読者です 読者をやめる 読者になる 読者になる

ちくわ

ちくわにきゅうりを入れるとうまい

AtCoder ABC #034 の A「テスト」をやってみた

Ruby

設問はこちら

abc034.contest.atcoder.jp

今回は 可能な限り短いコードで 、という個人ルールを設けてやってみました。

ロジック自体はすぐに分かったのですが、思わぬところで時間をかけてしまいました。まず、最初にさっと書いたのがこちら

x, y = STDIN.gets.split
p x < y ? "Better" : "Worse"

これが直ぐに書けるようになるとは... 1 ヶ月前の自分には信じられないことです。
もう A 楽勝だろ―と思ってたらまさかの Wrong Answer で全てのテストケースで失敗。(ノ∀`)

原因は p にありました。何故か p は puts の省略だと誤認識していたのです。

p (Kernel) - Rubyリファレンス

確かに手元で実行すると、

$ ruby z
1 2
"Better"

と言った感じで、ダブルクオーテーションで囲まれた状態で表示されます。ここで気付くべきだった。
そして次に puts に直したのですが、

x, y = STDIN.gets.split
puts x < y ? "Better" : "Worse"

これも Wrong Answer ... TestCase が 2 つ失敗して Score は 0 です。 ちょっと考えたあと、結果通ったのがこちらです。

x, y = STDIN.gets.split
puts x.to_i < y.to_i ? "Better" : "Worse"

to_i を付けたら通りました。
設問に 入力はすべて整数である。 と書いてあったのでいらないだろうと思ってましたが、要るんですね...未だにこれは納得できておらず。

また、この書き方では to_i の部分が冗長なので、ぐぐってみると以下のサイトを見つけました。

qiita.com

Symbol や Proc 周りは説明を受けたものの、まだ体が覚えておらず、復習しよう...
この辺りを理解した時に色々見える気がする!気がする!

この Qiita ページの Symbol.to_procという魔法をかけて、さらに綺麗に という説明を読んで、最終的には以下のコードになりました。

x, y = STDIN.gets.split.map(&:to_i)
puts x < y ? "Better" : "Worse"

更に 1 行で (; でつなげるとかではなく) 処理出来ないかと試行錯誤しましたが、今の自分には思いつかずです。

以上です。


5/26 追記

設問に 入力はすべて整数である。 と書いてあったのでいらないだろうと思ってましたが、要るんですね...未だにこれは納得できておらず。

ここですが、@alotofwe さんからコメント頂きまして

という事でした。なるほどねー。なるほどねー。 AtCoder のテストケースとしては整数が渡されるけど、それが整数として扱うかどうかはプログラム側次第から、今回はちゃんと指定しないとアカンのですね。まぁそれはそうですよね。テストの大半が通ってしまったので見えなくなっていた。