RubyKaigi2019でcookpadが毎日3問パズルを出していて、それに触発されて、2019/05のokinawa.rbでパズルを出題し合う会をやった。
オリジナルのcookpadパズル: https://techlife.cookpad.com/entry/2019/04/25/122520
他の人の問題は hanachinさんのgist にまとまってます
問題はこちら https://gist.github.com/tompng/07c8e8b8f04626d104fff1c33bb7a094
その答えと意図と考えたこと
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
問題
s = %w(Goodbye World Hello)
t = %w(Hello World Goodbye)
tap {
$> << s[-1] # Hello
}
tap {
$> << t[-1] # Goodbye
.to_str
}
tap {
$>.<<(t[s.size - 2 % 4]) # World
}
tap {
$>.<<(s[t.size - 3 % 5]) # Goodbye
.to_io
}
答え
s = %w(Goodbye World Hello)
t = %w}(Hello World Goodbye)
tap {
$> << s[-1] # Hello
}
tap {
$> << t[-1] # Goodbye
.to_str
}
tap {
$>.<<(t[s.size - 2 % 4]) # World
}
tap {
$>.<<(s[t.size - 3 % 5]) # Goodbye
.to_io
}
t = %w(Hello World Goodbye)
→ t = %w}(Hello World Goodbye)
%w(a b c)
%w[a b c]
%w!a b c!
はよく使うし、この記法は括弧の対応もちゃんと見ているんだけど、
実は %w))
%w]]
%w}}
も使える。(括弧の対応は無視されてただの記号扱い)
これを使う、使った結果コメント行の # Hello
を有効活用する、ことを目標に問題作った。
1文字解答だけじゃなく二つのGoodbyeを潰す2文字解答もちょっと難しめにしようと思った結果(to_str to_ioの部分)、
2文字解答はどちらも ta=p
にできたり他にも別解が沢山あるしただ単に問題がごちゃっとしただけになってしまったのは失敗だったかもしれない。
問題
s = %w(Hello Goodbye World)
3.times do |i|
print s[(i-2).abs-1]
end
答え
s = %w(Hello Goodbye World)
3.times do |i|
print s[(i-2).abs2-1]
end
abs
→ abs2
ごめん... ''.methods
0.methods
etc... を眺めて、メソッドに1文字追加して別のメソッドに変える問題を作れないか考えてた。
見たことのない abs2
を見つけてこれだ、と問題を作っちゃった。
問題
defined? $><<'World'<<($><<'Hello')<<'GoodBye'
答え
defined? $><<'World'<0<($><<'Hello')<<'GoodBye'
'World'<<
→ 'World'<0<
他の数値やp
でも可。
いまいちよくわからないまま問題にしちゃったのは内緒。
問題
send def say
$> << 'Goodbye' << ($> << 'Hello' << 'World'; 'World')
end
答え
send def say
% $> << 'Goodbye' << ($> << 'Hello' << 'World'; 'World')
end
$>
→ % $>
あとで追加した問題。
$> << 'Goodbye' << ...
を "$>" << 'Goodbye' << ...
と文字列のappendに変えてGoodbye出力を阻止する。
%(abc)
%!abc!
%+abc+
記法の記号は条件次第で改行文字も空白文字も使える。
問題が成り立つために$>
の前にスペースが必要なのでdefで囲ってインデントをつけた。
この問題は、Q1の2文字解答の別解チェック(ブルートフォースで)で見つけた以下の別解を元に作った。
ta「別解1:ここに=を追加」p {「想定解:ここに%を追加」
「別解2:ここに%を追加」 $> << t[-1] # Goodbye
.to_str
}