M5YZ5CWWEBPSUWT7WLPPQE7ECE347IRBHYZBAHKKSXTUHM6U2DGQC const std = @import("std");const PATH = "../input/day08.txt";const Str = []const u8;pub fn first(allocator: ?std.mem.Allocator) anyerror!usize {const lines = try parseInstructions(allocator.?);defer allocator.?.free(lines);var visited = try std.DynamicBitSet.initEmpty(allocator.?, lines.len);defer visited.deinit();var accumulator: isize = 0;var idx: isize = 0;while (idx < lines.len) : (idx += 1) {if (visited.isSet(@intCast(usize, idx))) break;visited.set(@intCast(usize, idx));const line = lines[@intCast(usize, idx)];switch (line[0]) {'n' => {},'a' => {var parts = std.mem.tokenize(u8, line, " ");_ = parts.next();const diff = try std.fmt.parseInt(isize, parts.next().?, 0);accumulator += diff;},'j' => {var parts = std.mem.tokenize(u8, line, " ");_ = parts.next();const diff = try std.fmt.parseInt(isize, parts.next().?, 0);idx += diff - 1;},else => unreachable,}}return @intCast(usize, accumulator);}fn parseInstructions(allocator: std.mem.Allocator) ![]Str {const file = @embedFile(PATH);var lines = std.mem.split(u8, file, "\n");var instr = std.ArrayList(Str).init(allocator);while (lines.next()) |line| {if (line.len == 0) break;try instr.append(line);}return instr.toOwnedSlice();}pub fn second(allocator: ?std.mem.Allocator) anyerror!usize {const lines = try parseInstructions(allocator.?);defer allocator.?.free(lines);for (lines) |l, i| {const changed_line = switch (l[0]) {'j', 'n' => @intCast(isize, i),else => continue,};var accumulator: isize = 0;var visited = try std.DynamicBitSet.initEmpty(allocator.?, lines.len);defer visited.deinit();var idx: isize = 0;while (idx < lines.len) : (idx += 1) {if (visited.isSet(@intCast(usize, idx))) break;visited.set(@intCast(usize, idx));const line = lines[@intCast(usize, idx)];var op: u8 = line[0];if (idx == changed_line) {// flip op on changed_line, so the next switch part can be unchangedif (op == 'j') op = 'n' else op = 'j';}switch (op) {'n' => {},'a' => {var parts = std.mem.tokenize(u8, line, " ");_ = parts.next();const diff = try std.fmt.parseInt(isize, parts.next().?, 0);accumulator += diff;},'j' => {var parts = std.mem.tokenize(u8, line, " ");_ = parts.next();const diff = try std.fmt.parseInt(isize, parts.next().?, 0);idx += diff - 1;},else => unreachable,}}// If all instructions called, then the program is finished.if (idx == lines.len) return @intCast(usize, accumulator);}unreachable;}test "day08a" {try std.testing.expectEqual(@as(usize, 1727), try first(std.testing.allocator));}test "day08b" {try std.testing.expectEqual(@as(usize, 552), try second(std.testing.allocator));}
acc +40acc -14nop +386jmp +262acc -4nop +25jmp +500acc +13acc -1acc -7acc +37jmp +319acc +46jmp +429acc -4acc -8jmp +335acc +12jmp +78acc +16acc -11nop +137acc +41jmp +210jmp +83acc +7jmp +48nop +374acc +11jmp +268acc +1acc -17acc +15jmp +178acc +23jmp -5jmp +374acc +8acc +5nop +231jmp +1jmp -22acc +44acc +39jmp +415acc +44acc -8acc -10jmp +36nop +385acc +6jmp -37nop +245acc +5jmp +261acc -3jmp +23acc +37jmp +532acc -18acc -8nop +405jmp +499acc -1acc +3acc +47acc +38jmp +67jmp -9acc +16acc -4acc +23acc +6jmp -14jmp +229nop +235acc +3acc +17jmp +521acc +49acc -8acc +10jmp +103jmp +75acc +22nop +527acc +36acc +32jmp -46nop +434jmp +447jmp +159acc +37acc -19acc +39jmp +181jmp +1jmp +162jmp +1acc +0acc +0acc +34jmp +241acc +42acc +12jmp -75jmp -70acc +42acc -4acc +49jmp +456jmp +277jmp +302acc +45acc +19nop -41jmp +318jmp +153acc +9nop +323jmp -113nop -9jmp +1acc +37acc +12jmp +448acc +3acc +38jmp -114acc +7jmp +180acc -5acc -10jmp +117jmp +320acc +9jmp +330acc +18jmp +1jmp +330nop +450acc +10jmp +22acc +44jmp +298acc +38nop +433acc +1jmp +431jmp +339nop +251jmp -126nop +191jmp +294acc -7acc +30acc -15jmp +400jmp +441acc +5acc +17nop +35nop +103jmp +410nop -122acc +35jmp +73acc -13jmp +291acc -11jmp +95acc -12acc +19acc -16acc +34jmp +140acc -15acc +6acc -4jmp +190acc +11acc +0acc +19acc +43jmp +167acc +29nop +371jmp +1jmp -36acc +20acc +20acc +26jmp +374jmp -76acc +20jmp +115acc +13acc +25acc +39jmp -115acc -18nop -64jmp +133acc -18acc +32nop -198jmp -157acc +6acc +41nop +36jmp -136jmp +1jmp +41acc -14acc -17acc +1jmp +280jmp +1jmp +72acc +7jmp +1acc -12acc -8jmp +291acc -13acc +36acc +0jmp +97acc +20acc +0acc +12acc -16jmp -196nop +342jmp -122acc +21nop -33acc +38jmp +285acc -9acc -17acc -2acc +25jmp +232jmp +146jmp +312acc +11nop -54nop +351jmp -46acc +27jmp -244jmp +262acc +42acc +5nop +4acc +20jmp +239jmp -62nop -147jmp -169acc -12acc +40acc +29jmp +178nop +310jmp +49acc -18acc +5jmp +297jmp +244acc +31acc +21acc +47acc +41jmp +76acc +29acc +22acc +16jmp -121jmp -244acc +45acc -9acc +36acc +5jmp +265acc +13acc +47acc -11jmp +338acc +0jmp +85acc +18acc +27jmp +1acc +43jmp +227jmp +276acc +42nop +52acc -15nop +311jmp -199acc +45jmp +286acc -8acc +7acc +9acc -18jmp -273acc +50jmp +239nop +31acc +16jmp -162acc +12nop -204acc +27jmp -166acc -4acc +38acc +50nop +120jmp +243acc +29jmp -300acc +0nop +179acc -6jmp -136nop -305acc +15jmp -136acc -6jmp +172jmp +41acc -7nop +81jmp +199jmp +54acc +1acc +25jmp -283nop -132acc +47jmp +239acc +45acc -14acc +1acc +0jmp +10acc -15nop -338nop -257jmp +1jmp -218acc +36acc +33acc +28jmp -230acc -5acc -14jmp +1jmp -87acc +48nop +141nop +224acc +42jmp +22nop +140acc +16jmp +1acc +16jmp -92acc +37jmp -368acc +27jmp +155acc +11nop +196acc +5jmp -269nop -92jmp -276acc +46acc +6acc +34jmp -258jmp +2jmp +80jmp +36acc +20jmp -181nop -54acc +48nop +166nop +165jmp -263acc +47acc +33jmp +54nop -216acc +37acc +19jmp -349acc +12nop -156nop +7acc -5jmp -390acc -10jmp -315nop -393jmp -89jmp +1jmp -312acc +4jmp -120acc -2nop +23acc +42acc +28jmp -205acc +43acc +6jmp -49acc -13acc +1acc +10acc +19jmp -394acc -15acc +0jmp -365acc +23acc -17nop +23acc +0jmp -37acc +9acc +31jmp -7jmp -278nop +147acc +5acc +43jmp -149nop -65acc +19acc +46jmp +59acc +29nop +169jmp +131acc +43acc +50jmp +10acc -4jmp -390acc +24jmp -236acc +10acc +19nop -160acc +32jmp +162acc +29jmp +170jmp -14acc +36jmp -88acc +2acc +1acc +1jmp -86nop +48acc +21jmp -356acc +0nop -321nop -247nop +127jmp -279jmp +40acc +23acc +47acc +6jmp -438acc +26acc +35nop +120acc +2jmp -58acc +30acc +2jmp +42acc +8acc +24acc +9acc +19jmp -351acc +40acc +18acc +43acc +29jmp +9jmp +1jmp -210jmp -82acc +41acc +45jmp -28nop -395jmp +71acc +38acc -13nop -251acc -9jmp -366acc +34acc +7acc -7jmp -212acc +6acc +24acc +1acc -11jmp +94acc +20acc -14acc -5jmp +81acc +37jmp +77acc -15nop -486jmp +39jmp +1acc +39acc +49jmp -371acc +5nop -446jmp -267acc +39jmp +67acc +35acc +8nop -419jmp -53acc +20acc -9acc +46acc +30jmp -136acc +35jmp +56jmp +70acc +13acc +48jmp -290acc -18acc +48acc +50jmp -225jmp -226acc +34jmp -391acc +49nop -324acc -10acc +41jmp -130jmp +6jmp -555acc -17jmp -433acc +33jmp -64jmp -476nop -138nop -556acc +47jmp +27jmp -78acc -16acc -4acc -3acc +48jmp -292acc +43acc +3acc +44jmp +15acc +49acc +5acc +4acc +27jmp -491acc +6acc +38acc +31nop -70jmp -379acc +0acc +2acc +49jmp -297jmp -405jmp -72jmp -371jmp -115acc +7acc -15acc -9jmp -486acc +3acc +16nop -19acc +14jmp -296jmp -233acc +40nop -342nop -58acc -9jmp -316acc +4acc +15acc +14acc +50jmp -296acc -11acc +14acc +43acc +38jmp -391acc +43acc +25acc -5acc +27jmp +1