Ruby でワンライナーでズンドコキヨシ
元ネタ
Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから
— てくも (@kumiromilk) 2016年3月9日
「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了って関数作ったら満点で単位貰ってた
元ネタが2年以上前でめちゃくちゃ今更なんですが、やってみた。
脳内で考えたコードがワンライナーでそのまま動作したのでちょっとうれしかった
Ruby でズンドコキヨシ
puts (1..).lazy.map { %w(ズン ドコ).sample }.each_cons(5).map(&method(:p)).find(&%w(ズン ズン ズン ズン ドコ).method(:==)).join puts "キ・ヨ・シ!" # => # ["ズン", "ドコ", "ズン", "ドコ", "ドコ"] # ["ドコ", "ズン", "ドコ", "ドコ", "ズン"] # ["ズン", "ドコ", "ドコ", "ズン", "ズン"] # ["ドコ", "ドコ", "ズン", "ズン", "ドコ"] # ["ドコ", "ズン", "ズン", "ドコ", "ズン"] # ["ズン", "ズン", "ドコ", "ズン", "ズン"] # ["ズン", "ドコ", "ズン", "ズン", "ドコ"] # ["ドコ", "ズン", "ズン", "ドコ", "ズン"] # ["ズン", "ズン", "ドコ", "ズン", "ズン"] # ["ズン", "ドコ", "ズン", "ズン", "ドコ"] # ["ドコ", "ズン", "ズン", "ドコ", "ドコ"] # ["ズン", "ズン", "ドコ", "ドコ", "ズン"] # ["ズン", "ドコ", "ドコ", "ズン", "ズン"] # ["ドコ", "ドコ", "ズン", "ズン", "ズン"] # ["ドコ", "ズン", "ズン", "ズン", "ズン"] # ["ズン", "ズン", "ズン", "ズン", "ドコ"] # ズンズンズンズンドコ # キ・ヨ・シ!
ワンライナーで書いているのでちょっと複雑かもしれませんが、やっていることは至極単純で
(1..) # Ruby 2.6 から入った (1..) で無限配列を生成 .lazy # 遅延処理するようにする .map { %w(ズン ドコ).sample } # ランダムな "ズン" "ドコ" な配列に変換 .each_cons(5) # 無限リストを5個ずつの配列に分割 .map(&method(:p)) # この時点で一旦出力 .find(&%w(ズン ズン ズン ズン ドコ).method(:==)) # ["ズン", "ズン", "ズン", "ズン", "ドコ"] の組み合わせを探す .join # 結果を結合
無限リスト + #lazy
を使って遅延処理しつつ、#each_cons(5)
で分割して ["ズン", "ズン", "ズン", "ズン", "ドコ"]
という並びがあれば終了する、っていう処理です。
やってることは割と力技。
ちなみに map(&%w(ズン ドコ).method(:sample))
と書きたかったんですが、#sample
が引数を受け取ってしまうのでダメでした。