First half of day 18
This commit is contained in:
		
							parent
							
								
									b28fd56a8a
								
							
						
					
					
						commit
						0383ace2e3
					
				| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					const Builder = @import("std").build.Builder;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn build(b: *Builder) void {
 | 
				
			||||||
 | 
					    // Standard target options allows the person running `zig build` to choose
 | 
				
			||||||
 | 
					    // what target to build for. Here we do not override the defaults, which
 | 
				
			||||||
 | 
					    // means any target is allowed, and the default is native. Other options
 | 
				
			||||||
 | 
					    // for restricting supported target set are available.
 | 
				
			||||||
 | 
					    const target = b.standardTargetOptions(.{});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Standard release options allow the person running `zig build` to select
 | 
				
			||||||
 | 
					    // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
 | 
				
			||||||
 | 
					    const mode = b.standardReleaseOptions();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const exe = b.addExecutable("day18", "src/main.zig");
 | 
				
			||||||
 | 
					    exe.setTarget(target);
 | 
				
			||||||
 | 
					    exe.setBuildMode(mode);
 | 
				
			||||||
 | 
					    exe.install();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const run_cmd = exe.run();
 | 
				
			||||||
 | 
					    run_cmd.step.dependOn(b.getInstallStep());
 | 
				
			||||||
 | 
					    if (b.args) |args| {
 | 
				
			||||||
 | 
					        run_cmd.addArgs(args);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const run_step = b.step("run", "Run the app");
 | 
				
			||||||
 | 
					    run_step.dependOn(&run_cmd.step);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,381 @@
 | 
				
			||||||
 | 
					(7 * (7 * 6 * 4 + 3)) * 3 + ((8 + 5 * 3 + 7 + 8) + 3 * (2 + 9 * 5 + 7 * 5 * 6) * 2 + 3 * 9) + (4 + 5 + 5 * 2 + 2) + ((5 + 6 + 9 + 6) + 3 + 4 * 6 * 5)
 | 
				
			||||||
 | 
					7 * 5
 | 
				
			||||||
 | 
					(9 * (9 + 7) * 7 + (4 + 5 * 5 + 2 + 3) + 3) * 7 * 5 + 8 + (4 + (7 + 9 + 6 * 9) * 2)
 | 
				
			||||||
 | 
					((6 + 4) * 6 * (5 + 3) * 9 * (3 * 5 * 5 * 9 * 4 + 9) * 4) * 2 * 8 + 9
 | 
				
			||||||
 | 
					7 * 7 + (9 + 2 * 9 + 9)
 | 
				
			||||||
 | 
					9 + (7 * 7 * 5 * 9 * 7) * 2 + 3 * 3
 | 
				
			||||||
 | 
					5 * (5 * (8 * 4) * 7 + 8 + 7) * (5 * (4 * 3 * 5 + 2 * 5) + (6 * 6 * 7 * 2 + 2) + 4) + (5 + 4 * 7 + 5 * 9 + 9) * 2
 | 
				
			||||||
 | 
					((7 + 3 + 8) + (2 + 6 * 4 * 5)) + 8
 | 
				
			||||||
 | 
					8 * (6 * 7 + 3 * (8 * 5 * 2 * 4)) * (3 + (5 + 5 + 6) * (4 * 3 + 7 * 5 + 7) + (3 * 5 * 9 * 3)) + 8
 | 
				
			||||||
 | 
					6 + 4 + 8 + 4 * ((3 + 5 * 8) + 7 * 7 * 8 * 7 * 2)
 | 
				
			||||||
 | 
					3 * (9 + 4) * (9 + 2 + 6 + 5) + 4 * (7 * 2) + 6
 | 
				
			||||||
 | 
					4 * 6 + (8 + 3) + 7
 | 
				
			||||||
 | 
					2 + (8 * (5 + 6 * 5) + 9 * 7 + (7 * 7)) + 5 + 5
 | 
				
			||||||
 | 
					(8 + (5 * 7 * 3 + 6) + 8) * 8 + 6
 | 
				
			||||||
 | 
					8 * 6 * 6
 | 
				
			||||||
 | 
					8 * 6 + (9 + 4 * 5 * 3) * 9 * (4 * 2 + 6 + 7 + 4 * 8)
 | 
				
			||||||
 | 
					(5 * 9 * 8 * 9 * 6) * 8
 | 
				
			||||||
 | 
					7 * 5 + ((2 * 7 * 5 + 2 + 6 + 3) * 9) * 5 + ((2 * 2 * 4 + 3) * 5)
 | 
				
			||||||
 | 
					(2 + 3 * 4 * (2 + 4 * 9 + 8) * 8) + 6 + 8 + 7 * 2
 | 
				
			||||||
 | 
					3 + 7 + (3 * 4 * (8 * 6 + 8 * 8 * 2 + 9)) * 4
 | 
				
			||||||
 | 
					9 * 9 + 9 + (3 * 7 * 9 * 4)
 | 
				
			||||||
 | 
					(7 * 7 + (2 * 5 * 8) * 4) * 9 + (9 + 4 * 8 * (9 + 3 * 5 * 4 * 7 * 4)) + 3 * 3
 | 
				
			||||||
 | 
					7 + 6 + 3 * 8 * 4 * (9 * 4 * (5 + 7 * 2 * 8 + 7 * 8))
 | 
				
			||||||
 | 
					(7 + 2) * 5 * 8 + 6 * 2
 | 
				
			||||||
 | 
					9 + 4 + (5 + (7 * 7 * 9 + 5) + 6 * 5 + 2 * (4 * 7 * 7 + 8 * 5 * 5)) * 2 + 2
 | 
				
			||||||
 | 
					8 + 2 * 2 * (2 + (2 + 7 + 7 * 7 * 3) + 7)
 | 
				
			||||||
 | 
					3 + 4 * (3 + 3 * 3 + 4) * 9 * 6 + 8
 | 
				
			||||||
 | 
					((4 + 4 + 6) + (5 * 5 + 4 * 9 * 5) + 5) + 2 * 2
 | 
				
			||||||
 | 
					9 * 5 * 6 * 2 + 6 + (2 * 9 + (2 * 3 + 4))
 | 
				
			||||||
 | 
					(3 * 9) + 2 * (2 * 5 + 7 + 9 * 7 * 6) + 5 * 5 * 2
 | 
				
			||||||
 | 
					7 + 3 + 5 * 6
 | 
				
			||||||
 | 
					7 + 5 + (2 * 8 + (6 * 6) + 6) + (4 + 7)
 | 
				
			||||||
 | 
					2 * (9 + 5 * 3 + 5 + 5 + 4) * (3 + 4 + 3 + 5 + 2 + 7) + 2 * 2
 | 
				
			||||||
 | 
					(4 * 5 + 6 * 3 + (5 * 3)) * 5 + 5
 | 
				
			||||||
 | 
					9 + 8 + 7 * (7 + 9 + 2 * 2 + 7) * 7
 | 
				
			||||||
 | 
					3 * 3 * ((4 + 3 * 4 * 2 * 2 * 6) * (9 + 6) * 3) * 5
 | 
				
			||||||
 | 
					9 + 6 + 7 + 6
 | 
				
			||||||
 | 
					8 * (4 * 8 * 8 * 7 + 4 + 9)
 | 
				
			||||||
 | 
					2 + (7 * 9 * 2) + 6 * 6 * 4 * 6
 | 
				
			||||||
 | 
					((4 * 6 + 7 + 9 * 4) + 9) * 4 * ((6 * 3 + 3 + 9 * 7) * 8 * 4 * 5 * (2 * 6 * 8 * 5 + 5 * 3)) * 7
 | 
				
			||||||
 | 
					(4 * 7) + 5
 | 
				
			||||||
 | 
					6 + 9 * 6 + 9 + ((5 + 7 * 5 * 8) + 7 + 7 + 8 * (2 + 8 * 2 * 4 * 7 + 9) * 7)
 | 
				
			||||||
 | 
					6 + 3 + (9 + 6 * (4 + 7 + 4 * 6 * 7)) + 6
 | 
				
			||||||
 | 
					5 * 7 * (4 * 6 * (3 + 8 + 6 * 8)) + 8
 | 
				
			||||||
 | 
					(5 * 6) * 8 + 2 * 3 + (7 + 4 + 3)
 | 
				
			||||||
 | 
					3 + 4 * 9 * 2 + (7 + (5 * 9 * 7 + 7 * 4) * 4) + 3
 | 
				
			||||||
 | 
					2 * 9 + ((3 + 5 + 2 + 9 * 9 + 6) + 4 + (6 * 4) + 2) + 3
 | 
				
			||||||
 | 
					3 + 6 + (3 + 6 + 8 + 2 + 2)
 | 
				
			||||||
 | 
					8 * ((8 * 6) + (7 + 2 * 2 * 2 + 4 * 3) * (9 + 8 + 4 * 8) + 8 * 4) + 2
 | 
				
			||||||
 | 
					9 + 4 * (7 * (2 * 4 + 9 * 3 + 7) * 8 + (4 * 3 * 9 + 9 * 5 + 7) + 9 * (6 * 4 * 2)) + ((5 + 6 + 7 * 9 * 6 + 6) + (6 * 2 + 8 + 9 + 4 + 4) + (8 * 5 * 2 + 6 + 7) * 5 + 3) * 9 * 8
 | 
				
			||||||
 | 
					9 + 2 + (5 + 3 * 2 * (7 + 4 * 5 * 5 + 3 * 7) * 8 * (5 * 6))
 | 
				
			||||||
 | 
					7 * (3 + 3 + 7 * 7 * 9) + (2 + 5 * 6 * 4)
 | 
				
			||||||
 | 
					9 + 8 + 9
 | 
				
			||||||
 | 
					8 * (7 + (5 * 7) + (7 + 3) * 2 + 7) + 4 * 3
 | 
				
			||||||
 | 
					2 * (2 * 6 + 5 * 7) * 2 + (3 + 3) * ((2 * 3 + 2) + (5 * 3 * 4 + 8 * 2))
 | 
				
			||||||
 | 
					4 * (3 + 7 + 6 + 8 + 3 + 6) + 8 + (2 * 3 * (5 * 2 + 6 + 5 * 8))
 | 
				
			||||||
 | 
					2 + 5 + 3 + 2 + 4 + (2 + (6 + 4) + 5)
 | 
				
			||||||
 | 
					2 * (4 * 4) + (5 + 2 * (4 + 2 * 2 + 4) * 4 + (5 * 9 * 9) + 2)
 | 
				
			||||||
 | 
					(6 + 9 + (3 + 5 * 3) + 4 * 2 * 2) + 7 + ((6 * 6 + 4 * 5 * 5 + 4) + 5) + ((8 + 4 + 9 * 8 * 9 + 2) + (7 + 2 + 9) + 4) + 5
 | 
				
			||||||
 | 
					7 * 3 + (6 + (8 * 5) * 6 * 8) * 2 * 9 * 4
 | 
				
			||||||
 | 
					9 + 9 + 9 + 2
 | 
				
			||||||
 | 
					(7 * 9 * 2 + 8 * 7 * 4) + 9 + (9 * 6 * 9 + 7) * 3 * (9 * 5 * 5)
 | 
				
			||||||
 | 
					4 * 7 * ((7 + 9 * 5 * 4 + 7 * 4) + (2 + 3 + 5 * 4 + 2) + (2 + 5 * 8 * 5 * 5 + 6)) * 6
 | 
				
			||||||
 | 
					5 + 8 * (9 + (9 + 3 + 9 + 5 + 5))
 | 
				
			||||||
 | 
					(3 * 7 * 2 * 3 + (8 + 8 + 3 * 9)) + 8 + 8 * 6 + 8 + 6
 | 
				
			||||||
 | 
					9 + 4 + 8 * (7 * 8 + 8 + 4 * 8)
 | 
				
			||||||
 | 
					2 * 9 + 2 * (5 + 3) * 2 * (5 * 5 * 8 + (3 + 4 + 4 + 5) + 4 * 4)
 | 
				
			||||||
 | 
					5 * 7 + 2 * ((2 * 8 * 8 + 8 * 2 * 7) * 6 * 7 + 7 + 2) * 2 + 9
 | 
				
			||||||
 | 
					4 * (6 * (6 * 3 * 3)) * (7 * 5 * 4 * 2 * (5 + 5 + 8 * 3)) + 7 + 7 * 8
 | 
				
			||||||
 | 
					3 * 2 + 4
 | 
				
			||||||
 | 
					9 + 6 * 2 * 4 + 2
 | 
				
			||||||
 | 
					((5 * 5 + 3 + 7 * 2) * 2 * 5 + (9 + 9)) + 3 + 6 * (9 + 8) * 8 * 9
 | 
				
			||||||
 | 
					4 * (8 + 2 + 3 * 9 * 6) * 6 * 3
 | 
				
			||||||
 | 
					2 * (9 * 6 + (8 + 6 * 4) * (5 * 5) + 9 * 2)
 | 
				
			||||||
 | 
					6 + (3 * (6 * 6 + 4 + 5) + 3 * 5 * 4 + (6 + 9 + 4 * 5 * 3)) + 6 * (3 + (6 + 5 + 5 + 6) * 8 + 8 * 4) * 4 + 6
 | 
				
			||||||
 | 
					9 * 9 * 2 + (6 * 4 * 2 + 4 * 7 * 9) * 7 + ((5 + 6 + 7 + 7) * (7 * 3 + 9) + 9)
 | 
				
			||||||
 | 
					(2 + (6 + 8 + 6 * 5 + 5) + 8 * 5) * 9 + 3
 | 
				
			||||||
 | 
					2 * 9 + 2 + (9 * (4 + 6 + 4 + 2) * 9 * 5 + 7 + 2)
 | 
				
			||||||
 | 
					8 + 6 + 4 + 6
 | 
				
			||||||
 | 
					3 + ((6 * 4 + 2 + 4 + 3 + 8) * (4 * 3) * (9 + 4 * 6 + 2 * 7 * 6)) + 5 + 7
 | 
				
			||||||
 | 
					3 * (8 * 4 + 9 + 4) * 7 * 2 + ((5 + 9 * 6 * 4 * 4) * 8 * 4 * (6 + 2))
 | 
				
			||||||
 | 
					((8 * 7 + 6) * 3 + 2 + 5) + 8 * 5 * 8
 | 
				
			||||||
 | 
					(3 * 2 * 6 * 3 * 2) * 6 * 2 * 9
 | 
				
			||||||
 | 
					(4 * 8 * 3 + 5) + (8 + 9) + 7 * 7 + 3 * 3
 | 
				
			||||||
 | 
					(2 + 7 * (7 * 8)) + 8 + (6 * (4 * 8) * 4 * 2 * 8) * 4 * ((7 + 8 + 4 + 3 + 6) * 4 + 9 + 4) + 3
 | 
				
			||||||
 | 
					((7 + 2 + 3 * 3) * 5 * 5 + 4) + 9 * 2 + 7 + 9 + 2
 | 
				
			||||||
 | 
					(6 + (2 + 7)) * 4 + 7 + 8 * 5
 | 
				
			||||||
 | 
					(9 * 8) + (8 + (2 + 4 + 5 + 6 * 9) + 2 * (8 + 9))
 | 
				
			||||||
 | 
					2 * (9 + 8) * 8 * ((7 * 6 + 7 * 3) + 2 + 5 * (7 * 2 + 7 + 8) + 3 * 3) + 8
 | 
				
			||||||
 | 
					4 * 6 + 6 + 4 * 9
 | 
				
			||||||
 | 
					(2 + 4 + 5 + 3 + 6) + 3 * 3 * 3 + (5 * 2 * 9 + 6 * 6 + 5)
 | 
				
			||||||
 | 
					7 * 5 + (6 + 2 * 2 * 8 + 5) * 6 + 6
 | 
				
			||||||
 | 
					(5 + 8 + 2) + 3
 | 
				
			||||||
 | 
					3 + 3 * 5 * ((3 + 8 + 5 + 9) * 4 + 4 * 4 + 4) + 8 * 3
 | 
				
			||||||
 | 
					2 + (5 + 5 + (6 * 5 * 2 * 8) * 4 + 8)
 | 
				
			||||||
 | 
					8 + (5 * 7 * 2 * 2) * (7 + 9 * 5) * 2 + 9 + 4
 | 
				
			||||||
 | 
					((9 * 9) + 6 + 4 + 9) * 5
 | 
				
			||||||
 | 
					5 + 3 * ((4 + 8) + 9 * 2 * 6 + 7)
 | 
				
			||||||
 | 
					6 + 7 + 5 * (2 + 9 * 4 * 5 * 7 + 5) + 9 * 4
 | 
				
			||||||
 | 
					(7 * 2 + 4 + (8 * 8 + 2 * 5 * 3 * 6)) + (4 + 4 * 3 + 7) + 4 * 6
 | 
				
			||||||
 | 
					2 * (5 * 9 * (5 + 3 * 5) * 5 + 6) + 4 + 5
 | 
				
			||||||
 | 
					5 * (4 + 7 + 4)
 | 
				
			||||||
 | 
					9 * 7 + 8 + 4 + (6 * (6 * 2 * 4 + 9)) + 5
 | 
				
			||||||
 | 
					6 * 3
 | 
				
			||||||
 | 
					(5 * 6 + 2 * (2 + 5 * 6 * 4 + 9 + 2)) + (4 + 3 * (9 * 9 + 4 * 8 * 8 * 9) * 4) * (8 + 7 + (4 + 8 * 2 + 4) * 9)
 | 
				
			||||||
 | 
					8 * 5 + 9
 | 
				
			||||||
 | 
					7 + 4 * 9 * 6 + 6
 | 
				
			||||||
 | 
					9 + 6 * (8 * (7 * 6 + 2 + 4 + 6 + 9) * 2 + 2 + 2 + (7 + 7 + 9))
 | 
				
			||||||
 | 
					6 * (7 * 6 * 6) * 9 * 6 + 7
 | 
				
			||||||
 | 
					(5 * 7 + 9) * 7 + ((4 * 5 + 3) * 5 * (3 + 8 * 7) + 2 + 3 * (7 + 6 + 2)) + (3 * 5 * 5) + 2
 | 
				
			||||||
 | 
					4 * 2 * 2 * 2 * (6 + 4 + 9 + 4 * 5)
 | 
				
			||||||
 | 
					((9 * 7 + 7) + 8 * 7) * 4 + (7 + 9 * 9) * 6
 | 
				
			||||||
 | 
					8 * (6 * (8 + 4) + (5 + 6) * 6) * 7 + 4 * 7 * 2
 | 
				
			||||||
 | 
					(7 + 7 * (8 * 5 + 4)) * 5 * (3 * 6 * 2 * 3 * 9) * 3
 | 
				
			||||||
 | 
					4 + (7 * 5 * 3 * 5 + 3 * 5) * 7
 | 
				
			||||||
 | 
					(6 + 5 + 6 * 3 * (6 * 4 + 6)) + 2 * 5 * 9 + 3 * 5
 | 
				
			||||||
 | 
					3 * (6 + 3 + 5 * 3) + 6 * 3 + (7 + 8) * 9
 | 
				
			||||||
 | 
					(3 + 8 + (5 * 4 + 4 + 7) + 5 * 2) + 2 + 5 + 6 * 9 + (4 + 2 + 6)
 | 
				
			||||||
 | 
					9 * 8 + (3 + (4 + 2 * 8 + 7 * 5 + 3) + (3 * 3) * 3 + (2 * 8))
 | 
				
			||||||
 | 
					7 * 4 + (3 + 7 + 6 + 4 * (3 * 6) * 2) + ((5 + 5 * 5) + 6 + 2 * (2 * 3 * 3 + 3))
 | 
				
			||||||
 | 
					9 * 5 * (6 + (2 * 3)) + (3 * 4 + 3 + 9 + 6) + (9 + 5 + 2 + (3 * 4 * 9 * 9 * 5) + 2 * 7) * 5
 | 
				
			||||||
 | 
					(6 + 9 * 4 + 5 * 4 * (8 + 2 * 4 * 2 * 3)) + 4 * 9 + 6 * (4 * 5 * 9)
 | 
				
			||||||
 | 
					9 * 7 + (2 + (6 + 3) + (4 * 3 + 9) + 9) + 8 + 9 * 3
 | 
				
			||||||
 | 
					3 * (8 + 7 + 7 + 8) * (5 + 5 + 2 + 6 + 9 + 7)
 | 
				
			||||||
 | 
					7 + (7 * 5 + 3 * 4 * 9 + 2) * (8 * 6 + (5 + 2) + 6) * 4 + (6 * 3) + 2
 | 
				
			||||||
 | 
					(4 * 5 + 7 + 3 * (7 * 8) + 8) + 6 * 2 + 9 + 3
 | 
				
			||||||
 | 
					7 * 4 * 8 * (7 + 5 + 2) + (8 * 8 * 2) + 3
 | 
				
			||||||
 | 
					7 + 7 * (6 + (4 * 7 + 3 + 2 + 7) + 3)
 | 
				
			||||||
 | 
					2 + (8 + (5 + 9 + 2 * 6 * 6 + 8) * 8 + 2 * (5 * 2 + 8) * 4) + 2 * 6
 | 
				
			||||||
 | 
					(4 * 9 * (7 * 6 * 9 + 8 * 6) * 9) * 2 * 2
 | 
				
			||||||
 | 
					3 + (8 + 2 + (2 + 3 * 2) * 6 + (5 * 8 * 8 * 8 + 2 + 3)) * 4 * (9 + 3) * 6
 | 
				
			||||||
 | 
					8 + 3 * (3 + 5) + 3 + 5
 | 
				
			||||||
 | 
					4 + ((9 * 5 * 2 + 7 + 5) + 6 + 3 + 6 * (7 * 6) + 6) * 2 * 3 * (3 * 9 + 9)
 | 
				
			||||||
 | 
					((4 * 9) * 8 * 6) + 8 * 8 + 6 + ((6 + 4 + 7) * (2 + 2 * 4 * 9) + 3 + (5 * 9 + 9 * 9 + 5) + 2)
 | 
				
			||||||
 | 
					(8 * 4) + (8 + 8)
 | 
				
			||||||
 | 
					((4 + 5 + 2 * 4 * 7 + 3) * 6 * (4 * 6 + 8) * 9 * (9 + 7 + 5 + 3)) * 5
 | 
				
			||||||
 | 
					8 * 2 + 8 + (7 * (8 + 2 + 6 * 7 + 9) + (5 + 9 + 3) + 6 * 6) * (8 + (4 * 2 + 4 + 7 * 5) + 2 * 6) * 5
 | 
				
			||||||
 | 
					(2 * 5 + (8 * 7 + 9 + 2 + 2)) * 2 + (8 * (2 + 4) + 4 * 5 + 7) + 4
 | 
				
			||||||
 | 
					4 + (2 + (4 * 3 * 9) * 5 * 4)
 | 
				
			||||||
 | 
					((3 + 4) * 7 + 6 + (5 * 3 * 8 + 8 * 9) * 3 + 6) + 8 * 4 * ((7 + 4 * 3) * (6 + 9 + 9 * 4 * 7) + 9 + 5 + 2 + (5 + 8 * 4 * 6 + 4 * 8))
 | 
				
			||||||
 | 
					4 * (9 * 5 * (5 * 7 * 7 + 4)) * 5 * (5 * 7 + (4 * 5) * 4 + 9)
 | 
				
			||||||
 | 
					5 + (8 * 6 + 8) + 8
 | 
				
			||||||
 | 
					7 + (8 + 6) * 4 + 2
 | 
				
			||||||
 | 
					(3 * (9 + 6 * 8)) * 8
 | 
				
			||||||
 | 
					3 + 6 + 4 + ((5 + 4 * 2) + 7)
 | 
				
			||||||
 | 
					7 * 3 + 5 * (2 * 5 + 4) * 8
 | 
				
			||||||
 | 
					5 * 5 + (6 * (8 + 5) * 7) * 7 + 4
 | 
				
			||||||
 | 
					7 + 9 + (2 + (3 + 8 + 4) + 9 * 2 + 6) * (7 + (3 + 6 * 8 + 8 * 7) + 9 * 3 * 8 + (9 * 6 + 2 + 8 + 4 * 4))
 | 
				
			||||||
 | 
					6 * (2 * 8 + 3 + 5 + 5) + (3 + (8 * 2 * 3) * (2 + 9 * 8 * 5 + 3) + 4 + 7) * 7 + (5 * 5 + 7)
 | 
				
			||||||
 | 
					(2 * 2 * 6 * 4 * 9 + (9 * 5 + 7 * 4 + 6 * 2)) * 4 + (4 + (8 * 2 + 3 + 6))
 | 
				
			||||||
 | 
					2 + (8 + 4 * 8 + 3) * 6 + 7 + 4
 | 
				
			||||||
 | 
					(6 + 6 * (2 * 5 * 5 * 4 * 5 * 4) + 8 * 7 * 3) + 5 + (3 * 6 + 3 * 7) + 5 + 5 * 3
 | 
				
			||||||
 | 
					2 * (8 + 2 + 6 * (9 * 9 * 9 + 4 * 2 * 7) * 3 * (4 + 6 * 3 + 8 + 4)) + 8
 | 
				
			||||||
 | 
					(6 * 7 + 8 * 6 * 7 + (5 + 9 * 3 + 6 + 9 * 5)) + 2 * 6
 | 
				
			||||||
 | 
					(7 + 2 * 4 + 3) + 4 * 5 + 3
 | 
				
			||||||
 | 
					((7 * 7 + 2 + 7) + (3 + 3 + 5 + 9 * 3 + 2) * (2 * 4 * 7 + 6 * 3)) * (2 + (7 + 4 + 3 * 9 + 4 * 5) * 4 + 3 * (5 + 8 * 3)) + 5 + (2 + 8 * 2 * 8 * (6 * 7 + 4 + 5)) * (3 * (7 * 6 * 3 * 8)) + 7
 | 
				
			||||||
 | 
					3 * 4 * ((8 + 8 + 9) * 6 + 6 + 7 + 6) + 8 + 3
 | 
				
			||||||
 | 
					(6 + (7 * 4) + (9 + 6 + 3 * 9)) + 2 * (4 + 6 * 5 + (2 + 8) * 5 + 9) + 3 * (6 + 8 + 8 * (7 * 8 * 3 * 2 + 2 + 8))
 | 
				
			||||||
 | 
					(9 + 8 * 4 + (5 * 8 + 7 * 2 * 8 * 9) * 8 + 9) * 3
 | 
				
			||||||
 | 
					9 + ((5 * 3 + 6) + (8 + 6 * 6 + 7 + 2 + 8) * 8 + 5 + (9 + 8 + 2 * 9 + 2)) * 7
 | 
				
			||||||
 | 
					((8 + 2 + 6 + 3) * 8 + 5 + 8 + 2) * 9
 | 
				
			||||||
 | 
					(6 + (4 * 4 * 7 * 2 + 6) * 4 + 2 * 8 * (6 + 2 * 8)) * 2 * 8
 | 
				
			||||||
 | 
					3 * (4 + 3 + 3 + (3 * 7 * 7)) + 6 + 7 + 4 + 8
 | 
				
			||||||
 | 
					(6 * 8 + 7) * 8 * 9 + 8 + 4
 | 
				
			||||||
 | 
					(7 * 7) * 2 + (8 * 7) + 4 * (5 * 2 * (3 + 4 + 7 * 8 * 3) * 9) + 6
 | 
				
			||||||
 | 
					7 + (9 * (6 + 8 * 7 + 6 * 3) + 4) * 4 + 3
 | 
				
			||||||
 | 
					6 + 3 * ((2 + 2 + 3 + 9 + 9 + 8) * 6 + 2) + 5
 | 
				
			||||||
 | 
					3 * 6 * 6 + 2 + 2 + (2 * 2)
 | 
				
			||||||
 | 
					6 + (4 + 9 * (5 + 9 * 4 * 6 + 6) + 4 * 6 * (2 * 7 * 7 * 4 + 8)) + 5
 | 
				
			||||||
 | 
					((2 + 6) + 2 + 5) + 7 + 3 + 5 * 3 + 5
 | 
				
			||||||
 | 
					(6 * (2 + 8 + 7) + 4 * (2 + 8) * 9) + 9 * 6
 | 
				
			||||||
 | 
					(2 * (9 * 4 * 3 * 2) + (4 + 4 * 3 + 2)) + 4
 | 
				
			||||||
 | 
					(6 + 4 * (5 + 9)) + 7 * 7 * 8 * 5 * 3
 | 
				
			||||||
 | 
					(3 + (5 + 4 * 3 + 9)) * 2 * (9 + 6 * 6 * (7 + 8 + 2 * 5) * 8 * 6)
 | 
				
			||||||
 | 
					8 + 6 * 6
 | 
				
			||||||
 | 
					8 + (8 * 9) + 5
 | 
				
			||||||
 | 
					8 + (7 * (6 + 8) * 7 * (5 * 7 * 8 * 7) + (8 + 4 + 6 * 9 + 8) + 4) + (6 * 4) * 3 * 7
 | 
				
			||||||
 | 
					9 + 4 + 3 * 7 * 5
 | 
				
			||||||
 | 
					(8 + 9) + 6 + 4 * 7
 | 
				
			||||||
 | 
					5 * (4 * 6 + 4 + 2 * (5 * 2 * 2 * 8)) * 3
 | 
				
			||||||
 | 
					3 * 3 + 2 + ((8 + 5 + 4 + 8 + 8) * 7 * 6 + 9 * 8)
 | 
				
			||||||
 | 
					9 + (8 + (8 + 9) + 7 + 8)
 | 
				
			||||||
 | 
					(8 + 2) + (2 + 5 + 7) + 6 * 6 * 6 * 6
 | 
				
			||||||
 | 
					5 + 7 + (5 + 4 * (5 * 6 + 3 + 3) + (7 * 9 * 5 * 6 * 6 + 3) * 8) * 7
 | 
				
			||||||
 | 
					6 + ((7 * 3) * 6 * 5 + 5 + (3 + 3 + 9)) + (6 * 2 + 6 + 9 + (2 + 4 * 3 * 4) + 7)
 | 
				
			||||||
 | 
					8 * 5 + (9 * 2 * 7 * 2 * 6 + 8) * 2 + 2 + 6
 | 
				
			||||||
 | 
					6 * 8
 | 
				
			||||||
 | 
					(2 * 3 + 5 + (8 + 6 * 8 * 7 * 2)) * 3 + 2 + 6 + 2 * 5
 | 
				
			||||||
 | 
					(7 + 6 * (2 + 2 * 4 * 9 + 7 * 5) * 4 + 2) + 4 * (9 + 6) + (9 + 5) + 7
 | 
				
			||||||
 | 
					5 * (3 + 7 + 7 * 4)
 | 
				
			||||||
 | 
					2 * ((2 * 7 * 8 * 4 * 3 + 7) + 6 + 3) * 5 * 7
 | 
				
			||||||
 | 
					8 * 4 + 7 + (6 * 4 + 3 + 2) + 7 * 8
 | 
				
			||||||
 | 
					7 * 9 + (2 * 9 * 2) * 6
 | 
				
			||||||
 | 
					8 + (6 * (2 + 8) + 9) + (7 + 6 + 6 * (8 * 3 * 5 * 5 * 9) + 3 + 7) + 8
 | 
				
			||||||
 | 
					2 + 5 * 4 + (4 * (3 + 7 * 5 + 8) * 8 + 2) + 3 * 7
 | 
				
			||||||
 | 
					(8 * (9 * 7 + 9 + 9 + 4) * 3 + 2) * 8
 | 
				
			||||||
 | 
					4 + (6 + (2 + 4 * 6) + 4)
 | 
				
			||||||
 | 
					(8 * (4 + 6 + 2 * 6 + 7)) * 9 + 8 + 3 * 5
 | 
				
			||||||
 | 
					((2 * 7 + 3 * 5) * (5 + 7 + 7 + 3 * 7 * 3) * 8) * 2 * ((2 * 9 * 4 * 6 + 4) + 6 + (8 * 5 * 4 * 5 * 6 * 8) + 7 * (9 * 6 + 7 * 3 + 4 + 7)) + 9
 | 
				
			||||||
 | 
					6 + 8 + (3 * 3 + 2) + 5 + 4
 | 
				
			||||||
 | 
					5 * 6 + 6 * 5 * ((3 + 5 * 8 + 4 * 8) * 9 * 9 + 6 * 4 + 6) + (4 * 7 * 5 + 9 + 7)
 | 
				
			||||||
 | 
					2 * 7 * (4 * 7 + (4 + 7 + 4 + 3 * 2 + 7) + 7)
 | 
				
			||||||
 | 
					((8 + 3 * 6 * 6 + 4) + (9 + 5 + 3 * 3) + 7 * (3 * 4 + 4 + 9 * 4 + 6) + (8 + 5 + 2 * 2 * 5)) * 8 * 6 * 7 + ((5 + 6 + 2 * 4 + 2) * (9 + 8 + 9) + 6 + (6 * 5 * 9 + 7) * 4 * 6) * 7
 | 
				
			||||||
 | 
					4 * 5 * (9 * 3) + (9 + 6 + 5 * 8)
 | 
				
			||||||
 | 
					3 * 8
 | 
				
			||||||
 | 
					9 + 2 * (7 + (2 + 9) * 9) + 4 * 4 * 8
 | 
				
			||||||
 | 
					(8 + 4 + 7 * 2 + 8 * (8 + 7 * 4 + 4)) + 4
 | 
				
			||||||
 | 
					4 + 8 + ((7 * 9 + 9) + 3 + 2 + 3) * 8
 | 
				
			||||||
 | 
					(6 + (4 + 3 + 8 + 6 * 8)) * (5 + 9 * (5 + 2 * 7 + 8) + (6 * 7 * 4 + 2 * 5) + 4 * 9) * 8 * 5
 | 
				
			||||||
 | 
					8 + 3 + 4 * 9 * ((4 * 9 + 3 + 6) + 3 * 3 + 9) * 2
 | 
				
			||||||
 | 
					6 + ((3 * 2) * (4 + 9 + 9 * 5 * 2) * (2 * 8 + 4 * 7 + 4 + 8)) * 5 + (9 * 4 * 6 + 6 * 4 + 8)
 | 
				
			||||||
 | 
					2 + (5 + 4 * 8) + (9 * 9)
 | 
				
			||||||
 | 
					8 * 3 + 7 * 3 + ((2 * 2 + 6 * 3) * 3 * 7 * 8 + 5) + 9
 | 
				
			||||||
 | 
					4 * 7 + ((6 + 7 * 3 * 4 + 8) * 2 + 6 + (4 * 6 + 9 + 6 * 8 * 3) + 3 * 3) + 3
 | 
				
			||||||
 | 
					5 * (9 * 9 + (7 + 6 + 2 + 9 + 9 + 9)) * 8
 | 
				
			||||||
 | 
					5 + 4 * 2 + 7 * (5 * 5 + 2 + 3)
 | 
				
			||||||
 | 
					2 * 2 + 6 + ((2 + 2 + 5) * 6 * (2 + 7 + 3 * 9) * 5 + 9 * 8)
 | 
				
			||||||
 | 
					((2 * 4 + 7) + 9 * 8) + 5 * 6 * 2 + 9
 | 
				
			||||||
 | 
					6 + ((7 * 9 * 9 + 2) * 2)
 | 
				
			||||||
 | 
					6 * (7 + (4 + 7 * 2) * 5 + 2 + 7) + 6 * 7 + 5
 | 
				
			||||||
 | 
					8 * (6 * 8 + (7 + 2 + 7) + 3) + 7 + 6
 | 
				
			||||||
 | 
					(7 * 2 * 3 * 7) + 4 * 3 + 6 * 9 + 7
 | 
				
			||||||
 | 
					8 * 7 * (8 * 9 * 3)
 | 
				
			||||||
 | 
					9 + (9 * 4 * (9 + 3 * 5 + 9 + 9) * 8 + 5 + 9)
 | 
				
			||||||
 | 
					6 * (9 * 2 * 9 + 6 + 9 + 8) + (6 * 9 * 5) + 2 * 4
 | 
				
			||||||
 | 
					2 * 5 * (7 + 8 + 3 + 8 + 6 * 4) * 4 + 5
 | 
				
			||||||
 | 
					2 * 2 * (4 + 3) + 2 + 4 * 4
 | 
				
			||||||
 | 
					(6 * (9 * 6 + 2 * 2) * 4 * 3 * 4 * 7) + 2
 | 
				
			||||||
 | 
					(2 * 5) * 3 + 3 * 3 * 7 * 8
 | 
				
			||||||
 | 
					3 + 6 + ((6 * 6) * (9 + 8 * 2) * 7 + 5 + 9 * 2)
 | 
				
			||||||
 | 
					9 + 7 + (2 * 8)
 | 
				
			||||||
 | 
					(8 * 7) + (8 + 6 * 7 + (3 * 9 + 6) * 6 + 8) + (4 * 2 * 9)
 | 
				
			||||||
 | 
					2 + 2 + 2 + 9 * ((4 + 5 * 7 * 5 * 4 * 7) * (9 + 9) + 4 * 4 + 9) * 8
 | 
				
			||||||
 | 
					4 + 2 + ((6 + 8 * 4 + 7) * 7 + 3 * 9 + (9 + 5))
 | 
				
			||||||
 | 
					7 + 8 * (3 * (3 + 9 + 6 * 5) + 6 * 8) * 7 + 4
 | 
				
			||||||
 | 
					8 + 7 * (2 * (5 * 7)) + (4 * 3 + 7)
 | 
				
			||||||
 | 
					(2 + 8 * 7) + ((8 * 9 * 3 + 3 + 5 * 7) * 2 * (9 + 6 * 3 * 5) * 4 * (4 + 6 * 6 + 4 * 9) * 3) * 6 + 4 * 4 + 2
 | 
				
			||||||
 | 
					3 * (9 + 4 + (9 + 5 + 8 + 6 * 3 * 4) * 8 + (9 * 3 + 8 + 4 + 7)) * 8
 | 
				
			||||||
 | 
					(4 + 4 * (4 * 7)) * 2 + 7 * 3
 | 
				
			||||||
 | 
					((4 * 9) * (9 + 6 + 9 * 8 + 7)) + 6 + 7 + 7
 | 
				
			||||||
 | 
					6 + ((9 * 5 + 9 + 6 * 6 + 4) * 7 + (9 + 5 + 5) * 9 + 3) * (5 * 9) + 8 + 9
 | 
				
			||||||
 | 
					(3 + 8 * (7 * 3 * 4)) * (6 * (6 + 4) + (9 + 8) * (2 * 5 + 4) + (8 + 5 * 6 + 5 * 2 + 2)) * 6 + 9 + (7 + 6 * 5) + (5 + 4 + (6 + 8 * 2) * 2)
 | 
				
			||||||
 | 
					4 * ((6 * 8 + 7 * 6 + 4) + 4)
 | 
				
			||||||
 | 
					((5 * 6) + 4) + (9 + 4 + 9) + 2
 | 
				
			||||||
 | 
					5 * 9 * 7 * 6 + (9 * 7)
 | 
				
			||||||
 | 
					5 + (2 + 7) * 5 + 9 + 7
 | 
				
			||||||
 | 
					6 * 2 * 8 + 4
 | 
				
			||||||
 | 
					(3 + 2 * 4 + 8) + ((7 * 5 + 7 * 2 * 8) + 7 + 2) * 6 * 2 + 5
 | 
				
			||||||
 | 
					(2 * 5) * (3 * 9 * 4 * 8 + 5 * 3) * ((9 + 5 * 6 * 3) + 3 * 7 + 4) * 5
 | 
				
			||||||
 | 
					((3 + 6 * 3) * (4 + 9 * 5 * 6 + 4 * 7)) + ((8 * 7 * 2 + 7) + 5 * 6) * 6 + 7
 | 
				
			||||||
 | 
					(8 + 4 * 8 * 8) * 9 * 9 + 7 + 4
 | 
				
			||||||
 | 
					(7 * 9 + 5) * 5 + (9 + 4 + 4 + (7 * 9 * 2 * 8 * 2 + 9)) * ((7 * 5 * 7 * 3 * 7) * 5 * 2) + 8
 | 
				
			||||||
 | 
					5 + (6 * (8 + 9) * 7 + 9) + 3 + 3
 | 
				
			||||||
 | 
					8 + 8 * (6 * 5 * (3 + 5 + 9 * 2 * 9 * 7))
 | 
				
			||||||
 | 
					5 * (4 + 7) * 5 + 7 + 8 + 6
 | 
				
			||||||
 | 
					3 * ((5 + 6 + 2 + 7) * 4 * 6) * 5 * 5
 | 
				
			||||||
 | 
					(6 + 3 * (9 * 9 * 7 * 8 * 9 + 9) + 5) * 8 * 6 + 7 + 2
 | 
				
			||||||
 | 
					8 * (4 + 3 * 5 + (5 + 2 * 3 + 8) * 2 + (8 + 7 * 7 + 4 * 7 + 7)) + 8 * 6 + 4 * 5
 | 
				
			||||||
 | 
					4 + 7 * 8 * (2 + 6 + 5) * (4 + 8 + 4)
 | 
				
			||||||
 | 
					9 + 8 * ((2 * 3 * 6 + 4 * 2) + (6 * 5 * 9 + 7) * 5 * 2 * 9 * 7) + (9 + 4 * (2 * 8 * 7) * 3 + (9 + 8)) + 3 + 6
 | 
				
			||||||
 | 
					7 * 3 * 8 + ((6 + 7) * 9) * 2
 | 
				
			||||||
 | 
					5 + 3
 | 
				
			||||||
 | 
					4 + 9 * 7 * ((7 * 8 + 7 * 2 + 5 * 7) + 5 * 4) + (5 * 5 + (7 * 6) * 6)
 | 
				
			||||||
 | 
					((2 + 4) * 5) * 3 + 5
 | 
				
			||||||
 | 
					5 + (2 + 8 * 9 * 6 * 2 * (2 + 8 + 3 + 5)) * 9 * 8 + 3 * (9 + (4 + 2 + 4 + 7 * 4) * 9 * 9 + 7)
 | 
				
			||||||
 | 
					2 + 6 * 9 + 3 + (7 + 8 + 2) * 4
 | 
				
			||||||
 | 
					5 * 4 * (2 * 4 + 3 + 3 * (9 + 6 + 6) + (3 * 8 * 4)) * 4 * 3 + (9 * 7)
 | 
				
			||||||
 | 
					7 * (5 * 5 + 4 + 8 + (3 * 4 + 6 + 9)) * 2 * 9 * (6 + 7)
 | 
				
			||||||
 | 
					2 + (5 + 3 * 5 * 8) + 3 * 8 + (9 + 9 * 8 * 2 * 2)
 | 
				
			||||||
 | 
					((7 + 9 * 9) * 7 * 2) + 6 * 6 * 9
 | 
				
			||||||
 | 
					(6 * (9 + 9 + 4 + 5 + 6 + 2) + 6 + 8 + (7 * 3 * 8)) + 2 + 6 + 2
 | 
				
			||||||
 | 
					(3 + (6 * 2 + 2 + 6 * 7 + 8) * 9 * 2) * ((2 + 9) + 8 * 9 + 2) + 3 * (3 + 4 * 7 * (3 + 2 * 8 * 6 + 7) * (5 + 3)) * 5
 | 
				
			||||||
 | 
					(9 * (9 * 9 + 7 * 4) + (7 * 4 * 7 * 5) * (9 * 2 + 8 + 5 * 6)) * (6 * (7 + 9 + 6 * 7 + 9) + 4 * 4 * 2 + 6) * 9
 | 
				
			||||||
 | 
					4 + (3 + (4 + 5)) + 7 * (6 + 4 * (5 + 3 + 9 + 5 + 2) * 4 + 4) + 8 + 8
 | 
				
			||||||
 | 
					((5 + 8) + 5) * 9 + 6 + 8 * 7
 | 
				
			||||||
 | 
					8 * (5 + (3 * 3 + 6 * 3)) * 5 + 2 + 8 * 8
 | 
				
			||||||
 | 
					6 * 2 * 9 * (8 * 7 * (2 * 4 + 6 + 7 + 4 * 5)) + 9 + 7
 | 
				
			||||||
 | 
					(5 * 3 * (8 * 2 * 8 + 2 + 8) * (8 + 8 + 9 * 7 * 6 * 3) + (4 * 2 * 7) * 4) + (4 * 3 + 9 * 5) + 5 + (5 + 9)
 | 
				
			||||||
 | 
					(6 + 3) * 5 + (6 + 7 + 5 + 7)
 | 
				
			||||||
 | 
					(9 * (6 + 6 * 8 + 4) * (3 * 6 + 6 + 7 + 7 + 5) + (5 * 7 + 4) * 9) * (7 + 3 + 7 * 2 + (5 + 7 * 6 + 8) * 4) * 7
 | 
				
			||||||
 | 
					6 + 8 * (5 * 5 + (3 * 2 * 2 * 7 + 4 * 9) * 7 + 4) + 8 + 4
 | 
				
			||||||
 | 
					9 + (5 * 7) * (5 * 6 * 8 * (5 * 2) + 9) * (6 + 3 + 6 + 9 + 2) * 6
 | 
				
			||||||
 | 
					8 * (8 + 8 + 9 + 9 * 6 * 3) + 8 * (3 * 3) + 3 * 3
 | 
				
			||||||
 | 
					7 * 7 * (5 + 5 * 9) + (6 * 6 * 3 * 4 * 8 + 8) + 3
 | 
				
			||||||
 | 
					(3 * 2) + 5 * (6 * (9 + 2 + 3 + 2 * 9 + 5) + 6) + 2 + 7 * 9
 | 
				
			||||||
 | 
					9 * 2 + 3 + (3 * 7) + 4
 | 
				
			||||||
 | 
					7 * 5 * 7 * (4 + 3 * 7 + 3 + (4 * 5 + 5) + (5 * 8)) * (8 * 3 * (8 + 9))
 | 
				
			||||||
 | 
					((3 * 8 * 8 + 6 + 5 * 5) + 3 + (3 * 8 * 7)) * 2 * (9 + (9 * 8) * 5) * 5 * 4 + 7
 | 
				
			||||||
 | 
					4 * 9 * (4 + (3 * 7) + (6 * 4 * 9)) + 2 + 8
 | 
				
			||||||
 | 
					5 * ((7 + 2 + 6 + 6) * 2 + 4 * 8)
 | 
				
			||||||
 | 
					5 + 9 * ((7 + 2) * 5 * 4 * (5 + 7) + (8 + 4 * 8 * 7 * 9))
 | 
				
			||||||
 | 
					((4 + 3) + 6 * 3) * (4 * (4 * 6) * 3 * 2 + 8 * 4) + 8
 | 
				
			||||||
 | 
					5 + (6 + 3 + 6 * 8 * 7 * 2) + 3 * 9 + (8 + 2 + 6 * (4 + 6 * 6 * 8 * 3 * 3)) + 7
 | 
				
			||||||
 | 
					7 + (8 + 8 * (8 + 3 * 3 * 5 + 2)) + 4 + (2 + 3 * 7 * 7 + 6 + 2) * 9
 | 
				
			||||||
 | 
					7 * 3 * 2 + 6 + 7 * 4
 | 
				
			||||||
 | 
					(3 + 4 * 7 + (8 * 3 * 5 * 8 + 5 * 3) * (7 + 4 * 8 + 9)) + 8 + (4 * 3 * 4) * (6 + 4 + 8) + 5 + (9 + 6 + 2 + 4)
 | 
				
			||||||
 | 
					((3 + 9 + 5) * 7 * 2 * (3 + 7)) + 5 + 3
 | 
				
			||||||
 | 
					(4 * 9 + 3 + 9) * 8 * 8 + ((7 * 2 + 6 * 2 * 2) + 8 * 3 * 2 + 2 + 6) * 3 + 7
 | 
				
			||||||
 | 
					(5 * 6 * (8 + 8) + 2) + 6 + 2 * (5 + 4) + 2
 | 
				
			||||||
 | 
					(3 * 8 + 2 + 5 + 6 + 6) + (8 + 7 + 9 * 4 * 4 + (4 * 4 + 4 * 7 + 7)) * 4
 | 
				
			||||||
 | 
					(7 * 7 * 4) * 7 * 3 + 6
 | 
				
			||||||
 | 
					(9 * 3 + 7) * 7 + 4 + 2 * 7 * 3
 | 
				
			||||||
 | 
					6 * 9 + (6 * 6 + 6 * (3 * 9 + 7))
 | 
				
			||||||
 | 
					5 + 6 * 7 + 8 + (3 * 3 + 5 + 3 + 6) + 8
 | 
				
			||||||
 | 
					(6 + 4 + 6 * 9) + (3 * (6 * 3 * 2 + 2 + 9)) + (2 + 9 + 8 * 3 * 8 + 9) + 4 + (4 + 4 + 7)
 | 
				
			||||||
 | 
					4 + 3 * ((6 * 3 * 2) + 3 * 3 + (6 * 4 + 5 * 5 * 7) * 6 + 3)
 | 
				
			||||||
 | 
					2 + (7 * 5 * 6 + 8 + 4 * 8) * 3 * 6 * 3
 | 
				
			||||||
 | 
					9 * (8 * (6 * 7 + 7) * 3 + 9) + 7 * 5 + 6
 | 
				
			||||||
 | 
					((3 * 5) + 2 * 4 * 2) * 7 + (4 + (4 * 2 * 6) + 2) + (3 + 5 * 8 + 6) + (5 + 2 * 6) * 2
 | 
				
			||||||
 | 
					8 + 9 * (4 + 6 + 9 + 2 + 4 + 6) * (9 + 4 * 5) * 2
 | 
				
			||||||
 | 
					(6 + 9 + 4 + 7 * 7 + (6 + 5 + 4 * 6 + 4 * 5)) * 3 + 7 + (2 + 9 + 7 + 8 + 4 * 5)
 | 
				
			||||||
 | 
					(6 * 7 * (7 * 7 + 3 * 9 + 4 * 2) + 8 * 7) * 3 * 2
 | 
				
			||||||
 | 
					(7 * (5 * 2 + 2 + 8 * 4 + 6)) + 7 + 7 * 8 * 7 + 2
 | 
				
			||||||
 | 
					(8 * 6 * (4 + 6 * 8 * 8)) * 8 + 4
 | 
				
			||||||
 | 
					(4 + 7) * (7 * 4 + 4 + 5 + (9 * 9 * 4 * 5) + 8) + 4 + (8 * 9 + 2 + 4 * (2 * 2 + 8) * (5 * 7 * 4 * 6 + 2)) + 6
 | 
				
			||||||
 | 
					4 * (8 * (2 * 5) + 4 * (7 * 2 + 7 + 8) * 7) * 4 * 9 * 7 + ((5 * 4 * 5 + 7 + 9) + 7 * 7 + (6 * 3 + 8 + 7 * 4) + (6 + 4 * 3))
 | 
				
			||||||
 | 
					((3 + 4 + 7 * 8 * 5) * 9 * 6) + 6 + 3
 | 
				
			||||||
 | 
					((7 + 3 * 8) * (3 * 7 + 4 * 3) + 5 + 2 * 9) * 8 + 4 + 2
 | 
				
			||||||
 | 
					((3 + 8 * 8 + 9) * 5 * (5 * 6 + 5 + 7)) + 2 * (6 * 5 + 4 * 6 * 4 * 8) * 9 * 7
 | 
				
			||||||
 | 
					4 + 9 * 8 * ((8 * 6) + 7 * 2 + 2 * 6)
 | 
				
			||||||
 | 
					(2 * 3 * 3) + 4 * 8 * (3 * 5)
 | 
				
			||||||
 | 
					(8 * (5 + 9) + (5 * 6 * 7 * 2) + 4 + 4 + (6 * 9 + 8 + 7 + 2)) * 7 * 2 * 6 + 2 * 2
 | 
				
			||||||
 | 
					(8 * 9 * 7 + 3 * 6) + 5 + 4 * ((9 + 8) + (3 + 7 + 6 * 2) + (7 * 5 * 9 + 5) * 8 * 3) + (6 + 9 * (6 * 8) + 2 + 4 * 4)
 | 
				
			||||||
 | 
					6 + 8 * 9 + (4 * (9 + 2 + 3 + 5 + 3 + 8) + (3 + 7 * 4) + 4 * 7 * (6 + 2))
 | 
				
			||||||
 | 
					2 + 4 * 7 * 5 + (8 * 3) + 6
 | 
				
			||||||
 | 
					9 + 9 + 4 + (4 * 3 + 3 * 2 + (7 + 2 + 9 + 8) + 4)
 | 
				
			||||||
 | 
					3 * 7 * 7 * 9 + 7
 | 
				
			||||||
 | 
					(3 * 2 * 3 * 5 + 6) + 4 * 5 + 8 + 5
 | 
				
			||||||
 | 
					7 * 6 + 7 * 8 + 8 * 3
 | 
				
			||||||
 | 
					(6 + 2 + (6 * 8 * 5) * 6 + 3 * (8 * 5 * 9 * 2 * 7 + 4)) * 3
 | 
				
			||||||
 | 
					(8 + (4 + 2 * 3 + 7 * 5) * 9) * 3 + 9 + 4 + 6
 | 
				
			||||||
 | 
					(9 + 6 + (6 + 3 * 2 + 8 * 5 + 7) + (8 + 8 * 3 + 9 * 4 * 8) + 6 * 2) * (7 + 9 + 5 + 8) * 7 + 4 * ((6 * 5 * 7 + 7 * 9 * 3) + (2 * 4 + 4 * 2))
 | 
				
			||||||
 | 
					(5 * (3 + 5 + 5 * 6) * 7) + 8 + 3 * 4 + 7
 | 
				
			||||||
 | 
					3 * 7 * (9 * 5 + 9 + 7) + 9 * (3 * 4 * 4 * (8 * 4 + 2 + 5)) + (9 * (5 * 3 * 4 * 9) + 5 * 8 + 9 * 5)
 | 
				
			||||||
 | 
					6 + 7 + ((2 * 4 * 5 + 7) * 2 * (8 + 8 * 4 * 3) * 3) * 5 * 6 * 4
 | 
				
			||||||
 | 
					7 * (9 * 6 * 4) + 7 + (8 * 2 * 7 * 4 + 8)
 | 
				
			||||||
 | 
					4 + 7 * (8 * 4 * 2 * (2 + 5 + 9 + 5 * 2 + 5) * (5 * 6 + 2 * 5 + 9) + 3) * 9 * (3 * 6 + 3 * (4 * 4 * 6 + 6 * 2 * 9)) + 8
 | 
				
			||||||
 | 
					2 + 6 * (8 + 9 + 6 + 2 * (9 + 4 * 7 * 5 + 5)) * (7 * 7 * 2 * 9)
 | 
				
			||||||
 | 
					4 * 3 + (8 * (6 * 8 + 8 + 6) + 3) + 5
 | 
				
			||||||
 | 
					(5 + 6) + (2 + 6 + 4 + 8)
 | 
				
			||||||
 | 
					(9 * 5 * 3 + 6 * 6) + (5 * 4)
 | 
				
			||||||
 | 
					3 * 2 + (7 + 7 * 2 + (6 + 6 + 2 * 8 * 4) * 3) * 8
 | 
				
			||||||
 | 
					(4 * 6 + 6) + 4 * 9
 | 
				
			||||||
 | 
					6 + (9 * 3 * 3 * 3) + 8
 | 
				
			||||||
 | 
					(5 + (9 + 6 + 3 + 7 * 3 + 5)) + 5 + (4 * 3 + 4) * 9 * 3
 | 
				
			||||||
 | 
					(6 + 8 * (8 + 3 * 2 + 4 + 5 + 9)) * 7
 | 
				
			||||||
 | 
					6 + 3 * 3 * 5 + ((7 + 4 * 8) + 2 * 7 + 4 * (5 + 8) * 8) + ((5 * 4 * 2) * 4 * 5 + (3 + 4 + 4 * 7 + 7))
 | 
				
			||||||
 | 
					2 * 3 * 3 * 4 * 7 + 2
 | 
				
			||||||
 | 
					6 * (7 + 9 * 9 + (9 * 6) + 5) + 4
 | 
				
			||||||
 | 
					8 * (2 * 7 + 5 * 5 + 8) + 5
 | 
				
			||||||
 | 
					(4 * 5) + (3 + 3 * (5 * 9 + 8 * 2) + 6 * 4 + 4) * 5 + 6
 | 
				
			||||||
 | 
					4 * 9 + (3 + 3 * 2 + (2 + 4 * 4 * 7 * 7 + 5) * 9) * 5 * 3
 | 
				
			||||||
 | 
					(5 * 3 * 6 + 8 + 2 + 4) * 6 * 8 * ((6 * 2 + 2 * 4 + 6 * 2) * 6)
 | 
				
			||||||
 | 
					4 * (5 * 4 * 6 + (7 + 3 * 9 + 3)) + (3 * 4 + 4 + (5 + 7 * 6 * 2 + 7) + 3)
 | 
				
			||||||
 | 
					3 * (5 + 2 * 6 + 8 + 5) + ((8 + 3 * 6 + 8 * 3) * (7 * 7)) + 8 * 4 * 5
 | 
				
			||||||
 | 
					4 + (8 + 6 * (4 + 3)) * 4 + 4
 | 
				
			||||||
 | 
					4 * 3 * (3 + (8 * 9) * (9 * 7 * 4 * 9 * 4 * 8) * (5 + 2 + 2 + 2))
 | 
				
			||||||
 | 
					8 + (2 + 2 * 5 * 3 * (4 * 3 + 7 + 6 + 3)) + 7 * 2 * 5 * 5
 | 
				
			||||||
 | 
					4 * (7 * 9 * (2 * 2 * 5) + 2 + 8 * (6 + 2)) * 4 * 7 * 8
 | 
				
			||||||
 | 
					(2 * 3 * 3 * 2 + (9 * 8 + 5 + 4)) + 7 * 2 * 6
 | 
				
			||||||
 | 
					((6 * 7 + 3 + 3 * 4) * (5 + 9 + 5) + 7 * 6) + 9
 | 
				
			||||||
 | 
					6 * 9 + 8 + 3 + 6 * (6 * 9 + 9 + 3 * 2 * 2)
 | 
				
			||||||
 | 
					(3 * 5 + 2 + 9) * (6 + 9 + (6 * 8 + 2 + 8 * 3 + 8) + (2 + 6 + 6 + 6 * 3)) * ((7 * 5 * 9) * 3 + 9 + 3 + 8 * 2) * 8 * 6 + 8
 | 
				
			||||||
 | 
					3 * (4 + 4 + 6 * (5 + 7) * 8) * (3 * (6 * 7 + 3 + 7 + 7) + 7)
 | 
				
			||||||
 | 
					6 * 8 + 8 * (6 + 9 + 5) * 7 + 7
 | 
				
			||||||
 | 
					3 * (8 + 5 + 8 * 7 * 7 * 8) + 7 + 9 * 4 + 9
 | 
				
			||||||
 | 
					(4 + 5 + 7 + 6) * (9 * (6 * 3 + 9 + 3 + 3) + 6 * 8 + (2 * 8 * 4 + 7 + 5 * 4))
 | 
				
			||||||
 | 
					7 * 2 + 3 * (5 + 9) + 7 * 3
 | 
				
			||||||
 | 
					7 * 8 + 5 + 7 * 4 * ((7 * 4 + 8 * 8) * (6 + 5 * 8 + 7 + 5 * 3))
 | 
				
			||||||
 | 
					(7 * 4 + 3) + (7 + 9 * 7 * 9 * (3 + 2 * 2 * 8 * 2 * 6)) + 5 * 3 + 3 + 3
 | 
				
			||||||
 | 
					5 + 6 * (3 + 6) * (6 + (7 + 2) * 3 + (8 * 6 + 3 + 8 + 5 * 9)) * 7
 | 
				
			||||||
 | 
					(9 + 6 + 8) + 3 + 5 + 2 + (3 * 9 + (8 + 3) + 7 * 3)
 | 
				
			||||||
 | 
					6 + (9 + 7 * 2 * (8 * 9 * 2 + 7 + 6 * 7) * 6)
 | 
				
			||||||
 | 
					2 + 4 * ((7 * 2 + 4) * 8) + 9 * 3 * 3
 | 
				
			||||||
 | 
					3 + ((5 + 4) * 4 * 7 * (3 + 5 * 4 + 3) + 3)
 | 
				
			||||||
 | 
					(7 + 4 * 3 * 6 * 7 * 5) * 2 * 7 + 4
 | 
				
			||||||
 | 
					(7 * (7 * 9) + 8 + 2 * (6 + 9 + 9 * 2 * 5) + 7) * 7 * 7 + 9
 | 
				
			||||||
 | 
					(2 * 5 + 9 * 5) * 3
 | 
				
			||||||
 | 
					3 * 9 + 5 + 7 * 9 + 6
 | 
				
			||||||
 | 
					9 * 3 * ((3 * 6 + 4 + 8) + 9 + 2) * 3
 | 
				
			||||||
 | 
					8 * 3 + 6 * 8 * 2 + 4
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,401 @@
 | 
				
			||||||
 | 
					const std = @import("std");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn main() anyerror!void {
 | 
				
			||||||
 | 
					    var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
 | 
				
			||||||
 | 
					    defer arena.deinit();
 | 
				
			||||||
 | 
					    var gpa = &arena.allocator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var sum : i64 = 0;
 | 
				
			||||||
 | 
					    var f = try std.fs.cwd().openFile("input", .{});
 | 
				
			||||||
 | 
					    var contents = try f.readToEndAlloc(gpa, std.math.maxInt(u32));
 | 
				
			||||||
 | 
					    defer gpa.free(contents);
 | 
				
			||||||
 | 
					    var it = std.mem.tokenize(contents, "\n");
 | 
				
			||||||
 | 
					    while (it.next()) |line| {
 | 
				
			||||||
 | 
					        var tree = try Tree.init(gpa);
 | 
				
			||||||
 | 
					        defer tree.deinit();
 | 
				
			||||||
 | 
					        try tree.parse_line(line);
 | 
				
			||||||
 | 
					        sum += tree.resolve();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    std.log.info("Sum of all operations from input: {}", .{sum});
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Operation = enum {
 | 
				
			||||||
 | 
					    addition,
 | 
				
			||||||
 | 
					    multiplication,
 | 
				
			||||||
 | 
					    unknown,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const TreeValueTag = enum {
 | 
				
			||||||
 | 
					    value,
 | 
				
			||||||
 | 
					    operation,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const TreeValue = union(TreeValueTag) {
 | 
				
			||||||
 | 
					    value: i64,
 | 
				
			||||||
 | 
					    operation: Operation,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Binary tree node
 | 
				
			||||||
 | 
					const TreeElement = struct {
 | 
				
			||||||
 | 
					    parent: ?*TreeElement = null,
 | 
				
			||||||
 | 
					    children: [2]?*TreeElement = [_]?*TreeElement {null, null},
 | 
				
			||||||
 | 
					    value: TreeValue,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn add_child(self: *TreeElement, c: *TreeElement) void {
 | 
				
			||||||
 | 
					        for (self.children) |ch, k| {
 | 
				
			||||||
 | 
					            if (ch == null) {
 | 
				
			||||||
 | 
					                self.children[k] = c;
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // We're not meant to call add_child 3+ times on a TreeElement
 | 
				
			||||||
 | 
					        unreachable;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn get_root_node(self: *TreeElement) *TreeElement {
 | 
				
			||||||
 | 
					        var r = self;
 | 
				
			||||||
 | 
					        while(r.parent) |p| {
 | 
				
			||||||
 | 
					            r = p;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return r;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn print(self: *TreeElement, depth: u64) anyerror!void {
 | 
				
			||||||
 | 
					        var _type = switch(@as(TreeValueTag, self.*.value)) {
 | 
				
			||||||
 | 
					            .value => "value",
 | 
				
			||||||
 | 
					            .operation => "operation"
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        var i : u64 = 0;
 | 
				
			||||||
 | 
					        var stdout = std.io.getStdOut().writer();
 | 
				
			||||||
 | 
					        while (i < depth) : (i += 1) {
 | 
				
			||||||
 | 
					            try stdout.print(" ", .{});
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        try stdout.print("{*} ({}) - {}\n", .{self, _type, self.value});
 | 
				
			||||||
 | 
					        for (self.children) |c, k| {
 | 
				
			||||||
 | 
					            if (c != null) {
 | 
				
			||||||
 | 
					                try TreeElement.print(self.children[k].?, depth + 2);
 | 
				
			||||||
 | 
					                //try self.children[k].?.print(depth + 2);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn resolve(self: *TreeElement) i64 {
 | 
				
			||||||
 | 
					        if (@as(TreeValueTag, self.value) == TreeValueTag.value) {
 | 
				
			||||||
 | 
					            return self.value.value;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else {
 | 
				
			||||||
 | 
					            std.debug.assert(self.value.operation != .unknown);
 | 
				
			||||||
 | 
					            var v : i64 = undefined;
 | 
				
			||||||
 | 
					            var l = self.children[0].?.resolve();
 | 
				
			||||||
 | 
					            var r = self.children[1].?.resolve();
 | 
				
			||||||
 | 
					            if (self.value.operation == .addition) {
 | 
				
			||||||
 | 
					                v = l + r;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else {
 | 
				
			||||||
 | 
					                v = l * r;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return v;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn nearest_unknown_parent(self: *TreeElement) ?*TreeElement {
 | 
				
			||||||
 | 
					        var t : *TreeElement = self;
 | 
				
			||||||
 | 
					        var r : ?*TreeElement = null;
 | 
				
			||||||
 | 
					        while(t.parent) |p| {
 | 
				
			||||||
 | 
					            if (@as(TreeValueTag, p.*.value) == TreeValueTag.value) {
 | 
				
			||||||
 | 
					                    t = p;
 | 
				
			||||||
 | 
					                    continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else {
 | 
				
			||||||
 | 
					                r = p;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return r;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Tree = struct {
 | 
				
			||||||
 | 
					    allocator: *std.mem.Allocator,
 | 
				
			||||||
 | 
					    // we want constant pointers for the TreeElements, but
 | 
				
			||||||
 | 
					    // maybe we can use this object to simplify keeping track
 | 
				
			||||||
 | 
					    // of them
 | 
				
			||||||
 | 
					    children: std.ArrayList(*TreeElement),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn init(a: *std.mem.Allocator) !*Tree {
 | 
				
			||||||
 | 
					        var self = try a.create(Tree);
 | 
				
			||||||
 | 
					        errdefer a.destroy(self);
 | 
				
			||||||
 | 
					        self.* = Tree {
 | 
				
			||||||
 | 
					            .allocator = a,
 | 
				
			||||||
 | 
					            .children = std.ArrayList(*TreeElement).init(a),
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        return self;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn deinit(self: *Tree) void {
 | 
				
			||||||
 | 
					        for (self.children.items) |c| {
 | 
				
			||||||
 | 
					            self.allocator.destroy(c);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        self.children.deinit();
 | 
				
			||||||
 | 
					        self.allocator.destroy(self);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn resolve(self: *Tree) i64 {
 | 
				
			||||||
 | 
					        std.debug.assert(self.children.items.len > 0);
 | 
				
			||||||
 | 
					        var root = self.children.items[0].get_root_node();
 | 
				
			||||||
 | 
					        return root.resolve();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn create_number_node(self: *Tree, buf: []const u8, previous: ?*TreeElement) !*TreeElement {
 | 
				
			||||||
 | 
					        var t = try self.create_node();
 | 
				
			||||||
 | 
					        var last : *TreeElement = undefined;
 | 
				
			||||||
 | 
					        t.* = .{
 | 
				
			||||||
 | 
					            .value = TreeValue { .value = try std.fmt.parseInt(i64, buf, 10) },
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        if (previous) |l| {
 | 
				
			||||||
 | 
					            l.add_child(t);
 | 
				
			||||||
 | 
					            t.parent = l;
 | 
				
			||||||
 | 
					            last = l;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else {
 | 
				
			||||||
 | 
					            last = t;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return last;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn parse_line(self: *Tree, line: []const u8) !void {
 | 
				
			||||||
 | 
					        var last_node : ?*TreeElement = null;
 | 
				
			||||||
 | 
					        var disjointed_nodes = std.ArrayList(*TreeElement).init(self.allocator);
 | 
				
			||||||
 | 
					        defer disjointed_nodes.deinit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var buf = std.mem.zeroes([16]u8);
 | 
				
			||||||
 | 
					        var buf_pos : usize = 0;
 | 
				
			||||||
 | 
					        for (line) |c, k| {
 | 
				
			||||||
 | 
					            if (c == ' ') {
 | 
				
			||||||
 | 
					                // Check buffer length, if not zero add the necessary tree node
 | 
				
			||||||
 | 
					                if (buf_pos == 0) {
 | 
				
			||||||
 | 
					                    continue;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                last_node = try self.create_number_node(buf[0..buf_pos], last_node);
 | 
				
			||||||
 | 
					                // Reset buffer
 | 
				
			||||||
 | 
					                std.mem.set(u8, buf[0..], 0);
 | 
				
			||||||
 | 
					                buf_pos = 0;
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (std.ascii.isDigit(c)) {
 | 
				
			||||||
 | 
					                buf[buf_pos] = c;
 | 
				
			||||||
 | 
					                buf_pos += 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // If we're at the end of the string, we need to run the stuff
 | 
				
			||||||
 | 
					                // for adding a number node
 | 
				
			||||||
 | 
					                if (k == line.len-1) {
 | 
				
			||||||
 | 
					                    last_node = try self.create_number_node(buf[0..buf_pos], last_node);
 | 
				
			||||||
 | 
					                    // Buffer reset unneccesary here
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            switch (c) {
 | 
				
			||||||
 | 
					                '+' => {
 | 
				
			||||||
 | 
					                    std.debug.assert(last_node != null);
 | 
				
			||||||
 | 
					                    // If we have a last node, we should check up for
 | 
				
			||||||
 | 
					                    // an unknown parent. If an unknown parent exists,
 | 
				
			||||||
 | 
					                    // we should set the operation on that node, and
 | 
				
			||||||
 | 
					                    // set that node to the last_node.
 | 
				
			||||||
 | 
					                    // If we ourselves are unknown
 | 
				
			||||||
 | 
					                    if (@as(TreeValueTag, last_node.?.value) == .operation) {
 | 
				
			||||||
 | 
					                        if (last_node.?.value.operation == .unknown) {
 | 
				
			||||||
 | 
					                            last_node.?.value = TreeValue { .operation = .addition };
 | 
				
			||||||
 | 
					                            continue;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else if (last_node.?.nearest_unknown_parent()) |unknown_parent| {
 | 
				
			||||||
 | 
					                        unknown_parent.value = TreeValue { .operation = .addition };
 | 
				
			||||||
 | 
					                        last_node = unknown_parent;
 | 
				
			||||||
 | 
					                        continue;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    // If there is no unknown parent, our last node could
 | 
				
			||||||
 | 
					                    // be an operation node or value node.
 | 
				
			||||||
 | 
					                    // When it's an operation node, this is probably an error?
 | 
				
			||||||
 | 
					                    var root = last_node.?.get_root_node();
 | 
				
			||||||
 | 
					                    var t = try self.create_node();
 | 
				
			||||||
 | 
					                    t.* = .{
 | 
				
			||||||
 | 
					                        .value = TreeValue{ .operation = .addition},
 | 
				
			||||||
 | 
					                    };
 | 
				
			||||||
 | 
					                    root.parent = t;
 | 
				
			||||||
 | 
					                    t.add_child(root);
 | 
				
			||||||
 | 
					                    last_node = t;
 | 
				
			||||||
 | 
					                    continue;
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                '*' => {
 | 
				
			||||||
 | 
					                    std.debug.assert(last_node != null);
 | 
				
			||||||
 | 
					                    // Same as '+'
 | 
				
			||||||
 | 
					                    if (@as(TreeValueTag, last_node.?.value) == .operation) {
 | 
				
			||||||
 | 
					                        if (last_node.?.value.operation == .unknown) {
 | 
				
			||||||
 | 
					                            last_node.?.value = TreeValue { .operation = .multiplication };
 | 
				
			||||||
 | 
					                            continue;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else if (last_node.?.nearest_unknown_parent()) |unknown_parent| {
 | 
				
			||||||
 | 
					                        unknown_parent.value = TreeValue { .operation = .multiplication };
 | 
				
			||||||
 | 
					                        last_node = unknown_parent;
 | 
				
			||||||
 | 
					                        continue;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    var root = last_node.?.get_root_node();
 | 
				
			||||||
 | 
					                    var t = try self.create_node();
 | 
				
			||||||
 | 
					                    t.* = .{
 | 
				
			||||||
 | 
					                        .value = TreeValue{ .operation = .multiplication},
 | 
				
			||||||
 | 
					                    };
 | 
				
			||||||
 | 
					                    root.parent = t;
 | 
				
			||||||
 | 
					                    t.add_child(root);
 | 
				
			||||||
 | 
					                    last_node = t;
 | 
				
			||||||
 | 
					                    continue;
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                '(' => {
 | 
				
			||||||
 | 
					                    // We need to start a new disjointed tree.
 | 
				
			||||||
 | 
					                    // Create an operation node of an unknown type,
 | 
				
			||||||
 | 
					                    // and set that as the parent of the current last node, if
 | 
				
			||||||
 | 
					                    // there is one.
 | 
				
			||||||
 | 
					                    if (last_node) |l| {
 | 
				
			||||||
 | 
					                        try disjointed_nodes.append(l);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else {
 | 
				
			||||||
 | 
					                        var t = try self.create_node();
 | 
				
			||||||
 | 
					                        t.* = .{
 | 
				
			||||||
 | 
					                            .value = TreeValue { .operation = .unknown },
 | 
				
			||||||
 | 
					                        };
 | 
				
			||||||
 | 
					                        if (last_node) |l| {
 | 
				
			||||||
 | 
					                            l.parent = t;
 | 
				
			||||||
 | 
					                            t.add_child(l);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        try disjointed_nodes.append(t);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    last_node = null;
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                ')' => {
 | 
				
			||||||
 | 
					                    std.debug.assert(last_node != null);
 | 
				
			||||||
 | 
					                    // Close out any number that's in progress
 | 
				
			||||||
 | 
					                    if (buf_pos != 0) {
 | 
				
			||||||
 | 
					                        last_node = try self.create_number_node(buf[0..buf_pos], last_node);
 | 
				
			||||||
 | 
					                        // Reset buffer
 | 
				
			||||||
 | 
					                        std.mem.set(u8, buf[0..], 0);
 | 
				
			||||||
 | 
					                        buf_pos = 0;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    var dj = disjointed_nodes.pop();
 | 
				
			||||||
 | 
					                    if (last_node) |l| {
 | 
				
			||||||
 | 
					                        l.parent = dj;
 | 
				
			||||||
 | 
					                        dj.add_child(l);
 | 
				
			||||||
 | 
					                        last_node = dj;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                else => unreachable,
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn create_node(self: *Tree) !*TreeElement {
 | 
				
			||||||
 | 
					        var t = try self.allocator.create(TreeElement);
 | 
				
			||||||
 | 
					        try self.children.append(t);
 | 
				
			||||||
 | 
					        return t;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn print_tree(self: *Tree) !void {
 | 
				
			||||||
 | 
					        var stdout = std.io.getStdOut().writer();
 | 
				
			||||||
 | 
					        if (self.children.items.len == 0) {
 | 
				
			||||||
 | 
					            try stdout.print("Tree {} has no children", .{self});
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        var root = self.children.items[0].get_root_node();
 | 
				
			||||||
 | 
					        try root.print(0);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test "no_parentheses" {
 | 
				
			||||||
 | 
					    var line = "1 + 2 * 3 + 4 * 5 + 6";
 | 
				
			||||||
 | 
					    var tree = try Tree.init(std.testing.allocator);
 | 
				
			||||||
 | 
					    defer tree.deinit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try tree.parse_line(line);
 | 
				
			||||||
 | 
					    std.debug.warn("\n", .{});
 | 
				
			||||||
 | 
					    try tree.print_tree();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var v = tree.resolve();
 | 
				
			||||||
 | 
					    std.testing.expectEqual(@as(i64, 71), v);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test "ex2" {
 | 
				
			||||||
 | 
					    var line = "1 + (2 * 3) + (4 * (5 + 6))";
 | 
				
			||||||
 | 
					    var tree = try Tree.init(std.testing.allocator);
 | 
				
			||||||
 | 
					    defer tree.deinit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try tree.parse_line(line);
 | 
				
			||||||
 | 
					    std.debug.warn("\n", .{});
 | 
				
			||||||
 | 
					    try tree.print_tree();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var v = tree.resolve();
 | 
				
			||||||
 | 
					    std.testing.expectEqual(@as(i64, 51), v);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test "ex3" {
 | 
				
			||||||
 | 
					    var line = "2 * 3 + (4 * 5)";
 | 
				
			||||||
 | 
					    var tree = try Tree.init(std.testing.allocator);
 | 
				
			||||||
 | 
					    defer tree.deinit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try tree.parse_line(line);
 | 
				
			||||||
 | 
					    std.debug.warn("\n", .{});
 | 
				
			||||||
 | 
					    try tree.print_tree();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var v = tree.resolve();
 | 
				
			||||||
 | 
					    std.testing.expectEqual(@as(i64, 26), v);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test "ex4" {
 | 
				
			||||||
 | 
					    var line = "5 + (8 * 3 + 9 + 3 * 4 * 3)";
 | 
				
			||||||
 | 
					    var tree = try Tree.init(std.testing.allocator);
 | 
				
			||||||
 | 
					    defer tree.deinit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try tree.parse_line(line);
 | 
				
			||||||
 | 
					    std.debug.warn("\n", .{});
 | 
				
			||||||
 | 
					    try tree.print_tree();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var v = tree.resolve();
 | 
				
			||||||
 | 
					    std.testing.expectEqual(@as(i64, 437), v);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					test "ex5" {
 | 
				
			||||||
 | 
					    var line = "5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))";
 | 
				
			||||||
 | 
					    var tree = try Tree.init(std.testing.allocator);
 | 
				
			||||||
 | 
					    defer tree.deinit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try tree.parse_line(line);
 | 
				
			||||||
 | 
					    std.debug.warn("\n", .{});
 | 
				
			||||||
 | 
					    try tree.print_tree();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var v = tree.resolve();
 | 
				
			||||||
 | 
					    std.testing.expectEqual(@as(i64, 12240), v);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test "double_open_brackets" {
 | 
				
			||||||
 | 
					    var line = "((2 * 3) + 4) * 2";
 | 
				
			||||||
 | 
					    var tree = try Tree.init(std.testing.allocator);
 | 
				
			||||||
 | 
					    defer tree.deinit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try tree.parse_line(line);
 | 
				
			||||||
 | 
					    std.debug.warn("\n", .{});
 | 
				
			||||||
 | 
					    try tree.print_tree();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var v = tree.resolve();
 | 
				
			||||||
 | 
					    std.testing.expectEqual(@as(i64, 20), v);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test "ex6" {
 | 
				
			||||||
 | 
					    var line = "((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2";
 | 
				
			||||||
 | 
					    var tree = try Tree.init(std.testing.allocator);
 | 
				
			||||||
 | 
					    defer tree.deinit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try tree.parse_line(line);
 | 
				
			||||||
 | 
					    std.debug.warn("\n", .{});
 | 
				
			||||||
 | 
					    try tree.print_tree();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var v = tree.resolve();
 | 
				
			||||||
 | 
					    std.testing.expectEqual(@as(i64, 13632), v);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue