falling number

falling number が終了した。面白い問題だったと思う。

JS

xulapp さんの解。xulapp さんは、ギリギリまでつめてくるから、かなわない。この解は、destructuring assignment だった。みごとだなぁ。

vi

vi は、10 から 9876 まで生成した後に条件を満たさない行を消す、という方針だが、はじめ、いつものようにマクロで数値の生成を行うとタイムアウトしてしまい、while を使うようにしたが、長くなってしまった。

マクロ版:
    i10^[qzYp^Aq9866@z
while版:
    :wh@n<9867|let@O=@n+10."\n"|let@n=@n+1|endw
    "oP

このため、seq コマンドを exec することで、B を稼いだが、その後、range() 関数というのがあるのを見つけた。range() は速い。vim は機能が多すぎて知らないものがまだまだたくさんある。

C

C はまぁまぁ素直な解だと思うが、最後、not さんにしっかり抜かれた。ちょっとした式の変更で追いついたが。。。まだまだ自分のつめの甘さを痛感する。

GolfScript

GolfScript は、解き方が少し異なる。数を文字列にし、桁をソートして、重複する数字を取り除いても元の数と同じもののみ出力する、という方法だ。ソートが逆順になるので、reverse もかけている。

10.4?,>{`.$.&-1%=},n*

重複の取り除きは、配列の & で行う。配列を dup して & すると重複が取り除ける。".&" の部分だ。