aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOrfeas <38209077+0xfea5@users.noreply.github.com>2023-12-08 19:47:50 +0200
committerOrfeas <38209077+0xfea5@users.noreply.github.com>2025-10-28 23:20:45 +0200
commit3a965871b37c9ab737aeb0c18b170c4060a144f0 (patch)
treeef6fa33a7c63a1b0dc03352e9e56ec652d8a786c
parentday8 (diff)
downloadaoc23-3a965871b37c9ab737aeb0c18b170c4060a144f0.tar.gz
aoc23-3a965871b37c9ab737aeb0c18b170c4060a144f0.zip
day7: moving cmp function in struct
-rw-r--r--day07/solution.zig32
1 files changed, 16 insertions, 16 deletions
diff --git a/day07/solution.zig b/day07/solution.zig
index 05224bf..8eda717 100644
--- a/day07/solution.zig
+++ b/day07/solution.zig
@@ -59,6 +59,20 @@ const Player = struct {
59 self.combo = combo; 59 self.combo = combo;
60 } 60 }
61 61
62 pub fn lessThan(valueFunc: *const fn (u8) u64, lhs: Player, rhs: Player) bool {
63 if (lhs.combo != rhs.combo) {
64 return @intFromEnum(lhs.combo) < @intFromEnum(rhs.combo);
65 }
66
67 for (lhs.hand, rhs.hand) |l, r| {
68 if (l != r) {
69 return cmpCard(valueFunc, l, r);
70 }
71 }
72
73 return false;
74 }
75
62 pub fn init(hand: []const u8, bid: u64) Player { 76 pub fn init(hand: []const u8, bid: u64) Player {
63 var res: Player = undefined; 77 var res: Player = undefined;
64 78
@@ -101,27 +115,13 @@ fn cmpCard(valueFunc: *const fn (u8) u64, lhs: u8, rhs: u8) bool {
101 return valueFunc(lhs) < valueFunc(rhs); 115 return valueFunc(lhs) < valueFunc(rhs);
102} 116}
103 117
104fn playerCmp(valueFunc: *const fn (u8) u64, lhs: Player, rhs: Player) bool {
105 if (lhs.combo != rhs.combo) {
106 return @intFromEnum(lhs.combo) < @intFromEnum(rhs.combo);
107 }
108
109 for (lhs.hand, rhs.hand) |l, r| {
110 if (l != r) {
111 return cmpCard(valueFunc, l, r);
112 }
113 }
114
115 return false;
116}
117
118pub fn part1(players: []Player) void { 118pub fn part1(players: []Player) void {
119 var ans: u64 = 0; 119 var ans: u64 = 0;
120 120
121 for (players) |*p| { 121 for (players) |*p| {
122 p.evalHand(false); 122 p.evalHand(false);
123 } 123 }
124 mem.sort(Player, players, &cardValue, playerCmp); 124 mem.sort(Player, players, &cardValue, Player.lessThan);
125 125
126 for (players, 1..) |p, rank| { 126 for (players, 1..) |p, rank| {
127 ans += p.bid * rank; 127 ans += p.bid * rank;
@@ -136,7 +136,7 @@ pub fn part2(players: []Player) void {
136 for (players) |*p| { 136 for (players) |*p| {
137 p.evalHand(true); 137 p.evalHand(true);
138 } 138 }
139 mem.sort(Player, players, &cardValueWithJoker, playerCmp); 139 mem.sort(Player, players, &cardValueWithJoker, Player.lessThan);
140 140
141 for (players, 1..) |p, rank| { 141 for (players, 1..) |p, rank| {
142 ans += p.bid * rank; 142 ans += p.bid * rank;