Ruby "enbugging" quiz
ネタバレを含みます。
Stage 1
1.rbn = 1_000.p n + 1puts "no error"なんか全ての問題が1点で行ける ということを聞いて色々試していたら、偶然発見した。
なんでこれでいけるんだ……?
n = 1000.p(n + 1) となるのはよいが、自分を定義する時に自分を使える? ので、先に n + 1 のほうが評価されている?? 再帰的な定義する際とかにここで自分を使える必要があるのだろうか?
これがko1の想定していた解答ですが、mameが想定していたもう少し難しい別解もあります。それは、1_000の前に#を置くことです。これにより、n = p n + 1という式になるのですが、nへの代入の右辺でnを参照すると、未初期化のローカル変数の読み出しとなり、やはりnilが得られます。
と同じ状況となっていそう。
Stage 2
2.rb# The billion dollar mistakeary = ["NO ERROR"]puts ary[10].downcaseこれは想定解通りだった。
Stage 3
3.rbdef foo(x, y, z)endfoo(1, 2, )ケツコンマが許されてるの知らなかった。
Stage 4
4.rbn = 3puts "I dunno error"[2 + @n..] n を @n にして nil を得た。 3 を消してまた未初期化の読み出しにする ってのはなるほどだ。Stage 5
5.rb# Out of bounds?ary = [1, 2, 3]ary[~3] = "no error"puts ary[3] ~3 で -4 が作れるのでは? と思ったら、作れた。 これも想定解っぽい。
Stage 6
Stage 7
7.rb# Last day!class C def no = "no" def error = "error"
private #:no, :error
def main no + " " + error endend
puts C.new.main# Thanks @joker1007 main をprivateにすればよいので、 # を挿入したけど、 , をつければ def main の戻り値の :mail を受けられる ってのはなるほど ってなった。Stage 8
8.rbmodule Mend
module M2 include M2end
module M #include ? # cyclic? puts "no error"end M2 の中で include M2 とすればいいだけとは気付いたけど、これだと M がかかわってこないのでちょっときれいじゃない。 と思ったけど想定解でもこれだった。
Stage 9
9.rb# The last quizdef x = 2def y = 1puts "no error" * (x$-y)ぜんぜんわからんので試しにいろんなところに記号を挿入してたら発見した。
$-y でひとつの変数になって、それを x に渡している という解釈か?想定解は
x -y 、なるほど。Stage A
a.rbdef foo(...) "no error".clamp(...0)end
puts foo("a", "z")これなんで
0... だと通って ...0 だと期待通りになるんだ?Stage C
c.rbputs "no " + 9219755.to_s(0x34)これは最初から見えてて、「あれ?
034 って52だよな……?」ってボケてたので、ボケがとけたら x 挿入すればいいことにすぐに気付いた。残り
とりあえず通るだけのコードたち(試行錯誤してわかんなくならないように……)。
6.rb# Hint: String#*n = 10puts "rhino error!!"*-1#[n * -1..-3] "rhino error!!"[n * -1..-3]*-1 にすれば3点には縮まるか。a.rbdef foo(...) "no error".clamp(1...2)end
puts foo("a", "z")b.rbr = 1#(0..1)0 => ^rputs "no error"#RubyKaigi_2024