why would I overcomplicate it so damn much lol
This commit is contained in:
@ -4,147 +4,101 @@ const print = std.debug.print;
|
|||||||
const GALAXY = 1;
|
const GALAXY = 1;
|
||||||
const SPACE = 0;
|
const SPACE = 0;
|
||||||
|
|
||||||
fn min(num1: u256, num2: u256) usize {
|
fn min(num1: usize, num2: usize) usize {
|
||||||
if (num1 > num2) {
|
if (num1 > num2) {
|
||||||
return @truncate(num2);
|
return (num2);
|
||||||
}
|
}
|
||||||
return @truncate(num1);
|
return (num1);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn max(num1: u256, num2: u256) usize {
|
fn max(num1: usize, num2: usize) usize {
|
||||||
if (num1 <= num2) {
|
if (num1 <= num2) {
|
||||||
return @truncate(num2);
|
return (num2);
|
||||||
}
|
}
|
||||||
return @truncate(num1);
|
return (num1);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn solve(input: [][]const u8) !void {
|
pub fn solve(input: [][]const u8) !void {
|
||||||
var allocator = std.heap.page_allocator;
|
var allocator = std.heap.page_allocator;
|
||||||
|
|
||||||
var grid = try allocator.alloc(u256, input.len);
|
var emptyRows = std.AutoHashMap(usize, usize).init(allocator);
|
||||||
var index: usize = 0;
|
var emptyCols = std.AutoHashMap(usize, usize).init(allocator);
|
||||||
|
|
||||||
for (input) |line| {
|
for (input, 0..) |line, i| {
|
||||||
var line1: u256 = 0;
|
var emptyRow = true;
|
||||||
for (line) |_c| {
|
for (line) |c| {
|
||||||
var c: u8 = 0;
|
if (c == '#') {
|
||||||
if (_c == '.') {
|
emptyRow = false;
|
||||||
c = SPACE;
|
|
||||||
} else {
|
|
||||||
c = GALAXY;
|
|
||||||
}
|
|
||||||
|
|
||||||
line1 = (line1 << 1) | @as(u256, c);
|
|
||||||
}
|
|
||||||
|
|
||||||
grid[index] = line1;
|
|
||||||
index += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
var rows: u256 = 0;
|
|
||||||
var cols: u256 = 0;
|
|
||||||
|
|
||||||
for (grid) |row| {
|
|
||||||
if (row == 0) {
|
|
||||||
rows = (rows << 1) | @as(u256, 1);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
rows = rows << 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (0..input[0].len) |i| {
|
|
||||||
var empty = true;
|
|
||||||
for (grid) |row| {
|
|
||||||
var truncated: u8 = @truncate(input[0].len - i - 1);
|
|
||||||
if (row & @as(u256, @as(u256, 1) << truncated) != 0) {
|
|
||||||
empty = false;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (emptyRow) {
|
||||||
if (empty) {
|
try emptyRows.put(i, 1);
|
||||||
cols = (cols << 1) | @as(u256, 1);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
cols = cols << 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var pair: usize = 0;
|
for (0..input[0].len) |i| {
|
||||||
|
var emptyCol = true;
|
||||||
|
for (0..input.len) |j| {
|
||||||
|
if (input[j][i] == '#') {
|
||||||
|
emptyCol = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (emptyCol) {
|
||||||
|
try emptyCols.put(i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var pairs: usize = 0;
|
||||||
var part1: usize = 0;
|
var part1: usize = 0;
|
||||||
|
|
||||||
for (grid, 0..) |row, i| {
|
var MULTIPLIER: usize = 1_000_000;
|
||||||
var galaxy: u265 = 1;
|
|
||||||
for (1..256) |k1| {
|
|
||||||
var comp1 = galaxy & row;
|
|
||||||
if (comp1 > 0) {
|
|
||||||
|
|
||||||
//
|
for (0..input.len) |i| {
|
||||||
// We found galaxy!
|
for (0..input[0].len) |j| {
|
||||||
//
|
if (input[i][j] != '#') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
for (i..grid.len) |j| {
|
// found one.
|
||||||
var rowAgain = grid[j];
|
for (i..input.len) |a| {
|
||||||
var galaxy2: u265 = 1;
|
for (0..input[0].len) |b| {
|
||||||
|
if (i == a and j == b) {
|
||||||
for (1..256) |k2| {
|
continue;
|
||||||
var comp2 = galaxy2 & rowAgain;
|
|
||||||
if (comp2 > 0) {
|
|
||||||
var found = i != j or k2 > k1;
|
|
||||||
|
|
||||||
if (found) {
|
|
||||||
pair += 1;
|
|
||||||
var distY: u256 = 0;
|
|
||||||
if (k1 > k2) {
|
|
||||||
distY = k1 - k2;
|
|
||||||
} else {
|
|
||||||
distY = k2 - k1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// print("Galaxy 1 | {},{}\n", .{ k1, i });
|
|
||||||
// print("Galaxy 2 | {},{}\n", .{ k2, j });
|
|
||||||
|
|
||||||
var emptyRows: u256 = 0;
|
|
||||||
var emptyCols: u256 = 0;
|
|
||||||
|
|
||||||
if (i != j) {
|
|
||||||
for (i + 1..j) |_shift| {
|
|
||||||
var shift: u8 = @truncate(_shift);
|
|
||||||
var u8Length: u8 = @truncate(input.len);
|
|
||||||
var r = @as(u256, 1) << (u8Length - shift - 1);
|
|
||||||
|
|
||||||
if (r & rows > 0) {
|
|
||||||
emptyRows += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (k1 != k2) {
|
|
||||||
for (min(k1, k2) + 1..max(k1, k2)) |_shift| {
|
|
||||||
var shift: u8 = @truncate(_shift);
|
|
||||||
var u8Length: u8 = @truncate(input[0].len);
|
|
||||||
var r = @as(u256, 1) << (u8Length - shift - 1);
|
|
||||||
|
|
||||||
if (r & cols > 0) {
|
|
||||||
emptyCols += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var dist = distY + (j - i) + emptyRows + emptyCols;
|
|
||||||
|
|
||||||
print("Distance: {}\n", .{dist});
|
|
||||||
print("---\n", .{});
|
|
||||||
part1 += @truncate(dist);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
galaxy2 = galaxy2 << 1;
|
|
||||||
}
|
}
|
||||||
|
if (i == a and b < j) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (input[a][b] != '#') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// print("Galaxy 1 | {} {}\n", .{ j, i });
|
||||||
|
// print("Galaxy 2 | {} {}\n", .{ b, a });
|
||||||
|
|
||||||
|
var dist: usize = (a - i) + (max(j, b) - min(j, b));
|
||||||
|
|
||||||
|
for (i..a) |k| {
|
||||||
|
if (emptyRows.get(k)) |_| {
|
||||||
|
dist += MULTIPLIER - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (min(j, b)..max(j, b)) |k| {
|
||||||
|
if (emptyCols.get(k)) |_| {
|
||||||
|
dist += MULTIPLIER - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// print("Distance: {}\n", .{dist});
|
||||||
|
// print("----\n", .{});
|
||||||
|
pairs += 1;
|
||||||
|
part1 += dist;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
galaxy = galaxy << 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
print("Pairs: {}\n", .{pair});
|
print("Pairs: {}\n", .{pairs});
|
||||||
print("Part 1: {}\n", .{part1});
|
print("Part 1: {}\n", .{part1});
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user