Skip to content

Commit

Permalink
Publish spoilers for IOCCC 2005
Browse files Browse the repository at this point in the history
  • Loading branch information
mame committed Apr 17, 2021
1 parent 9085ac2 commit 7e5e7e9
Show file tree
Hide file tree
Showing 61 changed files with 3,995 additions and 0 deletions.
100 changes: 100 additions & 0 deletions 2005/aidan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
---
id: 2005/aidan
year: 2005
order: 1
authors: "Aidan_Thornton"
orig_url: "https://www.ioccc.org/2005/aidan/aidan.c"
hint_url: "https://www.ioccc.org/2005/aidan/hint.text"
title: "IOCCC 2005: Most ingenious puzzle solution"
award_ja: "もっとも巧妙なパズルの解"
---

## 動作

数独のソルバおよび問題作成器。

無引数で呼び出して問題を標準入力に与えるとソルバになる。

```
$ gcc -o aidan aidan.c
$ ./aidan < insane1.sudoku
. . 4 | . . . | . 5 6
5 . . | . 7 2 | . . .
. . 1 | . . . | 8 . .
------+-------+------
. . . | . . . | . . .
. . . | 6 9 3 | . . 5
. . . | . . . | 7 3 4
------+-------+------
. 5 . | 2 . 1 | 4 . 8
3 . . | . . . | . . .
. . . | . . . | . 6 1
7 3 4 | 8 1 9 | 2 5 6
5 8 6 | 4 7 2 | 9 1 3
2 9 1 | 3 5 6 | 8 4 7
------+-------+------
1 2 3 | 5 4 7 | 6 8 9
8 4 7 | 6 9 3 | 1 2 5
9 6 5 | 1 2 8 | 7 3 4
------+-------+------
6 5 9 | 2 3 1 | 4 7 8
3 1 8 | 7 6 4 | 5 9 2
4 7 2 | 9 8 5 | 3 6 1
Done (stk 0 3)
```

シード付きで起動すると問題を作成する。

```
$ ./aidan 1
. . . | . . . | . . .
. . . | . . . | . . .
. . . | . . . | . . .
------+-------+------
. . . | . . . | . . .
. . . | . . . | . . .
. . . | . . . | . . .
------+-------+------
. . . | . . . | . . .
. . . | . . . | . . .
. . . | . . . | . . .
2 1 3 | 7 8 9 | 4 5 6
6 4 7 | 5 1 2 | 8 3 9
8 5 9 | 3 4 6 | 7 2 1
------+-------+------
7 8 1 | 4 6 3 | 2 9 5
3 6 2 | 9 5 8 | 1 4 7
4 9 5 | 1 2 7 | 3 6 8
------+-------+------
9 2 4 | 6 7 1 | 5 8 3
5 7 6 | 8 3 4 | 9 1 2
1 3 8 | 2 9 5 | 6 7 4
Done (stk 44 44)
2 . . | 7 8 . | . . .
6 . . | . . 2 | . 3 9
8 . . | . . . | . . 1
------+-------+------
7 . 1 | . . 3 | . 9 5
. . . | . . . | . 4 .
. . 5 | . . . | . . 8
------+-------+------
. . 4 | . . . | . . .
. . . | . . 4 | 9 . 2
1 . . | 2 . . | 6 . .
Done (stk 82 6)
```

## 解説

変な変数名や、`goto`によるわかりにくいフローなど。
アルゴリズムはブルートフォースではないらしい。詳細未解析。
77 changes: 77 additions & 0 deletions 2005/anon.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
---
id: 2005/anon
year: 2005
order: 2
authors: "Anonymous_2005"
orig_url: "https://www.ioccc.org/2005/anon/anon.c"
hint_url: "https://www.ioccc.org/2005/anon/hint.text"
title: "IOCCC 2005: Best 3D puzzle"
award_ja: "最高の3Dパズル"
---

## 動作

15パズルの任意サイズ化+3D対応。

次のように起動すると普通の15パズルになる。

```
$ gcc -o anon anon.c
$ ./anon 4 4
```

```
15 7 13 2
10 3 1 5
## 8 11 6
14 9 4 12
```

`##`が空きマス。<kbd>j</kbd>と<kbd>l</kbd>で空きマスを左右に動かし、<kbd>i</kbd>と<kbd>k</kbd>で上下に動かす。

次のように起動すると3次元化する。

```
$ ./anon 3 3 3
```

```
7 11 1
12 9 22
25 23 4
18 17 8
6 14 26
2 20 13
10 24 21
15 19 5
## 16 3
```

