diff options
| author | Orfeas <38209077+0xfea5@users.noreply.github.com> | 2023-12-08 19:47:50 +0200 |
|---|---|---|
| committer | Orfeas <38209077+0xfea5@users.noreply.github.com> | 2025-10-28 23:20:45 +0200 |
| commit | 3a965871b37c9ab737aeb0c18b170c4060a144f0 (patch) | |
| tree | ef6fa33a7c63a1b0dc03352e9e56ec652d8a786c | |
| parent | day8 (diff) | |
| download | aoc23-3a965871b37c9ab737aeb0c18b170c4060a144f0.tar.gz aoc23-3a965871b37c9ab737aeb0c18b170c4060a144f0.zip | |
day7: moving cmp function in struct
| -rw-r--r-- | day07/solution.zig | 32 |
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 | ||
| 104 | fn 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 | |||
| 118 | pub fn part1(players: []Player) void { | 118 | pub 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; |
