annotate day7.rb @ 26:eb6c3a7d2f72

Constrained and more optimised route finding * Track routes so we can see if we have gone straight for too long * Track multiple routes so we can use a non-optimal route to X if it makes another route to Y through X possible (e.g. optimal route takes three consecutive steps to X, but then has to turn, whereas a longer straight earlier and two consecutive steps to X gives a much better next hop to Y) * We have a start point, so only include the nodes from the search front in "unvisited" to avoid looking at lots of irrelevant nodes
author IBBoard <dev@ibboard.co.uk>
date Sun, 17 Dec 2023 20:13:03 +0000
parents 9ec95ff0d33d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
1 #! /usr/bin/env ruby
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
2
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
3 require 'set'
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
4
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
5 if ARGV.length != 1
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
6 abort("Incorrect arguments - needs input file")
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
7 elsif not File.exist? (ARGV[0])
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
8 abort("File #{ARGV[0]} did not exist")
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
9 end
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
10
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
11 file = ARGV[0]
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
12
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
13 Hand = Struct.new(:cards, :score, :bid)
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
14
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
15 $card_scoring = ("1".."9").to_a.concat(["T", "J", "Q", "K", "A"])
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
16
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
17 FULL_HOUSE = Set.new([2,3])
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
18 TWO_PAIR = {2 => 2, 1 => 1}
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
19
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
20 def score_hand(cards)
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
21 card_vals = cards.each_char.map {|c| $card_scoring.index(c)}
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
22 card_counts = card_vals.group_by{|v| v}.map {|k, v| v.length}
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
23 card_count_counts = card_counts.group_by{|v| v}.map{|k,v| [k, v.length]}.to_h
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
24 of_a_kind = card_counts.max
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
25 rank = of_a_kind * 2 # 5, 4 or 3 of a kind or a pair => 10, 8, 6 and 4
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
26 if Set.new(card_counts) == FULL_HOUSE
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
27 rank = 7
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
28 elsif card_count_counts == TWO_PAIR
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
29 rank = 5
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
30 end
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
31 card_vals.reduce("#{rank-1}") {|str, v| "#{str}.#{(v+1).to_s.rjust(2, '0')}"}
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
32 end
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
33
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
34 hands = File.open(file, "r").each_line(chomp: true).map {|line| cards, bid = line.split(" "); Hand.new(cards, score_hand(cards), bid.to_i)}
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
35
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
36 puts hands.sort {|a, b| a.score <=> b.score}.map.with_index(1) {|val, i| i * val.bid}.sum
9ec95ff0d33d Add Day 7 solutions with string sorting
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
37 # Rest of algorithm here