過去問は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)