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}"