Day 3: Binary Diagnostic

3-a

# Adbent Calendar Day


input = [];
File.foreach("3_input.dat").with_index do |line, line_num|
  input.push(line)
end

array = [0,0,0,0,0,0,0,0,0,0,0,0];
input.each_with_index do |line, index|
  if line[0].to_i == 1 then
    array[0] = array[0] + 1
  end
  if line[1].to_i == 1 then
    array[1] = array[1] + 1
  end
  if line[2].to_i == 1 then
    array[2] = array[2] + 1
  end
  if line[3].to_i == 1 then
    array[3] = array[3] + 1
  end
  if line[4].to_i == 1 then
    array[4] = array[4] + 1
  end
  if line[5].to_i == 1 then
    array[5] = array[5] + 1
  end
  if line[6].to_i == 1 then
    array[6] = array[6] + 1
  end
  if line[7].to_i == 1 then
    array[7] = array[7] + 1
  end
  if line[8].to_i == 1 then
    array[8] = array[8] + 1
  end
  if line[9].to_i == 1 then
    array[9] = array[9] + 1
  end
  if line[10].to_i == 1 then
    array[10] = array[10] + 1
  end
  if line[11].to_i == 1 then
    array[11] = array[11] + 1
  end
end

p array

3-b

# Adbent Calendar Day2-b


array = [];
File.foreach("2_input.dat").with_index do |line, line_num|
  array.push(line)
end

h = 0;
d = 0;
aim = 0;
array.each_with_index do |line, index|
  if line[0] == "f" then
    h = h + line[8].to_i
    d = d + (line[8].to_i * aim)
  elsif line[0] == "u" then
    aim = aim - line[3].to_i
  else
    aim = aim + line[5].to_i
  end
end

puts "horizontal: #{h}"
puts "depth: #{d}"
puts h * d

メモ

今回の問題は色々学びが多かった。

  • 配列をeachで回してる時にその配列内の要素を消去してはいけない。配列要素を参照しているポインターがずれてしまうので、ループが上手くいかなくなる。delete_ifメソッドを代わりに使う。
array = [0,0,0,0,1,1,0,1,0,1]

#これはダメ

array.each do |n|
  if n == 1
    array.delete(n)
  end
end

#代わりにこっちを使う

arry.delete_if do ||
  n == 1
end

後はLoopのExit条件は問題通り正確に実装しよう。こうしたら試行回数減らせるんじゃない?っていう安易な考えで実装してはいけない。特に問題なければ読んだ通りにコードに落とし込もう。自戒。