[AtCoder]AtCoderの過去問を解く②[Ruby]

プログラミング

過去問を解いていきます。http://atcoder-scores.herokuapp.com/

ABC045A – 台形/Trapezoids

問題

上底の長さが a、下底の長さが b、高さが hの台形があります。台形の面積を求めてください。

自分の回答

def trapezoid(top_side, bottom_side, height)
  area = (top_side + bottom_side)*height/2
  p area
end

top_side= gets.chomp.to_i
bottom_side = gets.chomp.to_i
height = gets.chomp.to_i
trapezoid(top_side, bottom_side, height)

台形の面積を求めればOKです。

ABC046A – AtCoDeerくんとペンキ/AtCoDeer and Paint Cans

問題

A君はペンキをこれまでに3つ買いました。おととい買ったペンキの色は a, 昨日買ったペンキの色は b , 今日買ったペンキの色はcです。各ペンキの色は1以上100以下の整数で表されます。 A君はわすれんぼうなため、同じ色のペンキを買ってしまっていることがあります。A君が買ったペンキの色の種類の個数を教えてあげてください。

自分の回答

def paintcans(cans)
  p cans.uniq.size
end

cans = gets.chomp.split(" ").map(&:to_i)
paintcans(cans)

uniqメソッドで重複を消して、そのサイズを出力すればOKですね。

ABC047A – キャンディーと2人の子供/Fighting over Candies

問題

幼稚園に通う 2人の子供がキャンディーの取り合いをしています。
3個のキャンディーパックがあり、それぞれのパックにはキャンディーが a,b,c 個入っています。
先生はこの3個のパックを、キャンディーの個数が等しくなるように2人に分けようとしています。そのような分け方が可能かどうかを判定してください。
ただし、キャンディーをパックから取り出すことはできず、それぞれのパックをそのままどちらかの子供にあげる必要があります。

自分の回答

def fightingover(candies)
  candies.sort!
  puts candies[0] + candies[1] == candies[2] ? "Yes" : "No"
end

candies = gets.chomp.split(" ").map(&:to_i)
fightingover(candies)

# ifワンライナーで書かないバージョン
def fightingover(candies)
  candies.sort!
  if candies[0] + candies[1] == candies[2]
    puts "Yes"
  else
    puts "No"
  end
end

candies = gets.chomp.split(" ").map(&:to_i)
fightingover(candies)

ちょっと考えました。

要は、キャンディの個数の小さいものの二つの合計がキャンディの個数が一番大きいものと等しいかどうかと言う問題になります。考え方さえわかって仕舞えば、コード自体は簡単ですね。

ワンライナーで書いたところをif文で書いたバージョンも載せておきます。決して、if文を書いてからじゃないとワンライナーで書けない訳ではありません。決してなのです。

ABC048A – AtCoder *** Contest

問題

A君は、AtCoder s Contest という名前のコンテストを開こうとしています。 ここで、sは長さ 1以上の文字列であり、1文字目は英大文字、2文字目以降は英小文字です。

すぬけ君は、このコンテストの略称を AxCに決めました。 ここで、xは sの先頭の英大文字です。

コンテストの名前が与えられるので、コンテストの略称を出力してください。

自分の回答

def contenst(word)
  word = word.gsub(/AtCoder /,"")
  puts "A#{word[0]}C"
end

word = gets.chomp.to_s
contenst(word)

正規表現を使って、きれいにできないかなと思いましたけど、思いつきませんでした。

最初に”AtCoder “を削除した後、残った文字列の一番最初をAとCで挟めばOKです。

もっとよくする

def contenst(x)
  puts "A#{x[0]}C"
end

A,x,C = gets.chomp.split(" ").map(&:to_s)
contenst(x)

他の方のを参考にして修正しました。入力の時点で振り分けていますね。これは頭がいい。

ABC049A – 居合を終え、青い絵を覆う/UOIAUAI

問題

英小文字cが与えられるので、cが母音であるか判定してください。ここで、英小文字のうち母音は aeiouの5つです。

自分の回答

def uoiauai(word)
  if word == "a" || word == "i" || word == "u" || word == "e" || word == "o"
    puts "vowel"
  else
    puts "consonant"
  end
end

word = gets.chomp.to_s
uoiauai(word)

他の方のを見ていると、includeを使っている人が多いですね。確かに、includeを使った方が、orで条件をたくさん書くよりもわかりやすいですね。

タイトルとURLをコピーしました