第一回---Hello, world!

さて、新しい言語を覚えると最初にやりたくなるのがHello, world!"。この問題は、「Hello, world!と出力せよ」とそれだけの問題です。しかし、出来るだけ短く書くには少し工夫が要ります。
まず、普通に書くと、
`.!`.d`.l`.r`.o`.w`. `.,`.o`.l`.l`.e`.Hi    (40byte)
となります。もちろん
`````````````.H.e.l.l.o.,. .w.o.r.l.d.!i    (40byte)
とか、関数の配置を並び替えることも出来ますが、文字数は変わりません。ここで"Hello, world!"を構成している文字がすべて違う文字ならば、これ以上縮めるのは不可能ですが、今の場合、"l"が連続してることに着目すると、
`.!`.d`.l`.r`.o`.w`. `.,`.o````s.H.e.li    (39byte)
と、sによって、.lを複製すればsは1byte、.lは2byteなので、1byte縮めることが出来ます。さらに
??????????????????????????????????????    (38byte)
とsをさらに使うと、もう1byte縮めることが出来ます。
実は、さらに縮めるにはsを使っているだけでは駄目で、c関数を使う必要があります。
cを使ったときの動作がよく分からないという人もいると思うので、ここで具体例を挙げて解説します。
``.9`.8`.7`.6`.5`.4`.3`.2`.1`.0`c.a.d  ---(*)
このコードを実行したとします。まず、最初に実行されるのは、
`c.a
の部分ですがc関数は関数Fに適用されると、"`F<cont>"を返します。つまりこの場合
`.a<cont>
を返します。重要なのはこの<cont>です。今は6文字で表していますが、この関数は作られたとき(cが実行されたとき)の情報を大域的に覚えています(c関数が二回実行されたとき、それぞれの"<cont>"は区別して扱う必要がある)。
さらに実行を続けると"a0123456789"と出力して
`<cont>.d
が残ります。いよいよ、<cont>が呼び出されるわけですが、そのとき、とんでもないことが起こります。評価を進めると次のステップで
``.9`.8`.7`.6`.5`.4`.3`.2`.1`.0.d.d
となります。つまり、"c"が呼び出されたときのコードが"`c.a"を、<cont>の引数".d"で置き換えた形で復活します。あとは普通に評価をするだけなので、結局このコード(*)は"a01234567890123456789d"と出力し
.d
を残して終了します。
肝心のHello, world!ですがcの扱いに慣れれば36byteのコードを見つけるのはそう難しくないはずです。
`.!`.d`.l`.r```.l`c`.H.e.o`.w`. `.,i    (36byte)
他にも36-byteは色々あると思います。どう実行されるかを一応示すと、
`.!`.d`.l`.r```.l`c`.H.e.o`.w`. `.,i                 output=""
`.!`.d`.l`.r```.l`c.e.o`.w`. `.,i                    output="H"
`.!`.d`.l`.r```.l`.e<cont>.o`.w`. `.,i         output="H"
`.!`.d`.l`.r```.l<cont>.o`.w`. `.,i         output="He"
`.!`.d`.l`.r``<cont>.o`.w`. `.,i         output="Hel"
`.!`.d`.l`.r```.l.o.o`.w`. `.,i                    output="Hel"
`.!`.d`.l`.r``.o.o`.w`. `.,i                    output="Hell"
`.!`.d`.l`.r`.o`.w`. `.,i                    output="Hello"
`.!`.d`.l`.r`.o`.w`. i                    output="Hello,"
`.!`.d`.l`.r`.o`.wi                    output="Hello, "
`.!`.d`.l`.r`.oi                    output="Hello, w"
`.!`.d`.l`.ri                    output="Hello, wo"
`.!`.d`.li                    output="Hello, wor"
`.!`.di                    output="Hello, worl"
`.!i                    output="Hello, world"
i                    output="Hello, "world!
end
となります。
Hello, world!の例のように、unlambdaでは、単に文字列を出力するだけでも極限まで短くするのは大変で、こだわるときりがありません。anarchy-golfで単に文字列を出力するだけHello, world!に似た問題は example_com, e,などがあります。
eの261byteを晒しておきます。
```c``````s``````.6`c`.5`.3`.1`.7`.4`.7`.8
```s````s```.2.5``c.7`.8`.2`.8`.1.4`.0`.9
.5.2.3`.5.6.0.2.2`.7``c`.4.9`.7.5`.3`.0`.3
`.6`.6`.7`.0`.4`.2`.7`.7`.2`.6```c`.9`.6`.3
````.4s.7.0.9`.5`.9.7`.6``c`.4.9`.6.9`.5`.7
```s.3.5.4.5.7.1```s.3.8.2```s.7.8.5.1`.6.4
`.7`.2i   (改行は取り除く)
まだまだ縮むと思うので、誰かどんどん縮めてください。

次のページ, 戻る