hacca8

AtCoder Beginners SelectionをRubyで解いてみました

学習のためAtCoderをやってみました。
時間の都合であまりコンテストには参加できませんが、少しずつ解いていこうと思います。

ABC086A - Product

a, b = gets.split.map(&:to_i)
puts (a * b).even? ? 'Even' : 'Odd'

ABC081A - Placing Marbles

s1, s2, s3 = gets.split('').map(&:to_i)
puts s1 + s2 + s3

カウントメソッドでいいとのこと count('1') 確かに🤔

ABC081B - Shift only

n = gets.to_i
nums = gets.split.map(&:to_i)
count_list = []
nums.each do |i|
  count = 0
  while i % 2 == 0
    i = i / 2
    count += 1
  end
  count_list << count
end
puts count_list.min

ABC087B - Coins

ary = Array.new(4){ gets.to_i }
count = 0
(0..ary[0]).each do |a|
  (0..ary[1]).each do |b|
    (0..ary[2]).each do |c|
      if ary[3] == a * 500 + b * 100 + c * 50
        count += 1
      end
    end
  end
end
puts count

ABC083B - Some Sums

n, a, b = gets.split.map(&:to_i)
total = 0
(1..n).each do |i|
  ary = i.to_s.chars.map(&:to_i)
  sum = ary.sum
  if sum >= a && sum <= b
    total += i
  end
end
puts total

ABC088B - Card Game for Two

n = gets.to_i
card_list = gets.split.map(&:to_i)
card_list = card_list.sort.reverse
alice = 0
bob = 0
n.times do |i|
  if i.even?
    alice += card_list[i]
  else
    bob += card_list[i]
  end
end
puts alice - bob

差分を出せばいいので、足し算引き算を繰り返して求めるでもいいとのこと

i.even? ? result += card_list[i] : result -= card_list[i]

確かに🤔

ABC085B - Kagami Mochi

n = gets.to_i
ary = Array.new(n){ gets.to_i }
puts ary.uniq.size

ABC085C - Otoshidama

n, y = gets.split.map(&:to_i)
flg = false
(0..n).each do |a|
  (0..n).each do |b|
    c = n - a - b
    if c >= 0 && y == 10000*a + 5000*b + 1000*c
      puts "#{a} #{b} #{c}"
      exit
    end
  end
end
puts '-1 -1 -1'

ABC049C - 白昼夢

s = gets.chomp
%w(eraser erase dreamer dream).each do |i|
  s.gsub!(i, '')
end
puts s.size == 0 ? 'YES' : 'NO'

通ってしまったけど一番駄回答そう…

ABC086C - Traveling

ary = []
n = gets.to_i
n.times do
  t, x, y = gets.split.map(&:to_i)
  ary << { t: t, x: x, y: y }
end

t, x, y = 0, 0, 0
ary.each do |i|
  dt = i[:t] - t
  dx = (i[:x] - x).abs
  dy = (i[:y] - y).abs
  if dt < dx + dy || (dt - dx + dy).odd?
    puts 'No'
    exit
  end
  t, x, y = i[:t], i[:x], i[:y]
end
puts 'Yes'

最初は単純にt < x + y || (t - x + y).odd?だけ見てたのですが、1つだけWAでした。
この条件だけだと、下記のようにいきなり0,0地点に戻ってもYesになったので手前の地点も見るようにすると通りました。

2
3 1 2
4 0 0

PS

ABC049C - 白昼夢の後にABC086C - Travelingを解くと、出力がYESYesで違うのでうっかりしてるとWAになります……ええ、見事に引っかかりました。