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