From 1960861b6836b788abb0abfb7e4f8e55e03b84b2 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Sat, 23 Jan 2021 09:51:40 +0900 Subject: [PATCH] Publish spoilers for IOCCC 1989 --- 1989/fubar.md | 80 +++++++++++++++++++ 1989/index.md | 19 +++++ 1989/jar.1.md | 36 +++++++++ 1989/jar.2.md | 65 +++++++++++++++ 1989/ovdluhe.md | 54 +++++++++++++ 1989/paul.md | 54 +++++++++++++ 1989/robison.md | 38 +++++++++ 1989/roemer.md | 31 ++++++++ 1989/tromp.md | 51 ++++++++++++ 1989/vanb.md | 44 +++++++++++ 1989/westley.md | 123 +++++++++++++++++++++++++++++ _includes/1989-fubar.c.inc | 19 +++++ _includes/1989-fubar.patch.inc | 22 ++++++ _includes/1989-jar.1.c.inc | 1 + _includes/1989-jar.2.c.inc | 44 +++++++++++ _includes/1989-jar.2.patch.inc | 56 +++++++++++++ _includes/1989-ovdluhe.c.inc | 21 +++++ _includes/1989-ovdluhe.patch.inc | 34 ++++++++ _includes/1989-paul.c.inc | 35 ++++++++ _includes/1989-robison.c.inc | 33 ++++++++ _includes/1989-robison.patch.inc | 11 +++ _includes/1989-roemer.c.inc | 36 +++++++++ _includes/1989-roemer.patch.inc | 11 +++ _includes/1989-tromp.bsd.c.inc | 19 +++++ _includes/1989-tromp.bsd.patch.inc | 19 +++++ _includes/1989-vanb.c.inc | 1 + _includes/1989-westley.c.inc | 24 ++++++ _src/1989/fubar.c | 19 +++++ _src/1989/fubar.new.c | 18 +++++ _src/1989/jar.1.c | 1 + _src/1989/jar.2.c | 44 +++++++++++ _src/1989/jar.2.new.c | 44 +++++++++++ _src/1989/ovdluhe.c | 21 +++++ _src/1989/ovdluhe.new.c | 21 +++++ _src/1989/paul.c | 35 ++++++++ _src/1989/robison.c | 33 ++++++++ _src/1989/robison.new.c | 33 ++++++++ _src/1989/roemer.c | 36 +++++++++ _src/1989/roemer.new.c | 36 +++++++++ _src/1989/tromp.bsd.c | 19 +++++ _src/1989/tromp.bsd.new.c | 19 +++++ _src/1989/vanb.c | 1 + _src/1989/westley.c | 24 ++++++ _update.rb | 5 +- imgs/1989-tromp.png | Bin 0 -> 9662 bytes index.md | 3 +- patches/1989-fubar.patch | 22 ++++++ patches/1989-jar.2.patch | 56 +++++++++++++ patches/1989-ovdluhe.patch | 34 ++++++++ patches/1989-robison.patch | 11 +++ patches/1989-roemer.patch | 11 +++ patches/1989-tromp.bsd.patch | 19 +++++ 52 files changed, 1543 insertions(+), 3 deletions(-) create mode 100644 1989/fubar.md create mode 100644 1989/index.md create mode 100644 1989/jar.1.md create mode 100644 1989/jar.2.md create mode 100644 1989/ovdluhe.md create mode 100644 1989/paul.md create mode 100644 1989/robison.md create mode 100644 1989/roemer.md create mode 100644 1989/tromp.md create mode 100644 1989/vanb.md create mode 100644 1989/westley.md create mode 100644 _includes/1989-fubar.c.inc create mode 100644 _includes/1989-fubar.patch.inc create mode 100644 _includes/1989-jar.1.c.inc create mode 100644 _includes/1989-jar.2.c.inc create mode 100644 _includes/1989-jar.2.patch.inc create mode 100644 _includes/1989-ovdluhe.c.inc create mode 100644 _includes/1989-ovdluhe.patch.inc create mode 100644 _includes/1989-paul.c.inc create mode 100644 _includes/1989-robison.c.inc create mode 100644 _includes/1989-robison.patch.inc create mode 100644 _includes/1989-roemer.c.inc create mode 100644 _includes/1989-roemer.patch.inc create mode 100644 _includes/1989-tromp.bsd.c.inc create mode 100644 _includes/1989-tromp.bsd.patch.inc create mode 100644 _includes/1989-vanb.c.inc create mode 100644 _includes/1989-westley.c.inc create mode 100644 _src/1989/fubar.c create mode 100644 _src/1989/fubar.new.c create mode 100644 _src/1989/jar.1.c create mode 100644 _src/1989/jar.2.c create mode 100644 _src/1989/jar.2.new.c create mode 100644 _src/1989/ovdluhe.c create mode 100644 _src/1989/ovdluhe.new.c create mode 100644 _src/1989/paul.c create mode 100644 _src/1989/robison.c create mode 100644 _src/1989/robison.new.c create mode 100644 _src/1989/roemer.c create mode 100644 _src/1989/roemer.new.c create mode 100644 _src/1989/tromp.bsd.c create mode 100644 _src/1989/tromp.bsd.new.c create mode 100644 _src/1989/vanb.c create mode 100644 _src/1989/westley.c create mode 100644 imgs/1989-tromp.png create mode 100644 patches/1989-fubar.patch create mode 100644 patches/1989-jar.2.patch create mode 100644 patches/1989-ovdluhe.patch create mode 100644 patches/1989-robison.patch create mode 100644 patches/1989-roemer.patch create mode 100644 patches/1989-tromp.bsd.patch diff --git a/1989/fubar.md b/1989/fubar.md new file mode 100644 index 0000000..6f29292 --- /dev/null +++ b/1989/fubar.md @@ -0,0 +1,80 @@ +--- +id: 1989/fubar +year: 1989 +order: 1 +patch: true +authors: "Jay_Vosburgh" +orig_url: "https://www.ioccc.org/1989/fubar.c" +hint_url: "https://github.com/ioccc-src/winner/blob/main/1989/fubar.hint" +title: "IOCCC 1989: Best self-modifying program" +award_ja: "最高の自己書き換えプログラム" +--- + +## 動作 + +階乗の計算。 + +動かし方にクセがある。 + +``` +$ cp fubar.c ouroboros.c + +$ chmod +x ouroboros.c + +$ ./ouroboros.c 10 +... +10 factorial = 3628800 +``` + +## 解説 + +このコードはC言語とシェルスクリプトのかんたんなpolyglotになっている。 +シェルスクリプトがやっている処理をわかりやすく書き下すと、次のような処理となる。 + +``` +$ cp fubar.c ouroboros.c +$ cc -o x ouroboros.c && cat ouroboros.c | ./x 5 > x1 && mv x1 ouroboros.c +$ cc -o x ouroboros.c && cat ouroboros.c | ./x 5 > x1 && mv x1 ouroboros.c +$ cc -o x ouroboros.c && cat ouroboros.c | ./x 5 > x1 && mv x1 ouroboros.c +$ cc -o x ouroboros.c && cat ouroboros.c | ./x 5 > x1 && mv x1 ouroboros.c +$ cc -o x ouroboros.c && cat ouroboros.c | ./x 5 > x1 && mv x1 ouroboros.c +$ cc -o x ouroboros.c && cat ouroboros.c | ./x 5 > x1 && mv x1 ouroboros.c +5 factorial = 120 +``` + +つまり、自分をコンパイルし、自分を読み込んであらたなコードを作る、ということを繰り返す。 + +初期コードのouroboros.cの先頭には、 + +``` +#define QQ 1 +#define TT 1 +``` + +と書かれている。 +これをビルドし、ouroboros.cを標準入力に流し込みながら`./x 5`と実行すると、ほとんど同じコードが出力されるが、上の箇所が下のように変わっている。 + +``` +#define QQ 2 +#define TT 2 +``` + +これをouroboros.cとして上書き保存し、同じ処理を行うと、次のようになっている。 + +``` +#define QQ 3 +#define TT 6 +``` + +`QQ`が繰り返し回数、`TT`がここまでの階乗の値であることがわかる。 +これを繰り返して、'QQ'がコマンドライン引数の数字に到達すると、標準エラー出力に`5 factorial = 120`と出力して停止する。 + +実行可能なプログラムを繰り返し出力する初の作品。 +元ソースコードを標準入力に与えているので厳密な意味でのQuineではないが、コードをもてあそぶ体験の原型がある。 +polyglot自体は[[[1985/applin]]]({{ site.baseurl }}{% link 1985/applin.md %})で既出だが、繰り返しの処理を自動化するシェルスクリプトをpolyglotとして盛り込んでいるところはポイント高い。 +さらに、`cc ouroboros.c -o x`の文字列がC言語プログラムとして解釈されているところも(単なるマクロ置換ではあるが)面白い。 + +現代の環境で動かすために、2点の変更を行っている。 + +* メーラの都合で折り返されていた行をあらかじめ結合した(`ex`コマンドのスクリプトが付属していたがうまく動かなかった)。 +* `PATH`にカレントディレクトリが含まれている前提だったので、`./x`とした。 diff --git a/1989/index.md b/1989/index.md new file mode 100644 index 0000000..0cfd843 --- /dev/null +++ b/1989/index.md @@ -0,0 +1,19 @@ +--- +year: 1989 +title: "IOCCC 1989の解説" +layout: contest +--- +## 全体の印象 + +単純なプログラムをむやみやたらに難読化するという時代は終わり、プログラムの挙動のおもしろさや難読化方法の創意工夫で競い合う傾向が急激に強まった。 + +言語処理系をテーマとする作品や、テトリスのように挙動の複雑さで勝負する作品が増えた。 +個人的には、プログラム自体を処理対象として扱い、新たなプログラムを出力する「コード遊び」の作品が増えたのが嬉しい。 +[[[1989/fubar]]]({{ site.baseurl }}{% link 1989/fubar.md %})はプログラムを実行するとプログラムが現れ、繰り返しコンパイルが体験できる作品。 +なかでも[[[1989/westley]]]({{ site.baseurl }}{% link 1989/westley.md %})は、あまり有名でないが恐ろしいレベルの超絶技巧。 + +この大会から全作品のhintファイルに作者のコメントが掲載されるようになった。 + +なお、この年はC言語の最初の標準規格が作られた年である(C89、通称ANSI C)。 +ただし、規格は年末に確定し、出版は翌年であるため、IOCCC 1989ではまだC89は登場しない。 +これらのプログラムがC規格策定前から存在したと思うと、ある意味感慨深い。 diff --git a/1989/jar.1.md b/1989/jar.1.md new file mode 100644 index 0000000..e5decf4 --- /dev/null +++ b/1989/jar.1.md @@ -0,0 +1,36 @@ +--- +id: 1989/jar.1 +year: 1989 +order: 2 +authors: "Jari_Arkko" +orig_url: "https://www.ioccc.org/1989/jar.1.c" +hint_url: "https://github.com/ioccc-src/winner/blob/main/1989/jar.1.hint" +title: "IOCCC 1989: Strangest abuse of the rules" +award_ja: "もっとも奇妙なルール悪用" +--- + +## 動作 + +コンパイルしたオブジェクトファイルの中にHello worldが見えるというもの。 + +``` +$ gcc -c -o jar.1.o jar.1.c +$ cat jar.1.o +ELF...... +Hello world. +GCC: (Ubuntu 9.3.0-10ubuntu2) 9.3.GNU....... +``` + +## 解説 + +作者の意図としては、`cc -c -o /dev/tty jar.1.c`とコンパイルすることで、コンパイル結果を直接TTYに書き出させることだったらしい。 +しかし現代ではこれは動かなくなっていたので残念。 + +作者のもともとのソースコード([jar.1.orig.c](https://www.ioccc.org/1989/jar.1.orig.c))は`char*He="llo world.\n";`となっていた。 +おそらく、当時のオブジェクトファイルのヘッダ部分やシンボル情報などに`He`が含まれていて、それとつながって表示されていたのではないかと思う。 +考古学もとむ。 + +翌年からルールに「実行可能な通常のファイルになること」が追加された。 + +同じ年に同じ人が複数入賞した初の事例。 +ただしもう1つの[[[1989/jar.2]]]({{ site.baseurl }}{% link 1989/jar.2.md %})は3人の共作で、この作品と同じ人が筆頭作者となっている。 diff --git a/1989/jar.2.md b/1989/jar.2.md new file mode 100644 index 0000000..802f2ae --- /dev/null +++ b/1989/jar.2.md @@ -0,0 +1,65 @@ +--- +id: 1989/jar.2 +year: 1989 +order: 10 +patch: true +authors: + - "Jari_Arkko" + - "Ora_Lassila" + - "Esko_Nuutila" +orig_url: "https://www.ioccc.org/1989/jar.2.c" +hint_url: "https://github.com/ioccc-src/winner/blob/main/1989/jar.2.hint" +title: "IOCCC 1989: Best of show" +award_ja: "最優秀賞" +--- + +## 動作 + +Lispインタプリタ。 + +``` +$ gcc -o jar.2 jar.2.c + +$ echo "(+ 1 1") | ./jar.2 + +$ cat fib.lisp +(defun fib (n) + (if (< n 2) + 1 + (+ (fib (- n 2)) (fib (- n 1))))) +(fib 10) + +$ cat fib.lisp | ./jar.2 +89.000000 +``` + +## 解説 + +初の言語処理系作品。1465バイトに次の機能が盛り込まれているとのこと。 + +``` + + - * < () + car cdr cons defun equal + function if lambda quote t +``` + +jar.2.hintにかんたんなサンプルコードがいくつか掲載されている。 +エラーチェックは非常に甘く、たとえば最初のカッコの前にスペースがあったら動かないとのこと。 + +形状の意味は特に解説されておらず不明だが、カッコを表現しているだろうか(下のほうがよくわからないが)。 +上下に挟まれた行のアルファベットだけ拾い読みすると`O B F U S C A T E D L i s p`になっている。 + +``` +,O;}B(F)U S(C(A(T(E)?D:_)));}L(i,s)p +``` + +作者のコメントによると、「Lispはコンスセルを基本データとするが、このプログラムは`char*`を基本とする」と書かれている。 +つまり単なるベタメモリということで、基本的にはただのジョークだと思うけれど、実際、組み込み関数のテーブルは`{関数名,関数ポインタをchar*にキャストしたもの}`の列となっている(構造体を宣言する必要がなくなるのでコードが小さくなる効果はあると思う)。 + +オリジナルのソースコードは、グローバル変数の配列が連続領域に確保されていることを前提としている。 +`p r[4][2]={...};`と`p not[99][2]={...};`とう定義に対して`r[13]`で`not[9]`をアクセスする。 +このようにした理由はわからない(特に小さくなるわけでも、レイアウトしやすくなるわけでもないと思うし、`not`は直接アクセスされていない)。 +単に難読化のためだろうか。 +このせいで現代のコンパイラで最適化オプション付きでビルドするとsegfaultになって動かないので、ひとつの定義とするように修正をおこなった。 + +[[[1989/jar.1]]]({{ site.baseurl }}{% link 1989/jar.1.md %})と合わせ、同じ年に同じ作者の作品が複数入賞した初の事例。 diff --git a/1989/ovdluhe.md b/1989/ovdluhe.md new file mode 100644 index 0000000..53013d0 --- /dev/null +++ b/1989/ovdluhe.md @@ -0,0 +1,54 @@ +--- +id: 1989/ovdluhe +year: 1989 +order: 3 +patch: true +authors: "Oskar_von_der_Luehe" +orig_url: "https://www.ioccc.org/1989/ovdluhe.c" +hint_url: "https://github.com/ioccc-src/winner/blob/main/1989/ovdluhe.hint" +title: "IOCCC 1989: Most humorous output" +award_ja: "もっともユーモラスな出力" +--- + +## 動作 + +与えられたテキストを参考に、適当な文字列を生成していく。 + +``` +$ gcc -o ovdluhe ovdluhe.c + +$ ./ovdluhe < /usr/share/dict/american-english-small +'s +Catholic's +Catholicism +Americans +April's +American +Asians +F +F's +Frence +absconding +abunday's +Tuesday's +Christmases +Thursday +Wednesday's +Frence +abbeys +... +``` + +## 解説 + +「猿がタイプライターを無限に叩き続ければ、いつか必ず任意のテキスト(たとえばシェイクスピアの作品でも)を打ち出す」という[無限の猿定理](https://ja.wikipedia.org/wiki/%E7%84%A1%E9%99%90%E3%81%AE%E7%8C%BF%E5%AE%9A%E7%90%86)に着想を得た作品。 +最近出力した4文字分だけの記憶を持ち、元のテキストの中でその4文字の直後に現れる確率が高い文字をランダムに選んで出力する、というのを繰り返す。 + +難読化は、識別子がape(猿)っぽい文字列ばかりという程度だと思う。 +興味深い挙動というネタで勝利した作品。 + +次の3点を修正した。 + +* `#define D define`して`#D`するコードを展開。 +* `typedef char ape`とした上で`unsigned ape`とするのはダメなようなので`unsigned char`に置き換え。 +* `*(ep-A)= *(ep++);`は未定義動作(副作用完了点の前に変更と読み出しがある)ので`*(ep-A)= *(ep),ep++;`に修正。 diff --git a/1989/paul.md b/1989/paul.md new file mode 100644 index 0000000..f6ff9bc --- /dev/null +++ b/1989/paul.md @@ -0,0 +1,54 @@ +--- +id: 1989/paul +year: 1989 +order: 4 +authors: "Paul_E._Black" +orig_url: "https://www.ioccc.org/1989/paul.c" +hint_url: "https://github.com/ioccc-src/winner/blob/main/1989/paul.hint" +title: "IOCCC 1989: Most complex algorithm" +award_ja: "もっとも複雑なアルゴリズム" +linewarp: true +--- + +## 動作 + +2進数でフィボナッチ数を列挙していく。 + +``` +$ gcc -m32 -o paul paul.c + +$ ./paul +1 +10 +11 +101 +1000 +1101 +10101 +100010 +110111 +1011001 +10010000 +11101001 +101111001 +1001100010 +1111011011 +11000111101 +101000011000 +1000001010101 +1101001101101 +10101011000010 +100010100101111 +... +``` + +## 解説 + +チューリングマシンのシミュレータ。 +詳細未解読だが、3文字1組で状態遷移の規則を表現しているらしい(遷移元状態、遷移先状態、遷移条件やヘッダ移動や出力など)。 +デフォルトのチューリングマシンが組み込まれていて、それがフィボナッチ列挙になっている。 + +独自のVMやシミュレータによる難読化の先駆けか。 +1994年のguidelineから、この方式の難読化はもっとクリエイティブになること(面白い挙動をするとか)が期待されるようになっている。 + +ポインタを`int`に変換しているので、`-m32`が必要。 diff --git a/1989/robison.md b/1989/robison.md new file mode 100644 index 0000000..fb7954b --- /dev/null +++ b/1989/robison.md @@ -0,0 +1,38 @@ +--- +id: 1989/robison +year: 1989 +order: 5 +patch: true +authors: "Arch_D_Robison" +orig_url: "https://www.ioccc.org/1989/robison.c" +hint_url: "https://github.com/ioccc-src/winner/blob/main/1989/robison.hint" +title: "IOCCC 1989: Best minimal use of C" +award_ja: "Cの最高の最小限の使い方" +--- + +## 動作 + +極小のAPLインタプリタ。2進数の足し算、引き算、掛け算ができる。 + +``` +$ gcc -o robison robison.c + +$ echo "101 x 111 - 100" | ./robison +1111 +``` + +APLではこれは5 x (7 - 4) = 15を表すとのこと。 + +``` +$ echo "(101 x 111) - 100" | ./robison +11111 +``` + +これは(5 x 7) - 4 = 31になっている。 + +## 解説 + +[[[1988/robison]]]({{ site.baseurl }}{% link 1988/robison.md %})に続き、C言語の利用構文を制限して書かれている(作者はこれをC\-\-と言っている)。 +robison.hintに書かれた作者コメントによると、関数呼び出し、間接参照、配列代入、コンマ、`sizeof`だけを使用して多倍長2進数計算を実現しているとのこと。 + +マクロ定義中の`D/**/f`を`D##f`などに置き換える変更が必要だった。 diff --git a/1989/roemer.md b/1989/roemer.md new file mode 100644 index 0000000..8c2bb42 --- /dev/null +++ b/1989/roemer.md @@ -0,0 +1,31 @@ +--- +id: 1989/roemer +year: 1989 +order: 6 +patch: true +authors: "Roemer_B._Lievaart" +orig_url: "https://www.ioccc.org/1989/roemer.c" +hint_url: "https://github.com/ioccc-src/winner/blob/main/1989/roemer.hint" +title: "IOCCC 1989: Best layout" +award_ja: "最高のレイアウト" +--- + +## 動作 + +[ネイピア数e](https://ja.wikipedia.org/wiki/%E3%83%8D%E3%82%A4%E3%83%94%E3%82%A2%E6%95%B0)を3141バイトほど出力する。 + +{: .wrap } +``` +$ gcc -o roemer roemer.c + +$ ./roemer +2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416928368190255151086574637721112523897844250569536967707854499699679468644549059879316368892300987931277361782154249992295763514822082698951936680331825288693984964651058209392398294887933203625094431173012381970684161403970198376793206832823764648042953118023287825098194558153017567173613320698112509961818815930416903515988885193458072738667385894228792284998920868058257492796104841984443634632449684875602336248270419786232090021609902353043699418491463140934317381436405462531520961836908887070167683964243781405927145635490613031072085103837505101157477041718986106873969655212671546889570350354021234078498193343210681701210056278802351930332247450158539047304199577770935036604169973297250886876966403555707162268447162560798826517871341951246652010305921236677194325278675398558944896970964097545918569563802363701621120477427228364896134225164450781824423529486363721417402388934412479635743702637552944483379980161254922785092577825620926226483262779333865664816277251640191059004916449982893150566047258027786318641551956532442586982946959308019152987211725563475463964479101459040905862984967912874068705048958586717479854667757573205681288459205413340539220001137863009455606881667400169842055804033637953764520304024322566135278369511778838638744396625322498506549958862342818997077332761717839280349465014345588970719425863987727547109629537415211151368350627526023264847287039207643100595841166120545297030236472549296669381151373227536450988890313602057248176585118063036442812314965507047510254465011727211555194866850800368532281831521960037356252794495158284188294787610852639813955990067376482922443752871846245780361929819713991475644882626039033814418232625150974827987779964373089970388867782271383605772978824125611907176639465070633045279546618550966661856647097113444740160704626215680717481877844371436988218559670959102596862002353718588748569652200050311734392073211390803293634479727355955277349071783793421637012050054513263835440001863239914907054797780566978533580489669062951194324730995876552368128590413832411607226029983305353708761389396391779574540161372236187893652605381558415871869255386061647798340254351284396129460352913325942794904337299085731580290958631382683291477116396337092400316894586360606458459251269946557248391865642097526850823075442545993769170419777800853627309417101634349076964237222943523661255725088147792231519747780605696725380171807763603462459278778465850656050780844211529697521890874019660906651803516501792504619501366585436632712549639908549144200014574760819302212066024330096412704894390397177195180699086998606636583232278709376502260149291011517177635944602023249300280401867723910288097866605651183260043688508817157238669842242201024950551881694803221002515373 +``` + +## 解説 + +πの形状で、識別子も`_31415`のようなものばかりになっているが、eを計算するというフェイント。 + +桁数が3141(小数点含む、改行文字を含めたら3142バイト)というのも芸が細かい。 + +文字列リテラルを破壊しているので、`strdup`か何かが必要。しかしこの作品はレイアウトも重要なので、なるべく崩さないように修正した。 diff --git a/1989/tromp.md b/1989/tromp.md new file mode 100644 index 0000000..32adb4d --- /dev/null +++ b/1989/tromp.md @@ -0,0 +1,51 @@ +--- +id: 1989/tromp +year: 1989 +order: 7 +patch: true +authors: + - "John_Tromp" + - "Freek_Wiedijk" +file: 1989/tromp.bsd +orig_url: "https://www.ioccc.org/1989/tromp.bsd.c" +hint_url: "https://github.com/ioccc-src/winner/blob/main/1989/tromp.bsd.hint" +title: "IOCCC 1989: Best game" +award_ja: "最高のゲーム" +--- + +## 動作 + +端末で[テトリス](https://ja.wikipedia.org/wiki/%E3%83%86%E3%83%88%E3%83%AA%E3%82%B9)。 + +``` +$ gcc -O -o tromp.bsd tromp.bsd.c + +$ ./tromp.bsd +``` + +{% include img.html src="1989-tromp.png" desc="端末でテトリスがプレイできる" %} + +デフォルトの操作方法は、jが左、lが右、kが回転、スペースが落とす、pがポーズ、qが終了。 + +## 解説 + +端末のエスケープシーケンスを使った初の作品で、Best game枠の最初の作品。 + +コマンドラインの第1引数で落下速度を、マンドラインの第2引数で操作方法を変えられるとのこと(無指定の場合は2秒と`jkl pq`が指定されたという扱い)。 + +ハッカーの遊びでテトリスと言うと退屈に感じてしまうかもしれない。 +しかしテトリスが世界的に売られ始めたのは1988年ごろなので、当時はブームの最中ということになる。 +この作品がテトリスをハッカーの遊びの定番ネタとするのに一役かったのかもしれない。 + +端末でポータブルにゲームを作るというのは意外と難しい話で、BSD版とSystem V版が用意されている。 +現代のLinuxはSystem Vに近いので、後者のほうが動かしやすいかもしれないが、BSD版でも少しの修正で動作した。 +次の変更が必要だった。 + +* `sigvec`を`sigaction`に置き換えた。 +* 関数ポインタを`int`に変換している箇所を`long`に置き換えた。なお、sigactionに与える関数ポインタであるせいか、`-m32`ではうまく動かなかった。 +* グローバル変数の初期値として関数へのポインタを与えることもできなくなっていたので、`main`関数の先頭で初期化するように変えた。 + +なお、`-O`をつけないと動作しなかった。おそらくまだ修正が必要なのだと思うが、詳しくは調べていない。 + +余談だが、このコードはscreenコマンドのテストコードとして含まれているので、screenをインストールしている環境では知らないうちに入っていることもある。 +Ubuntu 20.04では/usr/share/doc/screen/terminfo/tetris.cに置かれていた。 diff --git a/1989/vanb.md b/1989/vanb.md new file mode 100644 index 0000000..f2344fa --- /dev/null +++ b/1989/vanb.md @@ -0,0 +1,44 @@ +--- +id: 1989/vanb +year: 1989 +order: 8 +authors: "David_Van_Brackle" +orig_url: "https://www.ioccc.org/1989/vanb.c" +hint_url: "https://github.com/ioccc-src/winner/blob/main/1989/vanb.hint" +title: "IOCCC 1989: Best one liner" +award_ja: "最高のワンライナー" +--- + +## 動作 + +コマンドライン引数の真部分集合を列挙する。 + +``` +$ gcc -o vanb vanb.c + +$ ./vanb 1 2 3 +2 +3 +---------- +3 +---------- +1 +3 +---------- +1 +---------- +---------- +2 +---------- +1 +2 +---------- +``` + +## 解説 + +変数は宣言せず、`argc`と`argv`だけで計算する。 +実際にはそれぞれ`Q`と`O`という円数名になっており、`0`の多用も相まって視覚的な厳しさがある。 +`main`関数の再帰呼び出しを活用している。 + +vanb.hintによると、`char`型が`signed`であることに依存しているらしい。Armでは動かないかもしれない。 diff --git a/1989/westley.md b/1989/westley.md new file mode 100644 index 0000000..a817f7c --- /dev/null +++ b/1989/westley.md @@ -0,0 +1,123 @@ +--- +id: 1989/westley +year: 1989 +order: 9 +authors: "Brian_Westley" +orig_url: "https://www.ioccc.org/1989/westley.c" +hint_url: "https://github.com/ioccc-src/winner/blob/main/1989/westley.hint" +title: "IOCCC 1989: Most algorithms in one program" +award_ja: "単一プログラム中の最多アルゴリズム" +--- + +## 動作 + +ROT13や文字列反転をするプログラムで、ROT13をかけても文字列反転をかけても同じ挙動をするロバストなプログラム。 + +---- + +コンパイルには`-Dtrgpune=putchar`というオプションが必要。 + +``` +$ gcc -w -Dtrgpune=putchar -o westley westley.c +``` + +コマンドライン引数の数によって挙動が異なる。0個のときは入力をそのまま出力するだけ(catと同じ)。 + +``` +$ echo Hello | ./westley +Hello +``` + +1個のときはROT13変換。 + +``` +$ echo Hello | ./westley 1 +Uryyb +``` + +2個のときは文字列反転。 + +``` +$ echo Hello | ./westley 1 2 + +olleH +``` + +3個のときはROT13変換かつ文字列反転。 +``` +$ echo Hello | ./westley 1 2 3 + +byyrU +``` + +--- + +冒頭の説明の通り、元のコードはいずれの変換をかけても同じ挙動をする。おそろしい。 + +``` +$ ./westley < westley.c > ver0.c && cc -w -Dtrgpune=putchar -o ver0 ver0.c +$ ./westley 1 < westley.c > ver1.c && cc -w -Dtrgpune=putchar -o ver1 ver1.c +$ ./westley 1 2 < westley.c > ver2.c && cc -w -Dtrgpune=putchar -o ver2 ver2.c +$ ./westley 1 2 3 < westley.c > ver3.c && cc -w -Dtrgpune=putchar -o ver3 ver3.c +$ echo Hello | ./ver0 +Hello +$ echo Hello | ./ver0 1 +Uryyb +$ echo Hello | ./ver0 1 2 + +olleH$ echo Hello | ./ver0 1 2 3 + +byyrU +``` + +`ver1`、`ver2`、`ver3`も同じ。 + +## 解説 + +westleyの3作目。あまり有名ではないが、ものすごくすばらしい作品。 + +`-Dtrgpune=putchar`の`trgpune`は`getchar`をROT13変換したもの。 +なので、westley.cをROT13すると、もともと`getchar`だった箇所が`putchar`に変わって動く。 +コンパイラオプション必須なのは少しかっこ悪いけれど、ROT13しても動くようにするためには避けられない。 +オリジナルのコードかROT13語のコードのどちらかに未定義シンボルが発生してしまう。 + +westley.hintの作者はコメントにはいろいろなことが書いてあって、感心しきり。 + +* ver0/ver1とver2/ver3でROT13のアルゴリズムが異なるとのこと(前者は計算、後者はテーブル)。賞名はこれを指していると思う。 +* `if`文は使えないので`&&`で回避するが、この演算子の振る舞いが環境によってコンパイラのバグで違って苦労したこと(`expr1 && (expr2,expr3);`で、`expr1`が偽のときでも`expr2`が実行されたとか)。 +* 変数名の選択のセンスがすごい。 + `irk`と`vex`は互いにROT13の関係となっていて、しかも類義語(どちらも「イライラさせる」)。 + `Near`と`Arne`はROT13の関係となっているアナグラム(並べ替え)。 + `tang`と`gnat`はROT13の関係となっていて、かつ文字列反転の関係。 +* 主要トリックは`/**/ (コード1) /*/ (コード2の反転) /**/`とのこと。 + コード2がコメントアウトされている。 + これを反転させると`/**/ (コード2) /*/ (コード1の反転) /**/`となり、コード2がコメントの外に出現し、コード1の反転はコメントに閉じ込められるギミックとなっている。 + 実際には更に発展型を使っているらしい。 +* 個人的に特に感動したのは、デフォルトのver0/ver1のコード形状は`K`だが、文字列反転したときのver2/ver3のコード形状は`R`に変わること(下図)。 + ハードタブをうまく使うことで、切れ目を調整している。なお`K`はカーニハン、`R`はリッチーを表現している([K&R](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9EC))。 + +``` +/**//*/};)/**/znva(/*//**/ABBA, tang,gnat,/**\\*//*/2&ABBA(niam + ;)tang+1,tang,1+gnat(avnz&&1-^ tang;)/***/Arne){ABBA&&(gnat='Z' +!='A'-1);;ABBA&&((gnat&&(tang= getchar(0)))||((!gnat)&&(tang +=trgpune(0))));!gnat&&(ABBA== 4)&&(tang==-1)&&(tang='\a')&&( +gnat= -58);(!ABBA&&(gnat^-1) &&(tang&2)&&((Arne==1&&trgpune +(gnat))||(Arne<=1-1&&getchar (gnat))))||ABBA&&main(/*//**/0 +-ABBA,tang,gnat/*-*//*/~,/* */,/*//**/gnat^gnat/**\**//*/( +niam;)tang:56+)/*yrp*/);}irk[256]={14,15,16,17,18,19,20,21,22 +,/*//**/23/**//*/&tang(+)62%)21+)/**/,24,25,26,1,2,3,4,5,6,7, +8,9,10,11,12,/*//**/13/**//*/&tang(((?'M'=0&&znva(ABBA,tang,gnat,Near);!(ABBA &1)&&(tang^-1)&&( +tang=irk[(tang+191)%256]>0?irk[(tang+191)&255]+64:tang);znva(0,ABBA, +tang,gnat);;;(Near=tang)^-1&&((gnat==1&& (Near=getchar(0)))||(!gnat&&( +Near=trgpune(0)))||((/*//**|**/gnat,gnat, gnat/**//*/(avnz&&gnat||))))) +noon(enupgrt(&&Near-1(||)))0+noon(rahcteg (&&Near((&&)2&tang(&&1-=!noon +&&gnat!({)Near,noon,/*krelc*/)<0&&(Near= - irk[-gnat--]-2)))&&main(ABBA, +Near,gnat,0-0);znva(0-0,~ABBA,/*//**/tang, gnat/**//*/(niam/**/);}/*//**/ +``` diff --git a/_includes/1989-fubar.c.inc b/_includes/1989-fubar.c.inc new file mode 100644 index 0000000..edb2447 --- /dev/null +++ b/_includes/1989-fubar.c.inc @@ -0,0 +1,19 @@ + +#include <stdio.h> +#define QQ 1 +#define TT 1 +#define cc main(c,v) int c; char **v;{char tt[12],qq[7]; int q=0,o=1,l=1,m=1;struct {int c;} f; +#define ouroboros qq[6]='\0';tt[11]='\0';if(QQ==atoi(v[1])+1){(void)fprintf(stderr,"%s factorial = %d\n",v[1], TT);exit(1);}o=c+f +#define x ;while(EOF!=(o=getchar())){if(l && q=='Q' && o=='Q'){l=0;(void)getchar();(void)fread(qq,6,1,stdin);(void)printf("Q %6d",atoi(qq)+1);}else +if(m && q=='T' && o=='T'){m=0;(void)fread(tt,11,1,stdin);(void)printf("T %9d\n",atoi(tt)*QQ);}else {q=o;(void)putchar(o);}}exit(0);} +cc ouroboros.c -o x +#define zxc ;{/* +cat ouroboros.c | x $1 > x1 +if [ $? -ne 0 ]; then +exit +fi +mv x1 ouroboros.c +chmod +x ouroboros.c +exec ouroboros.c $1 +exit +*/ \ No newline at end of file diff --git a/_includes/1989-fubar.patch.inc b/_includes/1989-fubar.patch.inc new file mode 100644 index 0000000..0d3d407 --- /dev/null +++ b/_includes/1989-fubar.patch.inc @@ -0,0 +1,22 @@ +--- fubar.c ++++ fubar.c +@@ -4,16 +4,15 @@ + #define TT 1 + #define cc main(c,v) int c; char **v;{char tt[12],qq[7]; int q=0,o=1,l=1,m=1;struct {int c;} f; + #define ouroboros qq[6]='\0';tt[11]='\0';if(QQ==atoi(v[1])+1){(void)fprintf(stderr,"%s factorial = %d\n",v[1], TT);exit(1);}o=c+f +-#define x ;while(EOF!=(o=getchar())){if(l && q=='Q' && o=='Q'){l=0;(void)getchar();(void)fread(qq,6,1,stdin);(void)printf("Q %6d",atoi(qq)+1);}else +-if(m && q=='T' && o=='T'){m=0;(void)fread(tt,11,1,stdin);(void)printf("T %9d\n",atoi(tt)*QQ);}else {q=o;(void)putchar(o);}}exit(0);} ++#define x ;while(EOF!=(o=getchar())){if(l && q=='Q' && o=='Q'){l=0;(void)getchar();(void)fread(qq,6,1,stdin);(void)printf("Q %6d",atoi(qq)+1);}else if(m && q=='T' && o=='T'){m=0;(void)fread(tt,11,1,stdin);(void)printf("T %9d\n",atoi(tt)*QQ);}else {q=o;(void)putchar(o);}}exit(0);} + cc ouroboros.c -o x + #define zxc ;{/* +-cat ouroboros.c | x $1 > x1 ++cat ouroboros.c | ./x $1 > x1 + if [ $? -ne 0 ]; then + exit + fi + mv x1 ouroboros.c + chmod +x ouroboros.c +-exec ouroboros.c $1 ++exec ./ouroboros.c $1 + exit + */ \ No newline at end of file diff --git a/_includes/1989-jar.1.c.inc b/_includes/1989-jar.1.c.inc new file mode 100644 index 0000000..a8a3343 --- /dev/null +++ b/_includes/1989-jar.1.c.inc @@ -0,0 +1 @@ +char*_="Hello world.\n"; \ No newline at end of file diff --git a/_includes/1989-jar.2.c.inc b/_includes/1989-jar.2.c.inc new file mode 100644 index 0000000..69cb187 --- /dev/null +++ b/_includes/1989-jar.2.c.inc @@ -0,0 +1,44 @@ +#define d define +#d a include +#a <stdio.h> +#a <string.h> +#a <ctype.h> +#d p char* +#d P ,(p) +#d T(E) !strcmp(E,"()") +#d U return +#d W while +#d X sbrk(199) +#d z atof +#d e isspace +#d D A(_) +#d E S(C(_)) +#d B(y) p y(_)p _;{ +#d G(y,V) B(y)p i;U sprintf(i=X,"%lf",z(E)V z(S(C(D)))),i;} + + p sbrk(),*S(),*j(),*O,*H;K,Y,M=14;double + z();Q(_)p _;{int V=0;W(e(*_))_++;H=_;W(V|!(e + (*H)|*H==')'||(*H=='('&&H-_)))V+=(*H=='(')-(*H== + ')'),H++;U H-_;}B(C)U _++,Y=Q(_),_=strncpy(X,_,Y),_[ + Y]=0,_;}B(A)_++,_+=Q(_);W(e(*_))_++;U O=X,*O='(',strcpy( + O+1,_),O;}B(Z)U _;}B(c)U C(E);}B(q)U A(E);}B(t)p i=E;U H=S(C +(D)),sprintf(O=X,T(H )?"(%s)":"(%s %s",i,H+1) + + ,O;}B(F)U S(C(A(T(E)?D:_)));}L(i,s)p + +i,*s;{U isdigit(*i) ? z(i)!=z(s):strcmp(i,s);} + B(b)U L(E,S(C(D)))?"()":"t";}B(R)U E;}B(o)U z(E)<z(S(C(D)))? + "t":"()";}G(f,+)G(g,-)G(h,*)p r[4][2]={"function" P R, + "quote"P C,"lambda"P Z,"defun"P j};B(j)U r[M][1]=D,* + r[M++]=C(_);}p not[99][2]={"if"P F,"equal"P b,"<" + P o,"+"P f,"-"P g,"*"P h,"car"P c,"cdr"P q, + "cons"P t,"t","t"};B(S)int Li,s;p u;if( + isdigit(*_)|T(_))U _;for(Y=M;Y--;) + if(!strcmp(_,*r[Y]))U r[Y][1] + ;u=E,_=D;if(*u-'(')U(*((p(*)())u) + )(_);s=Li=M;W(!T(_))r[M][1]=E,*r[M++] + ="",_=D;O=C(u);W(!T(O))*r[Li++]=C(O),O=A(O);U O=S + (C(A(u))),M=s,O;}main(){H=O=X,Y=0;W(Y|!e(K=getchar()))K== + EOF?exit(0):0,Y+=(K=='(')-(K==')'),*H++=K;*H=0,puts(S(O)) + , + main();{printf("XLISP 4.0\n");}} \ No newline at end of file diff --git a/_includes/1989-jar.2.patch.inc b/_includes/1989-jar.2.patch.inc new file mode 100644 index 0000000..293d4e6 --- /dev/null +++ b/_includes/1989-jar.2.patch.inc @@ -0,0 +1,56 @@ +--- jar.2.c ++++ jar.2.c +@@ -1,20 +1,20 @@ + #define d define +-#d a include +-#a <stdio.h> +-#a <string.h> +-#a <ctype.h> +-#d p char* +-#d P ,(p) +-#d T(E) !strcmp(E,"()") +-#d U return +-#d W while +-#d X sbrk(199) +-#d z atof +-#d e isspace +-#d D A(_) +-#d E S(C(_)) +-#d B(y) p y(_)p _;{ +-#d G(y,V) B(y)p i;U sprintf(i=X,"%lf",z(E)V z(S(C(D)))),i;} ++#define a include ++#include <stdio.h> ++#include <string.h> ++#include <ctype.h> ++#define p char* ++#define P ,(p) ++#define T(E) !strcmp(E,"()") ++#define U return ++#define W while ++#define X sbrk(199) ++#define z atof ++#define e isspace ++#define D A(_) ++#define E S(C(_)) ++#define B(y) p y(_)p _;{ ++#define G(y,V) B(y)p i;U sprintf(i=X,"%lf",z(E)V z(S(C(D)))),i;} + + p sbrk(),*S(),*j(),*O,*H;K,Y,M=14;double + z();Q(_)p _;{int V=0;W(e(*_))_++;H=_;W(V|!(e +@@ -28,11 +28,11 @@ + + i,*s;{U isdigit(*i) ? z(i)!=z(s):strcmp(i,s);} + B(b)U L(E,S(C(D)))?"()":"t";}B(R)U E;}B(o)U z(E)<z(S(C(D)))? +- "t":"()";}G(f,+)G(g,-)G(h,*)p r[4][2]={"function" P R, +- "quote"P C,"lambda"P Z,"defun"P j};B(j)U r[M][1]=D,* +- r[M++]=C(_);}p not[99][2]={"if"P F,"equal"P b,"<" +- P o,"+"P f,"-"P g,"*"P h,"car"P c,"cdr"P q, +- "cons"P t,"t","t"};B(S)int Li,s;p u;if( ++ "t":"()";}G(f,+)G(g,-)G(h,*)p r[99][2]={"function" P R, ++ "quote"P C,"lambda"P Z,"defun"P j,"if"P F,"equal"P b ++ ,"<"P o,"+"P f,"-"P g,"*"P h, "car"P c, "cdr"P q, ++ "cons"P t,"t","t"};B(j)U r[M][1]=D,*r[M++]= ++ C(_);;;;;;;;;;;;;;}B(S)int Li,s;p u;if( + isdigit(*_)|T(_))U _;for(Y=M;Y--;) + if(!strcmp(_,*r[Y]))U r[Y][1] + ;u=E,_=D;if(*u-'(')U(*((p(*)())u) \ No newline at end of file diff --git a/_includes/1989-ovdluhe.c.inc b/_includes/1989-ovdluhe.c.inc new file mode 100644 index 0000000..f75b869 --- /dev/null +++ b/_includes/1989-ovdluhe.c.inc @@ -0,0 +1,21 @@ +#include <string.h> +typedef char ape +#define D define +#D EA register +#D EP unsigned +#D A 1 +#D AP (A<<A) +#D P (A<<AP) +#D AE ((P<<P)<<A) +#D PE (((A<<P)<<P)<<P) +#D E ((EP)A>>A) +#D APE {EA EP ape ea=AE;while(ea--) e[ea]=E;} +;ape a[PE+A],ap,*ae,p[P+A],e[AE]; +main(){ape pe,*ep=a;srand((EP)time((long)E)); +while(((*(ep++)=getchar())!=-A)&&((ep-a)<PE)); +*(ae= --ep)=E;for(ap=E;ap<=P;){APE;if(pe=PA()) +{putchar(pe);if(ap<P){p[ap]=pe;ap++;}else{ +ep=p+A;while(*ep) *(ep-A)= *(ep++); *(ep-A)=pe;}}else break;}} +PA(){EA ape pe,*ep=a,pa,Ap=E;for(ep=a;ep<ae-P;ep++) +if(!strncmp(ep,p,ap)){e[*(ep+ap)]++;Ap++;}if(!Ap)return(Ap); +pa=rand()%Ap+A;pe=~E,Ap=!Ap;while((Ap+=e[++pe])<pa);return(pe);} \ No newline at end of file diff --git a/_includes/1989-ovdluhe.patch.inc b/_includes/1989-ovdluhe.patch.inc new file mode 100644 index 0000000..4092a0c --- /dev/null +++ b/_includes/1989-ovdluhe.patch.inc @@ -0,0 +1,34 @@ +--- ovdluhe.c ++++ ovdluhe.c +@@ -1,21 +1,21 @@ + #include <string.h> + typedef char ape + #define D define +-#D EA register +-#D EP unsigned +-#D A 1 +-#D AP (A<<A) +-#D P (A<<AP) +-#D AE ((P<<P)<<A) +-#D PE (((A<<P)<<P)<<P) +-#D E ((EP)A>>A) +-#D APE {EA EP ape ea=AE;while(ea--) e[ea]=E;} ++#define EA register ++#define EP unsigned ++#define A 1 ++#define AP (A<<A) ++#define P (A<<AP) ++#define AE ((P<<P)<<A) ++#define PE (((A<<P)<<P)<<P) ++#define E ((EP)A>>A) ++#define APE {EA EP char ea=AE;while(ea--) e[ea]=E;} + ;ape a[PE+A],ap,*ae,p[P+A],e[AE]; + main(){ape pe,*ep=a;srand((EP)time((long)E)); + while(((*(ep++)=getchar())!=-A)&&((ep-a)<PE)); + *(ae= --ep)=E;for(ap=E;ap<=P;){APE;if(pe=PA()) + {putchar(pe);if(ap<P){p[ap]=pe;ap++;}else{ +-ep=p+A;while(*ep) *(ep-A)= *(ep++); *(ep-A)=pe;}}else break;}} ++ep=p+A;while(*ep) *(ep-A)= *(ep),ep++; *(ep-A)=pe;}}else break;}} + PA(){EA ape pe,*ep=a,pa,Ap=E;for(ep=a;ep<ae-P;ep++) + if(!strncmp(ep,p,ap)){e[*(ep+ap)]++;Ap++;}if(!Ap)return(Ap); + pa=rand()%Ap+A;pe=~E,Ap=!Ap;while((Ap+=e[++pe])<pa);return(pe);} \ No newline at end of file diff --git a/_includes/1989-paul.c.inc b/_includes/1989-paul.c.inc new file mode 100644 index 0000000..467f987 --- /dev/null +++ b/_includes/1989-paul.c.inc @@ -0,0 +1,35 @@ +#include <stdio.h> +#define f int +#define v (void)printf( +#define x ),exit(1); +#define y ){if(n)c=z(n,u),u=n,n=c;o[i]=n?'0'+(1&*n):'0';} +#define z(a,b) (f*)(~1&*a^(f)b) +#define k(l) if(!(l=(f*)malloc(sizeof(l))))v 23+m x if(1&(f)l)v 39+m x*l= +r(p,q,d)f*p,*q;{char o[81];f*n=p,i=39,*c,*u=d?q:z(p,q);o[40]='0'+(1&*p); +for(;i>=0;i--y u=d?z(p,q):q;n=p;for(i=41;i<79;i++y o[i++]='\r';o[i++]=0; +v o);(void)fflush(stdout);sleep(1);} +main(a,c)char**c;{char*u,*malloc(),*m= +"Usage: black [string]\n\0No more memory\n\0Unusable memory alignment\n\0jt,s@m@ (beleY%XX&Yz {z&z}i|R(|)*((.)i)hiniFiGJ%FG.JJgJ: ;;&;z {z&z}-RS/ROiOV OP+PsaPh+ijainnjmamfmfAlnnnnphppopv%vvgv.aABiB1/BVP11/1.%..&.OhrR-WV V1#1VP1CcC0R\ +\n\n'CVP0\n!\n\n'\nEaEEnEamat!akckk'kwaww'wz,zzozEit +", +*n=m;f*q,*p=0,*g,b=3,d; +if(a>2)v m x n=a>1?c[1]:n; +/*v"\t\t\t\t\tV\n");*/ +k(q)0;u=n;a=~1&'j'; +while(a!='x'){ + /*r(q,p,b);*/ + for(;;u+=3){ + u= *u?u:n; + if((~1&*u)==a&&(1&*q)<<1==(2&u[2]))break; + } + a=~1&u[1]; + d=(8&u[2])>>3; + if(16&u[2])putchar(u[3]); + if(4&u[2])*q|=1;else*q&=~1; + if(b==d)g=p;else{ + g=z(q,p); + if(!g){k(g)(f)q;*q^=(f)g;} + } + p=q;q=g;b=1-d; +} +/*r(q,p,b);v"\n");*/exit(0); +} \ No newline at end of file diff --git a/_includes/1989-robison.c.inc b/_includes/1989-robison.c.inc new file mode 100644 index 0000000..b9b61f2 --- /dev/null +++ b/_includes/1989-robison.c.inc @@ -0,0 +1,33 @@ + typedef struct A*B,*(*C)();struct A{C(*d)();B e;}*v(),*b;C n[256]; +# include <stdio.h> +#define a (d->e) +#define o (B)printf +#define X(_){return _;} +#define Y(_,A)B _(d,e)B d,e;X(A) +#define Z(P)C P(f,g,h,i)C f,g,h,i;X(P) +#define c(_)(b=(B)malloc(sizeof(*b)),b->d=_,b->e=d,b) +#define _(D,E,F,G,H)B D();Y(D/**/f,E)Y(D/**/g,F)Y(D/**/h,G)Y(D/**/i,H)Y(D,(*(*d->d)(D/**/f,D/**/g,D/**/h,D/**/i))(d,e)) +Z(f) +Z(g) +Z(h) +Z(i) +_(j,d,d,j a,j a) +_(k,d,c(h),c(h),c(h)) +_(l,c(i),d,c(i),c(i)) +_(m,c(g),c(f),l(m a),k(m a)) +_(p,d,l(m(d)),k(p a),l(m a)) +_(q,l(p(d)),m(d),l a,k(q a)) +_(r,m(d),k(mf a),l(r a),k a) +_(s,d,e,o("0",s a),o("1",s a)) +_(t,d,p(e),k(t(a,e)),v(k(t(a,e)),e)) +_(u,k(e),l(r(e)),k(v(a,e)),l(v(a,e))) +_(v,e,r(e),u(e,a),u(q(e),a)) +_(w,o("0"),d,s(d),s(d)) +_(x,(*n[getchar()])(d),o("-1"),w(p(d,o("-"))),xh(d)) +_(y,xf(mg()),v(d,p(yf())),v(d,yf()),t(d,yf())) +_(z,xf(yf()),(*(*j(d)->d)(w,x))(d),xf(k(d)),xf(l(d))) +main(){ +n['(']=zf;n['x']=yi;n['-']=yg; +n['+']=yh;n['0']=zh;n['1']=zi; +n[' ']=xf;n[')']=n['\n']=kf; +o("\n",zg(yf()));} \ No newline at end of file diff --git a/_includes/1989-robison.patch.inc b/_includes/1989-robison.patch.inc new file mode 100644 index 0000000..5c52303 --- /dev/null +++ b/_includes/1989-robison.patch.inc @@ -0,0 +1,11 @@ +--- robison.c ++++ robison.c +@@ -6,7 +6,7 @@ + #define Y(_,A)B _(d,e)B d,e;X(A) + #define Z(P)C P(f,g,h,i)C f,g,h,i;X(P) + #define c(_)(b=(B)malloc(sizeof(*b)),b->d=_,b->e=d,b) +-#define _(D,E,F,G,H)B D();Y(D/**/f,E)Y(D/**/g,F)Y(D/**/h,G)Y(D/**/i,H)Y(D,(*(*d->d)(D/**/f,D/**/g,D/**/h,D/**/i))(d,e)) ++#define _(D,E,F,G,H)B D();Y(D##f,E)Y(D##g,F)Y(D##h,G)Y(D##i,H)Y(D,(*(*d->d)(D##f,D##g,D##h,D##i))(d,e)) + Z(f) + Z(g) + Z(h) \ No newline at end of file diff --git a/_includes/1989-roemer.c.inc b/_includes/1989-roemer.c.inc new file mode 100644 index 0000000..80b514c --- /dev/null +++ b/_includes/1989-roemer.c.inc @@ -0,0 +1,36 @@ + + + char + _3141592654[3141 + ],__3141[3141];_314159[31415],_3141[31415];main(){register char* + _3_141,*_3_1415, *_3__1415; register int _314,_31415,__31415,*_31, + _3_14159,__3_1415;*_3141592654=__31415=2,_3141592654[0][_3141592654 + -1]=1[__3141]=5;__3_1415=1;do{_3_14159=_314=0,__31415++;for( _31415 + =0;_31415<(3,14-4)*__31415;_31415++)_31415[_3141]=_314159[_31415]= - +1;_3141[*_314159=_3_14159]=_314;_3_141=_3141592654+__3_1415;_3_1415= +__3_1415 +__3141;for (_31415 = 3141- + __3_1415 ; _31415;_31415-- + ,_3_141 ++, _3_1415++){_314 + +=_314<<2 ; _314<<=1;_314+= + *_3_1415;_31 =_314159+_314; + if(!(*_31+1) )* _31 =_314 / + __31415,_314 [_3141]=_314 % + __31415 ;* ( _3__1415=_3_141 + )+= *_3_1415 = *_31;while(* + _3__1415 >= 31415/3141 ) * + _3__1415+= - 10,(*--_3__1415 + )++;_314=_314 [_3141]; if ( ! + _3_14159 && * _3_1415)_3_14159 + =1,__3_1415 = 3141-_31415;}if( + _314+(__31415 >>1)>=__31415 ) + while ( ++ * _3_141==3141/314 + )*_3_141--=0 ;}while(_3_14159 + ) ; { char * __3_14= "3.1415"; + write((3,1), (--*__3_14,__3_14 + ),(_3_14159 ++,++_3_14159))+ + 3.1415926; } for ( _31415 = 1; + _31415<3141- 1;_31415++)write( + 31415% 314-( 3,14),_3141592654[ + _31415 ] + "0123456789","314" + [ 3]+1)-_314; puts((*_3141592654=0 +,_3141592654)) ;_314= *"3.141592";} \ No newline at end of file diff --git a/_includes/1989-roemer.patch.inc b/_includes/1989-roemer.patch.inc new file mode 100644 index 0000000..8d74ef3 --- /dev/null +++ b/_includes/1989-roemer.patch.inc @@ -0,0 +1,11 @@ +--- roemer.c ++++ roemer.c +@@ -25,7 +25,7 @@ + _314+(__31415 >>1)>=__31415 ) + while ( ++ * _3_141==3141/314 + )*_3_141--=0 ;}while(_3_14159 +- ) ; { char * __3_14= "3.1415"; ++ );{char s[]= "3.1415",*__3_14=s; + write((3,1), (--*__3_14,__3_14 + ),(_3_14159 ++,++_3_14159))+ + 3.1415926; } for ( _31415 = 1; \ No newline at end of file diff --git a/_includes/1989-tromp.bsd.c.inc b/_includes/1989-tromp.bsd.c.inc new file mode 100644 index 0000000..3c5a574 --- /dev/null +++ b/_includes/1989-tromp.bsd.c.inc @@ -0,0 +1,19 @@ +long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K +=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1, +12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12, +1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12, +12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i])-Q[i] +){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28);printf( +"\033[%dm "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+ +n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char* +*V,*a;{h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i< +25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigvec(14,v, +0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+ +12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){ +for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c +=a[5]);}}if(c==*a)G(--x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if(c==a[2])G +(++x)||--x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){s=sigblock( +8192);printf("\033[H\033[J\033[0m%d\n",w);if(c==a[5])break;for(j=264;j--;Q[j]= +0);while(getchar()-a[4]);puts("\033[H\033[J\033[7m");sigsetmask(s);}}d=popen( +"stty -cbreak echo stop \023;cat - HI|sort -rn|head -20>/tmp/$$;mv /tmp/$$ HI\ +;cat HI","w");fprintf(d,"%4d on level %1d by %s\n",w,l,getlogin());pclose(d);} \ No newline at end of file diff --git a/_includes/1989-tromp.bsd.patch.inc b/_includes/1989-tromp.bsd.patch.inc new file mode 100644 index 0000000..e662b79 --- /dev/null +++ b/_includes/1989-tromp.bsd.patch.inc @@ -0,0 +1,19 @@ +--- tromp.bsd.c ++++ tromp.bsd.c +@@ -1,4 +1,4 @@ +-long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K ++long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}long c,d,l,v[]={0,0,2},w,s,I,K + =0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1, + 12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12, + 1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12, +@@ -6,8 +6,8 @@ + ){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28);printf( + "\033[%dm "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+ + n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char* +-*V,*a;{h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i< +-25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigvec(14,v, ++*V,*a;{*v=(long)t;h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i< ++25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigaction(14,v, + 0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+ + 12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){ + for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c \ No newline at end of file diff --git a/_includes/1989-vanb.c.inc b/_includes/1989-vanb.c.inc new file mode 100644 index 0000000..b05f68f --- /dev/null +++ b/_includes/1989-vanb.c.inc @@ -0,0 +1 @@ +main(Q,O)char**O;{if(--Q){main(Q,O);O[Q][0]^=0X80;for(O[0][0]=0;O[++O[0][0]]!=0;)if(O[O[0][0]][0]>0)puts(O[O[0][0]]);puts("----------");main(Q,O);}} \ No newline at end of file diff --git a/_includes/1989-westley.c.inc b/_includes/1989-westley.c.inc new file mode 100644 index 0000000..5b4e917 --- /dev/null +++ b/_includes/1989-westley.c.inc @@ -0,0 +1,24 @@ + +/**//*/};)/**/main(/*//**/tang ,gnat/**//*/,ABBA~,0-0(avnz;)0-0,tang,raeN +,ABBA(niam&&)))2-]--tang-[kri - =raeN(&&0<)/*clerk*/,noon,raeN){(!tang&& +noon!=-1&&(gnat&2)&&((raeN&&( getchar(noon+0)))||(1-raeN&&(trgpune(noon +)))))||tang&&znva(/*//**/tang ,tang,tang/**|**//*/((||)))0(enupgrt=raeN +(&&tang!(||)))0(rahcteg=raeN( &&1==tang((&&1-^)gnat=raeN(;;;)tang,gnat +,ABBA,0(avnz;)gnat:46+]552&)191+gnat([kri?0>]652%)191+gnat([kri=gnat +(&&)1-^gnat(&&)1& ABBA(!;)raeN,tang,gnat,ABBA(avnz&&0>ABBA{)raeN +,/**/);}znva(/*//**/tang,gnat,ABBA/**//*/(niam;}1-,78-,611-,321 +-,321-,001-,64-,43-,801-,001-,301-,321-,511-,53-,54,44,34,24 +,14,04,93,83,73,63,53,43,33,85,75,65,55,45,35,25,15,05,94,84 +,74,64,0,0,0,0,0,0,/**/){ABBA='N'==65;(ABBA&&(gnat=trgpune +(0)))||(!ABBA&&(gnat=getchar(0-0)));(--tang&1)&&(gnat='n'<= +gnat&&gnat<='z'||'a'<=gnat&&gnat<='m'||'N'<=gnat&&gnat<='Z' +||'A'<=gnat&&gnat<='M'?(((gnat&/*//**/31/**//*/,21,11,01,9,8 +,7,6,5,4,3,2,1,62,52,42,/**/)+12)%26)+(gnat&/*//**/32/**//*/, +22,12,02,91,81,71,61,51,41{=]652[kri};)/*pry*/)+65:gnat);main +(/*//**\**/tang^tang/**//*/,/* */,~/*//*-*/tang,gnat,ABBA- +0/**//*/(niam&&ABBA||))))tang( rahcteg&&1-1=<enrA(||))tang( +enupgrt&&1==enrA((&&)2&gnat(&& )1-^tang(&&ABBA!(;)85- =tang +(&&)'a\'=gnat(&&)1-==gnat(&&)4 ==ABBA(&&tang!;))))0(enupgrt= + gnat(&&)tang!((||)))0(rahcteg =gnat(&&tang((&&ABBA;;)1-'A'=! +'Z'=tang(&&ABBA{)enrA/***/);gnat ^-1&&znva(tang+1,gnat,1+gnat); + main(ABBA&2/*//*\\**/,tang,gnat ,ABBA/**//*/(avnz/**/);}/*//**/ \ No newline at end of file diff --git a/_src/1989/fubar.c b/_src/1989/fubar.c new file mode 100644 index 0000000..51d90b0 --- /dev/null +++ b/_src/1989/fubar.c @@ -0,0 +1,19 @@ + +#include +#define QQ 1 +#define TT 1 +#define cc main(c,v) int c; char **v;{char tt[12],qq[7]; int q=0,o=1,l=1,m=1;struct {int c;} f; +#define ouroboros qq[6]='\0';tt[11]='\0';if(QQ==atoi(v[1])+1){(void)fprintf(stderr,"%s factorial = %d\n",v[1], TT);exit(1);}o=c+f +#define x ;while(EOF!=(o=getchar())){if(l && q=='Q' && o=='Q'){l=0;(void)getchar();(void)fread(qq,6,1,stdin);(void)printf("Q %6d",atoi(qq)+1);}else +if(m && q=='T' && o=='T'){m=0;(void)fread(tt,11,1,stdin);(void)printf("T %9d\n",atoi(tt)*QQ);}else {q=o;(void)putchar(o);}}exit(0);} +cc ouroboros.c -o x +#define zxc ;{/* +cat ouroboros.c | x $1 > x1 +if [ $? -ne 0 ]; then +exit +fi +mv x1 ouroboros.c +chmod +x ouroboros.c +exec ouroboros.c $1 +exit +*/ diff --git a/_src/1989/fubar.new.c b/_src/1989/fubar.new.c new file mode 100644 index 0000000..9c93c91 --- /dev/null +++ b/_src/1989/fubar.new.c @@ -0,0 +1,18 @@ + +#include +#define QQ 1 +#define TT 1 +#define cc main(c,v) int c; char **v;{char tt[12],qq[7]; int q=0,o=1,l=1,m=1;struct {int c;} f; +#define ouroboros qq[6]='\0';tt[11]='\0';if(QQ==atoi(v[1])+1){(void)fprintf(stderr,"%s factorial = %d\n",v[1], TT);exit(1);}o=c+f +#define x ;while(EOF!=(o=getchar())){if(l && q=='Q' && o=='Q'){l=0;(void)getchar();(void)fread(qq,6,1,stdin);(void)printf("Q %6d",atoi(qq)+1);}else if(m && q=='T' && o=='T'){m=0;(void)fread(tt,11,1,stdin);(void)printf("T %9d\n",atoi(tt)*QQ);}else {q=o;(void)putchar(o);}}exit(0);} +cc ouroboros.c -o x +#define zxc ;{/* +cat ouroboros.c | ./x $1 > x1 +if [ $? -ne 0 ]; then +exit +fi +mv x1 ouroboros.c +chmod +x ouroboros.c +exec ./ouroboros.c $1 +exit +*/ diff --git a/_src/1989/jar.1.c b/_src/1989/jar.1.c new file mode 100644 index 0000000..2534e60 --- /dev/null +++ b/_src/1989/jar.1.c @@ -0,0 +1 @@ +char*_="Hello world.\n"; diff --git a/_src/1989/jar.2.c b/_src/1989/jar.2.c new file mode 100644 index 0000000..7ac78ce --- /dev/null +++ b/_src/1989/jar.2.c @@ -0,0 +1,44 @@ +#define d define +#d a include +#a +#a +#a +#d p char* +#d P ,(p) +#d T(E) !strcmp(E,"()") +#d U return +#d W while +#d X sbrk(199) +#d z atof +#d e isspace +#d D A(_) +#d E S(C(_)) +#d B(y) p y(_)p _;{ +#d G(y,V) B(y)p i;U sprintf(i=X,"%lf",z(E)V z(S(C(D)))),i;} + + p sbrk(),*S(),*j(),*O,*H;K,Y,M=14;double + z();Q(_)p _;{int V=0;W(e(*_))_++;H=_;W(V|!(e + (*H)|*H==')'||(*H=='('&&H-_)))V+=(*H=='(')-(*H== + ')'),H++;U H-_;}B(C)U _++,Y=Q(_),_=strncpy(X,_,Y),_[ + Y]=0,_;}B(A)_++,_+=Q(_);W(e(*_))_++;U O=X,*O='(',strcpy( + O+1,_),O;}B(Z)U _;}B(c)U C(E);}B(q)U A(E);}B(t)p i=E;U H=S(C +(D)),sprintf(O=X,T(H )?"(%s)":"(%s %s",i,H+1) + + ,O;}B(F)U S(C(A(T(E)?D:_)));}L(i,s)p + +i,*s;{U isdigit(*i) ? z(i)!=z(s):strcmp(i,s);} + B(b)U L(E,S(C(D)))?"()":"t";}B(R)U E;}B(o)U z(E) +#include +#include +#define p char* +#define P ,(p) +#define T(E) !strcmp(E,"()") +#define U return +#define W while +#define X sbrk(199) +#define z atof +#define e isspace +#define D A(_) +#define E S(C(_)) +#define B(y) p y(_)p _;{ +#define G(y,V) B(y)p i;U sprintf(i=X,"%lf",z(E)V z(S(C(D)))),i;} + + p sbrk(),*S(),*j(),*O,*H;K,Y,M=14;double + z();Q(_)p _;{int V=0;W(e(*_))_++;H=_;W(V|!(e + (*H)|*H==')'||(*H=='('&&H-_)))V+=(*H=='(')-(*H== + ')'),H++;U H-_;}B(C)U _++,Y=Q(_),_=strncpy(X,_,Y),_[ + Y]=0,_;}B(A)_++,_+=Q(_);W(e(*_))_++;U O=X,*O='(',strcpy( + O+1,_),O;}B(Z)U _;}B(c)U C(E);}B(q)U A(E);}B(t)p i=E;U H=S(C +(D)),sprintf(O=X,T(H )?"(%s)":"(%s %s",i,H+1) + + ,O;}B(F)U S(C(A(T(E)?D:_)));}L(i,s)p + +i,*s;{U isdigit(*i) ? z(i)!=z(s):strcmp(i,s);} + B(b)U L(E,S(C(D)))?"()":"t";}B(R)U E;}B(o)U z(E) +typedef char ape +#define D define +#D EA register +#D EP unsigned +#D A 1 +#D AP (A<>A) +#D APE {EA EP ape ea=AE;while(ea--) e[ea]=E;} +;ape a[PE+A],ap,*ae,p[P+A],e[AE]; +main(){ape pe,*ep=a;srand((EP)time((long)E)); +while(((*(ep++)=getchar())!=-A)&&((ep-a) +typedef char ape +#define D define +#define EA register +#define EP unsigned +#define A 1 +#define AP (A<>A) +#define APE {EA EP char ea=AE;while(ea--) e[ea]=E;} +;ape a[PE+A],ap,*ae,p[P+A],e[AE]; +main(){ape pe,*ep=a;srand((EP)time((long)E)); +while(((*(ep++)=getchar())!=-A)&&((ep-a) +#define f int +#define v (void)printf( +#define x ),exit(1); +#define y ){if(n)c=z(n,u),u=n,n=c;o[i]=n?'0'+(1&*n):'0';} +#define z(a,b) (f*)(~1&*a^(f)b) +#define k(l) if(!(l=(f*)malloc(sizeof(l))))v 23+m x if(1&(f)l)v 39+m x*l= +r(p,q,d)f*p,*q;{char o[81];f*n=p,i=39,*c,*u=d?q:z(p,q);o[40]='0'+(1&*p); +for(;i>=0;i--y u=d?z(p,q):q;n=p;for(i=41;i<79;i++y o[i++]='\r';o[i++]=0; +v o);(void)fflush(stdout);sleep(1);} +main(a,c)char**c;{char*u,*malloc(),*m= +"Usage: black [string]\n\0No more memory\n\0Unusable memory alignment\n\0jt,s@m@ (beleY%XX&Yz {z&z}i|R(|)*((.)i)hiniFiGJ%FG.JJgJ: ;;&;z {z&z}-RS/ROiOV OP+PsaPh+ijainnjmamfmfAlnnnnphppopv%vvgv.aABiB1/BVP11/1.%..&.OhrR-WV V1#1VP1CcC0R\ +\n\n'CVP0\n!\n\n'\nEaEEnEamat!akckk'kwaww'wz,zzozEit +", +*n=m;f*q,*p=0,*g,b=3,d; +if(a>2)v m x n=a>1?c[1]:n; +/*v"\t\t\t\t\tV\n");*/ +k(q)0;u=n;a=~1&'j'; +while(a!='x'){ + /*r(q,p,b);*/ + for(;;u+=3){ + u= *u?u:n; + if((~1&*u)==a&&(1&*q)<<1==(2&u[2]))break; + } + a=~1&u[1]; + d=(8&u[2])>>3; + if(16&u[2])putchar(u[3]); + if(4&u[2])*q|=1;else*q&=~1; + if(b==d)g=p;else{ + g=z(q,p); + if(!g){k(g)(f)q;*q^=(f)g;} + } + p=q;q=g;b=1-d; +} +/*r(q,p,b);v"\n");*/exit(0); +} diff --git a/_src/1989/robison.c b/_src/1989/robison.c new file mode 100644 index 0000000..3a3a72c --- /dev/null +++ b/_src/1989/robison.c @@ -0,0 +1,33 @@ + typedef struct A*B,*(*C)();struct A{C(*d)();B e;}*v(),*b;C n[256]; +# include +#define a (d->e) +#define o (B)printf +#define X(_){return _;} +#define Y(_,A)B _(d,e)B d,e;X(A) +#define Z(P)C P(f,g,h,i)C f,g,h,i;X(P) +#define c(_)(b=(B)malloc(sizeof(*b)),b->d=_,b->e=d,b) +#define _(D,E,F,G,H)B D();Y(D/**/f,E)Y(D/**/g,F)Y(D/**/h,G)Y(D/**/i,H)Y(D,(*(*d->d)(D/**/f,D/**/g,D/**/h,D/**/i))(d,e)) +Z(f) +Z(g) +Z(h) +Z(i) +_(j,d,d,j a,j a) +_(k,d,c(h),c(h),c(h)) +_(l,c(i),d,c(i),c(i)) +_(m,c(g),c(f),l(m a),k(m a)) +_(p,d,l(m(d)),k(p a),l(m a)) +_(q,l(p(d)),m(d),l a,k(q a)) +_(r,m(d),k(mf a),l(r a),k a) +_(s,d,e,o("0",s a),o("1",s a)) +_(t,d,p(e),k(t(a,e)),v(k(t(a,e)),e)) +_(u,k(e),l(r(e)),k(v(a,e)),l(v(a,e))) +_(v,e,r(e),u(e,a),u(q(e),a)) +_(w,o("0"),d,s(d),s(d)) +_(x,(*n[getchar()])(d),o("-1"),w(p(d,o("-"))),xh(d)) +_(y,xf(mg()),v(d,p(yf())),v(d,yf()),t(d,yf())) +_(z,xf(yf()),(*(*j(d)->d)(w,x))(d),xf(k(d)),xf(l(d))) +main(){ +n['(']=zf;n['x']=yi;n['-']=yg; +n['+']=yh;n['0']=zh;n['1']=zi; +n[' ']=xf;n[')']=n['\n']=kf; +o("\n",zg(yf()));} diff --git a/_src/1989/robison.new.c b/_src/1989/robison.new.c new file mode 100644 index 0000000..7b66a91 --- /dev/null +++ b/_src/1989/robison.new.c @@ -0,0 +1,33 @@ + typedef struct A*B,*(*C)();struct A{C(*d)();B e;}*v(),*b;C n[256]; +# include +#define a (d->e) +#define o (B)printf +#define X(_){return _;} +#define Y(_,A)B _(d,e)B d,e;X(A) +#define Z(P)C P(f,g,h,i)C f,g,h,i;X(P) +#define c(_)(b=(B)malloc(sizeof(*b)),b->d=_,b->e=d,b) +#define _(D,E,F,G,H)B D();Y(D##f,E)Y(D##g,F)Y(D##h,G)Y(D##i,H)Y(D,(*(*d->d)(D##f,D##g,D##h,D##i))(d,e)) +Z(f) +Z(g) +Z(h) +Z(i) +_(j,d,d,j a,j a) +_(k,d,c(h),c(h),c(h)) +_(l,c(i),d,c(i),c(i)) +_(m,c(g),c(f),l(m a),k(m a)) +_(p,d,l(m(d)),k(p a),l(m a)) +_(q,l(p(d)),m(d),l a,k(q a)) +_(r,m(d),k(mf a),l(r a),k a) +_(s,d,e,o("0",s a),o("1",s a)) +_(t,d,p(e),k(t(a,e)),v(k(t(a,e)),e)) +_(u,k(e),l(r(e)),k(v(a,e)),l(v(a,e))) +_(v,e,r(e),u(e,a),u(q(e),a)) +_(w,o("0"),d,s(d),s(d)) +_(x,(*n[getchar()])(d),o("-1"),w(p(d,o("-"))),xh(d)) +_(y,xf(mg()),v(d,p(yf())),v(d,yf()),t(d,yf())) +_(z,xf(yf()),(*(*j(d)->d)(w,x))(d),xf(k(d)),xf(l(d))) +main(){ +n['(']=zf;n['x']=yi;n['-']=yg; +n['+']=yh;n['0']=zh;n['1']=zi; +n[' ']=xf;n[')']=n['\n']=kf; +o("\n",zg(yf()));} diff --git a/_src/1989/roemer.c b/_src/1989/roemer.c new file mode 100644 index 0000000..3e476f5 --- /dev/null +++ b/_src/1989/roemer.c @@ -0,0 +1,36 @@ + + + char + _3141592654[3141 + ],__3141[3141];_314159[31415],_3141[31415];main(){register char* + _3_141,*_3_1415, *_3__1415; register int _314,_31415,__31415,*_31, + _3_14159,__3_1415;*_3141592654=__31415=2,_3141592654[0][_3141592654 + -1]=1[__3141]=5;__3_1415=1;do{_3_14159=_314=0,__31415++;for( _31415 + =0;_31415<(3,14-4)*__31415;_31415++)_31415[_3141]=_314159[_31415]= - +1;_3141[*_314159=_3_14159]=_314;_3_141=_3141592654+__3_1415;_3_1415= +__3_1415 +__3141;for (_31415 = 3141- + __3_1415 ; _31415;_31415-- + ,_3_141 ++, _3_1415++){_314 + +=_314<<2 ; _314<<=1;_314+= + *_3_1415;_31 =_314159+_314; + if(!(*_31+1) )* _31 =_314 / + __31415,_314 [_3141]=_314 % + __31415 ;* ( _3__1415=_3_141 + )+= *_3_1415 = *_31;while(* + _3__1415 >= 31415/3141 ) * + _3__1415+= - 10,(*--_3__1415 + )++;_314=_314 [_3141]; if ( ! + _3_14159 && * _3_1415)_3_14159 + =1,__3_1415 = 3141-_31415;}if( + _314+(__31415 >>1)>=__31415 ) + while ( ++ * _3_141==3141/314 + )*_3_141--=0 ;}while(_3_14159 + ) ; { char * __3_14= "3.1415"; + write((3,1), (--*__3_14,__3_14 + ),(_3_14159 ++,++_3_14159))+ + 3.1415926; } for ( _31415 = 1; + _31415<3141- 1;_31415++)write( + 31415% 314-( 3,14),_3141592654[ + _31415 ] + "0123456789","314" + [ 3]+1)-_314; puts((*_3141592654=0 +,_3141592654)) ;_314= *"3.141592";} diff --git a/_src/1989/roemer.new.c b/_src/1989/roemer.new.c new file mode 100644 index 0000000..1d4eb5f --- /dev/null +++ b/_src/1989/roemer.new.c @@ -0,0 +1,36 @@ + + + char + _3141592654[3141 + ],__3141[3141];_314159[31415],_3141[31415];main(){register char* + _3_141,*_3_1415, *_3__1415; register int _314,_31415,__31415,*_31, + _3_14159,__3_1415;*_3141592654=__31415=2,_3141592654[0][_3141592654 + -1]=1[__3141]=5;__3_1415=1;do{_3_14159=_314=0,__31415++;for( _31415 + =0;_31415<(3,14-4)*__31415;_31415++)_31415[_3141]=_314159[_31415]= - +1;_3141[*_314159=_3_14159]=_314;_3_141=_3141592654+__3_1415;_3_1415= +__3_1415 +__3141;for (_31415 = 3141- + __3_1415 ; _31415;_31415-- + ,_3_141 ++, _3_1415++){_314 + +=_314<<2 ; _314<<=1;_314+= + *_3_1415;_31 =_314159+_314; + if(!(*_31+1) )* _31 =_314 / + __31415,_314 [_3141]=_314 % + __31415 ;* ( _3__1415=_3_141 + )+= *_3_1415 = *_31;while(* + _3__1415 >= 31415/3141 ) * + _3__1415+= - 10,(*--_3__1415 + )++;_314=_314 [_3141]; if ( ! + _3_14159 && * _3_1415)_3_14159 + =1,__3_1415 = 3141-_31415;}if( + _314+(__31415 >>1)>=__31415 ) + while ( ++ * _3_141==3141/314 + )*_3_141--=0 ;}while(_3_14159 + );{char s[]= "3.1415",*__3_14=s; + write((3,1), (--*__3_14,__3_14 + ),(_3_14159 ++,++_3_14159))+ + 3.1415926; } for ( _31415 = 1; + _31415<3141- 1;_31415++)write( + 31415% 314-( 3,14),_3141592654[ + _31415 ] + "0123456789","314" + [ 3]+1)-_314; puts((*_3141592654=0 +,_3141592654)) ;_314= *"3.141592";} diff --git a/_src/1989/tromp.bsd.c b/_src/1989/tromp.bsd.c new file mode 100644 index 0000000..9285810 --- /dev/null +++ b/_src/1989/tromp.bsd.c @@ -0,0 +1,19 @@ +long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K +=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1, +12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12, +1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12, +12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i])-Q[i] +){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28);printf( +"\033[%dm "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+ +n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char* +*V,*a;{h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i< +25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigvec(14,v, +0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+ +12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){ +for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c +=a[5]);}}if(c==*a)G(--x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if(c==a[2])G +(++x)||--x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){s=sigblock( +8192);printf("\033[H\033[J\033[0m%d\n",w);if(c==a[5])break;for(j=264;j--;Q[j]= +0);while(getchar()-a[4]);puts("\033[H\033[J\033[7m");sigsetmask(s);}}d=popen( +"stty -cbreak echo stop \023;cat - HI|sort -rn|head -20>/tmp/$$;mv /tmp/$$ HI\ +;cat HI","w");fprintf(d,"%4d on level %1d by %s\n",w,l,getlogin());pclose(d);} diff --git a/_src/1989/tromp.bsd.new.c b/_src/1989/tromp.bsd.new.c new file mode 100644 index 0000000..fa82b7f --- /dev/null +++ b/_src/1989/tromp.bsd.new.c @@ -0,0 +1,19 @@ +long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}long c,d,l,v[]={0,0,2},w,s,I,K +=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1, +12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12, +1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12, +12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i])-Q[i] +){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28);printf( +"\033[%dm "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+ +n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char* +*V,*a;{*v=(long)t;h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i< +25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigaction(14,v, +0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+ +12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){ +for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c +=a[5]);}}if(c==*a)G(--x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if(c==a[2])G +(++x)||--x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){s=sigblock( +8192);printf("\033[H\033[J\033[0m%d\n",w);if(c==a[5])break;for(j=264;j--;Q[j]= +0);while(getchar()-a[4]);puts("\033[H\033[J\033[7m");sigsetmask(s);}}d=popen( +"stty -cbreak echo stop \023;cat - HI|sort -rn|head -20>/tmp/$$;mv /tmp/$$ HI\ +;cat HI","w");fprintf(d,"%4d on level %1d by %s\n",w,l,getlogin());pclose(d);} diff --git a/_src/1989/vanb.c b/_src/1989/vanb.c new file mode 100644 index 0000000..f6b8ebf --- /dev/null +++ b/_src/1989/vanb.c @@ -0,0 +1 @@ +main(Q,O)char**O;{if(--Q){main(Q,O);O[Q][0]^=0X80;for(O[0][0]=0;O[++O[0][0]]!=0;)if(O[O[0][0]][0]>0)puts(O[O[0][0]]);puts("----------");main(Q,O);}} diff --git a/_src/1989/westley.c b/_src/1989/westley.c new file mode 100644 index 0000000..852ea84 --- /dev/null +++ b/_src/1989/westley.c @@ -0,0 +1,24 @@ + +/**//*/};)/**/main(/*//**/tang ,gnat/**//*/,ABBA~,0-0(avnz;)0-0,tang,raeN +,ABBA(niam&&)))2-]--tang-[kri - =raeN(&&0<)/*clerk*/,noon,raeN){(!tang&& +noon!=-1&&(gnat&2)&&((raeN&&( getchar(noon+0)))||(1-raeN&&(trgpune(noon +)))))||tang&&znva(/*//**/tang ,tang,tang/**|**//*/((||)))0(enupgrt=raeN +(&&tang!(||)))0(rahcteg=raeN( &&1==tang((&&1-^)gnat=raeN(;;;)tang,gnat +,ABBA,0(avnz;)gnat:46+]552&)191+gnat([kri?0>]652%)191+gnat([kri=gnat +(&&)1-^gnat(&&)1& ABBA(!;)raeN,tang,gnat,ABBA(avnz&&0>ABBA{)raeN +,/**/);}znva(/*//**/tang,gnat,ABBA/**//*/(niam;}1-,78-,611-,321 +-,321-,001-,64-,43-,801-,001-,301-,321-,511-,53-,54,44,34,24 +,14,04,93,83,73,63,53,43,33,85,75,65,55,45,35,25,15,05,94,84 +,74,64,0,0,0,0,0,0,/**/){ABBA='N'==65;(ABBA&&(gnat=trgpune +(0)))||(!ABBA&&(gnat=getchar(0-0)));(--tang&1)&&(gnat='n'<= +gnat&&gnat<='z'||'a'<=gnat&&gnat<='m'||'N'<=gnat&&gnat<='Z' +||'A'<=gnat&&gnat<='M'?(((gnat&/*//**/31/**//*/,21,11,01,9,8 +,7,6,5,4,3,2,1,62,52,42,/**/)+12)%26)+(gnat&/*//**/32/**//*/, +22,12,02,91,81,71,61,51,41{=]652[kri};)/*pry*/)+65:gnat);main +(/*//**\**/tang^tang/**//*/,/* */,~/*//*-*/tang,gnat,ABBA- +0/**//*/(niam&&ABBA||))))tang( rahcteg&&1-1=A1Qc=he`Nxs7>k44ofy`glX(f`u%tWs zIx;Y9?C1WI$O`0h7I;J!Gcbs$f-s|Jkje)J2Gw9s7srr_xVP61_Nq9Rxj1rd_~q?7 z_rz&y{<33>8{cpkGs+oh*E9aJ|If(4V0SWtouQ%M=o%x#gT+0i3=BUsl4XIyr-%`* zIQm~Mh;QA6$n&Qd=cKJUtbI#lb5TL-xvDU}2PVm~aTk}(nA)sea&2=F!*a>jAG*wr zu91mZxOv`GW{a~C?crNA)1E%yn)`K)%z?~fR(lrt8fvqLzgUz0l)=yV+C$OYu1L!r zPU*JV>;XSxZ}xY*fKXHOlpf7yeYEFvv`sL#EKG`eQ4ZLZD!e~Ixdlq3c0JI*h0 zLmH#Iv*ykknLm@yWuPR-QOD6Vru(UrSf+rGGq9W&b zps(jo{S8SL@bUtfC`J{6N?xvEA3O|o2mb#R|E10JhZo#xW~g(h{?k9o9~9w1?D`?n kRvQhB>LvgGJpa$wP<1W4RNLhOaLpBir>mdKI;Vst08dhNMgRZ+ literal 0 HcmV?d00001 diff --git a/index.md b/index.md index 9ce76f5..17d9f36 100644 --- a/index.md +++ b/index.md @@ -15,6 +15,7 @@ IOCCCをよく知らない人は、まず[このサイトについて]({{ site.b 更新履歴: -* 2021/01/13: [IOCCC 1988]({{ site.baseurl }}{% link 1988/index.md %})の解説を公開しました。 +* 2021/01/23: [IOCCC 1989]({{ site.baseurl }}{% link 1989/index.md %})の解説を公開しました。 +* 2021/01/16: [IOCCC 1988]({{ site.baseurl }}{% link 1988/index.md %})の解説を公開しました。 * 2021/01/09: [IOCCC 1987]({{ site.baseurl }}{% link 1987/index.md %})の解説を公開しました。 * 2021/01/03: [IOCCC 1984]({{ site.baseurl }}{% link 1984/index.md %})、[IOCCC 1985]({{ site.baseurl }}{% link 1985/index.md %})、[IOCCC 1986]({{ site.baseurl }}{% link 1986/index.md %})の解説を公開しました。 diff --git a/patches/1989-fubar.patch b/patches/1989-fubar.patch new file mode 100644 index 0000000..0bffa24 --- /dev/null +++ b/patches/1989-fubar.patch @@ -0,0 +1,22 @@ +--- fubar.c ++++ fubar.c +@@ -4,16 +4,15 @@ + #define TT 1 + #define cc main(c,v) int c; char **v;{char tt[12],qq[7]; int q=0,o=1,l=1,m=1;struct {int c;} f; + #define ouroboros qq[6]='\0';tt[11]='\0';if(QQ==atoi(v[1])+1){(void)fprintf(stderr,"%s factorial = %d\n",v[1], TT);exit(1);}o=c+f +-#define x ;while(EOF!=(o=getchar())){if(l && q=='Q' && o=='Q'){l=0;(void)getchar();(void)fread(qq,6,1,stdin);(void)printf("Q %6d",atoi(qq)+1);}else +-if(m && q=='T' && o=='T'){m=0;(void)fread(tt,11,1,stdin);(void)printf("T %9d\n",atoi(tt)*QQ);}else {q=o;(void)putchar(o);}}exit(0);} ++#define x ;while(EOF!=(o=getchar())){if(l && q=='Q' && o=='Q'){l=0;(void)getchar();(void)fread(qq,6,1,stdin);(void)printf("Q %6d",atoi(qq)+1);}else if(m && q=='T' && o=='T'){m=0;(void)fread(tt,11,1,stdin);(void)printf("T %9d\n",atoi(tt)*QQ);}else {q=o;(void)putchar(o);}}exit(0);} + cc ouroboros.c -o x + #define zxc ;{/* +-cat ouroboros.c | x $1 > x1 ++cat ouroboros.c | ./x $1 > x1 + if [ $? -ne 0 ]; then + exit + fi + mv x1 ouroboros.c + chmod +x ouroboros.c +-exec ouroboros.c $1 ++exec ./ouroboros.c $1 + exit + */ diff --git a/patches/1989-jar.2.patch b/patches/1989-jar.2.patch new file mode 100644 index 0000000..fc6edbd --- /dev/null +++ b/patches/1989-jar.2.patch @@ -0,0 +1,56 @@ +--- jar.2.c ++++ jar.2.c +@@ -1,20 +1,20 @@ + #define d define +-#d a include +-#a +-#a +-#a +-#d p char* +-#d P ,(p) +-#d T(E) !strcmp(E,"()") +-#d U return +-#d W while +-#d X sbrk(199) +-#d z atof +-#d e isspace +-#d D A(_) +-#d E S(C(_)) +-#d B(y) p y(_)p _;{ +-#d G(y,V) B(y)p i;U sprintf(i=X,"%lf",z(E)V z(S(C(D)))),i;} ++#define a include ++#include ++#include ++#include ++#define p char* ++#define P ,(p) ++#define T(E) !strcmp(E,"()") ++#define U return ++#define W while ++#define X sbrk(199) ++#define z atof ++#define e isspace ++#define D A(_) ++#define E S(C(_)) ++#define B(y) p y(_)p _;{ ++#define G(y,V) B(y)p i;U sprintf(i=X,"%lf",z(E)V z(S(C(D)))),i;} + + p sbrk(),*S(),*j(),*O,*H;K,Y,M=14;double + z();Q(_)p _;{int V=0;W(e(*_))_++;H=_;W(V|!(e +@@ -28,11 +28,11 @@ + + i,*s;{U isdigit(*i) ? z(i)!=z(s):strcmp(i,s);} + B(b)U L(E,S(C(D)))?"()":"t";}B(R)U E;}B(o)U z(E) + typedef char ape + #define D define +-#D EA register +-#D EP unsigned +-#D A 1 +-#D AP (A<>A) +-#D APE {EA EP ape ea=AE;while(ea--) e[ea]=E;} ++#define EA register ++#define EP unsigned ++#define A 1 ++#define AP (A<>A) ++#define APE {EA EP char ea=AE;while(ea--) e[ea]=E;} + ;ape a[PE+A],ap,*ae,p[P+A],e[AE]; + main(){ape pe,*ep=a;srand((EP)time((long)E)); + while(((*(ep++)=getchar())!=-A)&&((ep-a)d=_,b->e=d,b) +-#define _(D,E,F,G,H)B D();Y(D/**/f,E)Y(D/**/g,F)Y(D/**/h,G)Y(D/**/i,H)Y(D,(*(*d->d)(D/**/f,D/**/g,D/**/h,D/**/i))(d,e)) ++#define _(D,E,F,G,H)B D();Y(D##f,E)Y(D##g,F)Y(D##h,G)Y(D##i,H)Y(D,(*(*d->d)(D##f,D##g,D##h,D##i))(d,e)) + Z(f) + Z(g) + Z(h) diff --git a/patches/1989-roemer.patch b/patches/1989-roemer.patch new file mode 100644 index 0000000..ce771fe --- /dev/null +++ b/patches/1989-roemer.patch @@ -0,0 +1,11 @@ +--- roemer.c ++++ roemer.c +@@ -25,7 +25,7 @@ + _314+(__31415 >>1)>=__31415 ) + while ( ++ * _3_141==3141/314 + )*_3_141--=0 ;}while(_3_14159 +- ) ; { char * __3_14= "3.1415"; ++ );{char s[]= "3.1415",*__3_14=s; + write((3,1), (--*__3_14,__3_14 + ),(_3_14159 ++,++_3_14159))+ + 3.1415926; } for ( _31415 = 1; diff --git a/patches/1989-tromp.bsd.patch b/patches/1989-tromp.bsd.patch new file mode 100644 index 0000000..114c181 --- /dev/null +++ b/patches/1989-tromp.bsd.patch @@ -0,0 +1,19 @@ +--- tromp.bsd.c ++++ tromp.bsd.c +@@ -1,4 +1,4 @@ +-long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K ++long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}long c,d,l,v[]={0,0,2},w,s,I,K + =0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1, + 12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12, + 1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12, +@@ -6,8 +6,8 @@ + ){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28);printf( + "\033[%dm "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+ + n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char* +-*V,*a;{h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i< +-25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigvec(14,v, ++*V,*a;{*v=(long)t;h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i< ++25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigaction(14,v, + 0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+ + 12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){ + for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c