Add solution for 2023 day 07 part 1
This commit is contained in:
parent
dbb917c8ef
commit
c438d7d665
@ -10,7 +10,7 @@
|
||||
| [04] | ✓ | ✓ | [Zig] |
|
||||
| [05] | ✓ | ✓ | [Zig] |
|
||||
| [06] | ✓ | ✓ | [Zig] |
|
||||
| [07] | | | |
|
||||
| [07] | ✓ | | [Zig] |
|
||||
| [08] | | | |
|
||||
| [09] | | | |
|
||||
| [10] | | | |
|
||||
|
115
2023/day-07/common.zig
Normal file
115
2023/day-07/common.zig
Normal file
@ -0,0 +1,115 @@
|
||||
const std = @import("std");
|
||||
const alloc = std.heap.page_allocator;
|
||||
const List = std.ArrayList;
|
||||
const OccuranceMap = std.AutoHashMap(Card, u8);
|
||||
|
||||
pub const Hand = struct {
|
||||
cards: [5]Card,
|
||||
bid: u64,
|
||||
type: HandType,
|
||||
};
|
||||
|
||||
pub const HandType = enum {
|
||||
Five,
|
||||
Four,
|
||||
FullHouse,
|
||||
Three,
|
||||
TwoPair,
|
||||
OnePair,
|
||||
HighCard,
|
||||
|
||||
pub fn as_u8(self: HandType) u8 {
|
||||
return switch (self) {
|
||||
.Five => 7,
|
||||
.Four => 6,
|
||||
.FullHouse => 5,
|
||||
.Three => 4,
|
||||
.TwoPair => 3,
|
||||
.OnePair => 2,
|
||||
.HighCard => 1,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
pub const Card = u8;
|
||||
|
||||
pub fn parse(data: []const u8) !List(Hand) {
|
||||
var lines = std.mem.tokenizeScalar(u8, data, '\n');
|
||||
|
||||
var hands = List(Hand).init(alloc);
|
||||
|
||||
while (lines.next()) |line| {
|
||||
var line_parts = std.mem.tokenizeScalar(u8, line, ' ');
|
||||
|
||||
const cards_part = line_parts.next().?;
|
||||
|
||||
var cards: [5]Card = undefined;
|
||||
var occurances = OccuranceMap.init(alloc);
|
||||
defer occurances.deinit();
|
||||
|
||||
for (cards_part, 0..) |card, i| {
|
||||
const card_num = switch (card) {
|
||||
'A' => 14,
|
||||
'K' => 13,
|
||||
'Q' => 12,
|
||||
'J' => 11,
|
||||
'T' => 10,
|
||||
'2'...'9' => card - 48,
|
||||
else => unreachable,
|
||||
};
|
||||
cards[i] = card_num;
|
||||
|
||||
if (occurances.get(card_num)) |val| {
|
||||
try occurances.put(card_num, val + 1);
|
||||
} else {
|
||||
try occurances.put(card_num, 1);
|
||||
}
|
||||
}
|
||||
|
||||
const hand_type = determine_hand_type(&occurances);
|
||||
|
||||
const bid_part = line_parts.next().?;
|
||||
const bid = try std.fmt.parseInt(u64, bid_part, 10);
|
||||
|
||||
const hand = .{
|
||||
.cards = cards,
|
||||
.bid = bid,
|
||||
.type = hand_type,
|
||||
};
|
||||
|
||||
try hands.append(hand);
|
||||
}
|
||||
|
||||
return hands;
|
||||
}
|
||||
|
||||
fn determine_hand_type(occurances: *const OccuranceMap) HandType {
|
||||
switch (occurances.count()) {
|
||||
1 => return HandType.Five,
|
||||
2 => {
|
||||
var iter = occurances.valueIterator();
|
||||
while (iter.next()) |val| {
|
||||
switch (val.*) {
|
||||
1, 4 => return HandType.Four,
|
||||
else => return HandType.FullHouse,
|
||||
}
|
||||
}
|
||||
},
|
||||
3 => {
|
||||
var iter = occurances.valueIterator();
|
||||
while (iter.next()) |val| {
|
||||
switch (val.*) {
|
||||
3 => return HandType.Three,
|
||||
2 => return HandType.TwoPair,
|
||||
else => continue,
|
||||
}
|
||||
unreachable;
|
||||
}
|
||||
},
|
||||
4 => return HandType.OnePair,
|
||||
5 => return HandType.HighCard,
|
||||
else => unreachable,
|
||||
}
|
||||
|
||||
unreachable;
|
||||
}
|
1000
2023/day-07/inputs/puzzle.txt
Normal file
1000
2023/day-07/inputs/puzzle.txt
Normal file
File diff suppressed because it is too large
Load Diff
5
2023/day-07/inputs/sample.txt
Normal file
5
2023/day-07/inputs/sample.txt
Normal file
@ -0,0 +1,5 @@
|
||||
32T3K 765
|
||||
T55J5 684
|
||||
KK677 28
|
||||
KTJJT 220
|
||||
QQQJA 483
|
37
2023/day-07/part_one.zig
Normal file
37
2023/day-07/part_one.zig
Normal file
@ -0,0 +1,37 @@
|
||||
const std = @import("std");
|
||||
const common = @import("common.zig");
|
||||
const Hand = common.Hand;
|
||||
|
||||
const data = @embedFile("inputs/puzzle.txt");
|
||||
|
||||
pub fn main() !void {
|
||||
const stdout = std.io.getStdOut().writer();
|
||||
|
||||
const hands = try common.parse(data);
|
||||
defer hands.deinit();
|
||||
|
||||
var sum: u64 = 0;
|
||||
|
||||
std.mem.sort(Hand, hands.items, {}, compare_hands);
|
||||
|
||||
for (hands.items, 1..) |hand, rank| {
|
||||
const value = hand.bid * rank;
|
||||
sum += value;
|
||||
}
|
||||
|
||||
try stdout.print("{d}\n", .{sum});
|
||||
}
|
||||
|
||||
fn compare_hands(_: void, lhs: Hand, rhs: Hand) bool {
|
||||
if (lhs.type == rhs.type) {
|
||||
for (lhs.cards, rhs.cards) |lcard, rcard| {
|
||||
if (lcard != rcard) {
|
||||
return lcard < rcard;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return lhs.type.as_u8() < rhs.type.as_u8();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
Loading…
Reference in New Issue
Block a user