あなたが狂ったコードに行を入れて、それをすべて振ります


10

1つのプログラミング言語を使用して、5つの単一行プログラムを記述します。各プログラムは、個別に実行すると、ハリーニルソンの1972曲「Coconut」に最初の詩の異なる行を出力します。

兄はココナッツを買った、彼はそれを10セントで買った
彼の妹はもう1つ持っていた、彼女はライムにそれを払った
彼女はココナッツにライムを入れた、彼女は両方を飲んだ
彼女はココナッツにライムを置いた、彼女は両方を飲んだ
彼女ライムをココナッツに入れ、彼女はそれらを両方飲みました

歌詞全体

最後の3行は歌詞が同じなので、最後の3つのプログラムも同じかもしれません。

これらの5つの単一行プログラムを単一の5行プログラムで行ごとに1つ配置できる5つの階乗または120の方法があります。これらの120の組み合わせのできるだけ多くに対して、5行プログラムが詩全体を適切な順序で出力するように、1行プログラムを最適化する必要があります。

最も単純な答えは、5つの単一行の印刷ステートメントで、最後の3つは同一です。

print('Brother bought a coconut, he bought it for a dime')
print('His sister had another one, she paid it for a lime')
print('She put the lime in the coconut, she drank them both up')
print('She put the lime in the coconut, she drank them both up')
print('She put the lime in the coconut, she drank them both up')

5行のプログラムへの出力は、最初の2つの単一行が正しい位置にある限り、適切な順序の詩になります。120の可能な配置のうち6つだけがこれを実現します。

得点

すべての120の勝利のうち、最も有効なケースを含む提出。タイブレーカーは、累積バイト数が最も少ないプログラムのセットに移動します(改行はカウントされません)。この例は309バイトです。

細部

  • プログラムが独自のソースコードを読み取れない可能性があります。また、他の外部ファイルを読み取ったり、ネットワーク接続を必要としたりすることもできません。

  • stdoutまたは最も近い代替への出力。任意の名前のファイルに出力することもできます。

  • 「単一行プログラム」は、行末記号以外の文字を含む文字列です(おそらく改行を気にする必要があるだけです)。

  • シングルライナーを5ライナーに構成するときは、シングルライナーの隣接するペアの間に1つずつ、4つの改行を追加する必要があります。必要に応じて、末尾の改行を追加できます。


「それぞれが異なる行を出力する5つのプログラムを書く...」それは不可能ではないですか?
feersum

@feersum が異なります。それらのうち3つはたまたま同じテキストを持っています。
Calvin's Hobbies

それぞれがmainメソッドを持つ5つのクラスを含むJavaファイルがある場合はどうなりますか?次に、プログラムを実行するときにどちらを実行する必要がありますか?
feersum 2015年

@feersumさて、コンパイラは何をしますか?同じファイル内の複数のクラスの両方が持っている場合、Javaが何をするかわかりませんmain
Calvin's Hobbies

2
私がこれを覚えているのは、「コーラにライムを入れた」コカコーラの広告の1つです...
Joe Z.

回答:


9

CJam、120有効な順列、334 299 290バイト

"She put the lime in the coconut, she drank them both up"N+
"Brother bought a coconut, he bought it for a dime"N+]$~
"She put the lime in the coconut, she drank them both up"N+
"His sister had another one, she paid it for a lime"N+]$~
"She put the lime in the coconut, she drank them both up"N+

かなり単純なロジック:

  • 曲の各行を5つのプログラムのそれぞれに入れます
  • スタック上のすべてを配列でラップします
  • 配列を並べ替える
  • 次のプログラムが同じロジックを使用できるように配列をアンラップします
  • 各ステップでは、部分的な歌詞が配列になっています。幸いにも、配列をソートすると、歌詞の正しい順序が得られます。

更新:3つの類似した後のラップ-ソート-アンラップサイクルが不要で、曲の最後の行に表示されることがわかります。それが明らかでない場合は、理由を説明できます:)


8

プレリュード、120順列、2045 2035バイト

