Advent of Code 2025 - Zig

Days 1, 2, and 3

ejri.dev 299e5ff5

+1
.envrc
···
+
use flake .
+3
.gitignore
···
+
/.direnv
+
/zig-out
+
/.zig-cache
+37
build.zig
···
+
const std = @import("std");
+
+
pub fn build(b: *std.Build) void {
+
const target = b.standardTargetOptions(.{});
+
const optimize = b.standardOptimizeOption(.{});
+
+
const exe = b.addExecutable(.{
+
.name = "aoc2025",
+
.root_module = b.createModule(.{
+
.root_source_file = b.path("src/main.zig"),
+
.target = target,
+
.optimize = optimize,
+
}),
+
});
+
+
b.installArtifact(exe);
+
+
const run_step = b.step("run", "Run the app");
+
+
const run_cmd = b.addRunArtifact(exe);
+
run_step.dependOn(&run_cmd.step);
+
+
run_cmd.step.dependOn(b.getInstallStep());
+
+
if (b.args) |args| {
+
run_cmd.addArgs(args);
+
}
+
+
const exe_tests = b.addTest(.{
+
.root_module = exe.root_module,
+
});
+
+
const run_exe_tests = b.addRunArtifact(exe_tests);
+
+
const test_step = b.step("test", "Run tests");
+
test_step.dependOn(&run_exe_tests.step);
+
}
+12
build.zig.zon
···
+
.{
+
.name = .aoc2025,
+
.version = "0.0.0",
+
.fingerprint = 0x52176dd5968cb572,
+
.minimum_zig_version = "0.15.2",
+
.dependencies = .{},
+
.paths = .{
+
"build.zig",
+
"build.zig.zon",
+
"src",
+
},
+
}
+42
flake.lock
···
+
{
+
"nodes": {
+
"nixpkgs": {
+
"locked": {
+
"lastModified": 1764517877,
+
"narHash": "sha256-pp3uT4hHijIC8JUK5MEqeAWmParJrgBVzHLNfJDZxg4=",
+
"owner": "NixOS",
+
"repo": "nixpkgs",
+
"rev": "2d293cbfa5a793b4c50d17c05ef9e385b90edf6c",
+
"type": "github"
+
},
+
"original": {
+
"owner": "NixOS",
+
"ref": "nixos-unstable",
+
"repo": "nixpkgs",
+
"type": "github"
+
}
+
},
+
"root": {
+
"inputs": {
+
"nixpkgs": "nixpkgs",
+
"systems": "systems"
+
}
+
},
+
"systems": {
+
"locked": {
+
"lastModified": 1681028828,
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+
"owner": "nix-systems",
+
"repo": "default",
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+
"type": "github"
+
},
+
"original": {
+
"id": "systems",
+
"type": "indirect"
+
}
+
}
+
},
+
"root": "root",
+
"version": 7
+
}
+31
flake.nix
···
+
{
+
inputs = {
+
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
+
};
+
+
outputs =
+
{
+
systems,
+
nixpkgs,
+
...
+
}:
+
let
+
eachSystem = nixpkgs.lib.genAttrs (import systems);
+
in
+
{
+
devShells = eachSystem (
+
system:
+
let
+
pkgs = nixpkgs.legacyPackages.${system};
+
in
+
{
+
default = nixpkgs.legacyPackages.${system}.mkShell {
+
packages = [
+
pkgs.zig
+
pkgs.zls
+
];
+
};
+
}
+
);
+
};
+
}
+4510
inputs/day1.txt
···
+
R46
+
L12
+
R1
+
R12
+
R41
+
R10
+
L45
+
R32
+
R6
+
R31
+
R46
+
L18
+
L33
+
R19
+
R38
+
L32
+
R39
+
L14
+
L33
+
L35
+
R14
+
R20
+
L49
+
R37
+
L25
+
R26
+
L37
+
L30
+
R25
+
L2
+
R43
+
R16
+
L26
+
R30
+
R9
+
L36
+
R38
+
L37
+
R41
+
R5
+
L39
+
R41
+
R9
+
L43
+
L27
+
R22
+
R28
+
R49
+
L33
+
R83
+
L1
+
R50
+
R50
+
L19
+
R74
+
R28
+
L60
+
L34
+
R84
+
R65
+
L96
+
L95
+
L36
+
R7
+
R43
+
L46
+
R7
+
L22
+
L13
+
R80
+
L72
+
L12
+
L23
+
L60
+
L24
+
R69
+
R55
+
R74
+
L14
+
L69
+
L49
+
L1
+
L41
+
R58
+
L40
+
R51
+
L56
+
R87
+
L70
+
R80
+
R55
+
R35
+
R4
+
L99
+
L5
+
L53
+
R27
+
L97
+
L51
+
L88
+
R69
+
R17
+
R66
+
L81
+
R91
+
R89
+
L89
+
L513
+
R94
+
R19
+
R99
+
L99
+
L82
+
L26
+
R440
+
L32
+
R580
+
R959
+
L930
+
L9
+
R76
+
L6
+
L34
+
L612
+
L24
+
L593
+
L7
+
R38
+
R62
+
L66
+
R45
+
L24
+
R14
+
R731
+
R79
+
R19
+
R190
+
R720
+
L43
+
L26
+
R861
+
L863
+
L15
+
L22
+
R67
+
L67
+
L37
+
L485
+
R252
+
R70
+
R10
+
L93
+
L17
+
R36
+
R4
+
L79
+
L955
+
R156
+
L40
+
L22
+
L311
+
R9
+
L82
+
L97
+
R94
+
L58
+
L55
+
R895
+
R53
+
L73
+
L25
+
R734
+
L62
+
L489
+
L33
+
L55
+
L61
+
R356
+
R81
+
R54
+
R847
+
L866
+
R46
+
L42
+
L66
+
L94
+
R180
+
R89
+
R58
+
R425
+
L62
+
L90
+
R23
+
R76
+
L99
+
R61
+
R39
+
R80
+
L21
+
R41
+
R62
+
R85
+
L471
+
L40
+
L80
+
L40
+
R27
+
R57
+
L36
+
L31
+
L95
+
L285
+
L85
+
R32
+
L37
+
R56
+
L392
+
R594
+
L74
+
L59
+
R911
+
R1
+
R43
+
L18
+
R912
+
R863
+
L20
+
L80
+
R87
+
L596
+
R9
+
L69
+
L64
+
R70
+
R98
+
L38
+
R85
+
L26
+
L6
+
R53
+
R97
+
L81
+
L43
+
L70
+
L86
+
L11
+
L25
+
R41
+
L8
+
R383
+
R35
+
L67
+
L90
+
L78
+
L35
+
L65
+
R94
+
R6
+
R60
+
R40
+
R51
+
L84
+
R38
+
L543
+
L72
+
R88
+
L87
+
R9
+
L37
+
R237
+
L67
+
R301
+
L15
+
R81
+
L58
+
R31
+
R2
+
L1
+
L61
+
R38
+
R349
+
L72
+
R72
+
R578
+
R362
+
L40
+
R81
+
R19
+
R54
+
L48
+
L77
+
R71
+
R73
+
L473
+
R110
+
R90
+
R51
+
L51
+
R53
+
L796
+
R43
+
R99
+
L555
+
R204
+
R52
+
R93
+
R7
+
R55
+
R45
+
L218
+
L82
+
L449
+
L70
+
R50
+
R969
+
L665
+
L28
+
R99
+
R51
+
R43
+
R70
+
L19
+
R45
+
L30
+
R434
+
R62
+
L712
+
L50
+
R190
+
R47
+
L341
+
L196
+
R852
+
L54
+
L65
+
R36
+
L69
+
R83
+
L93
+
L190
+
L807
+
R7
+
L2
+
R2
+
R5
+
R82
+
L26
+
R39
+
R95
+
R85
+
L80
+
R11
+
R89
+
L89
+
L25
+
R14
+
L53
+
L218
+
R70
+
R44
+
L32
+
L786
+
R87
+
L33
+
R21
+
L483
+
L17
+
L81
+
L70
+
L40
+
L611
+
L93
+
L5
+
R49
+
R51
+
L61
+
L57
+
R18
+
R62
+
R53
+
R85
+
R40
+
L17
+
R506
+
L49
+
L243
+
R63
+
L49
+
R96
+
L31
+
R52
+
L80
+
L71
+
L44
+
R27
+
R1
+
L1
+
R89
+
L589
+
R40
+
L85
+
R45
+
L25
+
L91
+
L84
+
R43
+
L55
+
L49
+
R993
+
L38
+
R6
+
L47
+
L1
+
L82
+
R32
+
L2
+
L723
+
R48
+
R94
+
R18
+
L863
+
L826
+
L44
+
L4
+
R7
+
R93
+
R78
+
R30
+
L71
+
L37
+
L651
+
L79
+
L58
+
R576
+
L610
+
R22
+
R77
+
L77
+
R430
+
R99
+
L530
+
R5
+
L4
+
L305
+
L95
+
L863
+
L81
+
R44
+
L836
+
L91
+
R12
+
R15
+
R38
+
R689
+
L86
+
R59
+
L27
+
R63
+
R64
+
R67
+
R33
+
R27
+
R264
+
R130
+
R579
+
L95
+
L459
+
L46
+
R411
+
L21
+
R15
+
R1
+
L806
+
L77
+
R85
+
L3
+
L5
+
L654
+
R54
+
L64
+
L285
+
R73
+
L65
+
R41
+
R29
+
L146
+
R417
+
L62
+
L82
+
R32
+
R374
+
R26
+
L457
+
L23
+
L10
+
R34
+
R68
+
L37
+
R33
+
L15
+
L97
+
L40
+
L58
+
L28
+
L9
+
L27
+
R37
+
R8
+
R711
+
R22
+
L373
+
L27
+
L94
+
R21
+
L35
+
L92
+
R33
+
L85
+
R552
+
R17
+
L65
+
R309
+
R39
+
L903
+
R63
+
R83
+
R41
+
L56
+
R10
+
R62
+
L270
+
L22
+
R157
+
L35
+
L30
+
L11
+
R49
+
L5
+
R967
+
R94
+
R46
+
L740
+
R77
+
R23
+
L12
+
L15
+
R27
+
R4
+
L630
+
L16
+
L26
+
R68
+
L50
+
L556
+
R6
+
R639
+
R630
+
L98
+
L71
+
R21
+
L21
+
R75
+
R53
+
L84
+
R56
+
R86
+
R14
+
R55
+
L57
+
R4
+
R98
+
L30
+
R20
+
R10
+
R98
+
R5
+
R56
+
R207
+
R34
+
L7
+
R7
+
L19
+
R92
+
L242
+
R43
+
L19
+
R3
+
L27
+
L31
+
L16
+
R17
+
L48
+
R92
+
L11
+
R32
+
L12
+
L64
+
R10
+
L86
+
L414
+
R676
+
L76
+
L27
+
R16
+
R12
+
R99
+
L83
+
L7
+
R90
+
L82
+
L5
+
R83
+
R30
+
L26
+
L51
+
L594
+
R719
+
L74
+
L7
+
L493
+
L99
+
L44
+
L68
+
L772
+
R83
+
L36
+
L76
+
L28
+
R89
+
L35
+
L44
+
L350
+
L78
+
L45
+
R77
+
R78
+
L52
+
L73
+
L27
+
L73
+
R34
+
L32
+
R57
+
L86
+
L43
+
L4
+
L28
+
R75
+
L4
+
R98
+
R57
+
L51
+
R55
+
L38
+
R83
+
R65
+
R95
+
R40
+
L89
+
L16
+
L44
+
L41
+
L23
+
L987
+
R65
+
L208
+
R198
+
L55
+
R52
+
R36
+
R40
+
L72
+
R44
+
R48
+
R20
+
L68
+
R2
+
L78
+
R96
+
R62
+
L77
+
L305
+
R146
+
R17
+
L63
+
L3
+
R10
+
R693
+
L78
+
L59
+
R5
+
R32
+
L91
+
L34
+
R25
+
L185
+
R15
+
L78
+
L79
+
R69
+
R58
+
R88
+
R12
+
R94
+
R45
+
L91
+
R47
+
L663
+
R868
+
L759
+
L97
+
R60
+
R64
+
L68
+
R87
+
R13
+
R67
+
R92
+
R1
+
R42
+
L402
+
R3
+
R4
+
R90
+
L13
+
R16
+
R89
+
R6
+
L795
+
L26
+
L91
+
R17
+
R88
+
R12
+
R96
+
L96
+
R81
+
R76
+
R43
+
L84
+
R84
+
R96
+
L50
+
R6
+
L15
+
L911
+
L60
+
L66
+
L832
+
R68
+
L36
+
R60
+
R40
+
L753
+
R73
+
L15
+
L71
+
R484
+
R517
+
R66
+
R476
+
L77
+
R22
+
R78
+
R20
+
R2
+
L722
+
L32
+
R41
+
L328
+
L23
+
R42
+
L97
+
R735
+
L807
+
R81
+
R88
+
R58
+
R179
+
R42
+
L79
+
L68
+
R68
+
R1
+
L42
+
R71
+
R72
+
R95
+
L53
+
R56
+
L48
+
L52
+
R449
+
R51
+
L30
+
L70
+
R25
+
L77
+
R52
+
R65
+
R228
+
L93
+
R64
+
R476
+
R46
+
R59
+
R69
+
R45
+
R21
+
R51
+
L16
+
L224
+
L80
+
R301
+
R88
+
R385
+
L30
+
R22
+
L39
+
L38
+
L75
+
R175
+
L74
+
L486
+
L40
+
L1
+
R1
+
L61
+
L72
+
L367
+
R54
+
R46
+
R89
+
L4
+
R15
+
L63
+
R67
+
R62
+
R34
+
R12
+
R95
+
R93
+
R36
+
L95
+
L3
+
R77
+
R29
+
R71
+
L15
+
L581
+
R53
+
R528
+
L20
+
L80
+
L98
+
R98
+
R55
+
L555
+
L866
+
R51
+
R15
+
R899
+
L399
+
R5
+
L758
+
L28
+
R82
+
L401
+
R51
+
L45
+
L6
+
L14
+
R40
+
L253
+
L473
+
R50
+
R150
+
R11
+
R80
+
R612
+
R833
+
L712
+
L89
+
R30
+
R60
+
R75
+
L4
+
L66
+
R22
+
R68
+
L56
+
L93
+
L11
+
R340
+
L926
+
R212
+
L36
+
R51
+
L959
+
R65
+
R93
+
L37
+
L63
+
R12
+
L62
+
R92
+
R20
+
R38
+
R887
+
R13
+
R92
+
R34
+
R818
+
L196
+
R52
+
R6
+
L6
+
L72
+
R19
+
R94
+
L41
+
R413
+
L67
+
R54
+
R719
+
L41
+
R22
+
R96
+
L796
+
R64
+
L84
+
L22
+
L58
+
R56
+
L314
+
R284
+
L194
+
L85
+
R49
+
L896
+
R42
+
R95
+
R63
+
L305
+
R98
+
L42
+
R49
+
L936
+
L10
+
L47
+
R27
+
R66
+
L48
+
R48
+
R34
+
R45
+
R67
+
R54
+
L98
+
L57
+
L66
+
R21
+
L12
+
L577
+
L74
+
R863
+
R66
+
R98
+
L29
+
R420
+
L255
+
R81
+
R53
+
L34
+
L24
+
R226
+
R21
+
L30
+
L43
+
L429
+
R921
+
L23
+
L19
+
L59
+
R57
+
L3
+
L595
+
R111
+
R68
+
L79
+
R1
+
L703
+
R2
+
L5
+
L40
+
L10
+
L79
+
L66
+
L310
+
L90
+
L66
+
L8
+
L44
+
R6
+
L31
+
R43
+
R14
+
R86
+
R79
+
L438
+
R59
+
R81
+
R83
+
L894
+
L3
+
L99
+
L841
+
R92
+
R623
+
L151
+
R77
+
R32
+
L64
+
L99
+
L8
+
L29
+
L85
+
R97
+
R49
+
L61
+
L56
+
R32
+
L76
+
L36
+
R36
+
R474
+
R26
+
L825
+
R67
+
L49
+
R7
+
R51
+
L12
+
L83
+
L9
+
L77
+
L62
+
R92
+
L73
+
L706
+
R19
+
L55
+
R70
+
L72
+
L83
+
L38
+
L58
+
L804
+
L692
+
R92
+
R54
+
R27
+
L876
+
R607
+
R49
+
L9
+
R38
+
R819
+
R48
+
L57
+
L188
+
R88
+
R26
+
L26
+
L76
+
R72
+
R22
+
R97
+
L22
+
R596
+
L70
+
R81
+
L37
+
L33
+
R26
+
L43
+
R87
+
R67
+
L55
+
R107
+
L73
+
R54
+
R17
+
R81
+
L41
+
L57
+
R49
+
L42
+
R293
+
R85
+
L85
+
R25
+
R832
+
R65
+
L48
+
L99
+
L96
+
L79
+
R93
+
R79
+
R30
+
L183
+
L36
+
L22
+
L29
+
R845
+
L25
+
R637
+
R11
+
R15
+
L43
+
R28
+
R99
+
R28
+
R19
+
R28
+
R326
+
L76
+
L924
+
R61
+
R50
+
L27
+
R16
+
R757
+
R373
+
L30
+
R57
+
R68
+
R72
+
L811
+
R47
+
L12
+
L21
+
L56
+
L541
+
R7
+
L10
+
L211
+
L89
+
R67
+
R25
+
R80
+
R38
+
L17
+
R85
+
R61
+
R95
+
R66
+
L319
+
R61
+
L2
+
R960
+
L89
+
R71
+
R19
+
R20
+
L21
+
L186
+
R47
+
R39
+
R71
+
R14
+
R15
+
L26
+
R84
+
L58
+
L51
+
L49
+
L99
+
L1
+
L65
+
L135
+
R27
+
L827
+
L47
+
L321
+
L32
+
L79
+
L29
+
L34
+
R96
+
L54
+
R63
+
R2
+
L44
+
R181
+
R982
+
L78
+
L6
+
L72
+
R69
+
R603
+
L19
+
R19
+
R41
+
L73
+
R465
+
R20
+
L69
+
R590
+
R93
+
R6
+
R12
+
L9
+
L84
+
L389
+
R97
+
R494
+
L88
+
L106
+
L21
+
L79
+
R11
+
R33
+
L439
+
R612
+
L90
+
R73
+
L675
+
L87
+
R65
+
L36
+
L67
+
R66
+
L96
+
L388
+
L89
+
R6
+
L99
+
R71
+
R982
+
L9
+
L533
+
L111
+
L37
+
R923
+
L72
+
R86
+
R16
+
R33
+
L72
+
L67
+
R90
+
L42
+
R4
+
R735
+
R9
+
R94
+
L4
+
L96
+
L36
+
R31
+
R20
+
R37
+
L452
+
L63
+
L40
+
L88
+
R88
+
L82
+
R92
+
L7
+
R35
+
R27
+
R51
+
R87
+
R45
+
R29
+
L74
+
R311
+
R89
+
L62
+
R94
+
L37
+
L95
+
R545
+
R14
+
R41
+
R82
+
L82
+
L55
+
L345
+
R1
+
L59
+
R238
+
L30
+
R50
+
R275
+
L66
+
R90
+
L56
+
R99
+
L188
+
R829
+
R17
+
L421
+
R21
+
R46
+
R68
+
R13
+
R49
+
R424
+
R93
+
R7
+
R74
+
L974
+
L93
+
R81
+
L94
+
L66
+
L26
+
R40
+
R58
+
R23
+
R18
+
R59
+
R43
+
L46
+
R63
+
L81
+
R21
+
L62
+
R62
+
R697
+
L97
+
R80
+
L766
+
R45
+
L59
+
R291
+
R9
+
L68
+
R58
+
L94
+
R50
+
R718
+
L35
+
L29
+
L73
+
R581
+
L708
+
R88
+
R12
+
R73
+
L77
+
R81
+
R97
+
L542
+
R17
+
R1
+
L94
+
L56
+
L48
+
L57
+
R5
+
L9
+
R20
+
L763
+
L56
+
L24
+
L368
+
L22
+
L40
+
R62
+
R30
+
R70
+
L51
+
R33
+
L82
+
R75
+
L60
+
L70
+
R3
+
L61
+
R613
+
R792
+
R108
+
L37
+
R37
+
L69
+
R34
+
R835
+
R67
+
R33
+
L157
+
L43
+
R816
+
L44
+
L72
+
R58
+
L58
+
R28
+
L3
+
L72
+
L73
+
L80
+
L26
+
L39
+
L81
+
L754
+
L96
+
L85
+
R50
+
L258
+
L27
+
R16
+
L84
+
R12
+
R672
+
L99
+
R230
+
R70
+
R99
+
L83
+
R583
+
L82
+
L14
+
R96
+
R343
+
L577
+
R93
+
R41
+
L894
+
R28
+
R66
+
R76
+
L76
+
L677
+
L23
+
L35
+
L41
+
R98
+
L103
+
L688
+
R18
+
R34
+
R82
+
R46
+
L11
+
L14
+
L5
+
L81
+
R35
+
L53
+
L82
+
L5
+
L44
+
L37
+
L64
+
L17
+
L87
+
L46
+
R876
+
R224
+
L799
+
L63
+
R62
+
L65
+
L65
+
L70
+
R46
+
R24
+
R30
+
L63
+
L24
+
R387
+
L71
+
R71
+
L94
+
L36
+
L70
+
L32
+
L77
+
L762
+
L29
+
L17
+
R225
+
L32
+
R96
+
L72
+
R77
+
R16
+
R7
+
L51
+
R445
+
R6
+
L32
+
L77
+
R9
+
L5
+
L95
+
R20
+
L59
+
L18
+
L32
+
L329
+
L723
+
R41
+
L69
+
L12
+
R922
+
L67
+
L950
+
R476
+
R27
+
R173
+
R83
+
L962
+
L56
+
R59
+
R60
+
R513
+
L97
+
R70
+
R54
+
L24
+
R416
+
R484
+
R57
+
R21
+
R22
+
L57
+
R71
+
R686
+
R93
+
L616
+
R747
+
R81
+
L323
+
R418
+
R32
+
R97
+
R28
+
R460
+
L58
+
R73
+
L26
+
L6
+
R6
+
L21
+
R76
+
L286
+
R629
+
L4
+
L52
+
R10
+
R87
+
R55
+
R55
+
L76
+
L26
+
L35
+
R82
+
R715
+
R85
+
R78
+
L34
+
L27
+
L8
+
R26
+
L35
+
R93
+
R7
+
R48
+
R62
+
R84
+
L94
+
R96
+
L89
+
L29
+
R2
+
L80
+
R933
+
L33
+
L59
+
L77
+
R111
+
R25
+
R76
+
L76
+
R56
+
L37
+
R84
+
R97
+
L25
+
L79
+
R4
+
R92
+
R96
+
L67
+
R42
+
R46
+
R28
+
L37
+
R29
+
L29
+
R34
+
R93
+
R19
+
R84
+
R770
+
L56
+
R689
+
L74
+
L1
+
R42
+
L72
+
R72
+
L609
+
R945
+
R15
+
R49
+
R8
+
R492
+
R58
+
R42
+
R470
+
R34
+
R17
+
R94
+
R5
+
R4
+
R82
+
L85
+
L62
+
R41
+
R37
+
R63
+
L50
+
R17
+
R41
+
R92
+
R995
+
R5
+
L63
+
R63
+
R23
+
L41
+
R55
+
L601
+
L40
+
L14
+
L87
+
L221
+
R24
+
R49
+
R712
+
L359
+
L28
+
R28
+
L844
+
R79
+
R90
+
R75
+
L46
+
L64
+
L14
+
R97
+
L655
+
R90
+
L20
+
R12
+
R79
+
L1
+
L78
+
R72
+
L99
+
L1
+
R602
+
L19
+
R72
+
R8
+
L78
+
L36
+
R87
+
L23
+
R23
+
L408
+
R57
+
R590
+
R66
+
R339
+
R53
+
L5
+
L90
+
L6
+
L76
+
R31
+
R854
+
L13
+
R43
+
L65
+
R122
+
L592
+
L75
+
L61
+
L82
+
L90
+
R86
+
L86
+
R64
+
R97
+
L57
+
R44
+
L88
+
L94
+
R279
+
L10
+
R13
+
R56
+
R12
+
R84
+
R59
+
L75
+
L84
+
R80
+
R20
+
L18
+
L1
+
L267
+
R786
+
L197
+
R597
+
R10
+
L99
+
R89
+
L19
+
L81
+
L877
+
L23
+
L35
+
R82
+
L47
+
R37
+
R63
+
R43
+
R57
+
R38
+
R62
+
R36
+
R52
+
L9
+
R321
+
R92
+
R73
+
R53
+
L37
+
R19
+
R36
+
L36
+
R121
+
R665
+
L621
+
R92
+
L57
+
L52
+
R86
+
R72
+
R12
+
R358
+
L809
+
L6
+
R39
+
R11
+
L52
+
R95
+
R95
+
L12
+
R33
+
R30
+
R53
+
R41
+
R10
+
R96
+
L87
+
L13
+
L33
+
L90
+
L77
+
L89
+
L11
+
R51
+
R43
+
L45
+
L92
+
L857
+
L86
+
L82
+
L29
+
L26
+
R1
+
R507
+
R94
+
L90
+
L89
+
L55
+
L3
+
L62
+
R20
+
R36
+
R164
+
L14
+
R62
+
L42
+
L27
+
L56
+
L50
+
R27
+
L47
+
R32
+
L11
+
R64
+
L738
+
L41
+
R518
+
R67
+
L16
+
L28
+
L451
+
L264
+
R15
+
R57
+
L398
+
L705
+
R481
+
L35
+
L23
+
R58
+
R6
+
R88
+
R79
+
R92
+
L99
+
L94
+
L24
+
L58
+
L20
+
L63
+
L42
+
R95
+
L42
+
R92
+
L999
+
L85
+
R362
+
L23
+
L23
+
R82
+
R41
+
R79
+
R21
+
R720
+
L43
+
L530
+
R8
+
R45
+
L3
+
R3
+
L66
+
L34
+
R727
+
R509
+
R93
+
L29
+
R97
+
R61
+
L58
+
R82
+
R32
+
R29
+
R57
+
L13
+
L87
+
R385
+
L23
+
L408
+
R46
+
R59
+
L59
+
L23
+
R521
+
R46
+
R54
+
R902
+
L634
+
L75
+
R9
+
R655
+
L29
+
L30
+
R93
+
R84
+
R66
+
L540
+
R10
+
R91
+
L910
+
R97
+
R46
+
L33
+
L2
+
L60
+
L93
+
L45
+
R73
+
R27
+
R20
+
L720
+
L90
+
R90
+
L76
+
L655
+
R31
+
L2
+
L498
+
R41
+
R71
+
L12
+
R378
+
R222
+
R37
+
R98
+
R26
+
L61
+
L490
+
L10
+
L66
+
R66
+
L48
+
R82
+
L41
+
L393
+
L52
+
R652
+
R483
+
L83
+
R75
+
L788
+
R38
+
L62
+
R37
+
R56
+
R71
+
L21
+
R19
+
R75
+
R92
+
L17
+
L75
+
R44
+
R356
+
L95
+
L5
+
L140
+
L52
+
R41
+
R43
+
R78
+
L13
+
R64
+
R73
+
L994
+
R861
+
L7
+
R46
+
L842
+
L406
+
L15
+
R863
+
L812
+
R3
+
L26
+
R35
+
L15
+
R15
+
R87
+
L29
+
L54
+
L95
+
L9
+
L5
+
R423
+
R38
+
L18
+
R701
+
R61
+
L20
+
R20
+
R11
+
R61
+
L225
+
R78
+
R17
+
L43
+
L32
+
L64
+
R372
+
L75
+
L41
+
R94
+
R47
+
L11
+
L89
+
L87
+
L59
+
R46
+
R127
+
L676
+
R48
+
R1
+
L268
+
R68
+
L54
+
R76
+
L22
+
L52
+
L53
+
R906
+
R99
+
L82
+
R382
+
R87
+
R13
+
R806
+
R36
+
R78
+
L20
+
L762
+
R62
+
L66
+
L34
+
R49
+
R51
+
L65
+
R65
+
L21
+
L62
+
R32
+
L770
+
R98
+
L723
+
L543
+
R89
+
L47
+
L53
+
L59
+
R12
+
L53
+
R85
+
L945
+
L82
+
R27
+
L58
+
L97
+
L883
+
R53
+
R21
+
L62
+
R526
+
R15
+
L89
+
L30
+
R365
+
R70
+
L16
+
R142
+
L89
+
L88
+
R35
+
R24
+
R776
+
R21
+
L38
+
L83
+
L21
+
R22
+
L60
+
R53
+
L613
+
L81
+
R569
+
L33
+
R64
+
R89
+
L64
+
R64
+
R11
+
R64
+
L64
+
R15
+
R96
+
L35
+
L85
+
R9
+
L29
+
L61
+
L83
+
R36
+
L14
+
L64
+
R15
+
R16
+
L204
+
L408
+
L4
+
R21
+
L11
+
R690
+
L23
+
R423
+
R376
+
L446
+
L45
+
R15
+
L65
+
R7
+
L2
+
L48
+
L92
+
L54
+
R33
+
L53
+
R41
+
R33
+
R2
+
L69
+
R933
+
L66
+
L20
+
R90
+
R20
+
R310
+
L893
+
L56
+
L63
+
L57
+
R57
+
R41
+
R10
+
R61
+
L65
+
R98
+
R25
+
R41
+
L57
+
R82
+
L124
+
R57
+
L5
+
R24
+
R85
+
L24
+
L80
+
R212
+
R28
+
L97
+
L4
+
R12
+
R41
+
L49
+
R795
+
R5
+
L31
+
L8
+
R88
+
R92
+
R16
+
L157
+
L92
+
R71
+
L79
+
L352
+
R45
+
R45
+
L38
+
R83
+
L61
+
R78
+
R64
+
L64
+
L41
+
L59
+
R247
+
R53
+
L80
+
L20
+
L23
+
R89
+
R34
+
L323
+
R723
+
L799
+
R75
+
R50
+
R40
+
R9
+
L807
+
R36
+
R56
+
R40
+
R590
+
R88
+
R9
+
R13
+
L38
+
R38
+
R20
+
R76
+
R2
+
R2
+
R32
+
L38
+
L194
+
R77
+
R14
+
R94
+
L85
+
L8
+
R58
+
R2
+
R25
+
R23
+
R86
+
L32
+
R85
+
L3
+
L91
+
L45
+
R75
+
R27
+
L50
+
R9
+
L61
+
L32
+
R94
+
L762
+
R42
+
L33
+
R47
+
L56
+
L91
+
L9
+
L13
+
L87
+
L88
+
R688
+
L94
+
L36
+
R71
+
R82
+
R77
+
R24
+
L205
+
R15
+
L34
+
R69
+
L90
+
R18
+
L14
+
L92
+
L43
+
R52
+
R66
+
R175
+
L26
+
L15
+
L18
+
R46
+
R66
+
R24
+
L18
+
R91
+
L54
+
L84
+
L2
+
R534
+
R82
+
L185
+
L6
+
L48
+
L28
+
R8
+
R292
+
R88
+
R516
+
R76
+
R132
+
L87
+
R75
+
L22
+
L66
+
R55
+
L67
+
L36
+
L56
+
R92
+
L83
+
R98
+
L24
+
R62
+
R71
+
R44
+
L68
+
R52
+
L48
+
R3
+
R93
+
R68
+
L68
+
R95
+
R69
+
L951
+
L69
+
R56
+
L482
+
R82
+
R34
+
R59
+
R507
+
L47
+
R94
+
R63
+
L49
+
R39
+
R55
+
L444
+
R89
+
R5
+
R95
+
R44
+
L33
+
L11
+
L311
+
L89
+
L63
+
R75
+
L49
+
L88
+
L98
+
L549
+
L533
+
R5
+
L54
+
R94
+
R60
+
R63
+
L563
+
R77
+
R23
+
L44
+
L42
+
R886
+
L51
+
R51
+
R967
+
L67
+
R71
+
R73
+
L548
+
L23
+
L19
+
L61
+
R7
+
R52
+
R31
+
R18
+
L39
+
R77
+
R4
+
R6
+
L81
+
R29
+
L476
+
L979
+
L42
+
L90
+
R90
+
R843
+
R74
+
L83
+
L34
+
L668
+
R50
+
R462
+
R53
+
R3
+
R679
+
R821
+
L238
+
R67
+
R11
+
L30
+
R56
+
L73
+
L410
+
R91
+
L95
+
R21
+
L87
+
L35
+
R90
+
L52
+
L17
+
L27
+
R28
+
R53
+
L33
+
R702
+
R78
+
R614
+
L52
+
R59
+
L6
+
R85
+
R56
+
R58
+
R32
+
L94
+
L82
+
R629
+
L603
+
L96
+
L54
+
R43
+
R11
+
R15
+
R85
+
L35
+
L65
+
L13
+
R74
+
R88
+
L349
+
R83
+
L74
+
L83
+
R74
+
L93
+
R61
+
R83
+
L52
+
L99
+
L83
+
R15
+
R38
+
L759
+
L711
+
R54
+
R46
+
L301
+
L99
+
L32
+
L548
+
R22
+
L39
+
R24
+
L7
+
L58
+
R32
+
L94
+
R309
+
R80
+
L89
+
R47
+
R53
+
L49
+
L51
+
L91
+
L429
+
L80
+
R72
+
L45
+
R935
+
R30
+
R638
+
R372
+
R98
+
L94
+
R74
+
L93
+
L663
+
L73
+
L51
+
R444
+
L799
+
L61
+
R43
+
L35
+
L18
+
R68
+
R25
+
L524
+
L41
+
L2
+
R61
+
R51
+
R55
+
L67
+
L755
+
L945
+
R52
+
L60
+
L42
+
R80
+
R167
+
L119
+
L278
+
R94
+
L92
+
L77
+
R51
+
R84
+
L19
+
R10
+
L51
+
L95
+
L59
+
L46
+
L79
+
L54
+
L34
+
L33
+
R69
+
L175
+
L410
+
R61
+
R11
+
L56
+
L34
+
R878
+
L56
+
R65
+
L43
+
R90
+
R89
+
L89
+
L5
+
L56
+
L7
+
L756
+
R71
+
R53
+
R441
+
R59
+
L114
+
L47
+
R33
+
R72
+
R856
+
R6
+
L320
+
L86
+
L202
+
L62
+
L36
+
R78
+
L78
+
R23
+
L915
+
L91
+
L17
+
L70
+
R11
+
R59
+
L42
+
L51
+
R17
+
L26
+
L798
+
R49
+
R997
+
R87
+
R28
+
L84
+
L10
+
L12
+
L55
+
L753
+
R553
+
R75
+
L69
+
R649
+
L55
+
R79
+
R21
+
L57
+
R41
+
L84
+
R38
+
R18
+
R434
+
L190
+
R41
+
L41
+
L140
+
R75
+
R65
+
R50
+
L50
+
R71
+
R59
+
L619
+
R43
+
R94
+
L43
+
L95
+
R3
+
R248
+
R39
+
R38
+
L33
+
R95
+
L90
+
R20
+
L30
+
R404
+
R96
+
L59
+
L12
+
L629
+
L48
+
L854
+
R97
+
R54
+
L46
+
R97
+
L39
+
L90
+
R6
+
L77
+
R2
+
R11
+
R39
+
L287
+
R735
+
R99
+
R76
+
R925
+
R665
+
R35
+
R150
+
R3
+
R47
+
R17
+
R83
+
R469
+
R34
+
R97
+
R2
+
R98
+
L39
+
L69
+
R8
+
L399
+
L69
+
L44
+
L2
+
L586
+
R21
+
L57
+
L64
+
L28
+
R28
+
L69
+
L89
+
L74
+
R32
+
L283
+
R73
+
L12
+
R22
+
R617
+
R25
+
R558
+
L78
+
R78
+
R34
+
R69
+
L612
+
L91
+
L14
+
R14
+
R91
+
L75
+
R84
+
L35
+
L13
+
R676
+
R182
+
R48
+
L62
+
L85
+
R2
+
R71
+
R79
+
L74
+
L938
+
L32
+
R81
+
R6
+
L19
+
R13
+
L609
+
L26
+
L85
+
L654
+
R74
+
R597
+
L97
+
L721
+
R21
+
L70
+
L87
+
L75
+
R34
+
L32
+
R80
+
R59
+
R91
+
L51
+
L81
+
R10
+
R39
+
R35
+
L74
+
R822
+
R932
+
R875
+
L151
+
R58
+
L914
+
R11
+
L17
+
R69
+
R791
+
L69
+
L94
+
L40
+
R23
+
R93
+
R90
+
L2
+
R59
+
L814
+
L79
+
L13
+
L44
+
L64
+
R57
+
R5
+
R26
+
R1
+
R1
+
R21
+
R89
+
R2
+
L89
+
R32
+
L45
+
L28
+
R64
+
L36
+
L97
+
L30
+
L73
+
L17
+
L883
+
L62
+
R69
+
R119
+
R74
+
L17
+
L83
+
L381
+
R25
+
L44
+
L80
+
L92
+
R64
+
R949
+
L871
+
L827
+
R57
+
L197
+
L4
+
L2
+
R88
+
R59
+
R788
+
L37
+
L95
+
R38
+
R27
+
R35
+
R23
+
L17
+
R194
+
L69
+
L71
+
R26
+
R83
+
R31
+
R18
+
R39
+
L57
+
L65
+
R89
+
R133
+
L57
+
R98
+
L644
+
L50
+
R980
+
R85
+
R962
+
L34
+
L61
+
R77
+
R339
+
R48
+
L81
+
L58
+
L780
+
R19
+
R48
+
R52
+
L240
+
R82
+
R658
+
R28
+
R39
+
R88
+
R45
+
R8
+
L79
+
R21
+
L50
+
R82
+
L82
+
R710
+
R87
+
L397
+
R430
+
L30
+
R44
+
L31
+
R96
+
L27
+
R18
+
L94
+
L676
+
L116
+
R61
+
R50
+
L68
+
R43
+
L1
+
L99
+
R783
+
R209
+
L39
+
L46
+
R36
+
L54
+
R211
+
L46
+
L395
+
R17
+
R393
+
L36
+
L633
+
L29
+
R43
+
L75
+
L939
+
L59
+
L74
+
R148
+
L26
+
R11
+
L45
+
L98
+
L87
+
R18
+
R12
+
R13
+
R87
+
L83
+
R83
+
R49
+
L49
+
L46
+
L24
+
L21
+
L32
+
R90
+
R33
+
R85
+
L85
+
R23
+
R77
+
L34
+
L66
+
L85
+
L15
+
R3
+
L3
+
L454
+
R579
+
L78
+
L47
+
R50
+
L32
+
L18
+
R39
+
R91
+
L40
+
R10
+
R84
+
L35
+
R751
+
R67
+
R64
+
L31
+
R8
+
R8
+
L83
+
L33
+
L50
+
L50
+
R64
+
R36
+
R71
+
L70
+
R56
+
R43
+
L23
+
R523
+
L295
+
L457
+
R52
+
R4
+
R47
+
L51
+
R35
+
R98
+
R87
+
R80
+
R24
+
R50
+
L39
+
L9
+
L71
+
R45
+
R10
+
L24
+
L986
+
R373
+
R99
+
L472
+
L26
+
R26
+
L1
+
R85
+
R22
+
L6
+
L35
+
L65
+
L37
+
L99
+
L664
+
R56
+
R64
+
L20
+
L1
+
L65
+
R68
+
L2
+
L558
+
L42
+
L87
+
R887
+
L18
+
R92
+
R26
+
L24
+
L43
+
L50
+
L29
+
R446
+
R539
+
R61
+
L947
+
R829
+
L806
+
L76
+
R830
+
L91
+
R34
+
L77
+
R86
+
L94
+
R12
+
L446
+
L77
+
L533
+
L39
+
R92
+
L7
+
L74
+
R68
+
R116
+
R88
+
L88
+
L31
+
L20
+
R83
+
L32
+
L71
+
R784
+
L13
+
L9
+
L304
+
L87
+
R665
+
L53
+
L12
+
L76
+
L87
+
R125
+
R33
+
L772
+
R77
+
L89
+
L11
+
L70
+
L30
+
R26
+
L965
+
R39
+
R153
+
R47
+
R648
+
R52
+
R108
+
L71
+
R63
+
L17
+
R17
+
L63
+
L74
+
L16
+
R21
+
L68
+
L93
+
L46
+
R539
+
R60
+
R269
+
L84
+
R37
+
L287
+
L83
+
L31
+
R4
+
L85
+
L82
+
R84
+
L28
+
R136
+
R90
+
L86
+
L945
+
R28
+
R49
+
R79
+
R142
+
R831
+
R24
+
L491
+
L42
+
R1
+
L52
+
R68
+
L2
+
R96
+
R69
+
R28
+
L544
+
R323
+
L76
+
L74
+
R74
+
L76
+
R154
+
L78
+
R2
+
L981
+
L21
+
R46
+
R91
+
L37
+
L92
+
R92
+
R76
+
R88
+
L64
+
R56
+
L82
+
L674
+
R63
+
R87
+
R50
+
L65
+
L8
+
L47
+
L587
+
R11
+
L4
+
R80
+
L80
+
R391
+
R888
+
R23
+
R19
+
L370
+
L760
+
L491
+
L873
+
L72
+
L89
+
R34
+
R23
+
R70
+
R943
+
L36
+
R42
+
L27
+
L62
+
L78
+
L26
+
L11
+
L538
+
R534
+
L34
+
L282
+
R30
+
R33
+
L77
+
R96
+
L853
+
L80
+
R8
+
R37
+
L40
+
L30
+
L142
+
L701
+
L58
+
R53
+
L94
+
R73
+
R127
+
R42
+
L42
+
R329
+
L516
+
L76
+
L154
+
R930
+
L97
+
L16
+
L63
+
R28
+
L365
+
R796
+
L96
+
L81
+
R92
+
R8
+
L1
+
L86
+
R254
+
R51
+
R63
+
L71
+
R54
+
L54
+
L16
+
L107
+
L406
+
R80
+
L71
+
R579
+
R24
+
R188
+
R69
+
L69
+
L92
+
R92
+
R328
+
R72
+
L70
+
R35
+
L43
+
L282
+
R425
+
L7
+
L69
+
R99
+
L36
+
R82
+
R65
+
L488
+
L80
+
L1
+
R63
+
R7
+
L51
+
R651
+
L25
+
R402
+
R23
+
L18
+
R77
+
R41
+
R15
+
L7
+
L632
+
R94
+
R12
+
R18
+
R89
+
R58
+
L595
+
L70
+
L15
+
R86
+
L2
+
L61
+
L190
+
R358
+
L45
+
R75
+
L88
+
L24
+
L76
+
L89
+
L85
+
R72
+
L98
+
L82
+
L89
+
L29
+
R62
+
L42
+
R84
+
L184
+
R1
+
R87
+
R92
+
R261
+
R87
+
R52
+
L44
+
R28
+
L97
+
R80
+
L967
+
R98
+
R18
+
R88
+
L69
+
L87
+
R918
+
R1
+
R33
+
R50
+
L13
+
R21
+
L55
+
L3
+
L390
+
R90
+
L70
+
L95
+
L35
+
L64
+
R64
+
L86
+
R16
+
L73
+
L57
+
L12
+
R12
+
R693
+
L16
+
L82
+
L99
+
L18
+
R779
+
R22
+
L453
+
L14
+
L12
+
L43
+
L257
+
R30
+
R52
+
L82
+
R2
+
R74
+
L92
+
R592
+
L76
+
L80
+
R80
+
R40
+
R60
+
L56
+
R24
+
L86
+
L607
+
R25
+
L56
+
R56
+
L84
+
L52
+
L40
+
L24
+
R51
+
R49
+
R58
+
R94
+
R84
+
L474
+
R57
+
L19
+
L55
+
R921
+
L366
+
R88
+
R5
+
R7
+
L419
+
R23
+
R78
+
L82
+
R81
+
R15
+
R78
+
L74
+
L29
+
R29
+
R35
+
L72
+
L63
+
L378
+
L95
+
L27
+
R69
+
R78
+
R29
+
L58
+
L41
+
R23
+
L265
+
L276
+
L59
+
L41
+
L859
+
R16
+
L97
+
L84
+
L64
+
L78
+
R71
+
L41
+
R55
+
R52
+
L41
+
R90
+
R15
+
R12
+
R22
+
L28
+
R17
+
R75
+
R8
+
R61
+
R47
+
R28
+
L36
+
R89
+
R5
+
R6
+
R79
+
L879
+
L91
+
R62
+
L68
+
R49
+
R45
+
L92
+
R15
+
R58
+
L31
+
R53
+
L45
+
R3
+
L789
+
L9
+
L70
+
L978
+
R5
+
L9
+
R75
+
L77
+
R9
+
L76
+
R87
+
L55
+
L29
+
R358
+
L287
+
L47
+
L27
+
R61
+
R36
+
R478
+
L53
+
R62
+
L54
+
L69
+
R61
+
R53
+
R79
+
R42
+
R46
+
L81
+
R73
+
R27
+
L2
+
R2
+
R69
+
L77
+
R7
+
L73
+
R81
+
L807
+
L8
+
R61
+
L64
+
R11
+
L43
+
R99
+
L56
+
L97
+
L95
+
R92
+
R45
+
R55
+
R84
+
R47
+
L597
+
R66
+
L86
+
R786
+
R12
+
R35
+
L47
+
R59
+
L559
+
L66
+
R19
+
L87
+
L91
+
L275
+
L86
+
R99
+
R902
+
L515
+
L44
+
R314
+
L71
+
R80
+
L231
+
L46
+
R675
+
R23
+
L67
+
R167
+
R123
+
L49
+
L268
+
L410
+
R605
+
L75
+
R43
+
R43
+
R68
+
R20
+
L596
+
R96
+
L53
+
R92
+
R65
+
L4
+
R12
+
L97
+
R85
+
L49
+
L4
+
L947
+
L83
+
R386
+
L83
+
R53
+
L94
+
L151
+
R40
+
L71
+
R47
+
R56
+
R89
+
R11
+
L54
+
R88
+
R66
+
R816
+
L816
+
R7
+
L903
+
L44
+
L60
+
R16
+
R84
+
L23
+
R23
+
R78
+
L574
+
L4
+
R31
+
L62
+
L69
+
L64
+
L97
+
L32
+
R93
+
R22
+
L22
+
L9
+
R870
+
R56
+
L102
+
R85
+
L23
+
R75
+
R221
+
R2
+
R75
+
R146
+
R6
+
R3
+
L5
+
R13
+
L94
+
L51
+
L68
+
R34
+
R46
+
L80
+
L43
+
R43
+
R88
+
R96
+
R74
+
L9
+
R2
+
L218
+
R467
+
R44
+
R36
+
R620
+
L16
+
L50
+
L34
+
L209
+
R9
+
R40
+
L40
+
R817
+
L64
+
L53
+
R659
+
L429
+
R22
+
L33
+
R98
+
R4
+
R36
+
R66
+
L723
+
R83
+
R781
+
R494
+
R91
+
R51
+
R61
+
R86
+
R11
+
L968
+
R3
+
R707
+
R39
+
L39
+
L69
+
R11
+
R85
+
R41
+
R75
+
L89
+
R55
+
R36
+
R83
+
L28
+
L45
+
L55
+
L66
+
R66
+
R12
+
L72
+
L66
+
R13
+
L787
+
L586
+
R1
+
R85
+
R53
+
L996
+
R237
+
L194
+
L90
+
L53
+
R37
+
L438
+
R33
+
R911
+
L94
+
R173
+
L39
+
R84
+
L24
+
L16
+
L84
+
L534
+
R4
+
L70
+
L81
+
L37
+
L30
+
R355
+
R93
+
L21
+
R75
+
L97
+
L27
+
L30
+
L58
+
L96
+
R54
+
R41
+
L734
+
R42
+
L49
+
L53
+
L72
+
L43
+
L32
+
R97
+
L497
+
R21
+
R6
+
L857
+
R569
+
L684
+
L64
+
L896
+
L95
+
R33
+
L77
+
R44
+
R84
+
R38
+
R78
+
R67
+
R33
+
R81
+
R19
+
L364
+
R81
+
R39
+
L56
+
L88
+
L936
+
R734
+
L43
+
L67
+
L675
+
L25
+
L68
+
R53
+
L4
+
R41
+
L22
+
L15
+
L46
+
L15
+
R19
+
L43
+
R56
+
R19
+
L28
+
R553
+
L68
+
L819
+
L50
+
L663
+
L82
+
L58
+
R40
+
R53
+
L24
+
L29
+
R53
+
L53
+
L542
+
R42
+
L76
+
R76
+
L833
+
L82
+
L85
+
L49
+
L851
+
L64
+
L69
+
L67
+
R21
+
R68
+
R21
+
R713
+
L23
+
L56
+
L44
+
R233
+
L54
+
L79
+
L55
+
R83
+
R65
+
L84
+
L37
+
L396
+
R324
+
R77
+
L77
+
L855
+
R9
+
L44
+
R90
+
R73
+
L254
+
R81
+
R80
+
L63
+
L264
+
R71
+
R63
+
R13
+
L86
+
R34
+
R52
+
R20
+
R90
+
L462
+
R561
+
L609
+
R12
+
L57
+
L55
+
R92
+
L61
+
R69
+
R6
+
L6
+
L18
+
L82
+
R23
+
R73
+
R78
+
L74
+
R99
+
L30
+
R88
+
L38
+
L19
+
R1
+
R82
+
R54
+
L737
+
R26
+
R74
+
R92
+
R21
+
R87
+
R5
+
L11
+
R31
+
R875
+
L72
+
L28
+
L11
+
L50
+
R61
+
L166
+
R306
+
L165
+
L69
+
L59
+
L257
+
L182
+
L81
+
R73
+
L54
+
R8
+
L1
+
R21
+
L23
+
L22
+
R71
+
R14
+
L14
+
R9
+
L95
+
R86
+
R65
+
R92
+
R49
+
L48
+
L158
+
L37
+
L63
+
L78
+
R18
+
L940
+
L36
+
R8
+
L72
+
L742
+
L5
+
R990
+
R251
+
R42
+
L30
+
L31
+
R25
+
L32
+
L468
+
R97
+
L23
+
L265
+
L778
+
L52
+
L29
+
R50
+
R8
+
R92
+
L793
+
L4
+
L3
+
L63
+
L30
+
L34
+
L73
+
L58
+
L642
+
R83
+
L62
+
R59
+
R15
+
R5
+
R67
+
L67
+
R55
+
R45
+
L99
+
R46
+
L747
+
R620
+
L20
+
L94
+
L9
+
L797
+
R105
+
R64
+
L69
+
R354
+
R63
+
R84
+
R11
+
R85
+
R99
+
L42
+
L54
+
L47
+
L578
+
L475
+
R21
+
L35
+
R96
+
R85
+
L69
+
L48
+
L40
+
R90
+
R40
+
R254
+
R531
+
L446
+
R960
+
R90
+
R67
+
R839
+
R65
+
R25
+
L68
+
L557
+
R34
+
R936
+
L68
+
R81
+
R96
+
L79
+
L20
+
L80
+
R511
+
R89
+
L84
+
R83
+
L95
+
L10
+
R93
+
R713
+
L9
+
R74
+
L81
+
R716
+
L35
+
L965
+
L66
+
R66
+
R786
+
R14
+
R76
+
L51
+
L25
+
R85
+
R79
+
L64
+
R88
+
L788
+
L78
+
R1
+
L74
+
L549
+
L643
+
R43
+
R42
+
L42
+
L34
+
R34
+
L147
+
L53
+
R3
+
R934
+
L97
+
L740
+
L33
+
R33
+
R30
+
L430
+
R189
+
R3
+
R29
+
R79
+
L609
+
L11
+
R730
+
R290
+
L4
+
L72
+
L28
+
R53
+
R51
+
L64
+
L88
+
R80
+
R72
+
L50
+
L65
+
R81
+
L8
+
R344
+
L2
+
R92
+
R8
+
L562
+
R62
+
R724
+
L65
+
R31
+
R66
+
R58
+
L23
+
R69
+
L147
+
L513
+
L30
+
R39
+
R51
+
R40
+
L997
+
R64
+
R65
+
R68
+
R42
+
R89
+
R32
+
R85
+
R52
+
R90
+
L86
+
L26
+
R356
+
L7
+
L266
+
R17
+
L47
+
L54
+
L26
+
R83
+
L34
+
L95
+
R2
+
L42
+
R75
+
R462
+
L302
+
R67
+
R33
+
R33
+
R8
+
R603
+
L44
+
R51
+
R1
+
R14
+
L966
+
L50
+
L39
+
L11
+
R361
+
R99
+
L288
+
L35
+
R63
+
L30
+
L20
+
L846
+
R747
+
L14
+
R153
+
L64
+
R59
+
R115
+
R46
+
R38
+
L30
+
L88
+
R102
+
L520
+
L48
+
R3
+
R497
+
R93
+
L510
+
R70
+
L52
+
R86
+
R13
+
R43
+
R39
+
R73
+
L623
+
R40
+
R19
+
R11
+
L96
+
R794
+
R188
+
L46
+
L64
+
L87
+
R253
+
R26
+
L70
+
R66
+
L98
+
R24
+
L92
+
R45
+
L73
+
L15
+
L75
+
R44
+
L726
+
L78
+
R1
+
R215
+
R162
+
R71
+
L10
+
R39
+
L65
+
L2
+
L77
+
R90
+
L46
+
L88
+
L9
+
R481
+
R41
+
L25
+
R41
+
L40
+
R99
+
L98
+
L12
+
L66
+
R22
+
L58
+
L88
+
R13
+
L28
+
L103
+
R245
+
R96
+
R65
+
R1
+
R18
+
R85
+
L19
+
R27
+
L34
+
L940
+
L877
+
R51
+
L67
+
L597
+
R58
+
L99
+
L92
+
L601
+
R569
+
L71
+
R767
+
L12
+
R554
+
R27
+
R81
+
R83
+
R59
+
L26
+
L93
+
L52
+
R33
+
L21
+
L662
+
L93
+
L45
+
L77
+
R970
+
L30
+
L63
+
R843
+
R68
+
L11
+
R246
+
L25
+
L90
+
L31
+
L8
+
L718
+
R26
+
L860
+
L22
+
R93
+
R50
+
R39
+
L392
+
R14
+
L87
+
R1
+
R50
+
L86
+
L48
+
L52
+
R77
+
R23
+
R58
+
R42
+
R745
+
L20
+
L25
+
R55
+
R19
+
L12
+
R8
+
L18
+
R28
+
L80
+
L78
+
L81
+
R59
+
R65
+
L82
+
L83
+
L32
+
L31
+
L29
+
R86
+
L94
+
R6
+
L4
+
L80
+
R78
+
R38
+
L96
+
R658
+
R92
+
R308
+
R97
+
R203
+
R30
+
R170
+
R194
+
R60
+
L134
+
L86
+
L21
+
R87
+
R17
+
L57
+
L40
+
R21
+
L24
+
R83
+
R718
+
L52
+
R275
+
L694
+
L86
+
R51
+
R88
+
L9
+
R9
+
L80
+
L20
+
R682
+
R18
+
R236
+
L94
+
L42
+
R82
+
R18
+
L41
+
R41
+
L51
+
L24
+
L25
+
R67
+
L190
+
L31
+
R79
+
L32
+
L93
+
R16
+
R19
+
L135
+
L60
+
L240
+
L102
+
R828
+
R566
+
L36
+
L656
+
R11
+
L62
+
R94
+
R64
+
L21
+
R44
+
R67
+
L97
+
L658
+
L11
+
L162
+
L69
+
L557
+
L30
+
L57
+
R483
+
R605
+
L44
+
R22
+
L622
+
L686
+
L14
+
R97
+
L60
+
L53
+
L52
+
R974
+
L78
+
L680
+
L48
+
L31
+
R731
+
L12
+
L50
+
R62
+
R55
+
L31
+
L99
+
L732
+
L37
+
R616
+
R17
+
R28
+
R53
+
L56
+
R7
+
L13
+
R53
+
L61
+
L29
+
L47
+
R76
+
R55
+
L39
+
R90
+
R81
+
L4
+
L452
+
R18
+
L49
+
L996
+
R94
+
R216
+
L924
+
L90
+
L65
+
L191
+
L7
+
L90
+
L47
+
R23
+
R77
+
L204
+
R69
+
L65
+
L89
+
L54
+
R1
+
R42
+
L66
+
R79
+
R87
+
R705
+
R765
+
L70
+
R62
+
L32
+
L80
+
R91
+
R44
+
L18
+
L176
+
R72
+
L7
+
L48
+
R47
+
L74
+
L34
+
R92
+
R61
+
R96
+
L79
+
R43
+
L73
+
R31
+
L59
+
L28
+
R88
+
L55
+
R51
+
R15
+
R31
+
L5
+
L19
+
R34
+
R29
+
L92
+
R82
+
L90
+
L19
+
L71
+
R12
+
L45
+
L77
+
L65
+
R65
+
R37
+
R33
+
L81
+
R46
+
R38
+
L92
+
R34
+
L26
+
L89
+
L24
+
R22
+
R62
+
R3
+
R94
+
R88
+
L14
+
L14
+
R40
+
R27
+
L35
+
L47
+
L24
+
R3
+
L32
+
R33
+
R4
+
L33
+
R49
+
L47
+
R31
+
R43
+
R11
+
L12
+
L18
+
R15
+
L18
+
L22
+
L43
+
L7
+
L8
+
R6
+
L14
+
L46
+
R49
+
R5
+
R32
+
R38
+
L45
+
R22
+
L1
+
R11
+
L22
+
R49
+
R28
+
R41
+
R12
+
R25
+
R3
+
R22
+
R25
+
L26
+
R45
+
R22
+
L43
+
R9
+
R48
+
R1
+10
inputs/day1test.txt
···
+
L68
+
L30
+
R48
+
L5
+
R60
+
L55
+
L1
+
L99
+
R14
+
L82
+1
inputs/day2.txt
···
+
1061119-1154492,3-23,5180469-5306947,21571-38630,1054-2693,141-277,2818561476-2818661701,21177468-21246892,40-114,782642-950030,376322779-376410708,9936250-10074071,761705028-761825622,77648376-77727819,2954-10213,49589608-49781516,9797966713-9797988709,4353854-4515174,3794829-3861584,7709002-7854055,7877419320-7877566799,953065-1022091,104188-122245,25-39,125490-144195,931903328-931946237,341512-578341,262197-334859,39518-96428,653264-676258,304-842,167882-252124,11748-19561
+1
inputs/day2test.txt
···
+
11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124
+200
inputs/day3.txt
···
+
5966546654588755548354591946657465889859765969657756889447669666979883895847755487857956955568577855
+
4542746645767855433451537445453466457263428353646434434876784556524857444555654342425558296642647865
+
5422251221224555623173322266326732412226343722532361271223275221532113734725256725254212236227222221
+
2324224426223243523532255245222222132222322212312412227525212622115222222422233212314232235522221282
+
3425335254326242335625565223334643464624361863233224152423533244376533232372522332643344363223232343
+
3323233325233222363224231232322322233232322313334122322327222324232232121323535223223323423333234333
+
2322422254231122221232525212231322423522221222282422162223425222232222652214222222232454212324522222
+
4415447714455363455685537565354363676452954665753777666562457835446656284751447993777546734467675755
+
1321372222222122333322332123323422222322252223222122222332122222322232125211331223132323222331122332
+
2242236323222342222112272221213212334114222323242122132214324232233232222263223222222432432223322122
+
8666442549563855473429495687888487174444636934689888567563752469997857776888435384749968858433947468
+
2324313232246343222224342234422321245212242423323411424213432222224342232332324232413423243423233121
+
2683781715168555587665344823228541542218165425258188531728734552264673257425771487447756633636163149
+
1222223226221322222222223222212222322122125422222222324224424422232223225223281322213534227324222222
+
5453552445153545644522534554544354555623563556577572237374753435463833254947544334526638415427343432
+
3342222252323515234222627222212413112534241272422423223227282252222254242224333544215112522943221225
+
7695333726436944223333723215353562935131693232362577267258343264534326334936632133292734373323684433
+
3232532232532213351332221323343312123432222223162223263333325232221224213321122397232432943333323223
+
2112422344232232513332265243223234713344645443375227325332223332723334345263432322512425374152552325
+
2112223322222265325221122221122322344221322222212222623122162212222222622273252415212543236224282226
+
3522223324214143232445522222552232222425242341322325223221441354225135322232144422223312633322314451
+
3553546964645433646854444545654684586664444554557344656544674454866542455564244724584635864456553552
+
2712132121124212228421333223222232222222232124122134222312221222233132212432223222423223222142222242
+
5243944565445115245394423332345325453227656933441445744435386341486555446252345552545553153155414455
+
5772447636633536424366261954729934453835645363432553634652753366355883885321733333657475668366474567
+
2232222423224213542322311322117222322242124212222212222222224222221311222411142122222233222241221222
+
2172222222222212172122543112232222222221222222244522122321235322221222223222222222222222215222232332
+
3232253411243335242423333323332232433322544313233221242223512322333233223626228323312243113212231323
+
4354444244443444424444454477434344455432453523444454343422334434444643644422433443243433445424346344
+
5654443436244425651246555333445346246614244246522445624445547356466332343845372444136585636453343646
+
2261413264273432522132262224336131112623313612262232223531724262612623213426342123442222222261225132
+
4373423443864444237444325623423232442462514423354435433543444556446334342465349435334635744411243244
+
5422222243422233424421322322425222213133122221222322251421223223211124225122323421322631212321522223
+
5963425243163332355331441641433333326335525213433232232231326234615232642432634222826632333323924451
+
2324222222132312333321322225434334223323234141273322325342323213653322322335412222326323331363123524
+
5333224514863533453264233532582633373331444536362422774345533363335783331322425432393454336733374523
+
6664464844646545643544454444254444265353434444542454344566441844433442436253654434566284334643344434
+
1124522111242222322227222224224221222327222122221212125252251222222252223323221232224522122222321222
+
3333442334343434244343225353423354573442454223433432513444343433243231444354135144434435452344224333
+
2262236237137225321226221221236253135467323313327813423513926312252334262272412611566632233361342242
+
5392592455444746485543643423688666547355365445734465633539744375937844375476945332576556454437338526
+
5332322363334313543655443375335343337333334325233352317335354433136535354333533334332542343322331334
+
2628652623641252526739354945246675138456355651565467436384464627556352765562222374242655131322464255
+
4252232443221482452342244241632224852342234454453297576353341322331334334324427462226124222634324484
+
2343524324251432343246435412256145211311154332123623231522124342233124542142122212433532122132314313
+
3121112232232226342222252124122252313222212223221212212112333422222222321222222222214122222324222121
+
4545155455423544422347654224443555454345452455344535453555555454463645445339625143555465443335555441
+
5232112323357534334442634546523833463236681345253623329255242273527442366224324461232145276286752531
+
2222242544156542442622344421254632325542352232224232645322232332516644243263334234224265151224422625
+
3232111512134223231412251249322622243314221121242521732332241112222322122253222213225222212223133223
+
2137456446344823253847425324457735964736765465454553665529426837274845146672425239823723678622542976
+
3232431332441314142343443324323133323333443343343343433343324433333354331423453433543659333221333543
+
3792349222426221232328521274527712222212236287629895275222522285952122145272182426478113226763322359
+
7232242443222323253213237222232437322224232242342222243173422251162244332422472222162238221422741244
+
3866476683744737663346554542536441642942416535726656534356736771635556445574363637258365544336427341
+
6989475847166863753683472846257524673255552682346416464575366742647387437723554233365788818885437874
+
2321312261931222324262621424212222257228613642222221822242471224242627237377383462243392325323532494
+
5526448865492548412356563325695884355822787558444326673637562977684644265493677563655114625574666445
+
5161451222522622612543222524225232224124243232224273553261338242221526212222523422253426472261572522
+
2234435355325343525422555553333545233523355252232535452333233332545354435452244553547542455323522343
+
3323333333433422433342333423532333383333333333332333433324742333234312334333233333332143332333134323
+
6274624676266423372423166657524747572423742244422172765691253246455536287625642573414593394834966487
+
2492462814355722424462725721442241222555686632111535122622554256225338242262642443624528243355562557
+
2222222322222212212224321132322224223222212122212228212217222124222152332222222122222223311233221223
+
3323222322223232324213223224224212233422222232222422222223324223623231332222333433325223323222312331
+
6843444733422331541526232332253335334454344296626313322444235544444523231322534513484224344543484475
+
3322212221222221222222212122522211122223322212248222122272222222352432112212221214423113223222232422
+
2954465557768644246662646996625779626629677338557847267476472846655567884645856765775586665366284525
+
4144434432182345324664773444643333434322737444536337329324733674332444634343443423531335322454345815
+
6337323722422446423612813562356353443433335371325263243235432566633124336463565756725343331423346356
+
1321467267713441124514622232756371645651116755716557177213236767653267434122662432455424215765442689
+
1352422333742333426333422332143314232133234341322343344334254332332342641423633444522255353235273232
+
5666486465666676663165636645468553453634666665636576548584666696678656766576678645665786669576567765
+
2233233223333342323221423332323332323533363213224334327233323212423121524433523322323332223432227355
+
2332125232123221222222322235232522222324222222222621122532222232341315224223224222223224321321645312
+
3433441344344444354461454433313325643331523224462434323465433523434234354333544342233444423344534634
+
3243223424221322133322434313123353432232134322334224232212233332223432223221334142224124223124342352
+
3321233333533313333343384446574333243333232313443354442362343333333423322453443144333345443232233421
+
5143343533454435554332443333343424355444253453433228343324245435433543333333513434535355233233543355
+
5493355975555767457451576475466757564945655386654644844364595655467684446534246847763251655467536853
+
1422232252222244223314342442214222222212432252222222232142212232211211223312222364443282282422334221
+
2422222142221232333321222231222422212422222222223222222322222121172222222122212211231222222222222213
+
4232332233445435543544132223432323134222223341333133443534421423232422323332332424452132322324343334
+
5333333232555553422337547533354245234652554554545433542552354453343555554315333343544743353447462554
+
8223564221936743763777324425733373415526479287562386241766624787522626327237265478331332285223424926
+
4641336733527335563784257333348885332443483535372331648749334829374337737534666733378445369363327372
+
2537623646443355552263644746464533355345433343357535564354351565545523168233536655546436642352434645
+
2152134125311143243351453321232142342155135343143523135515252121341442514331135454354321433512526789
+
3223133234721443432311332332323252343332222223222233153232253313347332433333333423232222333223231151
+
6572776785737735753946665862896387826755845269998549992857936376966753465489955574499145885395549264
+
3141326224334322222322335353443263223322352235242463222246552324423655422152543223252235211334744288
+
3452233433334233364225523335333335373442233553332656432633136366326453533353333343322745334533354633
+
4453358679558455454455655559433243495345474175545835555345754152535555854455455855355336525874354525
+
2112842221322212341241272227521929124282284244723222422218426224222623222222112169257225162226132221
+
6354323563231433446256927333437365936353452553234357451134663245626563744445354132664332645425713545
+
6442322366534344344123323733265342632232323313935373343333424334233341335335412843344433233244422635
+
3225212222124222222422222323121242222142222222222141122322224222244222222132222212223122221132242242
+
3568364547563266273735644938534578738465559383615775337332835678843357435868448872838933847745336847
+
4565754312212444453434544642553633622423452554362372424752734435485236336275344554436555524244136553
+
6436114624354253213444646233634112136433156435465442232252352226442553541464113336226514346645525789
+
1423311231234334321123424413141224312412313434222242221322433114341324432221211441424443323334456789
+
8552543584793363447722232252568544516923637822434363233257335437727438383533435336322465745452365423
+
3363432162212712133312222223241235211324122222143123222222623222222212713521322242233123234351222731
+
3323443314443353143332413122124243322242323332233333443346243522242323424233134133343225532344433462
+
5354454225434314351546442422332222443456242462336354846647332542333222232421344525245464426323223434
+
2152322321342232222421332222224121221212232223222332323522122231234241422112311122412121112242211322
+
2227145451222236213322564255646212212222224421222223421124123231621222267241322225221122912222262111
+
3546344553226433252323357324365336323524624546454333336735923445345366433787754247453744353353342466
+
4266155222212222131222512122232326222252621428124221122222222261222262454111122452231215221233232222
+
8462466626545326243532255335417443361226666625556926634465451545654312563666643444245586556644463534
+
5235123522251251652235324212242113221157622332255332222512221242221152224251262213225242422126223115
+
2542433334352333335225232234333433352123422324243334333552333233335235324452533452133232235722334333
+
2433343532225534434332235134334323333531334413242341124332334333442333133432333443653223333343333423
+
2222132122233242422242233224232221132422362222221224223241332233554222341122112313135225222122123222
+
2313434442451151114122212333221262442222442144223242232243342242432222233434223222423433441232252544
+
2324243623121264363332236122243226332331672232522733513222321335342553233235433332153233212624623323
+
5635333443333733324334334133322442432413253334354213133334333433343233285345933236327212734353221355
+
2222225422242428332142142234222241362412332523331415224112264523322222212452222422424631322314441143
+
4475657476878685867484639857645948655788668536475657788484657753555949667865645465763786488978775655
+
9848447474667345747435326259288747656536755884544764343644543338453359234332463632566275454636438687
+
6432363437755273265623524444533257237334336234321623235433252366433633255655225756312564253446457442
+
5546856627678773727172469177764592642687586647529895336678557676388743572936655854414676423547775383
+
7162633493716443455872541433245413484313733452444734444443735433449334449544355743436223666644343321
+
2572563533546546653354454645455555474464655365344755454455837555674442464654441346646546564663523445
+
1224322522324224633241324433731212125512121249343714322251226522232461225334521312243332243623222352
+
1352322131221222222232723221222122222232122222223233222222321311234122222122222224222112222223122221
+
3252231432252243451335351534337232434323534236222243234234334323432243435242334347434385222134223375
+
7443335445434424253427657435264354445443444244432347543425337444525314336543354843158465439435434316
+
3222982682222612772861233572624864321221122224223321224722213122286123222313323327132224238422431222
+
3583331732927282422534313323233223335233653324539244123233272535833341233333569473249435233422612333
+
3222322333222112233233221223222122331223121232131233323333323222221332322222222221213221222212214212
+
6353363846364648646668363433543348755462736564266654664453642653554245665434426463444435537354765558
+
3423333221233336431243133223632523221433632333342223243323223324343333432132323344332426313344332342
+
3223322333221132513222232222362312227222735233422222322233233223222223223223232226225233323223223122
+
6553646555554651555648765744544555364165855566558717565344555444356452556585231755555456564479565439
+
4243222422224233113222422222112424162122224121242342222322322123212311442223212214322221222322241324
+
4233211543232214522345423233436232542235243214452245225123332423232243456321244122322222312122323322
+
3345533464734436856864333868255322554635832443937355244434533849338945443344624545452467334964497233
+
3173224222412521239312233219224352422712312214135124322721322122127132219242229418225222714223142229
+
3162432244234745352223325184245322847342714422522321223235843322224286225632528466615689683136253244
+
4235443335446233232464634343733642242443444434214422633443441431321563412352243134322344333553324343
+
3823325334231322342312235313542113322854675333642436345333333232531131233232626343323233333533333532
+
2236143222222523311264442153341623316366132121222421125234232535222325263212221322122122365172122231
+
2434224457335331163122536122434244143142522464253442243472644243571345241145436593432425324332423365
+
2393223335343332233333237234333233212345383133223233323323332235323222321372335352133233838233239423
+
3322854732234455221443232154445442444225411441433343434243234425445345255152343245414242344253335552
+
2232332342424222322222234422361112222222422322252432413233223222242322322211222233222233212312221242
+
4563322912162552292222214622227125363121673551222224137354217832622292422242916312432222811222724552
+
4635352525532364322423332412333463553534533523434455333433353352542335433533443332234247335523433493
+
2294444542133424422422355444452438347432242333213614242435223332422131212345324224323233443833544331
+
4174736724576257235447954142252828447241324247253444226752582818365231137562835462123244353224243232
+
3242227322323232212623222222222132223113336371123243334233232234212122213313232218725322223224232254
+
2133441334322223442352317742724334343433121235333423243331331125224343533332233324231327438334334523
+
3221123111122234331232432532132222223232224322322223223221313422232631312444241232222322311123342222
+
3272222123233224222312222232222212223352121252232221221223423322212222322122324612222222522232442222
+
2311225212524174125221222193462121825412221213612462225273423252722222221272622111324238221191232262
+
2237623172221535335987425563349754836432546631871455984471335427235235532464413722536613447344235432
+
2262423412535112233123337922362144535322434433123322223249332324323423423333524438823224332544254321
+
2222222212222222222322122122222222222232211222231222323122221223222222122222222152112121121122222222
+
1323248243324353637234224642171243534222442341434429323432221228446322212322143373243342291216636342
+
7987579256589679753389663399597634538395537994734689877374477535869584689979667957875566992768596673
+
2652275416222222324126622163122244262281372524225672432226252743252665552521225722236347352467233452
+
2212231222223222432225332112224323141232232222223323221213211222222222222422221222222376226122232215
+
2224222253352211132221241422371214221343729211422222112223222224123222222122112122422233221132324251
+
9344534654223744453425555324553554447523553756365549453243434443352524444554434534342534595552364353
+
4322533534436362432354233246542455564333253354335433326656617455342452366323366355535416243634743223
+
4676645447577676445654544665577775772363446565564575486544444744446745576456554457544455464445455755
+
3322212242324222312533322332313323431323322253323213382253316323222231723232142322223133321222212123
+
2572222122232422221792522242122325212232442424222442222221454523341222122231222227322224327122222623
+
7334447633626359444442545837435676143333574646264533755445555625464676753765324645434643544454464766
+
2322222132232334332233233463313323322322333323334226323333123323233332333333442361223212222322343722
+
2242336244446434444435444534143433444374746464444543443433374435345543347444464474344454444473444434
+
3123322313262231332225222113322234342221233722212322323414433331233442223262212313373332332224234252
+
9352412214242122232222432123422662232322321134242342223323222212232226233212222233121122322222332242
+
4736431626714323842651212533433573342355532543222331333554366272447555533135242642244334645355545545
+
2472223225223243422342419362233325227851222222225242452223222164223324321552243322112524411453122232
+
2252322413521221142342133233231422232424122551252542322222224421121733213592228612333464563262324334
+
2523553215362323542323338155821424424443834352254226529566534556453564333642524272924632627535323515
+
6554345479377685374765446735558667354545646558567463863444555854579473554268452646777677778774564657
+
3232235235333537433236234445553345231333333433332333373152532243352338335343431584424323433351523433
+
1521522241532122522222222521222222222342322111233253322221222522322222232221352231233213214122121251
+
2444223414441453424247563364834454154582463338424436545334355334254634244444523444344844443264385333
+
8484934248686434424347878474937455235484656654643299454444433676573457675578544556428594354533924344
+
2264221112146221123225222222222121212222221213116212225222222122222122251132222165224522228222222222
+
4335444334342436244432332354332753314422524434765543359335522243353625433234235233622335433186522222
+
6774525555567545566345585775465752455561583545555448595552556353555655555455555445653264634545452196
+
8767574132734963847872834724176579773753887822475446995355475274834842122652346537485587595572495594
+
4221222343422545312522321222431243542321254223245125252435324613262223723223252121232422262256166262
+
6334632424242442512232423442441312715342234423462344432423332224422344342234222662314423413134235224
+
2323342323322333323213322223333323111273141111113332435424423223533243132332333432233324232333213114
+
2346135221242136352126332345432632222325132632265232622213272522321222242252345833222539235313123122
+
3383444684433314435473444453291443543434443434868443824343535464233463744433834743433443439814453584
+
2352254744214432641473842923244324222273123342344423232423232322344222331834342253932222622235423241
+
1332314211242422222221322222322112222222221222323223231422223222313212322314222212123221323323312112
+
2232344422342333212212421231222132123222221227224233332232222235222212332452212322232233142534213421
+
6445776542465468544242457727683445544443962648646641476446476776636454444646664864745529576337624474
+
7722122222234222472214222222212422223812223742415321422228423223331323222242346242622222284222221121
+
4531123234334233233248633323343142333332444234332323234434414148453332244343442223152333442433345823
+
2221316224345532222214424621334432622232324326226223222222212342223244232513433522145226533232122623
+
9454527354735656537472876857246747554763445832354347645346455852255465346827664554778667358636366668
+4
inputs/day3test.txt
···
+
987654321111111
+
811111111111119
+
234234234234278
+
818181911112111
+35
src/day1.zig
···
+
const std = @import("std");
+
+
pub fn run(input: []u8) !void {
+
var lines = std.mem.tokenizeScalar(u8, input, '\n');
+
+
var dial: u8 = 50;
+
var zeroes_p1: u64 = 0;
+
var zeroes_p2: u64 = 0;
+
while (lines.next()) |line| {
+
const direction: i2 = switch (line[0]) {
+
'L' => -1,
+
'R' => 1,
+
else => unreachable,
+
};
+
const turns = try std.fmt.parseInt(u16, line[1..], 10);
+
+
const new_rotation: i17 = dial + @as(i17, direction) * turns;
+
+
var zeroes_clicked: u64 = @intCast(@abs(@divTrunc(new_rotation, 100)));
+
if (dial != 0 and new_rotation <= 0) {
+
zeroes_clicked += 1;
+
}
+
+
dial = @intCast(@mod(new_rotation, 100));
+
+
if (dial == 0) {
+
zeroes_p1 += 1;
+
}
+
+
zeroes_p2 += zeroes_clicked;
+
}
+
+
std.debug.print("Answer P1: {d}\n", .{zeroes_p1});
+
std.debug.print("Answer P2: {d}\n", .{zeroes_p2});
+
}
+53
src/day2.zig
···
+
const std = @import("std");
+
+
pub fn run(input: []u8) !void {
+
var ranges = std.mem.tokenizeScalar(u8, std.mem.trimEnd(u8, input, "\n"), ',');
+
+
var answer1: u64 = 0;
+
var answer2: u64 = 0;
+
while (ranges.next()) |range_str| {
+
var range = std.mem.tokenizeScalar(u8, range_str, '-');
+
+
const low = try std.fmt.parseInt(u64, range.next().?, 10);
+
const high = try std.fmt.parseInt(u64, range.next().?, 10);
+
+
var buf: [32]u8 = undefined;
+
for (low..high + 1) |num| {
+
const num_str = try std.fmt.bufPrint(&buf, "{d}", .{num});
+
+
const middle = num_str.len / 2;
+
+
if (std.mem.eql(u8, num_str[0..middle], num_str[middle..])) {
+
answer1 += num;
+
answer2 += num;
+
continue;
+
}
+
+
for (1..middle + 1) |chunk_len| {
+
const repeating_str = num_str[0..chunk_len];
+
+
var is_repeating = true;
+
var i = chunk_len;
+
while (i + chunk_len <= num_str.len) : (i += chunk_len) {
+
if (num_str.len % chunk_len != 0) {
+
is_repeating = false;
+
break;
+
}
+
+
if (!std.mem.eql(u8, repeating_str, num_str[i .. i + chunk_len])) {
+
is_repeating = false;
+
break;
+
}
+
}
+
+
if (is_repeating) {
+
answer2 += num;
+
break;
+
}
+
}
+
}
+
}
+
+
std.debug.print("Answer P1: {d}\n", .{answer1});
+
std.debug.print("Answer P2: {d}\n", .{answer2});
+
}
+32
src/day3.zig
···
+
const std = @import("std");
+
+
pub fn run(input: []u8) !void {
+
var lines = std.mem.tokenizeScalar(u8, input, '\n');
+
+
var answer1: u64 = 0;
+
var answer2: u64 = 0;
+
while (lines.next()) |line| {
+
answer1 += try calculateJoltage(line, 2);
+
answer2 += try calculateJoltage(line, 12);
+
}
+
+
std.debug.print("Answer P1: {d}\n", .{answer1});
+
std.debug.print("Answer P2: {d}\n", .{answer2});
+
}
+
+
fn calculateJoltage(line: []const u8, num_digits: usize) !u64 {
+
var index: usize = 0;
+
var value: usize = 0;
+
var total: usize = 0;
+
for (0..num_digits) |i| {
+
const start = if (i == 0) 0 else index + 1;
+
const end = line.len - (num_digits - i - 1);
+
+
index = std.mem.indexOfMax(u8, line[start..end]) + start;
+
value = try std.fmt.charToDigit(line[index], 10);
+
+
total += value * std.math.pow(usize, 10, num_digits - i - 1);
+
}
+
+
return total;
+
}
+40
src/main.zig
···
+
const std = @import("std");
+
const day1 = @import("./day1.zig");
+
const day2 = @import("./day2.zig");
+
const day3 = @import("./day3.zig");
+
+
pub fn main() !void {
+
var args = std.process.args();
+
_ = args.skip();
+
+
const day_str = args.next() orelse {
+
std.debug.print("Needs day arg\n", .{});
+
std.process.exit(0);
+
};
+
+
const test_str = args.next() orelse "";
+
+
var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init;
+
const allocator = gpa.allocator();
+
+
const day = try std.fmt.parseInt(u4, day_str, 10);
+
+
const input_path = try std.fmt.allocPrint(allocator, "inputs/day{d}{s}.txt", .{ day, test_str });
+
defer allocator.free(input_path);
+
+
const input_file = try std.fs.cwd().openFile(input_path, .{});
+
defer input_file.close();
+
+
var buf: [4096]u8 = undefined;
+
+
var reader = input_file.reader(&buf);
+
const input_content = try reader.interface.allocRemaining(allocator, .unlimited);
+
defer allocator.free(input_content);
+
+
switch (day) {
+
1 => try day1.run(input_content),
+
2 => try day2.run(input_content),
+
3 => try day3.run(input_content),
+
else => {},
+
}
+
}