Best Calculated Risk

最高の計算されたリスク

受賞者:Brent Burley

引用元:https://www.ioccc.org/2004/burley.c

審査員・作者による説明:https://github.com/ioccc-src/winner/blob/main/2004/burley.hint

動作

ポーカー。最初の所持金は$100。まずは賭け金を入力する。

$ gcc -m32 -o burley burley.c

$ ./burley
100

すると手札が配られる。

$ ./burley
100
J 4 5 Q 8
D D S D D

ダイヤのジャック、ダイヤの4、スペードの5、ダイヤのQ、ダイヤの8と読む。残したい札の位置を指定する。

1245
J 4 2 Q 8
D D D D D
$600 (600)

無事フラッシュができたので賭け金の6倍が帰ってきた。負けると当然減る。ちなみに借金は可能。役ごとの倍率はburley.hintを参照のこと。

解説

「勝てる賭け金の戦略は?」という問いがあるが、負の金額を賭ければよい。ただし-1と入力してもマイナスをスキップするコードがあるのでダメ。 4294967295とすれば、オーバーフローして-1となり、負けたときに$1得ることができる(勝ったら当然減る)。

コードは、グローバル変数宣言と、1つのreturn文だけのmain関数のみ。 main関数の中はsetjmp()longjmp()を使ってループを実現している。 mainの再帰呼び出しをしているようにみえるが、実際にはlongjmp()によって戻るので再帰呼び出しはしていない。 無意味に式を複雑にしているところも多い。

getsの返り値のポインタをint型で扱っているので-m32が必要。 char *gets(char *);というプロトタイプ宣言を追加してもよい。