*言語名*は素晴らしい!


13

stdinから入力を読み取り、わずかに変更された出力をstdoutに出力する任意の言語でプログラムを作成します。プログラムは、入力と出力から可能な限り大きな接頭辞の*language-name* is awesome!後に改行を入力し、入力の残りの文字を借用する必要があります。

  • 入力には大文字は含まれません。
  • 言語名の最初の文字が文字列にない場合、改行文字のみを借用する必要があります。
  • 入力に改行文字がない場合は、入力を変更せずに出力します。
  • どのキャラクターを借りるかは関係ありません。

書き込み時にスペースを節約するために\n、改行文字(0x0a)として使用しています。実際のプログラムは、\n文字列ではなく、実際の改行文字のみを考慮する必要があります。

例:python。
input:abcdefghijklmnopqrstuvwxyz\n0123456789
output:python\nabcdefgijklmqrsuvwxz0123456789
入力にはスペースがないため、次の単語に十分な文字がありますが続行できません:is

例:C.
入力:i don't see anything!
出力:i don't see anything!
文字列にCが見つからなかったため、変更はできませんでした。また、改行文字は存在しません。

例:C ++。
入力:i don't\nsee anything!
出力:\ni don'tsee anything!
文字列にCが見つからなかったため、変更できませんでした。

例:Obj-C。
input:objectively, clojure is amazing.\nq.e.d.
output:obj\nectively, clojure is amazing.q.e.d.
入力には書き込むのに十分な文字が含まれていますobjが、-欠落しています。

ソースコードのバイトカウントから言語名のバイトカウントを引いたutf-8エンコード(可能であれば)がスコアです。最低勝ち!


3
誰かが負のスコアのために名前に繰り返しの多い言語を見つけることを期待しましょう:)
フィリップハグラント

i don't\nsee anything!テストケースとして含めることができますか?
デニス

良いテストケース!追加。
フィリップハグランド

(名前または入力のいずれかで)文字が繰り返されるケースはどのように処理されるべきですか 出力の残りの文字の順序は重要ですか?
ピーターテイラー

おっと!それを修正しました。また、最初のキャラクターだけでなく、どのキャラクターも借りることができることを明確にしました。
フィリップハグランド

回答:


4

Pyth、37バイト

.-Jjb.zpef!.-TJ+,kb+Rb._"pyth is awesome!

ソースコードの長さは41バイトです。オンラインでお試しください。

使い方

  Jjb.z                                      Save all user input in J.
                      ._"pyth is awesome!    Compute all prefixes that string:
                                               ["p", "py", ... ]
                   +Rb                       Append a linefeed to each prefix.
               +,kb                          Concatenate ["", "\n"] with the result.
         f                                   Filter the resulting array; for each T:
           .-TJ                                Perform bagwise difference between T
                                               and J (respects multiplicities).
         !                                     Take the logical NOT.
                                             Keep T if ! returned True, i.e., if J
                                             contains all of T's characters.
        e                                    Retrieve the last, longest match.
       p                                     Print it.
.-J                                          Remove its characters from J.
                                             (implicit) Print the result.

2

Python、186-6 = 180

import sys
a=sys.stdin.read()
s="python is awesome!"
r=''
if'\n'not in a:print a;exit()
a=a.replace('\n','',1)
for c in s:
 if c in a:a,r=a.replace(c,'',1),r+c
 else:break
print r+'\n'+a

オンラインで試す


文字のみを借用する必要があるため、入力に複数の改行が存在する場合は、そのうちの1つのみを借用します。すべての文字が出力に残っているはずですが、必ずしも同じ順序である必要はありません。
フィリップハグランド

1

Python、146バイト

import sys
r=sys.stdin.read();y='\npython is awesome!';a=''
for i in y:
    if i in r:a+=i
    else:break
print a[1:]+'\n'+''.join(b for b in r if not b in a)

@デニスはそれを修正しました-_-
TheDoctor

入力に改行が含まれていない場合、1つの改行が多すぎます(2番目の例)。
デニス

1

セイロン、235-6 = 229

