Rebmu:79文字OR(37 + length(p1)+ 2 * max(length(p2)、length(p3)))
最初に、どの言語を学ぶ必要があるかを尋ねる79文字のソリューションを提供します。(エントロピー4.0、30文字は含まず?
)、Rebolおよび[Red]の提案を提供します。
DD 11 DD :do dd {dd {p{Which languages must you learn?}qt}} pp{{[RReebdo]l}}
ここで利用できる他の言語にはないユニークな戦術は、中括弧が非対称の文字列区切り文字であり、合法的にネストできるという事実を利用することから得られます。
my-string: {"It's cool," said {Dr. Rebmu}, "for MANY reasons--like less escaping."}
これにより、エスケープシーケンスを使用しないプログラムで簡単に機能する一般的なソリューションを作成できます。79文字バージョンはショートカットするのに十分なほど簡単でしたが、プログラムp2およびp3の任意のプログラムソースを適切に含めるには、完全なテンプレートが必要です。それを使用した場合、87文字になります。
DD 11 DD :do dd {dd {p{Which languages must you learn?}qt}} ddoo{{pp{{[RReebdo]l}}}}
この一般的な形式を使用するためのパターンは、変数の長さの連続的な文字の3つのソーステキストを持っている場合(のは次のように例を使用してみましょうということですAAA
、BBBBB
、CCCCCCC
あなたはの線に沿って何かとしてそれらをコードすることができます):
DD 11 DD :do dd {dd {AAAqt}} ddoo{{BCBCBCBCBC C C}}
(注:このパターンは、エスケープ文字を使用するプログラムを微調整しないと機能しませんが、致命的な欠陥ではありません。中括弧で区切られた文字列で一致しない左中括弧を取得するには、次のようなものが必要です{Foo ^{ Bar}
...代替文字列表記"Foo { Bar"
、および組み合わせたケースは、エスケープされていない文字列の混合物を一緒に接着することで管理できます。
だから...例はどうですか?一般的なフォームが利用可能になると、この573文字プログラムは、3つの従来のコードゴルフソリューションからわずか数分で組み立てられました。
DD 11 DD:do dd {dd {rJ N 0%rN Wa1m2j S {\ x /} D00 Hc&[u [Ze?Wa Qs〜rpKw [isEL00c [skQd2k] [eEV?kQ [tlQ]] pcSeg--b00 [ eZ 1 5] 3] prRJ [si〜dSPscSqFHs] eZ 1 [s + dCa + wM2cNO]]] Va | [mpAp2j] prSI〜w { } Ls2w Wl h01tiVsb01n -1 chRVs { } hLceVn01qt}} ddoo {{BrdSzfc [sn [{N sbeo [tIt0l1eV} 0e5gXN1 01L {5s0} C {1} 0 {0 Do5f0 0bMe1e0r0} 0]] tMw9C9 Numz Jl [paN + [KperlCJBn [[ba sWS {B noJn Nt0a]] {K、j} b P { } lf EZ--n [N m {G otothestoreandbuysome more}] {Takeonedownandpassitar ound} c B w P lf]]}}
誰かが選択した言語でそのプログラムを書きたいと思って、573を打つことができると思うなら、私に知らせてください。あなたがそうするならば、私はあなたに重い評判を賞賛します-あなたの選択した言語がRebmuでないと仮定してください、それらのプログラムが最小でないことを知っているので。:-)
最後に取得する「無駄な」間隔は、p2とp3の長さが不均衡な場合に発生します。ただし、この場合、3つのプログラムはすべてサイズが異なるため、p2 / p3を選択するのに特に適切なペアリングはありません。(迷路など、入力として外部データがなかったため、これらを選択しました。長さが似ているというわけではありません。より最適な新しいプログラムを作成することはできましたが、十分な時間をかけて、君ははしません新しいプログラムを書く ...)
使い方
(注:合理化されたものではなく、より面白そうな、より「創造的な」アプローチから始めました。このアプローチについてはすでに長いので、ブログのエントリに移動しました。)
ここで重要なのは、他のエントリと同様の「文字列としての評価コード」トリックです。非対称文字列の区切り文字の切り札を持っています。80文字のケースの動作を説明することから始めます。
以下は、このケースの読みやすさのために空白を調整する「全体」プログラムです。
DD 11 ; assign 11 to dd (about to overwrite again)
DD :do ; make dd a synonym for DO (a.k.a. "eval")
; eval a string as source code that ends with QUIT (QT)
dd {dd {p{Which languages must you learn?}qt}}
; we'll never get here, but whatever's here must be legally parseable
pp{{[RReebdo]l}}
ここで、DDをDOの同義語(別名「評価」)に設定します。しかし、半分のプログラムを実行すると、Dを無害なリテラル1に定義することしか効果がないコードを実行するというトリックがあります。
奇数文字コードが行うことは次のとおりです。空白は再び調整されます。
D 1 ; assign 1 to d
D d ; assign d to itself, so it's still 1
d ; evaluates to integer, no side effect
{d pWihlnugsms o er?q} ; string literal, no side effect
p {Rebol} ; print "Rebol"
そして、これが偶数文字コードです:
D 1 ; assign 1 to d
D:od ; URL-literal (foo:...), no side effect
d ; evaluates to integer, no side effect
{{hc agae utyulan}t} ; string literal (well-formed!), no side effect
p {[Red]} ; print "[Red]"
実際には、半分にされていないプログラムの場合は、dd {dd {(arbitrary code)qt}}
任意のコードを実行します。ただし、評価する呼び出しは1つではなく2つあります。入れ子になったブレースはインターリーブされたコードではうまく機能しますが、DOの評価動作を台無しにするからです。なぜなら:
do {{print "Hello"}}
文字列をプログラムとしてロードしますが、そのプログラムは文字列定数だけになります{print "Hello"}
。したがって、ここで使用するトリックは、DD(DOと同じ関数値を保持)を取得して2回実行することです。半分は文字列のさまざまな部分をかみますが、コンテンツの偶数/奇数が正しい場合は両方をかみません。半分にした後に文字列の外側に残っているものは整数定数であるd
ため、無害です。
このパターンを使用すると、半分にカットされていない場合のプログラムの動作を記述する際に問題が発生しません。コードの文字長が偶数であれば何でも入力できます(QT(QUIT)をカウントしている場合は奇妙です)。奇数から偶数を取得する必要がある場合は、スペースを挿入します(したがって、p1のプログラムの長さが奇数である場合、p1の上記の式には実際に+1があります)。トリックは後でインターリーブされたコードを書くように見えますが、半分にされていない場合はパーサーを渡す必要があります。(QTのために実行されませんが、実行する前にLOADableである必要があります。)
このケースは簡単です。pp
未定義であってもシンボルとして問題なくロードさp
れ、各ハーフプログラムで印刷用に分割されます。しかし、文字列リテラルを再度使用するだけで、別のトリックを実行できます。半分になったプログラムには、通常どおりにDOが定義されているため、次のように言ってもかまいません。
ddoo{{pp{{[RReebdo]l}}}}
パーサーがピックアップする唯一の部分をシンボリックワードddoo
と文字列リテラルにすることで、パーサーを怒らせずに、その文字列リテラル内に希望する2つのプログラムをインターリーブできます。半分になったバージョンは次のように言います:
do{p{Rebol}}
..そして...
do{p{[Red]}}
私が言うように、この部分は、プログラムを文字列として扱い、評価する他のソリューションに馴染みがあるように見えます。しかし、競争の場合、パックしているプログラムにネストされた文字列が含まれている場合、それがレンチを投げます。ここで問題が発生するのは、キャレットを介したエスケープ(^
)の使用だけです。これは簡単に回避できます。
(小さな「不正」の注意:この問題に対応して「QUIT」にQTを追加しました。実際、以前はquitの略語を意図的に削除していました。 REPLにない場合は2文字のスペースを使用しますが、特にこの場合は追加しませんが、間違っていると思うので追加しますが、変更前は2文字長くなりました。私が最初にソリューションを投稿したとき、Rebmuにバグがあり、実際には動作するはずだったにもかかわらず...実際には動作するはずです)
x0=00;;
。素晴らしい挑戦です!