9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                                          (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-594+9409-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-99+96+609-9-9-9-9-9-9-1-992++909-9-9-9-9-9-9-1-992++87993++96+209-9-9-9-9-9-9-1-5809-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-992++87993++96+209-9-9-9-9-9-9-1-99+58992++96+99+09-9-9-3-                                             (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                 (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-594+993+09-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-99+96+609-9-9-9-9-9-9-1-992++909-9-9-9-9-9-9-1-49197+09-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-595+96+09-9-9-9-9-9-9-1-99+58992++96+95+109-9-9-9-9-9-9-1-41809-9-9-9-9-9-9-1-99+5992++991++9991++09-9-9-9-9-9-9-1-991++909-9-6-                                                           (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                                                                   (9+9+9+9+9+9+9+9+9+9+6+!)

これにより、結局、PreludeとCJamには子供が必要だと確信しました。Preludeの非常に限定された命令セットがなければ、この提出は実際には非常に競争力があり、CJamに勝るものさえないでしょう。

基本的な考え方は次のとおりです

"push line 4"               print
"push line 1"print
"push line 3"          print
"push line 2"     print
"push line 5"                    print

Preludeでは、各ラインは独自のスタックを持つ独自の「ボイス」であり、これらのボイスは並行して実行されます。つまり、完全なプログラムでは、各行が文字列を個別に構成し、最後に出力します。しかし、printステートメントのオフセットのため、実行は上から下ではなく左から右であるため、行の順序は出力の順序にはまったく関係ありません。

さて、なぜ行がそれほど長いのですか?Preludeはスタックに数値のみを保存します。さらに、一度に1桁の数値しかプッシュできないため、加算と減算からより大きな数値を構成する必要があります(乗算も他の算術もありません)。したがって、コードの最大の部分は、適切な文字コードを計算してプッシュすることです。これを少し短くするために、でオフセットしました96。最後に、印刷するために、スタックが空になる(つまりa 0が検出される)までループし、各数値に96を追加して印刷します。

文字列は最後から最初の文字まで印刷されるため、文字列が逆にプッシュされることに注意してください。

これは、PythonインタプリタNUMERIC_OUTPUT = False(仕様がI / Oを定義する方法で)使用することを前提としています。

次のCJamコードを使用して文字列構成を生成しました。

"Brother bought a coconut, he bought it for a dime
"W%{i96-_0<{zLa*9/:,'-*'-+0\+}{La*9/:,_,'+*W<}?}%

最後に、楽しみのために、Preludeに文字列の概念がある場合、これは本当に短いと思うのはなぜですか。

"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!
"emid a rof ti thguob eh ,tunococ a thguob rehtorB"N+!
"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!
"emil a rof ti diap ehs ,eno rehtona dah retsis siH"N+!
"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!

これで、印刷ステートメント!は既に正しい順序になっているので、オフセットする必要さえありません。いつかこれを実装することにします。


7

Ruby、120有効な順列、430バイト

$*[1]='His sister had another one, she paid it for a lime';a||=at_exit{puts($*-[p])}
$*[0]='Brother bought a coconut, he bought it for a dime';a||=at_exit{puts($*)}
$*[2]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}
$*[3]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}
$*[4]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}

任意の順序で、または個別に機能します。各行はグローバル状態を変更し、フックがすでに設定されていない限り、プログラムの最後に実行されるようにフックを設定します。


質問には、「5つの単一行プログラム」とあります。これは、各行が個別のプログラムにある必要があることを意味しませんか?1つにすべてではありませんか?
bacchusbeale 2015年

1
フォーマットの問題です。各行は独自のプログラムとして機能します。
ヒストクラート2015年

6

> <>、120順列、703バイト

<    /a"emid a rof ti thguob eh ,tunococ a thguob rehtorB"0a.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
<   / a"emil a rof ti diap ehs ,eno rehtona dah retsis siH"09.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
<  /  a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"08.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
< /   a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"07.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
</    a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"06.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"

ワンライナーの制限は2D言語にとってかなり厳しいものだったので、.テレポートの指示を最大限に活用する方法を見つける必要がありました。

イニシャル<はプログラムを左方向にフローさせ、ラップアラウンドして実行

"o;?=0l>\\\\\\/////"15p26p37p48p59p75p76p77p78p79p7ap8ap9apaapbapcapdap

これはp、ボードが次のようになるまで文字を配置する一連の(put)命令です。

<    /<lyrics1>0a.#.!50<blah>
<   / <lyrics2>09.#.!50<blah>
<  /  <lyrics3>08.#.!50<blah>
< /   <lyrics4>07.#.!50<blah>
</    <lyrics5>06.#.!50<blah>
 /     \
  /    \
   /   \
    /  \
     / \
       >l0=?;o

次に#.!50、プログラムフローを再び右に戻し、5行目にジャンプします。これは次のとおりです。

  • /5行目のミラーをたどると、歌詞5が見つかり、スタックにプッシュされます。次に、ライン6にテレポートします。
  • /6行目のミラーをたどると、歌詞4が見つかり、スタックにプッシュされます。次に、ライン7にテレポートします。
  • /7行目のミラーをたどると、歌詞3が見つかります...

これは、歌詞1をプッシュするまで発生します。その時点で、行10にテレポートします。これは、スタックが空になるまでスタック全体を出力するループです。

プログラムの1行しか存在しない場合、\ミラーは各歌詞行のテレポートと同じ働きをします。

プログラムがスクランブルされている場合、上記の説明が引き続き適用されるため、プログラムはすべての順列で機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.