Starryは、難解なプログラミング言語です。コードは+*.,`'
、各文字が表す実際のコマンドがその前のスペースの数によって決定される場所のみで構成されます。さまざまなコマンドが非常にさまざまなバイト数に対応できるため、ゴルフの固定出力の課題であっても難しいことです。特に、数値リテラルには単項表現があるため、小さい数字を操作して大きい数字を作成する必要があります。
したがって、この課題は、そのような星空プログラムをゴルフできるプログラムを書くことです。
Starryはどのように機能しますか?
(いくつかの詳細はエソランで未指定のままになっているため、Rubyインタープリターの動作について説明します。)
Starryはスタックベースの言語であり、任意の精度の整数値の単一スタック(最初は空です)を備えています。
意味のある文字は次のとおりです。
+*.,`'
およびスペース。他のすべての文字は無視されます。これらのスペース以外の文字のいずれかが続くスペースの各シーケンスは、単一の命令を表します。命令のタイプは、スペース以外の文字とスペースの数によって異なります。
手順は次のとおりです。
Spaces Symbol Meaning
0 + Invalid opcode.
1 + Duplicate top of stack.
2 + Swap top 2 stack elements.
3 + Rotate top 3 stack elements. That is, send the top stack element
two positions down. [... 1 2 3] becomes [... 3 1 2].
4 + Pop and discard top of stack.
n ≥ 5 + Push n − 5 to stack.
0 mod 5 * Pop y, pop x, push x + y.
1 mod 5 * Pop y, pop x, push x − y.
2 mod 5 * Pop y, pop x, push x * y.
3 mod 5 * Pop y, pop x, push x / y, rounded towards -∞.
4 mod 5 * Pop y, pop x, push x % y. The sign of the result matches the sign of y.
0 mod 2 . Pop a value and print it as a decimal number.
1 mod 2 . Pop a value and print it as an ASCII character. This throws an error
if the value is not in the range [0, 255].
n ` Mark label n.
n ' Pop a value; if non-zero, jump to label n.
インタープリターは、実行を開始する前にラベルのソースコードをスキャンするため、前後にジャンプすることも可能です。
もちろん、Starryには入力コマンドもあります(,
と同様に使用します.
)が、これらはこの課題とは無関係です。
チャレンジ
文字列が与えられたら、入力を受け取らず、その文字列をSTDOUTに正確に出力するStarryプログラムを生成します。
プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、STDOUT(または最も近い代替)、関数の戻り値または関数(out)パラメーターを介して結果を出力できます。
文字列は128文字以下であり、印刷可能なASCII文字(コードポイント0x20〜0x7E)のみで構成されると想定できます。
あなたのソリューションは、合理的なデスクトップマシンで5分未満でそのような入力を処理する必要があります(これには多少の余裕があります;ラップトップで数分以上かかる場合は気にしませんが、15分かかる場合は失格しますそれ)。
ソリューションは、以下にリストされているさまざまな文字列でテストされます。スコアは、対応するStarryプログラムの合計バイト数です。同点の場合、最短のメタゴルファが勝ちます。つまり、同点がない限り、自分のコードをわざわざわざわざしないでください(最適な解決策が可能な場合にのみ起こると思います)。
以下にリストされている特定のテストケースに向けてコードを最適化しないでください。具体的には、手作りのソリューションをハードコーディングしないでください。与えられた文字列の構造に類似した構造を持つ文字列のクラスに最適化することは問題ありません。ハードコーディングソリューションの疑いがある場合、テストケースの一部またはすべてを(同等の構造の文字列で)置き換える権利を留保します。
テストケース
各行は個別のテストケースです。
Hello, World!
pneumonoultramicroscopicsilicovolcanoconiosis
.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
Hickory, dickory, dock. The mouse ran up the clock. The clock struck 1. The mouse ran down. Hickory, dickory, dock.
36912059868043514648560046917066768694455682545071266675083273015450033938555319356951628735735013250100789433961153496780296165
bVZ48121347GLtpYnt76CZSxTpMDs6791EJE808077eySXldY162424ddTB90707UupwlWGb63618542VhA252989453TXrWgqGm85899uHOAY2oAKE198GOVUttvW63
7MYxoWBNt180CDHS5xBGvU70HHVB17bh8jYzIIiU6n6g98Rose1nOe8Svcg56nax20q30kT3Ttb2jHl5q2Iuf1vPbjPxm9cyKXwxc0OUK8pr13b2n7U9Y7RwQTc26A1I
n9}unwxVa}[rj+5em6K#-H@= p^X/:DS]b*Jv/_x4.a5vT/So2R`yKy=in7-15B=g _BD`Bw=Z`Br;UwwF[{q]cS|&i;Gn4)q=`!G]8"eFP`Mn:zt-#mfCV2AL2^fL"A
2番目のテストケースのクレジットはDennisに送られます。4番目のテストケースのクレジットはSp3000に割り当てられます。
参照ソリューション
CJamの非常に基本的なリファレンスソリューションを次に示します。
q{S5*\iS*'+S'.}%
ここでテストスイート全体に対して実行できます。スコアは次のとおりです。
1233
5240
4223
11110
7735
10497
11524
11392
Total: 62954
これは、可能な限り最も単純なアプローチです。各文字のコードポイントをリテラルとしてプッシュし、印刷します。連続した文字、整数の印刷、文字列の繰り返し部分などの小さな違いを利用しません。それらをあなたに任せます。
改善の余地はたくさんあると思います。参考までに、最短の手作り「Hello、World!」長さは169バイトのみです。