Add day 2 and partial day3
This commit is contained in:
parent
729a8ff201
commit
b8077a35c3
60
src/day2/day2.rb
Normal file
60
src/day2/day2.rb
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
Point = Struct.new(:x, :y) do
|
||||||
|
def +(other)
|
||||||
|
self.class.new(self.x + other.x, self.y + other.y)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def process_input(input_string)
|
||||||
|
split = input_string.split
|
||||||
|
return split.first.to_sym, split.last.to_i
|
||||||
|
end
|
||||||
|
|
||||||
|
def step_to_point(direction, amount)
|
||||||
|
x = y = 0
|
||||||
|
case direction
|
||||||
|
when :forward
|
||||||
|
x = amount
|
||||||
|
when :down
|
||||||
|
y = amount
|
||||||
|
when :up
|
||||||
|
y = -amount
|
||||||
|
end
|
||||||
|
return Point.new(x, y)
|
||||||
|
end
|
||||||
|
|
||||||
|
position = Point.new(0, 0)
|
||||||
|
inputs = ARGF.read.lines
|
||||||
|
inputs.map do |input|
|
||||||
|
direction, amount = process_input(input)
|
||||||
|
point = step_to_point(direction, amount)
|
||||||
|
position += position + point
|
||||||
|
end
|
||||||
|
|
||||||
|
puts "Position is (#{position.x}, #{position.y})"
|
||||||
|
puts "The product of depth and height is #{position.x * position.y}"
|
||||||
|
|
||||||
|
# Aim portion
|
||||||
|
def step_to_point_with_aim(direction, amount, aim)
|
||||||
|
x = y = 0
|
||||||
|
case direction
|
||||||
|
when :forward
|
||||||
|
x += amount
|
||||||
|
y += amount * aim
|
||||||
|
when :down
|
||||||
|
aim += amount
|
||||||
|
when :up
|
||||||
|
aim -= amount
|
||||||
|
end
|
||||||
|
return Point.new(x, y), aim
|
||||||
|
end
|
||||||
|
|
||||||
|
position = Point.new(0, 0)
|
||||||
|
aim = 0
|
||||||
|
inputs.map do |input|
|
||||||
|
direction, amount = process_input(input)
|
||||||
|
point, aim = step_to_point_with_aim(direction, amount, aim)
|
||||||
|
position += position + point
|
||||||
|
end
|
||||||
|
|
||||||
|
puts "Position considering aim is (#{position.x}, #{position.y})"
|
||||||
|
puts "The product of depth and height considering aim is #{position.x * position.y}"
|
||||||
1000
src/day2/input
Normal file
1000
src/day2/input
Normal file
File diff suppressed because it is too large
Load Diff
52
src/day3/day3.rb
Normal file
52
src/day3/day3.rb
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
def process_input(input)
|
||||||
|
input.strip.to_i(2)
|
||||||
|
end
|
||||||
|
|
||||||
|
def find_most_common_bit(report)
|
||||||
|
bit_length = report.first.bit_length
|
||||||
|
|
||||||
|
ones_count = []
|
||||||
|
zeros_count = []
|
||||||
|
report.each do |column|
|
||||||
|
index = 0
|
||||||
|
while index <= bit_length + 1 do
|
||||||
|
ones_count[index] ||= 0
|
||||||
|
zeros_count[index] ||= 0
|
||||||
|
case column[index]
|
||||||
|
when 0 then zeros_count[index] += 1
|
||||||
|
when 1 then ones_count[index] += 1
|
||||||
|
end
|
||||||
|
index += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
result = ones_count.zip(zeros_count)
|
||||||
|
puts "Result: #{result}"
|
||||||
|
result.map do |digit|
|
||||||
|
if digit.first > digit.last then 1 else 0 end
|
||||||
|
end
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
def find_least_common_bit(report)
|
||||||
|
most_common_bit = find_most_common_bit(report)
|
||||||
|
least_common_bit = most_common_bit.map do |bit|
|
||||||
|
case bit
|
||||||
|
when 0 then 1
|
||||||
|
when 1 then 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return least_common_bit
|
||||||
|
end
|
||||||
|
|
||||||
|
inputs = ARGF.read.lines
|
||||||
|
|
||||||
|
puts "Report looks like: "
|
||||||
|
report = []
|
||||||
|
inputs.each do |input|
|
||||||
|
puts " #{input}"
|
||||||
|
processed_input = process_input(input)
|
||||||
|
report << processed_input
|
||||||
|
end
|
||||||
|
|
||||||
|
puts "Gamma Rate: #{find_most_common_bit(report)}"
|
||||||
|
puts "Epsilon Rate: #{find_least_common_bit(report)}"
|
||||||
12
src/day3/input
Normal file
12
src/day3/input
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
00100
|
||||||
|
11110
|
||||||
|
10110
|
||||||
|
10111
|
||||||
|
10101
|
||||||
|
01111
|
||||||
|
00111
|
||||||
|
11100
|
||||||
|
10000
|
||||||
|
11001
|
||||||
|
00010
|
||||||
|
01010
|
||||||
Loading…
x
Reference in New Issue
Block a user