Counting adventure2009/12/15

Counting adventure - anarchy golf

テキストの圧縮問題は苦手。

ActiveSupport を require させてくれれば秒殺な感じはするんだけど……。 (Lisp系の極端に短いのはそういうことだよね?)

zero lines2009/12/15

zero lines - anarchy golf

22Bまでは簡単なんだけど、21Bは判らない……。

22Bの2パターンは見付けたけど、 yowaさんの0/7/13は謎。

(追記) 0/7/13 は投稿したのじゃない方の22Bの別表記だった。

Enumerable::Enumerator#each2009/11/26

each {...} -> object

   生成時のパラメータに従ってブロックを繰り返します。生成時に指定したイテレータの戻り値をそのまま返します。
Enumerable::Enumerator#each

戻り値が元のメソッドの戻り値というのが面白い。

str = "Hello World!"
enum = str.gsub(/./)
out = enum.each{|c| p c; c.downcase} #=> "H"
                                     #   "e"
                                     #   "l"
                                     #   "l"
                                     #   "o"
                                     #   " "
                                     #   "W"
                                     #   "o"
                                     #   "r"
                                     #   "l"
                                     #   "d"
                                     #   "!"
p out #=> "hello world!"

Enumerable::Enumerator#each に与えたブロックが yeild される際には Enumerator生成に使った元のメソッドの副作用もちゃんと適用されているようで、 このgsubの場合では、$&等の組み込み変数もちゃんと変更されている。

str = "Hello World!"
enum = str.gsub(/./)
out = enum.each{p $&} #=> "H"
                      #   "e"
                      #   "l"
                      #   "l"
                      #   "o"
                      #   " "
                      #   "W"
                      #   "o"
                      #   "r"
                      #   "l"
                      #   "d"
                      #   "!"
p out #=> nil

問題は、Kernel#gsub に Enumerable::Enumerator を返却するインターフェイスが無いことか……。

$_ = "Hello World!"
not_enum = gsub(/./)
p not_enum #=> "Hello World!"
p not_enum.class #=> String

今日のイディオム2009/11/04

eval *$<

STDINから数字の入力を受けて、Numericに変換する。 STDINに複数行ある場合はまずいけど、理想状態では

gets.to_i
eval gets

のいずれよりも1バイト短い。

Count diamonds level 1 こたえあわせ2009/10/16

Count diamonds level 1 - anarchy golf

残り1Bは果てしなく遠かったでござるの巻。

$/=gets;p split.size/3while gets

までは行ったんだけどなあ……。

あと、これも格好いい '**'を数えるのは最初にやったけど、この発想はなかった。

ちなみに

$/=gets;p$_.sum/50%49while gets

$/=gets;p$_.count('*')/5while gets

と同じアイディア。 ' '(0x20)と'*'(0x2a)の差(10)が5つで50になります。

あと

$/=gets;loop{p$$%gets.sum%51}

とかも考えたけど、テストケース3回($$が2ずつ増加する)に耐えられなかった。