Skip to content

Commit

Permalink
Publish spoilers for IOCCC 1993
Browse files Browse the repository at this point in the history
  • Loading branch information
mame committed Feb 20, 2021
1 parent ba34b86 commit 8483bfc
Show file tree
Hide file tree
Showing 47 changed files with 2,881 additions and 4 deletions.
31 changes: 31 additions & 0 deletions 1993/ant.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
---
id: 1993/ant
year: 1993
order: 1
authors: "Anthony_C._Howe"
orig_url: "https://www.ioccc.org/1993/ant.c"
hint_url: "https://github.com/ioccc-src/winner/blob/main/1993/ant.hint"
title: "IOCCC 1993: Best Utility"
award_ja: "最高のユーティリティ"
---

## 動作

egrep風コマンド。

```
$ gcc -o ant ant.c
$ ./ant a.*t$ ant.hint
ant.hint: make ant
ant.hint: See the author's Posix P1003.2-like documentation file ant.txt
```

## 解説

作り込み系の作品。
POSIX.2の拡張正規表現の小さくないサブセットに対応しているとのこと。

難読化は識別子が1文字である程度で、見逃していない限り特別なテクニックは見られない。
man風のドキュメントが添付されている([ant.txt](https://www.ioccc.org/1993/ant.txt))。
同作者の[[[1992/ant]]]({{ site.baseurl }}{% link 1992/ant.md %})と同系統の作品。
35 changes: 35 additions & 0 deletions 1993/cmills.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
id: 1993/cmills
year: 1993
order: 2
patch: true
authors: "Christopher_Mills"
orig_url: "https://www.ioccc.org/1993/cmills.c"
hint_url: "https://github.com/ioccc-src/winner/blob/main/1993/cmills.hint"
title: "IOCCC 1993: \"Bill Gates\" Award"
award_ja: "『ビル・ゲイツ』賞"
linewrap: true
---

## 動作

X Window Systemの中で窓が飛び回り、粉砕していくデモアプリ。
[[[1991/davidguy]]]({{ site.baseurl }}{% link 1991/davidguy.md %})と同じようにVcXsrvを準備した上で、次のように実行する。

```
$ gcc -o cmills cmills.c -lX11
$ ./cmills
```

{% include img.html src="1993-cmills.png" desc="X Window Systemの画面の中を窓が飛び回って粉砕していく" %}

## 解説

作者の意図はよくわからないが、賞名から考えてWindowsに対する皮肉として採択されていると思う。
当時のUnix文化圏におけるWindowsの空気感をよく知らないので、あまりわからない。

難読化は、短い識別子を使い、インデントをなくした程度に見える。
窓が割れる確率は運動エネルギー(つまり面積と速さ)に基づくとのこと。

現代では処理速度が速すぎるので`usleep`で少しウェイトを置いた。
122 changes: 122 additions & 0 deletions 1993/dgibson.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
---
id: 1993/dgibson
year: 1993
order: 3
authors: "David_Gibson"
orig_url: "https://www.ioccc.org/1993/dgibson.c"
hint_url: "https://github.com/ioccc-src/winner/blob/main/1993/dgibson.hint"
title: "IOCCC 1993: Best Abuse of the C Preprocessor"
award_ja: "Cプリプロセッサの最高の悪用"
---

## 動作

ライフゲーム。life.dに初期盤面を入れておく。

```
$ cat life.d
LIFE
L _ _ _ _ _
L _ _ _ O _
L _ O _ O _
L _ _ O O _
L _ _ _ _ _
GEN 0
END
```

1世代すすめる。

```
$ gcc -ansi dgibson.c -o dgibson
$ ./dgibson
LIFE
L _ _ _ _ _
L _ _ O _ _
L _ _ _ O O
L _ _ O O _
L _ _ _ _ _
GEN 1 STAT 329040
END
```

見ての通りこの出力は初期盤面と同じフォーマットになっているので、life.dを更新して再コンパイルするとさらに次の世代が求められる。

```
$ ./dgibson > life.d
$ gcc -ansi dgibson.c -o dgibson
$ ./dgibson
LIFE
L _ _ _ _ _
L _ _ O _ _
L _ _ _ O _
L _ O O O _
L _ _ _ _ _
GEN 2 STAT 328960
END
```

## 解説

dgibson.cの最後で`#include "life.d"`としているとおり、この盤面のフォーマットはdgibson.cで定義されたマクロで展開することで有効なCコードとなる。C言語での組み込みDSLと言える。

こんな大きいのも動くので良い。ビルドにちょっと時間がかかるが、実行は一瞬。

```
$ time gcc -ansi dgibson.c -o dgibson
real 0m2.400s
user 0m2.179s
sys 0m0.211s
$ ./dgibson
LIFE
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ O _ _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ O _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O O _ _ _ O O O _ _ _ _ _ O _ _ _ _ O _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ O _ _ _ O _ _ O _ _ _ _ O _ O O O O O _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O _ _ _
L _ _ _ _ _ _ _ _ _ _ O O _ _ _ _ _ _ _ _ _ _ O _ _ _ O _ _ _ _ _ _ _ _ _ _ _ O O O _ _ _ O _ _
L _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ O _
L _ _ _ _ _ _ _ _ O O _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ O _
L _ _ _ _ _ _ _ O _ _ _ _ O _ _ _ _ _ _ _ O O O _ _ _ O O O _ _ _ _ _ _ _ _ _ _ O _ _ O _ _ O _
L _ _ _ _ _ _ O O O O O _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ O _ _ _ _ _ _ _ _ O _ O O _ _ O _ O _ _
L _ _ _ O O _ _ _ _ _ O O _ _ _ _ O _ _ _ _ O O O O O O O _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _
L _ _ O _ _ _ O O O _ _ O _ _ O O O _ _ _ O _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O O _
L _ O _ _ _ O _ _ _ _ _ O O _ O O _ _ _ O O O O O O O O O O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O _
L _ O _ _ _ _ _ O _ _ _ O _ _ _ O _ _ O _ _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ O O O _
L _ O _ _ O _ _ O _ _ _ _ _ O O O _ O O O O O O O O O O O O O O _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _
L _ _ O _ O _ _ O O _ O _ _ O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O _ _ O _ O O _ _ O _ O _ _
L _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ O O O O O O O O O O O O O O _ O O O _ _ _ _ _ O _ _ O _ _ O _
L _ O O O _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ _ O _ _ O _ _ _ O _ _ _ O _ _ _ _ _ O _
L _ O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O O O O O O O O O O _ _ _ O O _ O O _ _ _ _ _ O _ _ _ O _
L _ O O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ O _ _ _ O O O _ _ O _ _ O O O _ _ _ O _ _
L _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ O O O O O O O _ _ _ _ O _ _ _ _ O O _ _ _ _ _ O O _ _ _
L _ _ O _ O _ _ O O _ O _ _ _ _ _ _ _ _ O _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ O O O O O _ _ _ _ _ _
L _ O _ _ O _ _ O _ _ _ _ _ _ _ _ _ _ O O O _ _ _ O O O _ _ _ _ _ _ _ O _ _ _ _ O _ _ _ _ _ _ _
L _ O _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ O O _ _ _ _ _ _ _ _
L _ O _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _
L _ _ O _ _ _ O O O _ _ _ _ _ _ _ _ _ _ _ O _ _ _ O _ _ _ _ _ _ _ _ _ _ O O _ _ _ _ _ _ _ _ _ _
L _ _ _ O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ O O O O O _ O _ _ _ _ O _ _ O _ _ _ O _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ O _ _ _ _ O _ _ _ _ _ O O O _ _ _ O O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ O _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ _ O _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
GEN 2 STAT 3089152
END
```
50 changes: 50 additions & 0 deletions 1993/ejb.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
---
id: 1993/ejb
year: 1993
order: 4
authors: "E._Jay_Berkenbilt"
orig_url: "https://www.ioccc.org/1993/ejb.c"
hint_url: "https://github.com/ioccc-src/winner/blob/main/1993/ejb.hint"
title: "IOCCC 1993: Best Obfuscated Algorithm"
award_ja: "最高の難読化アルゴリズム"
---

## 動作

2つのアルゴリズムが搭載されている。
1つはハノイの塔。コマンドライン引数に正の値を与えると、その高さのハノイの塔の解答を表示する。

```
$ gcc -o ejb ejb.c
$ ./ejb 3
move ring 1 from stack 1 to stack 2
move ring 2 from stack 1 to stack 3
move ring 1 from stack 2 to stack 3
move ring 3 from stack 1 to stack 2
move ring 1 from stack 3 to stack 1
move ring 2 from stack 3 to stack 2
move ring 1 from stack 1 to stack 2
```

もう1つ。負の値をあたえると、patience puzzleを外すまでの状態の列を表示する。
patience puzzleはたぶん[連環・チャイニーズリング](https://ja.wikipedia.org/wiki/%E3%83%81%E3%83%A3%E3%82%A4%E3%83%8B%E3%83%BC%E3%82%BA%E3%83%AA%E3%83%B3%E3%82%B0)のこと。
右端の数字が最初のリングを表し、1はU字金具に入った状態、0は外れた状態を表すらしい。

```
$ ./ejb -3
111
110
010
011
001
000
```

## 解説

コードはセミコロンをかたどっている。
このプログラムには、セミコロンが2つしかない(変数宣言で1つ、`return`文の終わり)。
プログラムの規模(lines of code)を測るためにセミコロンを数えるとすると、このプログラムのセミコロンは2つか、それとも3つか曖昧にするため、というネタらしい。

型名などを除けば、キーワードは`return`しか使っていない。必然的に、`main`関数の再帰を伴う巨大な式1つからなる`return`文となっている。
21 changes: 21 additions & 0 deletions 1993/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
year: 1993
title: "IOCCC 1993の解説"
layout: contest
---
## 全体の印象

前年の反動か、アスキーアート化された作品やメタな作品は少し減り、挙動の作り込みを追求した作品が増えた。
[[[1993/dgibson]]]({{ site.baseurl }}{% link 1993/dgibson.md %})はC言語でのライフゲームDSLという新境地を開拓している。
[[[1993/schnitzi]]]({{ site.baseurl }}{% link 1993/schnitzi.md %})は挙動のインパクトがあって良い。
[[[1993/rince]]]({{ site.baseurl }}{% link 1993/rince.md %})はオリジナリティのある題材を扱っていて良い。

IOCCCの最優秀賞には通例"Best of Show"という賞名が与えられるが、この年は"Most Well Rounded"が最優秀賞と思われる。
ときどき気分で変わるようだ。IOCCC 1995からまた"Best of Show"に戻る。

この年から、ANSI Cコンパイラでコンパイルできることが必須となった。
おかげで、現代でもそのまま動く確率が非常に高くなった。

細かい話だが、これまで`PATH`にカレントディレクトリが含まれているという前提があったのが、この年からついに消えた。
hintファイルやスクリプトで`./exe`という形式が使われるようになっている(これより前は`exe`だけで実行できるという前提があった)。
ただし、1994年からまたもとに戻っている。移行期だったのだろうか。
46 changes: 46 additions & 0 deletions 1993/jonth.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
---
id: 1993/jonth
year: 1993
order: 5
patch: true
authors: "Jon_Thingvold"
orig_url: "https://www.ioccc.org/1993/jonth.c"
hint_url: "https://github.com/ioccc-src/winner/blob/main/1993/jonth.hint"
title: "IOCCC 1993: Most Obfuscated X Program"
award_ja: "もっとも難読化されたXプログラム"
---

## 動作

X Window Systemでのテトリス。

{: .wrap }
```
$ sed -e s/\^\ /#define/ -e 's/@/Window(D,/g' jonth.c > jonth.tmp.c
$ gcc -DXX1='H 19;}M(J,4)}N H 20;}M(T,4)}q(m,w,' -DXX='XKeycodeToKeysym(D,((XKeyEvent*)o)->keycode,0);K 12:Y();}R;}d XX1' jonth.tmp.c -o jonth -lX11
$ ./jonth
```

{% include img.html src="1993-jonth.png" desc="X Window Systemでテトリス" %}

<kbd>j</kbd>で左、<kbd>l</kbd>で右、<kbd>k</kbd>で回転、スペースで落とす。

## 解説

X11の関数名は長いので、sedコマンドで`@``Window(D,`に置き換えるなどをした上でコンパイルすることになっている。
それ以外、コードに特筆することはないと思う。

現代で動かすことにとても苦労した。
なぜか(難読化のため?)、`#include <X11/Xlib.h>`をせず、定数は即値で、構造体は配列インデックスで無理やりアクセスしている。
関数宣言もないので、返り値は暗黙的に`int`が仮定されてしまう。
jonth.hintに「`int`とポインタが同じサイズでないと動かない」と書いてあるとおり(`-m32`をつけるとX11とリンクできないので使えなかった)。
よって、`#include <X11/Xlib.h>`をして`int``long`に書き換えれば、とりあえず動いた。
しかしこれだけではキー入力が効かない。
構造体のフィールドを`int`の配列インデックスで読みだそうとしているが、`long`に変えたためにずれる模様。
このコード断片はMakefileの中にある(サイズ制限回避のため?)。
ややこしいので、直接展開した上で修正した。
さらに、`XSelectInput`を指定した。
これによってキー操作もできるようになった。
ただし、途中でキーボード操作が効かなくなることがある(未調査)。
72 changes: 72 additions & 0 deletions 1993/leo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
---
id: 1993/leo
year: 1993
order: 6
authors: "Leonid_A._Broukhis"
orig_url: "https://www.ioccc.org/1993/leo.c"
hint_url: "https://github.com/ioccc-src/winner/blob/main/1993/leo.hint"
title: "IOCCC 1993: Best Game"
award_ja: "最高のゲーム"
---

## 動作

[マスターマインド](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%89)のゲームマスターとソルバ。
実行ファイル名の最後が`d`だとゲームマスターになる。

```
$ gcc -o leo leo.c
$ mv leo mind
$ ./mind
(1296): ???
```

`????`の部分に予想を書くと、その成否を2桁で返す(上の桁は位置も数字も正しい数、下の桁は数字は正しいが位置が違う数)。
最後まで動かした例を示す。

```
$ ./mind
(1296): 5565
12
(240): 5232
12
(28): 2225
04
(6): 4542
20
(2): 1552
40
```

実行ファイルの最後が`d`以外だとソルバになる。

```
$ mv mind leo
$ ./leo
(1296): 2435
??
```

`??`のところに成否を2桁で埋めていく。最後まで進めた例を示す

```
$ ./leo
(1296): 2435
01
(152): 1262
22
(7): 1226
40
```

## 解説

カッコの中にある数字は、残る可能性の数を表している。

コードはジグザグ形状。特に意味はないと思う。
ソルバのguessは、特に最短解答を目指すものではなく、乱数生成していると思う。
実質6行程度であり、わりと短くまとまっていて良い。
ゲームマスターモードとソルバモードでコードが共有されているのはエレガント。
Loading

0 comments on commit 8483bfc

Please sign in to comment.