atcoder039のABCを解いた

こんにちは、いなむーです。

いつものatcoderシリーズです。

今回はいつもより問題が簡単だったため、初めてCまで解くことができました。

問題Aはこちら

そして書いたコードはこちら。

A,B,C = STDIN.gets.split(/ /).map {|v|v.to_i}
p 2 * ( A*B + A*C + B*C )

表面積の公式に当てはめただけです。
ただ、公式を思い出すのに苦労しましたがw

つぎに問題Bはこちら

そして書いたコードはこちら。

X = gets.to_i
 
(1..1000000000).each do | v |
  if (v ** 4) == X
    puts v
    exit
  end
end

この辺がプログラマーとの違いな気がします。このコードでは無駄にとにかく4乗になる値を回してるだけなので、きっともっと良い方法がありそうです。

そして問題Cはこちら

書いたコードはこちら。

K = "WBWBWWBWBWBW" * 3
 
arr1 = %w[ Do Re Mi Fa So La Si ]
arr2 = Array.new
 
(0..11).each do | v |
  if K[v,1] == "W"
    arr2 << K[v,20]
  end
end
 
X = arr1.zip(arr2)
S = gets.chomp
S2 = X.select { | v2 | v2[1]==S }
puts S2[0][0]

鍵盤で判断するための20文字が網羅できる数を変数に入れます。
つぎにドレミの値を配列にいれます。
次にドからシまでの間の文字数12鍵分、eachで回しながら取得する文字の位置を変えていき、一文字目がWだったら、その文字の位置から20文字取得して、arr2の配列にいれます。

そして、zipメソッドで配列に配列をいれます。
その配列の2つ目の要素が、標準入力と一緒だったら、1つ目の要素(音階)を表示させる。

これが流れです。

もはやClassとかにしていないし、結構雑になってしまったのでリファクタリングしたいですが、色々勉強になったので良かったです。

以上。