void a(){variable value i="";variable value r="\nceylon is awesome!";while(exists l=process.readLine()){i=i+"\n"+l;}i=i.rest;for(j->c in r.indexed){if(c in i){i=i.replaceLast(c.string,"");}else{r=r[0:j];break;}}print(r.rest+r[0:1]+i);}

以下は、フォーマットされコメントされたバージョンです。

void a() {
    // our target string, with the \n shuffled to the start.
    variable value r = "\nceylon is awesome!";

    // read the whole input line by line
    // (there doesn't seem a way to do this shorter :-/)
    variable value i = "";
    while (exists l = process.readLine()) {
        i = i + "\n" + l;
    }
    // remove first \n:
    i = i.rest;
    for (j->c in r.indexed) {
        if (c in i) {
            // remove some occurence of c
            i = i.replaceLast(c.string, "");
        } else {
            // stop the loop, and take the part of `r` processed so far.
            r = r[0:j];
            break;
        }
    }
    // reshuffle first \n in r to its end.
    // This will result in the empty string if r is empty, i.e. no \n was found.
    print(r.rest + r[0:1] + i);
}

短いため、replaceLast代わりに使用しreplaceFirstます。

質問と同じ形式の入力と出力の例:

  • abcdefghijklmnopqrstuvwxyz\n0123456789ceylon\nabdfghijkmpqrstuvwxz0123456789
  • i don't see anything!i don't see anything!
  • i don't\nsee anything!\ni don't see anything!
  • objectively, closure is amazing.\nq.e.d.ceylon is a\nobjectivel, sureiamzng.\q..d.

0

JavaScript(ES6)90(100-10)

要求された出力を返す関数として。STDINの通常の代替はprompt()であり、入力文字列内の改行を受け入れないため、I / Oで実装することは困難です。

(を使用してalert)実際の出力を持つ関数として、バイトカウントは107です。

f=s=>alert(([...`
javascript is awesome`].every(c=>(z=s.replace(c,''))!=s&&(s=z,q?o+=c:q=c),q=o=''),o+q+z))

EcmaScript 6準拠のブラウザーで以下のスニペットを実行してテストします(スプレッド演算子と矢印関数の実装-FireFoxを使用します)

f=s=>([...`
javascript is awesome`].every(c=>(z=s.replace(c,''))!=s&&(s=z,q?o+=c:q=c),q=o=''),o+q+z)

function test()
{
  O.innerHTML=f(I.value)
}

test()
#I {width: 80%}
<textarea id=I>
objectively, clojure is amazing.
q.e.d.</textarea><button onclick="test()">-></button>
<pre id=O></pre>


0

Perl、72-4 = 68バイト

2つのスイッチが含まれます。

perl -0pe 'for$c("\nperl is awesome!"=~/./gs){s/$c//?$p.=$c:last}s/^/$p\n/;s/\n//'

説明:文字列内のすべての文字について"\nperl is awesome"、入力文字列($_)から対応する文字を削除し$_ます。一致する文字が保存され、$pその文字の前に文字が$_印刷されます。

-0スイッチは完全な入力ではなく、ライン・バイ・ラインを読み込み、-pスイッチは入力を読みになり、暗黙の出力を印刷します。


0

JavaScript(ES7)、101 107-10 = 97

以前は短く、4つのテストケースすべてに取り組んでいましたが、どうやら規則に違反したようです。

x=>(i=r=q='',[for(c of`
javascript is awesome`)(y=x.replace(c,''),i||y==x?i=1:(c<' '?q=c:r+=c,x=y))],r+q+x)

Firefox 42で正常に動作します。これはもともと119バイトで始まりましたが、@ edc65の答えからのトリックが大幅に短縮するのに役立ちました。まだ改善の余地があると思います。いつものように、提案は大歓迎です!


入力に改行がないと失敗します。テストobj-> job、変更しないでください(ルール3)
-edc65

@ edc65ああ、そうです、テストケースはエッジケースの75%しかカバーしていません。削除することもできis awesomeますが、それでも4つすべてで適切に機能します。これをできるだけ早く修正します。
ETHproductions
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.