設問はこちら
今回は 可能な限り短いコードで 、という個人ルールを設けてやってみました。
ロジック自体はすぐに分かったのですが、思わぬところで時間をかけてしまいました。まず、最初にさっと書いたのがこちら
x, y = STDIN.gets.split p x < y ? "Better" : "Worse"
これが直ぐに書けるようになるとは... 1 ヶ月前の自分には信じられないことです。
もう A 楽勝だろ―と思ってたらまさかの Wrong Answer で全てのテストケースで失敗。(ノ∀`)
原因は p
にありました。何故か p は puts の省略だと誤認識していたのです。
確かに手元で実行すると、
$ 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
の部分が冗長なので、ぐぐってみると以下のサイトを見つけました。
Symbol や Proc 周りは説明を受けたものの、まだ体が覚えておらず、復習しよう...
この辺りを理解した時に色々見える気がする!気がする!
この Qiita ページの Symbol.to_procという魔法をかけて、さらに綺麗に
という説明を読んで、最終的には以下のコードになりました。
x, y = STDIN.gets.split.map(&:to_i) puts x < y ? "Better" : "Worse"
更に 1 行で (; でつなげるとかではなく) 処理出来ないかと試行錯誤しましたが、今の自分には思いつかずです。
以上です。
5/26 追記
設問に
入力はすべて整数である。
と書いてあったのでいらないだろうと思ってましたが、要るんですね...未だにこれは納得できておらず。
ここですが、@alotofwe さんからコメント頂きまして
@ginbear 文字列は辞書式順序で比較されるため、例えば「'123' < '5'」と書くと、それぞれの1文字目の'1'と'5'が比較されて結果はtrueになってしまうのです...!
— 玲香@健康 (@alotofwe) 2016年5月25日
という事でした。なるほどねー。なるほどねー。 AtCoder のテストケースとしては整数が渡されるけど、それが整数として扱うかどうかはプログラム側次第から、今回はちゃんと指定しないとアカンのですね。まぁそれはそうですよね。テストの大半が通ってしまったので見えなくなっていた。