49 lines
1.2 KiB
Ruby
49 lines
1.2 KiB
Ruby
|
class PotentialTriangle
|
||
|
attr_reader :sides
|
||
|
|
||
|
def initialize(line)
|
||
|
@sides = line.split.map(&:to_i)
|
||
|
end
|
||
|
|
||
|
%w[a b c].each_with_index do |side, index|
|
||
|
define_method("side_#{side}") do
|
||
|
sides[index]
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def valid?
|
||
|
side_a_valid? && side_b_valid? && side_c_valid?
|
||
|
end
|
||
|
|
||
|
def side_a_valid?
|
||
|
side_a < side_b + side_c
|
||
|
end
|
||
|
|
||
|
def side_b_valid?
|
||
|
side_b < side_a + side_c
|
||
|
end
|
||
|
|
||
|
def side_c_valid?
|
||
|
side_c < side_b + side_a
|
||
|
end
|
||
|
end
|
||
|
|
||
|
input = STDIN.read.chomp
|
||
|
potential_triangle_lines = input.split("\n")
|
||
|
potential_triangles = potential_triangle_lines.map { |line| PotentialTriangle.new line }
|
||
|
valid_triangles = potential_triangles.count(&:valid?)
|
||
|
|
||
|
puts "Part 1: #{valid_triangles}"
|
||
|
|
||
|
grouped_triangle_lines = potential_triangle_lines.join(" ").split.each_with_index.each_with_object([[], [], []]) do |item_index, groups|
|
||
|
item, index = item_index
|
||
|
groups[index % 3] << item
|
||
|
groups
|
||
|
end
|
||
|
|
||
|
sideways_triangle_lines = grouped_triangle_lines.flatten.each_slice(3).to_a.map { |tri| tri.join " " }
|
||
|
sideways_triangles = sideways_triangle_lines.map { |line| PotentialTriangle.new line }
|
||
|
valid_sideways_triangles = sideways_triangles.count(&:valid?)
|
||
|
|
||
|
puts "Part 2: #{valid_sideways_triangles}"
|