Skip to content

Instantly share code, notes, and snippets.

@therubyhound
Last active December 2, 2024 23:09
Show Gist options
  • Save therubyhound/0008e6c7c5cab2991030038fda2abbf3 to your computer and use it in GitHub Desktop.
Save therubyhound/0008e6c7c5cab2991030038fda2abbf3 to your computer and use it in GitHub Desktop.
Advent of Code 2024, Day 1: ruby location_data.rb day_1.txt
require "minitest/autorun"
INPUT = DATA.read
class LocationDataTest < Minitest::Test
def test_total_distance
location_list = LocationData.new(INPUT)
assert_equal 11, location_list.total_distance
end
def test_similarity_score
location_list = LocationData.new(INPUT)
assert_equal 31, location_list.similarity_score
end
def test_distance
location_list = LocationData.new(INPUT)
assert_equal 2, location_list.distance(1, 3)
assert_equal 1, location_list.distance(2, 3)
assert_equal 0, location_list.distance(3, 3)
assert_equal 1, location_list.distance(3, 4)
assert_equal 2, location_list.distance(3, 5)
assert_equal 5, location_list.distance(4, 9)
end
def test_similarity
location_list = LocationData.new(INPUT)
assert_equal 9, location_list.similarity(3)
assert_equal 4, location_list.similarity(4)
assert_equal 0, location_list.similarity(2)
assert_equal 0, location_list.similarity(1)
end
def test_ordered_data
location_list = LocationData.new(INPUT)
ordered = [[1, 3], [2, 3], [3, 3], [3, 4], [3,5], [4, 9]]
assert_equal ordered, location_list.ordered_data
end
def test_left_list
location_list = LocationData.new(INPUT)
assert_equal [3, 4, 2, 1, 3, 3], location_list.left_list
end
def test_right_list
location_list = LocationData.new(INPUT)
assert_equal [4, 3, 5, 3, 9, 3], location_list.right_list
end
end
class LocationData
attr_reader :data
def initialize(input)
@data = parse input
end
def total_distance
ordered_data.reduce(0) { |total, pair| total + distance(*pair) }
end
def similarity_score
left_list.reduce(0) { |total, location| total + similarity(location) }
end
def distance(left, right)
(left - right).abs
end
def similarity(location)
location * (right_list.tally[location] || 0)
end
def ordered_data
data.transpose.map(&:sort).transpose
end
def left_list
data.transpose[0]
end
def right_list
data.transpose[1]
end
private
def parse(input)
input.split("\n").map { |x| x.split.map(&:to_i) }
end
end
BLUE = "\e[34m"
YELLOW = "\e[33m"
RESET = "\e[0m"
location_list = LocationData.new(File.read(ARGV[0]))
puts "#{BLUE}Total Distance:#{RESET} #{YELLOW}#{location_list.total_distance}#{RESET}"
puts "#{BLUE}Similarity Socre:#{RESET} #{YELLOW}#{location_list.similarity_score}#{RESET}"
__END__
3 4
4 3
2 5
1 3
3 9
3 3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment