「Pythonで記号なしプログラミング」(未完)
竹迫さんがPerlで記号なしプログラミングの偉業を達成したのは7年前だった。(see ppencode)
そしてoxyさんがRubyで記号のみプログラミングを達成した(rrencode)
7年前にも「Pythonで記号なしプログラミングできないの?」と言われた。当時若かった(まだ四捨五入したら二十歳だった)僕は「いやー、無理ですよ」とバッサリ切り捨てていた。
あれから7年経って、Pythonの文法はさほど変わっていないけど、僕の考え方が変わった。ユーザの要望に「それは無理」なんて言っちゃうのは下策だ。100%達成することが不可能な問題でも、8割解くのは可能だったりする。「100%やるのはこれこれの理由で無理だが、この条件を緩めれば可能」と提案する方が上策だ。後者では8割分の価値を作り出すことができているが、前者では理由がいかに正しかろうが何も作り出すことができていない。
さて、なにを緩めるか。
PythonではRubyと違ってすべての関数呼び出しにカッコが必須だ。だからカッコを禁止されるととても苦しくなる。また、カンマを使わずにイテレート可能なオブジェクトを作ろうとすると、文字列かジェネレータかという選択になるが、前者は引用符、後者はカッコとコロンと改行とインデントが必要になる。文字列を使うのはあんまり面白くないだろうし、ジェネレータのためだけにコロンを要求するのも嫌だ。というわけで「小文字アルファベットとカッコとカンマだけで」をゴールにしよう。空白文字も改行も必要ない。
完成したのがこちらのPythonスクリプト。見やすくするために入れてある80文字での改行と最後の行のコメントは取り除いても実行に影響しない。
print(bytearray(len(repr(x))for(x)in(repr((repr((str(list(str(((),)))),())),)),( repr)((repr((repr(str(help)),())),)),str(list(str(id))),str(list(str(id))),str(( list)((repr((repr((repr((str((str)(help)),())),())),)),))),str(object(),),repr(( repr((str(list(str(((),)))),())),)),repr((repr((repr(str(help)),())),)),repr(str (list(repr(str(set()))))),repr(((repr)(repr((repr)(str(help)))),)),str(list(str( buffer))),repr(str(list(repr(str(((),())))))),repr((repr((repr((str(str(help)),( ))),())),)),repr((str(abs),())),str(object()),repr(((str)(object(),),())),repr(( repr((repr(repr(str(abs))),())),())),repr((repr((str(eval),())),)),str(object()) ,repr((repr((str(object()),())),())),repr(repr((repr(str(int)),()))),str((list)( repr(str(((),))))),repr((repr((str(object()),())),())),str(object(),),str(list(( str(str(help)),))),repr((repr(((repr)((repr(str(abs)),())),())),())),repr((repr( str(help)),)),repr((repr((str(list(str(((),)))),())),)),repr((repr((repr((repr(( str)(abs)),())),())),())),repr((str(str(help)),)),str(object()),repr((repr((str( list(str(((),)))),())),)),str(list(str(buffer))),repr((repr(repr(str(list(str((( ),)))))),)),repr(repr(repr(str(list(str(((),))))))),repr((repr(repr(repr((str)(( help))))),)),repr((repr((repr(str(help)),())),)),str(list(str(eval))),str(list(( str)(abs)))))) # "Happy Hacking!" using [a-z(),] only. (C) 2012 NISHIO Hirokazu
python2.7で実行すると「Happy Hacking! (C) 2012 NISHIO Hirokazu」と表示される。
$ python2.7 Python 2.7.3 (default, Apr 19 2012, 00:55:09) [GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> print(bytearray(len(repr(x))for(x)in(repr((repr((str(list(str(((),)))),())),)),( ... repr)((repr((repr(str(help)),())),)),str(list(str(id))),str(list(str(id))),str(( ... list)((repr((repr((repr((str((str)(help)),())),())),)),))),str(object(),),repr(( ... repr((str(list(str(((),)))),())),)),repr((repr((repr(str(help)),())),)),repr(str ... (list(repr(str(set()))))),repr(((repr)(repr((repr)(str(help)))),)),str(list(str( ... buffer))),repr(str(list(repr(str(((),())))))),repr((repr((repr((str(str(help)),( ... ))),())),)),repr((str(abs),())),str(object()),repr(((str)(object(),),())),repr(( ... repr((repr(repr(str(abs))),())),())),repr((repr((str(eval),())),)),str(object()) ... ,repr((repr((str(object()),())),())),repr(repr((repr(str(int)),()))),str((list)( ... repr(str(((),))))),repr((repr((str(object()),())),())),str(object(),),str(list(( ... str(str(help)),))),repr((repr(((repr)((repr(str(abs)),())),())),())),repr((repr( ... str(help)),)),repr((repr((str(list(str(((),)))),())),)),repr((repr((repr((repr(( ... str)(abs)),())),())),())),repr((str(str(help)),)),str(object()),repr((repr((str( ... list(str(((),)))),())),)),str(list(str(buffer))),repr((repr(repr(str(list(str((( ... ),)))))),)),repr(repr(repr(str(list(str(((),))))))),repr((repr(repr(repr((str)(( ... help))))),)),repr((repr((repr(str(help)),())),)),str(list(str(eval))),str(list(( ... str)(abs)))))) # "Happy Hacking!" using [a-z(),] only. (C) 2012 NISHIO Hirokazu Happy Hacking! (C) 2012 NISHIO Hirokazu
現状で僕にできることはこれが限界だ。でもそれでいいんじゃない。できないことを悩んでも仕方がない。