操作方法は2D版に加え、<kbd>o</kbd>で奥方向に動かし、<kbd>n</kbd>で手前方向に動かす。

## 解説

難読化の一番のポイントとされているのは、変数宣言も`malloc`もせずに動いていること。
`argc``argv`だけでどうにかしているわけでもない。
どうしているかというと、`main`を再帰させることでスタックを伸ばし、その連続領域をメモリとして使っている。
スタックが伸びる方向は環境によって違いがあるが、検出して適切に扱っているとのこと。

確保された領域は、フレームポインタやリターンアドレスも遠慮なく書き潰されるので、スタックは破壊される。
そのため`main`関数は正常に`return`はできないので、終了するときは`exit()`を使っている。

生成されるパズルは解けないこともある。
初期版はパリティチェックしていたが、IOCCCのサイズ制限のために除去したとのこと。

ゲーム中毒防止のため(?)、また、解けないパズルに無限の時間を使ってしまわないようにするため、長く操作をしているとそのうち異常終了するとのこと。
操作のたびに`main`を再帰することにより、そのうちスタックオーバーフローするという仕様になっている。

ia64でポインタを格納するために`int`ではなく`long`にした、という記述があり、近代になってきた感がある。

マクロを使った難読化もいろいろ行われている。
多くのマクロはサブルーチン的に使われているので、単純にプリプロセスで展開してもわかりやすくならない。
`main`関数が1つの巨大な`return`文になっているので、indentコマンドをかけるのもほとんど無力。
hint.textに各マクロやデータ構造の詳細な解説があるので、興味があれば参照するとよい。

33 changes: 33 additions & 0 deletions 2005/boutines.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
---
id: 2005/boutines
year: 2005
order: 3
authors: "Francois_Boutines"
orig_url: "https://www.ioccc.org/2005/boutines/boutines.c"
hint_url: "https://www.ioccc.org/2005/boutines/hint.text"
title: "IOCCC 2005: Most superfluous output"
award_ja: "もっとも過剰な出力"
---

## 動作

2次元の点の集合を入力し、[ボロノイ図](https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%AD%E3%83%8E%E3%82%A4%E5%9B%B3)をSVGで描く。

{: .wrap }
```
$ gcc -o boutines boutines.c
$ ruby -e '20.times{puts "#{rand} #{rand}"}' | ./boutines > test.svg
$ convert test.svg test.png
```

{% include img.html src="2005-boutines.png" desc="ランダムに配置した点に対してボロノイ図を計算した様子" %}

## 解説

審査員が「『生成されたSVGファイルは名前に反してスケーラブルでない』の意味を説明できますか?」という問いを残している。
SVGはScalable Vector Graphicsの略なのに、巨大なSVGファイルを作るとビューアが重くなってつらい(スケーラブルでない)という意味だと思われる。
もちろん、SVGのScalableは拡大縮小できるという意味。

賞名の意味はわからなかった。
55 changes: 55 additions & 0 deletions 2005/chia.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
---
id: 2005/chia
year: 2005
order: 4
authors: "V._Chia"
orig_url: "https://www.ioccc.org/2005/chia/chia.c"
hint_url: "https://www.ioccc.org/2005/chia/hint.text"
title: "IOCCC 2005: Most ambiguous language"
award_ja: "もっとも曖昧な言語"
---

## 動作

端末に[コッホ曲線](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%83%E3%83%9B%E6%9B%B2%E7%B7%9A)を描く。

```
$ gcc -o chia chia.c
$ ./chia
```

```
..::..
..:.:: ::.:.
:` `` `` ::
::. .:`
::`:. ::` `:. ::`:.
.:..: `:.:..: `:.:..: `:.:..
````` `````` `````` ````::
`: .::`
.:: ::.
::.... ....::
`:``: .:`:``
`:. ::`
::` `:.
..::.: `:.::..
:: ::
``: .:``
.:: ::.
::.... ...... ...... ....::
````: `:````: `:````: `:````
`:::` `:. ::` `:::`
:`` ``:
:.... ....::
```:: ::```
``::``
```

## 解説

Javaのような見た目のコード。
素直に読むと、ファイルを読んで各行の長さを出力するように見えるが、実際にはまったく異なる挙動をする。
コメントにもhint.textにもJavaへの怨嗟で溢れていて面白い。

プリプロセスしてindentすれば比較的普通に読める。
Loading

0 comments on commit 7e5e7e9

Please sign in to comment.