[AtCoder]AtCoder過去問を解く③[Ruby]

プログラミング

過去問はhttp://atcoder-scores.herokuapp.com/にあります。

ABC050A – Addition and Subtraction Easy

問題

joisinoお姉ちゃんは、A op B という式の値を計算したいと思っています。 ここで、A,Bは整数でopは、+ または - の記号です。 あなたの仕事は、joisinoお姉ちゃんの代わりにこれを求めるプログラムを作ることです。

並び替えたい3つの文節の長さを表す整数 A,B,Cが与えられるので、それらの文節を並び替えて五七五にできるか判定してください。

自分の回答

def addition(a,b,symbol)
  p symbol == "+" ? a.to_i + b.to_i : a.to_i - b.to_i
end

a, symbol, b = gets.chomp.split(" ")
addition(a,b,symbol)

符号(symbol)が”+”の時は加算、”-“の時は減算をすれば良いです。気をつけなければいけないのは、.getsで受け取った時点で数字のa、bはstring型になっているので、計算する際には、int型に変換しましょう。

ABC051A – Haiku

問題

イルカは、新年に長さ 19の文字列 sを受け取りました。
文字列 ss の形式は [英小文字 \(5\) 文字],[英小文字 \(7\) 文字],[英小文字 \(5\) 文字] で表されます。
イルカは、カンマで区切られた文字列 ss を、スペースで区切られた文字列に変換したいと思っています。
イルカの代わりに、この処理を行うプログラムを作ってください。

自分の回答

def haiku(word)
  puts word.gsub(/,/," ")
end

word = gets.chomp
haiku(word)

gsubメソッドを知っていれば簡単な問題ですね。カンマ(,)をスペースに変換しています。gsubはそこそこ使うので覚えていた方がいいですね。

gsub => 文字列中で pattern にマッチする部分全てを文字列 replace で置き換えた文字列を生成して返します。

ABC052A – TwoRectangles

問題

二つの長方形があります。 一つ目の長方形は、縦の辺の長さがA、横の辺の長さがBです。 二つ目の長方形は、縦の辺の長さがC、横の辺の長さがDです。

この二つの長方形のうち、面積の大きい方の面積を出力してください。 なお、二つの長方形の面積が等しい時は、その面積を出力してください。

自分の回答

def rectangles(a, b, c, d)
  p a * b >= c * d ? a * b : c * d
end

a, b, c, d = gets.chomp.split(" ").map(&:to_i)
rectangles(a, b, c, d)

面積を計算して大きい方の面積を出力すれば良いです。

ABC053A – ABC/ARC

問題

すめけくんは現在のレートが 1200未満ならば AtCoder Beginner Contest (ABC) に、そうでなければ AtCoder Regular Contest (ARC) に参加することにしました。 すめけくんの現在のレート xが与えられます。すめけくんが参加するコンテストが ABC ならば ABC と、そうでなければ ARC と出力してください。

自分の回答

def abc(x)
  puts x < 1200 ? "ABC" : "ARC"
end

x = gets.chomp.to_i
abc(x)

レートの値(x)が1200未満の時は”ABC”をそれ以上の時は”ARC”を出力します。

ABC054A – One Card Poker

問題

AliceとBobは、2人で1枚ポーカーを行います。
1枚ポーカーは、トランプを用いて行う2人ゲームです。

今回使用するトランプでは、各カードに 1 から 13 までの数が書かれています。
カードの強さは、カードに書かれている数で決まり,強さの基準は以下の通りです。
弱 2<<3<<4<<5<<6<<7<<8<<9<<10<<11<<12<<13<<1 強

自分の回答

def poker(a, b)
  if a == b
    puts "Draw"
  elsif a == 1
    puts "Alice"
  elsif b == 1
    puts "Bob"
  elsif a > b
    puts "Alice"
  else
    puts "Bob"
  end
end

a, b = gets.chomp.split(" ").map(&:to_i)
poker(a, b)

問題の回答自体はすぐに浮かびましたが、なんとかしてきれいなコードにならないかと考えてしまいました。結局、elsifを並べることしか思い浮かばなかったです。

他の方のを見ると、aやbが1の時は14に変換してから、値を比較しています。その方が、コードとしては短くなります。ただ、14に変換すると言うのが不自然かなと思ってしなかったのですが、そちらの方がよかったですね。参考に下に14に変換するバージョンを書いておきます。

def poker(a, b)
  a = 14 if a == 1
  b = 14 if b == 1
  puts a == b ? 'Draw' : (a > b ? 'Alice' : 'Bob')
end

a, b = gets.chomp.split(" ").map(&:to_i)
poker(a, b)
タイトルとURLをコピーしました