Day 4: Enjoyable !!
This commit is contained in:
139
AdventOfCode2023/src/day4/day4.zig
Normal file
139
AdventOfCode2023/src/day4/day4.zig
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
const std = @import("std");
|
||||||
|
const print = std.debug.print;
|
||||||
|
|
||||||
|
pub fn solve(input: [][]const u8) !void {
|
||||||
|
var part1: u32 = 0;
|
||||||
|
const allocator = std.heap.page_allocator;
|
||||||
|
|
||||||
|
for (input) |line| {
|
||||||
|
var verticalVarSplit = std.mem.tokenizeSequence(u8, line, "|");
|
||||||
|
|
||||||
|
var myMap = std.AutoHashMap(u32, u32).init(allocator);
|
||||||
|
|
||||||
|
var winningNums = verticalVarSplit.next().?;
|
||||||
|
var myNums = verticalVarSplit.next().?;
|
||||||
|
|
||||||
|
var currentScore: u32 = 0;
|
||||||
|
|
||||||
|
// Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53
|
||||||
|
|
||||||
|
var spaceTokeniser = std.mem.tokenizeAny(u8, winningNums, " :");
|
||||||
|
_ = spaceTokeniser.next().?;
|
||||||
|
_ = spaceTokeniser.next().?;
|
||||||
|
|
||||||
|
while (spaceTokeniser.next()) |num| {
|
||||||
|
if (num.len > 0) {
|
||||||
|
try myMap.put(try std.fmt.parseInt(u32, num, 10), 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spaceTokeniser = std.mem.tokenizeAny(u8, myNums, " ");
|
||||||
|
|
||||||
|
while (spaceTokeniser.next()) |num| {
|
||||||
|
if (num.len > 0) {
|
||||||
|
var winningNum = try std.fmt.parseInt(u32, num, 10);
|
||||||
|
if (myMap.get(winningNum)) |_| {
|
||||||
|
if (currentScore == 0) {
|
||||||
|
currentScore = 1;
|
||||||
|
} else {
|
||||||
|
currentScore += currentScore;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
part1 += currentScore;
|
||||||
|
myMap.deinit();
|
||||||
|
}
|
||||||
|
|
||||||
|
var gamesProcessing = std.AutoHashMap(usize, u32).init(allocator);
|
||||||
|
|
||||||
|
var part2: u32 = 0;
|
||||||
|
|
||||||
|
for (input, 0..) |_, index| {
|
||||||
|
try gamesProcessing.put(index, 1);
|
||||||
|
part2 += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
var counter: usize = 0;
|
||||||
|
|
||||||
|
while (counter < 5) {
|
||||||
|
counter += 1;
|
||||||
|
var gamesPlayed = false;
|
||||||
|
|
||||||
|
for (1..input.len + 1) |gameIndex| {
|
||||||
|
var numOfGames = gamesProcessing.get(gameIndex);
|
||||||
|
// print("Game: {} | Num Of Games {?} \n", .{ gameIndex, numOfGames });
|
||||||
|
|
||||||
|
if (numOfGames) |i| {
|
||||||
|
if (i == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
gamesPlayed = true;
|
||||||
|
|
||||||
|
var line = input[gameIndex - 1];
|
||||||
|
var verticalVarSplit = std.mem.tokenizeSequence(u8, line, "|");
|
||||||
|
|
||||||
|
var myMap = std.AutoHashMap(u32, u32).init(allocator);
|
||||||
|
|
||||||
|
var winningNums = verticalVarSplit.next().?;
|
||||||
|
var myNums = verticalVarSplit.next().?;
|
||||||
|
|
||||||
|
var spaceTokeniser = std.mem.tokenizeAny(u8, winningNums, " :");
|
||||||
|
_ = spaceTokeniser.next().?;
|
||||||
|
_ = spaceTokeniser.next().?;
|
||||||
|
|
||||||
|
while (spaceTokeniser.next()) |num| {
|
||||||
|
if (num.len > 0) {
|
||||||
|
try myMap.put(try std.fmt.parseInt(u32, num, 10), 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spaceTokeniser = std.mem.tokenizeAny(u8, myNums, " ");
|
||||||
|
var numbersWon: u32 = 0;
|
||||||
|
|
||||||
|
while (spaceTokeniser.next()) |num| {
|
||||||
|
if (num.len > 0) {
|
||||||
|
var winningNum = try std.fmt.parseInt(u32, num, 10);
|
||||||
|
if (myMap.get(winningNum)) |_| {
|
||||||
|
numbersWon += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (numbersWon == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// print("Adding: \n", .{});
|
||||||
|
for (gameIndex + 1..gameIndex + 1 + numbersWon) |i| {
|
||||||
|
// print("{}, ", .{i});
|
||||||
|
var currentNums: u32 = 0;
|
||||||
|
if (gamesProcessing.get(i)) |n| {
|
||||||
|
currentNums = n;
|
||||||
|
}
|
||||||
|
try gamesProcessing.put(i, numOfGames.? + currentNums);
|
||||||
|
part2 += numOfGames.?;
|
||||||
|
}
|
||||||
|
// print("\n", .{});
|
||||||
|
myMap.deinit();
|
||||||
|
|
||||||
|
try gamesProcessing.put(gameIndex, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gamesPlayed) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (input, 0..) |line, index| {
|
||||||
|
_ = line;
|
||||||
|
_ = index;
|
||||||
|
}
|
||||||
|
|
||||||
|
print("Part 1: {}\n", .{part1});
|
||||||
|
print("Part 2: {}\n", .{part2});
|
||||||
|
}
|
@ -1,13 +1,14 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
// const day1 = @import("./day1/day1.zig");
|
// const day1 = @import("./day1/day1.zig");
|
||||||
// const day2 = @import("./day2/day2.zig");
|
// const day2 = @import("./day2/day2.zig");
|
||||||
const day3 = @import("./day3/day3.zig");
|
// const day3 = @import("./day3/day3.zig");
|
||||||
|
const day4 = @import("./day4/day4.zig");
|
||||||
const utils = @import("utils.zig");
|
const utils = @import("utils.zig");
|
||||||
|
|
||||||
pub fn main() !void {
|
pub fn main() !void {
|
||||||
const allocator = std.heap.page_allocator;
|
const allocator = std.heap.page_allocator;
|
||||||
var input = try utils.getInput("./src/day3/input.txt", allocator);
|
var input = try utils.getInput("./src/day4/input.txt", allocator);
|
||||||
defer allocator.free(input);
|
defer allocator.free(input);
|
||||||
|
|
||||||
try day3.solve(input);
|
try day4.solve(input);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user