You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.5 KiB
Zig
88 lines
2.5 KiB
Zig
const std = @import("std");
|
|
|
|
const Record = struct { map: []const u8, damaged: std.ArrayList(u8) };
|
|
|
|
pub fn main() !void {
|
|
const content = @embedFile("test.txt");
|
|
var lines = std.mem.split(u8, content, "\n");
|
|
|
|
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
|
const allocator = gpa.allocator();
|
|
|
|
var records = std.ArrayList(Record).init(allocator);
|
|
defer records.deinit();
|
|
|
|
// parse lines
|
|
while (lines.next()) |line| {
|
|
if (line.len < 1) {
|
|
break;
|
|
}
|
|
var parts = std.mem.split(u8, line, " ");
|
|
const map = parts.next().?;
|
|
var damageIterator = std.mem.split(u8, parts.next().?, ",");
|
|
var damaged = std.ArrayList(u8).init(allocator);
|
|
while (damageIterator.next()) |d| {
|
|
const parsed = try std.fmt.parseInt(u8, d, 10);
|
|
try damaged.append(parsed);
|
|
}
|
|
try records.append(Record{ .map = map, .damaged = damaged });
|
|
}
|
|
std.debug.print("records: {any}\n", .{records.items});
|
|
|
|
var part1: u8 = 0;
|
|
for (records.items) |r| {
|
|
// var all = std.ArrayList(u8).init(allocator);
|
|
const all = allArrangements(r.map, r.damaged, 0);
|
|
std.debug.print("all arrangements: {any}\n", .{all});
|
|
|
|
// part1 += numValid(r);
|
|
}
|
|
|
|
std.debug.print("Part1: {d}\n", .{part1});
|
|
}
|
|
|
|
// replaces ?s with every possible combination of . or #
|
|
// fn allArrangements(r: Record, i: u8) []const u8 {
|
|
fn allArrangements(map: []const u8, damaged: std.ArrayList(u8), start: u8) []const u8 {
|
|
std.debug.print("allArrangements. map: {any} damage: {any} start: {any}\n", .{ map, damaged, start });
|
|
// find the first ?
|
|
const idx = std.mem.indexOf(u8, map, "?");
|
|
if (idx == null) {
|
|
return map;
|
|
}
|
|
|
|
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
|
const allocator = gpa.allocator();
|
|
|
|
var records = std.ArrayList(Record).init(allocator);
|
|
defer records.deinit();
|
|
|
|
var one: [map.len]u8 = undefined;
|
|
@memcpy(one, map);
|
|
std.debug.print("? idx: {?d}\n", .{idx});
|
|
return &[_]u8{1};
|
|
}
|
|
|
|
fn numValid(r: Record) u8 {
|
|
// var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
|
// const allocator = gpa.allocator();
|
|
//
|
|
// // generate all possible arrangements
|
|
// var all = std.ArrayList(u8).init(allocator);
|
|
// defer all.deinit();
|
|
|
|
const num = numQuestionMarks(r.map);
|
|
std.debug.print("num ?: {d}\n", .{num});
|
|
return num;
|
|
}
|
|
|
|
fn numQuestionMarks(str: []const u8) u8 {
|
|
var i: u8 = 0;
|
|
for (str) |char| {
|
|
if (char == '?') {
|
|
i += 1;
|
|
}
|
|
}
|
|
return i;
|
|
}
|