Skip to content

Instantly share code, notes, and snippets.

@tompng
Last active May 17, 2019 04:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tompng/1270002185556ff1cfedd64278c56ea2 to your computer and use it in GitHub Desktop.
Save tompng/1270002185556ff1cfedd64278c56ea2 to your computer and use it in GitHub Desktop.

RubyPuzzle

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

その答えと意図と考えたこと

Q1

問題

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 にできたり他にも別解が沢山あるしただ単に問題がごちゃっとしただけになってしまったのは失敗だったかもしれない。

Q2

問題

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

absabs2

ごめん... ''.methods 0.methods etc... を眺めて、メソッドに1文字追加して別のメソッドに変える問題を作れないか考えてた。

見たことのない abs2 を見つけてこれだ、と問題を作っちゃった。

Q3

問題

defined? $><<'World'<<($><<'Hello')<<'GoodBye'

答え

defined? $><<'World'<0<($><<'Hello')<<'GoodBye'

'World'<<'World'<0< 他の数値やpでも可。

いまいちよくわからないまま問題にしちゃったのは内緒。

Q4

問題

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
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment