最近のあなごる

Difference of

hinoe さんの C 解。以下の通り。

main(a,p)char*p;{for(;*++p||!gets(p=&a)-puts();)*p=p[1]?abs(p[1]-*p)+48:0;}

この解の面白いところは、*++p の部分。for 文の一重化を行う際、キーとなることの一つに、変数の初期値がある。たとえば、上記解において、p をグローバル変数に取ると、

char*p;main(a){for(;p&&*++p||!gets(p=&a)-puts();)*p=p[1]?abs(p[1]-*p)+48:0;}

p は 0 で初期化されているため、上記のように、p 自身の NULL チェックをしなければならない。ところが hinoe さんの解のように、p を main() の第二引数として取れば、main() の第二引数はプログラムへのコマンドライン引数文字列の配列へのポインター argv であり、それは、valid なポインターなので、NULL チェックなしにアクセスできる。しかも、実際には、コマンドライン引数は一つもなく、プログラム名("./a.out")だけなので(だから、main() の第一引数は 1)、p を 4 バイト進めると、*p は 0 となる。この時点ではじめて、gets() 呼び出しのほうに行く。つまり、最初 4 回無駄ループを回しているということだ。for 文一重化の際に有効なやりかただ。みごと。
ところで、全然関係ないが、C Golf では、if 文を使わず、&& や ?: を使うのが定石だが、場合によっては、以下のように、if 文の方が良いこともある。ただ、このパターンは、今までなかったように思うが。。。

(a=expr1)&&(b=expr2);
(a=expr1)?b=expr2:0;
if(a=expr1)b=expr2;     // if 文が短くなる例

Enumeration of divisor

C はさすがに速い。単純にそのまま書いてタイムアウトを起こさず success してしまう。JavaScript は、3 問目がタイムアウトする。タイムアウトを避けるために工夫がいるのだが、twobit さんの 57B に 1B 届かない。

NABEATSU of the world

Groovy

murky-satyr さんの解。以下の通り。

1.upto(300){n->println n%3<1||n=~3?'aho':n}
1.upto(300){println it%3<1||it=~/3/?'aho':it}

下段は私の解。変数が、n か it かは、長さに関係ない。問題は、n=~3 の部分。

~3            // -4
n=~3          // n =~ 3 : n と 3 がまず、文字列に変換され、その後パターンマッチが行われる
n= ~3         // n に ~3、つまり、-4 が代入される

つまり、n=~3 の ~ は、3 にくっつくのではなく、= にくっつき、=~ 演算子として解釈されるということだ。lex analyzer の特徴だ。lex が token を抽出する際できるだけ長いマッチを優先させるということだ。しかしよくこんなの思いつくなぁ。毎度のことながらさすがだ。

JavaScript

JavaScript は、以下の部分が面白い。

print(/3/(i)<i%3?i:'aho')

/3/(i) は、数値 i が文字列化され、'3' を含んでいれば、'3' を返し、そうでなければ、null を返す。'3' が返った場合は、i%3 は、0 か 1 か 2 なので、/3/(i)

Power Set

Power Set は難しいな。not さんの C の 97B はとても追いつかない。JavaScript と Groovy で回答を投げているが、not さんの C の 97B を考えると、たぶん、別のやり方があって、もっと縮むのではないかと思う。

Fifth Identity

フィボナッチ数列は、ほんと、いろいろと面白い性質があるな。この問題は、問題のサンプル数が少なく、言語によっては、embed 解のほうが短くなる。embed 解や random 解ができないように、問題は作ってほしいな。ただし、C@77B は embed ではない。
Equations も。これも、入力をハッシュにかけてフィルターする cheat 解の方が短くなりそうな予感。

Two coins

問題文の英語がちょっとへん? There are two kinds of coin 〜 かなんかじゃないのかな?また、disjoint は「互いに素」という意味だったのか。しらなかった。要は、互いに素な金額のコインが2種類あったとしたらそれらのコインを使って表せない金額の最大値は何か?ということのようだ。もちろん、無限大ではない。
今朝起きて anarchy golf を見たら、teebee さんが、言語ランキングで、1位から20位くらいまでを独占していてびっくり。何とか阻止しようと試したが、C も、JavaScript も抜けない。Groovy は追いつけすらしなかった。幸い、GolfScript で短い解ができた。それにしても、teebee さん、多言語使いで急激に User ranking を駆け上ってきているな。この勢いではそのうち抜かされるだろう。