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

ちくわ

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

AtCoder ABC #038 の A と B やってみた

AtCoder 続いてしまった...

abc038.contest.atcoder.jp

こちらです。

A - お茶

問題文はリンク先をご参照下さい。 ローマ字を読めない高橋君の為に、その飲み物が お茶 であるかどうかを区別するプログラムを作れとのことです。 条件は T で終わる名前がお茶とのこと。どんな名前のお茶なのか。

今回最初に書いたコードはこちら

puts gets.match(/T$/) ? "YES" : "NO"

ついに 1 行で行けた!そして一発オールクリア!!
T で終わるといった条件を聞くと正規表現が早そうと思いそれで評価しました。

B - ディスプレイ

問題文はリンク先を(ry
豪華にもマルチディスプレイにした高橋君の話です。ローマ字すら読めないのにディスプレイはデュアルな高橋くん。 購入した二つのディスプレイの高さが合うかどうかを判別するプログラムを作れとのことです。 ただし入力される数値は 90 度回転しているケースも考慮する必要があります。

最初に Submit したコードはこちら

class Display
  def initialize
    @first  = STDIN.gets.split.map(&:to_i)
    @second = STDIN.gets.split.map(&:to_i)
    @first.each  {|n| raise 'Opps' unless n.between?(1,100_000) }
    @second.each {|n| raise 'Opps' unless n.between?(1,100_000) }
  end

  def result
    result = "NO"
    @first.each{|s| @second.each{|t| result = "YES" if s == t}}
    result
  end
end

display = Display.new
puts display.result

...こちらも一発 OK ! ひとつ目のディスプレイの高さと幅、ふたつ目のディスプレイの高さと幅、どちらかが合えばいいかという考えで each の入れ子作戦で行きました。

唯一ハマったのがエラー判定です。

raise 'Opps' unless @first.each  {|n| n.between?(1,100_000) }
raise 'Opps' unless @second.each {|n| n.between?(1,100_000) }

こう書いてしまったんですが、何を入れても通ってしまう。
unless の判定が配列にかかってしまったのが原因... だと思ってます。

そろそろ AtCoder だと Ruby の書き方パターンが決まってきてしまったなぁ。
C に挑戦してもいいのですが、Ruby よりもアルゴリズム周りで脳内リソースや変なハマりをしそうなので、ちょっと思いと違うのですよね。 何か別の挑戦をしたくなってきた...