Ruby "enbugging" quiz
ネタバレを含みます。
Stage 1
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
2.rb
# The billion dollar mistake
ary = ["NO ERROR"]
puts ary[10].downcase
これは想定解通りだった。
Stage 3
3.rb
def foo(x, y, z)
end
foo(1, 2, )
ケツコンマが許されてるの知らなかった。
Stage 4
4.rb
n = 3
puts "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
end
end
puts C.new.main
# Thanks @joker1007
main
をprivateにすればよいので、 #
を挿入したけど、 ,
をつければ def main
の戻り値の :mail
を受けられる ってのはなるほど ってなった。Stage 8
8.rb
module M
end
module M2
include M2
end
module M
#include ? # cyclic?
puts "no error"
end
M2
の中で include M2
とすればいいだけとは気付いたけど、これだと M
がかかわってこないのでちょっときれいじゃない。 と思ったけど想定解でもこれだった。
Stage 9
9.rb
# The last quiz
def x = 2
def y = 1
puts "no error" * (x$-y)
ぜんぜんわからんので試しにいろんなところに記号を挿入してたら発見した。
$-y
でひとつの変数になって、それを x
に渡している という解釈か?想定解は
x -y
、なるほど。Stage A
a.rb
def foo(...)
"no error".clamp(...0)
end
puts foo("a", "z")
これなんで
0...
だと通って ...0
だと期待通りになるんだ?Stage C
c.rb
puts "no " + 9219755.to_s(0x34)
これは最初から見えてて、「あれ?
034
って52だよな……?」ってボケてたので、ボケがとけたら x
挿入すればいいことにすぐに気付いた。残り
とりあえず通るだけのコードたち(試行錯誤してわかんなくならないように……)。
6.rb
# Hint: String#*
n = 10
puts "rhino error!!"*-1#[n * -1..-3]
"rhino error!!"[n * -1..-3]*-1
にすれば3点には縮まるか。a.rb
def foo(...)
"no error".clamp(1...2)
end
puts foo("a", "z")
b.rb
r = 1#(0..1)
0 => ^r
puts "no error"
#RubyKaigi_2024