Mercurial > repos > other > adventofcode2023
annotate day7.rb @ 14:dcc060e59c47
Replace "each… each…" with a reduce and a flat map
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sat, 09 Dec 2023 20:07:16 +0000 |
parents | 9ec95ff0d33d |
children |
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 |