Ruby "enbugging" quiz

Ruby "enbugging" quiz


ネタバレを含みます。

Stage 1
1.rb
Copied!
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
Copied!
# The billion dollar mistake
ary = ["NO ERROR"]
puts ary[10].downcase
これは想定解通りだった。

Stage 3
3.rb
Copied!
def foo(x, y, z)
end
foo(1, 2, )
ケツコンマが許されてるの知らなかった。

Stage 4
4.rb
Copied!
n = 3
puts "I dunno error"[2 + @n..]
n @n にして nil を得た。
3 を消してまた未初期化の読み出しにする ってのはなるほどだ。

Stage 5
5.rb
Copied!
# Out of bounds?
ary = [1, 2, 3]
ary[~3] = "no error"
puts ary[3]
~3 -4 が作れるのでは? と思ったら、作れた。
これも想定解っぽい。

Stage 6

Stage 7
7.rb
Copied!
# 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
Copied!
module M
end

module M2
include M2
end

module M
#include ? # cyclic?
puts "no error"
end
M2 の中で include M2 とすればいいだけとは気付いたけど、これだと M がかかわってこないのでちょっときれいじゃない。
と思ったけど想定解でもこれだった。

Stage 9
9.rb
Copied!
# The last quiz
def x = 2
def y = 1
puts "no error" * (x$-y)
ぜんぜんわからんので試しにいろんなところに記号を挿入してたら発見した。
$-y でひとつの変数になって、それを x に渡している という解釈か?
想定解は x -y 、なるほど。

Stage A
a.rb
Copied!
def foo(...)
"no error".clamp(...0)
end

puts foo("a", "z")
これなんで 0... だと通って ...0 だと期待通りになるんだ?

Stage C
c.rb
Copied!
puts "no " + 9219755.to_s(0x34)
これは最初から見えてて、「あれ? 034 って52だよな……?」ってボケてたので、ボケがとけたら x 挿入すればいいことにすぐに気付いた。

残り
とりあえず通るだけのコードたち(試行錯誤してわかんなくならないように……)。
6.rb
Copied!
# Hint: String#*
n = 10
puts "rhino error!!"*-1#[n * -1..-3]
"rhino error!!"[n * -1..-3]*-1 にすれば3点には縮まるか。
a.rb
Copied!
def foo(...)
"no error".clamp(1...2)
end

puts foo("a", "z")
b.rb
Copied!
r = 1#(0..1)
0 => ^r
puts "no error"



#RubyKaigi_2024
Powered by Helpfeel