最近のあなごる問題

Telephone Keypad Letter Mapping Fixed

JSの『functionを使ったら負け』は、クロージャーの簡便な記述が JavaScript 1.8 で導入されて神話が崩れつつある。
Cは、強豪が多くなかなかトップを取らしてもらえない。トップとの2B差はもう縮みそうもないな。残念。ところで、この問題で、『文字列として読み込んだものをそのまま数値として使う』というプチテクを見つけた。以下の例はこの問題で当初使っていたものだが、上の行は、連続した数字からなる文字列("33"とか"333"とか)を取り出して、atoi() で数値に変換し、10で割ったあまりを取ることで、その連続している数字を取り出すというものだが、これを下の行のように、読み込んだ文字列の文字コードから直接得てしまうという方法で短くできる。

for(;~scanf("%[^1]1%n",&s,&l);)f(atoi(&s)%10);
for(;~scanf("%[^1]1%n",&s,&l);)f(s&15);

scanf() や atoi() は char* と思っているものが、実は int* で、int の"入れ物"に、文字列を上書きさせて、それを int として読んじゃう、という感じだ。minimal PostScript interpreterでも同様のテクニックを使った。
GolfScriptもトップに5B差をつけられている。まだまだ修行が足りないな。当初、GolfScriptで、文字コードから文字を得る方法がよく分からなかった。http://www.golfscript.com/golfscript/builtin.html にも記述が無いようだ。以下でできることを見つけた。

' '{16+}%     # ==> '0'
{16+}' '%     # ==> '0'
'ABC'{32+}%   # ==> 'abc'
{32+}'ABC'%   # ==> 'abc'
#以下、2010-03-22追記
[97 98 99]''+ # ==> 'abc'
''[97 98 99]+ # ==> 'abc'
#以下、2010-04-29追記
[97 98 99]+ # ==> 'abc'

2010-04-29追記

http://www.golfscript.com/golfscript/tutorial.html に記述があった。上記のような"文字"化は、coercion と呼ばれているタイププロモーションの結果ということだった。タイプのプライオリティーは、弱いほうから、数値、配列、文字列、ブロックで、+、-、^、&、| オペレーターの両引数は、プライオリティーの高いタイプにプロモート(coerce)されてから処理されるとのことだ。なので、

[97 98 99]''+

は、配列の各要素に ''(空文字列)が足された結果 'abc' になるのではなく、まず、配列 [97 98 99] が文字列 'abc' にプロモートされて、それに、''(空文字列)が足されるということのようだ。なので、

[97 98 99]'z'+

は、'abcz' になる。
なお、最後の例、

[97 98 99]+

は、単に、入力文字列が ''(空文字列)のため、

''[97 98 99]+

と同じ結果になるということだ。
しかし、まだ、ちょっとよく分からないのは、

' '{32+}%  # ==> '0'
' '32+     # ==> ' 32'

の違い。なぜ両者は同じ結果にならないのかな?

Collatz Problem

こちらは、vi が pla さんにまたもや大差(4B)をつけられた。色々試してみたが、どうも縮まらない。かなわないな。

Remenber Previous Input

#綴りが違う
どうやって3回の呼び出し間でデータを受け渡すかだが、cwd にファイルを作ればあっさり渡せることがわかった。今までファイル IO を行う問題が皆無だったので(print fileはあった)、それなりに面白かった。awk / vim で昨晩 eban さんと live(?) で争ったが両方とも負けてしまった。う〜む、強いな。ちょっと悔しい。
JavaScriptは、ファイル IO ができないからしょうがないと思ったら、こんなの(https://developer.mozilla.org/en/SpiderMonkey/File_object)見つけた。anarchy golf には、組み込まれていないんだな。

Square free integer

「簡単そうな問題を」と思い、久々に問題を作成したら、簡単過ぎた感があったが、実はその後結構縮まり驚いた。「エンドレス問題」として作成したが、タイムリミットを設けたほうが良かったかなと、ちょっと後悔している。