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.

120 lines
3.1 KiB
Zig

const std = @import("std");
pub fn main() !void {
const content = @embedFile("data.txt");
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const allocator = gpa.allocator();
// yo dog
var grids = std.ArrayList(std.ArrayList(std.ArrayList(u8))).init(allocator);
var sections = std.mem.split(u8, content, "\n\n");
while (sections.next()) |section| {
var lines = std.mem.split(u8, section, "\n");
var gridArrayList = std.ArrayList(std.ArrayList(u8)).init(allocator);
while (lines.next()) |line| {
if (line.len < 1) {
break;
}
var lineArrayList = std.ArrayList(u8).init(allocator);
for (line) |char| {
try lineArrayList.append(char);
}
try gridArrayList.append(lineArrayList);
}
try grids.append(gridArrayList);
}
var part1: usize = 0;
var part2: usize = 0;
for (grids.items) |grid| {
const transposed = try transpose(grid, allocator);
const rowReflection = findRowReflection(grid);
const columnReflection = findRowReflection(transposed);
part1 += 100 * (rowReflection orelse 0) + (columnReflection orelse 0);
const rowSmudge = findSmudge(grid);
const colSmudge = findSmudge(transposed);
part2 += 100 * (rowSmudge orelse 0) + (colSmudge orelse 0);
}
std.debug.print("part1 {d}\n", .{part1});
std.debug.print("part2 {d}\n", .{part2});
}
fn findSmudge(grid: std.ArrayList(std.ArrayList(u8))) ?usize {
const height = grid.items.len;
for (1..height) |row| {
var numDiff: u8 = 0;
for (1..row + 1) |d| {
const row1 = grid.items[row - d];
const row2 = grid.items[row + d - 1];
for (0..row1.items.len) |i| {
if (row1.items[i] != row2.items[i]) {
numDiff += 1;
}
}
if (numDiff > 1) {
break;
}
if (row - d == 0 or row + d == height) {
break;
}
}
if (numDiff == 1) {
return row;
}
}
return null;
}
fn findRowReflection(grid: std.ArrayList(std.ArrayList(u8))) ?usize {
const height = grid.items.len;
for (1..height) |row| {
for (1..row + 1) |d| {
const row1 = grid.items[row - d];
const row2 = grid.items[row + d - 1];
if (!std.mem.eql(u8, row1.items, row2.items)) {
break;
}
if (row - d == 0 or row + d == height) {
return row;
}
}
}
return null;
}
fn transpose(grid: std.ArrayList(std.ArrayList(u8)), allocator: std.mem.Allocator) !std.ArrayList(std.ArrayList(u8)) {
const height = grid.items.len;
const width = grid.items[0].items.len;
var grid2 = std.ArrayList(std.ArrayList(u8)).init(allocator);
for (0..width) |c| {
var row = std.ArrayList(u8).init(allocator);
for (0..height) |r| {
try row.append(grid.items[r].items[c]);
}
try grid2.append(row);
}
return grid2;
}