カメヲラボ

主にプログラミングとお勉強全般について書いてます

503日ぶりの記録更新

http://acm.pku.edu.cn/JudgeOnline/problem?id=1145
稲葉さんの天才的コードを改めて眺めています。当時の自分の力量からすれば、スゴイということは感じながらもどうスゴイのかがうまく言えませんでした。今になってみれば、現在のショートコーディングにおける鉄則がすべて詰まったコードだったんだなぁということがわかります。今朝、
http://d.hatena.ne.jp/yaneurao/20051126#p1
にあるコードを
http://d.hatena.ne.jp/yaneurao/20051127#p1
の形まで、私が長い時間かけて積み上げたショートコーディングルールで変形することができましたが、そんなことお構いなしでさらりと書き上げてしまうところはすばらしいとしか言い様がありません。

でもまあ、私はそういう才能が無かったからこそ多くの問題に触れ、自分なりの論理ができたのだと考えれば、それはそれでよかったと思います。

さて、1145番の問題はもはや伝説と呼ばれるものであり、たくさんのチートコードまで飛び出した結果、記録の大半はrejudgeによって消されることとなりました。現在残っている記録はrejudgeに耐え抜いた「ある程度正しい」コードです。稲葉さんのコードのすばらしいのは「変態的なのにバッチリ正しい」というところで、今後何回rejudgeを食らっても確実に生き延びるコードだと思います。

rejudge後に、何度かコードを通してみて気付いたのですが、おそらくテストケースは厳しいものに変えられたのではなく、チート防止として簡単なケースが1個以上追加されただけなのではないかという感じで、namasuteさんやkikさんの結構キワドイコードが残っているのを見れば、この感覚は間違っていないように思えます。

というわけで、このようなコードをsubmitしたところ、Acceptされました。
期待される合計値が0で、かつ正解がnoの場合は完全な間違いなのですが、そのようなテストケースは含まれていないようです。

y,i;
main(p,k)
{
  for(;1&~getchar(y*=scanf("%d ",&i)?k=p?y=i:k-i,i=3:--i|k);
    p&&puts(y?"no":"yes"))
    main(0,k);
}

 --i|kとしている部分も怪しいですが、こちらで引っかかる確率は随分低いんじゃないかと思います。