ひさびさのゴルフ

2月下旬からかなり忙しかった。休日出勤したのも久しぶりだ。この日記もひと月空いてしまった。あと、もう少し。4月になれば少し楽になると思う。
さて、いくつかゴルフの話題を。

shell game EASY

C

単独トップを取れたのはうれしいが、それよりも、この問題は、C golf の基本技がいくつも入っているところが面白い、というか、教科書的?だ。

char x,y,v=49;main(){for(;gets(&x);puts(&v))v^=x*y%v?0:x^y;}

まず、ある1文字を改行付きで出力するには、

printf("%c\n",c);

ではなく、

puts(&c);

とすること。しばしば使う技だ。
次に、連続した文字を別々の変数に読み込む方法。

char x,y;
scanf("%c%c",&x,&y);

ではなく、

char x,y;
gets(&x);

とでできる。メモリー上、y が x のとなりに配置されるので、これでできてしまう。
そして、最後は、数字を数としてではなく、文字として、文字コードで扱ってやると gets() で読んだ結果をそのまま処理できる。特に今回の場合は、

x*y%v

とすることで、x か y のどちらかが v に等しいことをチェックできて好都合だ。

Groovy

murky-satyr さんの解

p=1
System.in.eachLine{println p=it-p-it?:p}

”it-p-it” の部分が絶妙だな。it が p を含めば、p ではない方の文字になり、含まなければ、さらに it が引かれることで、null ストリングになり、elvis 演算子により p になる。みごと。2位のhoozie さんも同じだ。

Farey sequence

not さんの出題だ。面白い問題だと思うけど、入力が単純すぎて random 解の方が短くなってしまう。とりあえず 100B を Submit したが、random だと 91B になる。現在トップの not さんの 94B は、random ではないんだろうな。そのあたりが分からないところも、random 可能問題の嫌なところだ。