VDUVFODEKUWCE3AJF7Q6BSSIY46WGQTAD5REJTZFL5B27IUEJBYAC af AND ah -> aiNOT lk -> llhz RSHIFT 1 -> isNOT go -> gpdu OR dt -> dvx RSHIFT 5 -> aaat OR az -> baeo LSHIFT 15 -> esci OR ct -> cub RSHIFT 5 -> ffm OR fn -> foNOT ag -> ahv OR w -> xg AND i -> jan LSHIFT 15 -> ar1 AND cx -> cyjq AND jw -> jyiu RSHIFT 5 -> ixgl AND gm -> goNOT bw -> bxjp RSHIFT 3 -> jrhg AND hh -> hjbv AND bx -> byer OR es -> etkl OR kr -> kset RSHIFT 1 -> fme AND f -> hu LSHIFT 1 -> aohe RSHIFT 1 -> hxeg AND ei -> ejbo AND bu -> bwdz OR ef -> egdy RSHIFT 3 -> eagl OR gm -> gnda LSHIFT 1 -> duau OR av -> awgj OR gu -> gveu OR fa -> fblg OR lm -> lne OR f -> gNOT dm -> dnNOT l -> maq OR ar -> asgj RSHIFT 5 -> gmhm AND ho -> hpge LSHIFT 15 -> gijp RSHIFT 1 -> kihg OR hh -> hilc LSHIFT 1 -> lwkm OR kn -> koeq LSHIFT 1 -> fk1 AND am -> angj RSHIFT 1 -> hcaj AND al -> amgj AND gu -> gwko AND kq -> krha OR gz -> hbbn OR by -> bziv OR jb -> jcNOT ac -> adbo OR bu -> bvd AND j -> lbk LSHIFT 1 -> cede OR dk -> dldd RSHIFT 1 -> dwhz AND ik -> imNOT jd -> jefo RSHIFT 2 -> fphb LSHIFT 1 -> hvlf RSHIFT 2 -> lggj RSHIFT 3 -> glki OR kj -> kkNOT ak -> alld OR le -> lfci RSHIFT 3 -> ck1 AND cc -> cdNOT kx -> kyfp OR fv -> fwev AND ew -> eydt LSHIFT 15 -> dxNOT ax -> aybp AND bq -> bsNOT ii -> ijci AND ct -> cviq OR ip -> irx RSHIFT 2 -> yfq OR fr -> fsbn RSHIFT 5 -> bq0 -> c14146 -> bd OR j -> kz OR aa -> abgf OR ge -> ggdf OR dg -> dhNOT hj -> hkNOT di -> djfj LSHIFT 15 -> fnlf RSHIFT 1 -> lyb AND n -> pjq OR jw -> jxgn AND gp -> gqx RSHIFT 1 -> aqex AND ez -> faNOT fc -> fdbj OR bi -> bkas RSHIFT 5 -> avhu LSHIFT 15 -> hyNOT gs -> gtfs AND fu -> fvdh AND dj -> dkbz AND cb -> ccdy RSHIFT 1 -> erhc OR hd -> hefo OR fz -> gat OR s -> ub RSHIFT 2 -> dNOT jy -> jzhz RSHIFT 2 -> iakk AND kv -> kxga AND gc -> gdfl LSHIFT 1 -> gfbn AND by -> caNOT hr -> hsNOT bs -> btlf RSHIFT 3 -> lhau AND av -> ax1 AND gd -> gejr OR js -> jtfw AND fy -> fzNOT iz -> jac LSHIFT 1 -> tdy RSHIFT 5 -> ebbp OR bq -> brNOT h -> i1 AND ds -> dtab AND ad -> aeap LSHIFT 1 -> bjbr AND bt -> buNOT ca -> cbNOT el -> ems LSHIFT 15 -> wgk OR gq -> grff AND fh -> fikf LSHIFT 15 -> kjfp AND fv -> fxlh OR li -> ljbn RSHIFT 3 -> bpjp OR ka -> kblw OR lv -> lxiy AND ja -> jbdy OR ej -> ek1 AND bh -> biNOT kt -> kuao OR an -> apia AND ig -> iiNOT ey -> ezbn RSHIFT 1 -> cgfk OR fj -> flce OR cd -> cfeu AND fa -> fckg OR kf -> khjr AND js -> juiu RSHIFT 3 -> iwdf AND dg -> didl AND dn -> dola LSHIFT 15 -> lefo RSHIFT 1 -> ghNOT gw -> gxNOT gb -> gcir LSHIFT 1 -> jlx AND ai -> akhe RSHIFT 5 -> hh1 AND lu -> lvNOT ft -> fugh OR gi -> gjlf RSHIFT 5 -> lix RSHIFT 3 -> zb RSHIFT 3 -> ehe RSHIFT 2 -> hfNOT fx -> fyjt AND jv -> jwhx OR hy -> hzjp AND ka -> kcfb AND fd -> fehz OR ik -> ilci RSHIFT 1 -> dbfo AND fz -> gbfq AND fr -> ftgj RSHIFT 2 -> gkcg OR ch -> cicd LSHIFT 15 -> chjm LSHIFT 1 -> kgih AND ij -> ikfo RSHIFT 3 -> fqfo RSHIFT 5 -> fr1 AND fi -> fj1 AND kz -> laiu AND jf -> jhcq AND cs -> ctdv LSHIFT 1 -> ephf OR hl -> hmkm AND kn -> kpde AND dk -> dmdd RSHIFT 5 -> dgNOT lo -> lpNOT ju -> jvNOT fg -> fhcm AND co -> cpea AND eb -> eddd RSHIFT 3 -> dfgr AND gt -> guep OR eo -> eqcj AND cp -> crlf OR lq -> lrgg LSHIFT 1 -> haet RSHIFT 2 -> euNOT jh -> jiek AND em -> enjk LSHIFT 15 -> joia OR ig -> ihgv AND gx -> gyet AND fe -> fglh AND li -> lk1 AND io -> ipkb AND kd -> kekk RSHIFT 5 -> knid AND if -> igNOT ls -> ltdw OR dx -> dydd AND do -> dqlf AND lq -> lsNOT kc -> kddy AND ej -> el1 AND ke -> kfet OR fe -> ffhz RSHIFT 5 -> icdd OR do -> dpcj OR cp -> cqNOT dq -> drkk RSHIFT 1 -> ldjg AND ji -> jjhe OR hp -> hqhi AND hk -> hldp AND dr -> dsdz AND ef -> ehhz RSHIFT 3 -> ibdb OR dc -> ddhw LSHIFT 1 -> iqhe AND hp -> hrNOT cr -> cslg AND lm -> lohv OR hu -> hwil AND in -> ioNOT eh -> eigz LSHIFT 15 -> hdgk AND gq -> gs1 AND en -> eoNOT kp -> kqet RSHIFT 5 -> ewlj AND ll -> lmhe RSHIFT 3 -> hget RSHIFT 3 -> evas AND bd -> bfcu AND cw -> cxjx AND jz -> kab OR n -> obe AND bg -> bh1 AND ht -> hu1 AND gy -> gzNOT hn -> hock OR cl -> cmec AND ee -> eflv LSHIFT 15 -> lzks AND ku -> kvNOT ie -> ifhf AND hl -> hn1 AND r -> sib AND ic -> iehq AND hs -> hty AND ae -> agNOT ed -> eebi LSHIFT 15 -> bmdy RSHIFT 2 -> dzci RSHIFT 2 -> cjNOT bf -> bgNOT im -> inev OR ew -> exib OR ic -> idbn RSHIFT 2 -> bodd RSHIFT 2 -> debl OR bm -> bnas RSHIFT 1 -> blea OR eb -> ecln AND lp -> lqkk RSHIFT 3 -> kmis OR it -> iuiu RSHIFT 2 -> ivas OR bd -> beip LSHIFT 15 -> itiw OR ix -> iykk RSHIFT 2 -> klNOT bb -> bcci RSHIFT 5 -> clly OR lz -> maz AND aa -> aciu RSHIFT 1 -> jncy LSHIFT 15 -> dccf LSHIFT 1 -> czas RSHIFT 3 -> aucz OR cy -> dakw AND ky -> kzlx -> aiw AND ix -> izlr AND lt -> lujp RSHIFT 5 -> jsaw AND ay -> azjc AND je -> jflb OR la -> lcNOT cn -> cokh LSHIFT 1 -> lb1 AND jj -> jky OR ae -> afck AND cl -> cnkk OR kv -> kwNOT cv -> cwkl AND kr -> ktiu OR jf -> jgat AND az -> bbjp RSHIFT 2 -> jqiv AND jb -> jdjn OR jo -> jpx OR ai -> ajba AND bc -> bdjl OR jk -> jmb RSHIFT 1 -> vo AND q -> rNOT p -> qk AND m -> nas RSHIFT 2 -> at
const std = @import("std");const Str = []const u8;const PATH = "input/day07.txt";pub fn first(allocator: std.mem.Allocator) !usize {var known = std.StringHashMap(usize).init(allocator);defer known.deinit();return try resolve(&known, @embedFile(PATH));}pub fn second(allocator: std.mem.Allocator) !usize {var known = std.StringHashMap(usize).init(allocator);defer known.deinit();try known.put("b", 956);return try resolve(&known, @embedFile(PATH));}fn resolve(known: *std.StringHashMap(usize), input: Str) !usize {var lines = std.mem.tokenize(u8, input, "\n");while (true) {const size = known.count();lines.reset();while (lines.next()) |line| {var words = std.mem.tokenize(u8, line, " ");if (std.mem.containsAtLeast(u8, line, 1, "NOT")) {_ = words.next(); // NOTconst wire = words.next().?;const val = known.get(wire) orelse continue;_ = words.next().?; // drop '->'const target = words.next().?;try known.put(target, ~val);} else if (std.mem.containsAtLeast(u8, line, 1, "AND") orstd.mem.containsAtLeast(u8, line, 1, "OR") orstd.mem.containsAtLeast(u8, line, 1, "LSHIFT") orstd.mem.containsAtLeast(u8, line, 1, "RSHIFT")){const left = words.next().?;const operand = words.next().?;const right = words.next().?;_ = words.next(); // drop '->'const target = words.next().?;try handleOp(known, left, operand, right, target);} else {const wire = words.next().?;const val = std.fmt.parseUnsigned(usize, wire, 10) catch known.get(wire) orelse continue;_ = words.next(); // drop '->'const target = words.next().?;// Do not overwrite 'b' value - Part 2if (std.mem.eql(u8, target, "b") and known.contains("b")) continue;try known.put(target, val);}}if (known.get("a")) |val| return val;if (size == known.count()) unreachable;}unreachable;}fn handleOp(known: *std.StringHashMap(usize), o1: Str, op: Str, o2: Str, target: Str) !void {const left = std.fmt.parseUnsigned(usize, o1, 10) catch known.get(o1) orelse return;const right = std.fmt.parseUnsigned(usize, o2, 10) catch known.get(o2) orelse return;if (std.mem.eql(u8, op, "AND")) {try known.put(target, left & right);} else if (std.mem.eql(u8, op, "OR")) {try known.put(target, left | right);} else if (std.mem.eql(u8, op, "RSHIFT")) {try known.put(target, left >> @intCast(u6, right));} else if (std.mem.eql(u8, op, "LSHIFT")) {try known.put(target, left << @intCast(u6, right));} else {unreachable;}}test "day07a" {try std.testing.expectEqual(@as(usize, 956), try first(std.testing.allocator));}test "day07b" {try std.testing.expectEqual(@as(usize, 40149), try second(std.testing.allocator));}