Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから
— てくも (@kumiromilk) 2016年3月9日
「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了って関数作ったら満点で単位貰ってた
やってみた。Ruby コード。
z, d = zd = ["ズン", "ドコ"] line = [] until line == [z, z, z, z, d] line << zd[rand(2)] line = line.last(5) print line.last sleep(1) end puts "キ・ヨ・シ!"
意外と出ないものですね。あ、これ、関数ではないか。
追記
ここにこういうコードがあった。
def zundoko z, d = zd = ['ズン', 'ドコ'] loop.lazy.map { zd.sample }.each_cons(5).with_index do |nominees, i| i.zero? ? nominees.each(&method(:print)) : print(nominees.last) break if nominees == [z, z, z, z, d] end print 'キ・ヨ・シ!' end zundoko
プロの優れたプログラマがネタとして書いたコードなのでマジレスするわけではないが、これは Ruby らしい「悪しきコード」だと思う。凝りすぎ。出力のためだけに with_index
や三項演算子を使ったり、each {|x| print x}
の代わりに(ブロック変数を省略するために ) each(&method(:print))
と書いたり。Ruby を使っているとついこういうコードを書きたくなってしまうけれど。まあ初心者の冗談レスですが。
もしこれが「悪いコード」だとするならば、ここで Enumerator と each_cons(5) を使おうと決めた選択がよくなかったということになると思う。