advent of code 2025 in ts and nix

feat: add solution for day 1 in nix

dunkirk.sh 322293f2 fbfecad0

verified
Changed files
+4480
nix
+5
README.md
···
This contains my solutions to advent of code 2025 in mostly `ts` or `nix` depending on how lazy I'm feeling that day.
The main repo is [the tangled repo](https://tangled.org/dunkirk.sh/aoc-2025) and the github is just a mirror.
<p align="center">
···
This contains my solutions to advent of code 2025 in mostly `ts` or `nix` depending on how lazy I'm feeling that day.
+
```bash
+
bun run index.ts
+
nix-instantiate --eval --strict solution.nix
+
```
+
The main repo is [the tangled repo](https://tangled.org/dunkirk.sh/aoc-2025) and the github is just a mirror.
<p align="center">
+4424
nix/01/input.txt
···
···
+
R45
+
L42
+
R24
+
L11
+
R31
+
L19
+
R13
+
L30
+
R8
+
R21
+
L13
+
L23
+
R10
+
R19
+
L12
+
R30
+
L15
+
R32
+
R18
+
R22
+
L35
+
R20
+
L11
+
L47
+
L36
+
L44
+
L6
+
R34
+
L46
+
L38
+
L45
+
L7
+
L41
+
R22
+
L30
+
R44
+
R30
+
L15
+
L22
+
R43
+
R48
+
L17
+
L22
+
R35
+
L42
+
R7
+
R31
+
L38
+
R15
+
L39
+
R12
+
L20
+
R64
+
L62
+
L59
+
R20
+
R12
+
R73
+
R54
+
L36
+
L64
+
L51
+
L49
+
R40
+
L90
+
R50
+
R59
+
R41
+
R82
+
R36
+
L94
+
R59
+
R17
+
L42
+
R42
+
R58
+
R42
+
L6
+
L40
+
L55
+
L17
+
L9
+
L97
+
L76
+
R78
+
R22
+
R19
+
L70
+
R59
+
L21
+
L92
+
L35
+
L33
+
L91
+
L59
+
L77
+
L77
+
L71
+
L21
+
R78
+
L72
+
R963
+
R77
+
L2
+
L412
+
L661
+
R397
+
R11
+
R835
+
R55
+
L19
+
L93
+
R88
+
R544
+
R21
+
L39
+
L88
+
L91
+
R777
+
R72
+
R28
+
L127
+
L73
+
L72
+
R72
+
L5
+
R3
+
R2
+
R86
+
R966
+
R48
+
R56
+
R56
+
R88
+
L8
+
L892
+
L70
+
R51
+
L49
+
L33
+
R98
+
L97
+
L37
+
L96
+
L62
+
R15
+
L120
+
L299
+
R77
+
L78
+
L4
+
R13
+
R23
+
L32
+
R94
+
L28
+
L979
+
R34
+
L4
+
L893
+
R51
+
R59
+
L534
+
R385
+
R34
+
L3
+
R984
+
L690
+
R837
+
R53
+
R40
+
L40
+
R52
+
L77
+
L75
+
L99
+
R79
+
L292
+
L94
+
R6
+
L317
+
L946
+
R63
+
L620
+
R20
+
R2
+
L2
+
L17
+
L83
+
R16
+
R21
+
L1
+
R64
+
L98
+
R98
+
R84
+
L84
+
R159
+
L22
+
L701
+
R8
+
L49
+
L77
+
L18
+
R74
+
R918
+
L92
+
R95
+
L95
+
R61
+
L1
+
L249
+
L81
+
L9
+
L77
+
L40
+
R90
+
R75
+
L58
+
L11
+
L46
+
L28
+
R74
+
R35
+
R65
+
L50
+
L50
+
R22
+
L25
+
R74
+
R628
+
L97
+
R8
+
R890
+
L8
+
R979
+
R29
+
L97
+
R5
+
R49
+
L357
+
R73
+
L86
+
L60
+
R73
+
L83
+
L17
+
L90
+
L95
+
R843
+
R42
+
L96
+
L82
+
R90
+
L12
+
L78
+
R78
+
R78
+
L767
+
R269
+
L703
+
L77
+
L45
+
L90
+
L156
+
L9
+
L46
+
L54
+
L406
+
L27
+
R33
+
R87
+
L87
+
L510
+
L52
+
R74
+
R88
+
L18
+
L33
+
R51
+
R511
+
R40
+
R47
+
L42
+
R60
+
R5
+
R79
+
L56
+
L91
+
L53
+
L59
+
L150
+
L91
+
R15
+
L68
+
R286
+
R60
+
L472
+
R67
+
R12
+
R39
+
R61
+
R69
+
L69
+
L63
+
R897
+
R166
+
L70
+
L30
+
R169
+
L69
+
L991
+
L9
+
R13
+
R81
+
R504
+
R31
+
L53
+
R98
+
L374
+
R417
+
L17
+
L23
+
R23
+
R23
+
L94
+
L21
+
R92
+
R570
+
L954
+
R84
+
R51
+
R46
+
L97
+
R760
+
R40
+
L49
+
R49
+
L75
+
R87
+
R85
+
R84
+
L81
+
R45
+
R155
+
L23
+
L40
+
R28
+
L8
+
L966
+
L26
+
R35
+
R25
+
R54
+
R21
+
L212
+
L21
+
R33
+
R581
+
L34
+
R53
+
R42
+
L78
+
L623
+
R59
+
L43
+
L57
+
L96
+
L78
+
L64
+
R38
+
R45
+
L41
+
R96
+
L118
+
L71
+
L18
+
R35
+
R63
+
L119
+
L81
+
L791
+
R88
+
L277
+
L957
+
R72
+
R74
+
R424
+
R76
+
L47
+
L98
+
R45
+
R49
+
R851
+
R90
+
R14
+
R19
+
R99
+
R2
+
R762
+
L68
+
L53
+
L7
+
L211
+
L47
+
L78
+
R573
+
L23
+
L90
+
R11
+
R34
+
R28
+
R29
+
L84
+
L90
+
L14
+
L96
+
L96
+
L4
+
R21
+
R679
+
L65
+
L703
+
L383
+
R75
+
R144
+
L68
+
R75
+
L96
+
L34
+
R13
+
L489
+
L58
+
R99
+
L948
+
R402
+
R36
+
L45
+
L52
+
R97
+
L13
+
L399
+
R61
+
L80
+
L16
+
R47
+
L30
+
R293
+
R711
+
L739
+
R9
+
L26
+
L15
+
L91
+
L6
+
R94
+
R64
+
R36
+
R68
+
R317
+
R64
+
R51
+
R79
+
R129
+
R20
+
L13
+
L315
+
L807
+
R25
+
L6
+
R18
+
L91
+
R92
+
L63
+
R32
+
L74
+
L83
+
R37
+
L685
+
L95
+
R75
+
R45
+
L18
+
L2
+
L28
+
R94
+
R34
+
R74
+
R116
+
L369
+
L60
+
R41
+
R36
+
L38
+
L82
+
R572
+
L59
+
L31
+
L78
+
R72
+
L94
+
R64
+
L95
+
R175
+
L2
+
L96
+
L583
+
R637
+
R53
+
L31
+
R767
+
L385
+
R32
+
R88
+
R88
+
L12
+
L81
+
R57
+
R93
+
R36
+
L46
+
L24
+
L35
+
R96
+
L414
+
R197
+
L74
+
R695
+
R80
+
L821
+
L21
+
L38
+
R988
+
L88
+
L80
+
R80
+
L69
+
L31
+
L56
+
L14
+
R70
+
R8
+
L29
+
R34
+
L13
+
R40
+
L69
+
R947
+
R89
+
R362
+
R72
+
L41
+
L10
+
R19
+
R136
+
L703
+
R64
+
R54
+
L988
+
L57
+
R85
+
R45
+
L98
+
R96
+
L43
+
R80
+
R20
+
L6
+
L22
+
R328
+
L229
+
R29
+
R52
+
R30
+
R19
+
L76
+
L204
+
L21
+
L76
+
L20
+
L19
+
R965
+
R70
+
L34
+
L21
+
L65
+
R76
+
R24
+
R42
+
L823
+
R9
+
L22
+
L6
+
L96
+
R896
+
L75
+
L25
+
L87
+
L61
+
R48
+
L66
+
L10
+
L97
+
R19
+
R11
+
L57
+
R71
+
R92
+
R73
+
L74
+
R5
+
R76
+
L43
+
L34
+
L27
+
R26
+
L24
+
R47
+
R65
+
R47
+
L23
+
L367
+
R29
+
R17
+
L78
+
L533
+
L45
+
R71
+
L171
+
R56
+
R43
+
L616
+
R17
+
R40
+
R860
+
R63
+
R50
+
L6
+
L43
+
L64
+
L53
+
R56
+
L71
+
R80
+
R410
+
L34
+
L75
+
L62
+
R49
+
L71
+
L81
+
R71
+
R85
+
R696
+
L92
+
L40
+
L851
+
R83
+
L22
+
L36
+
R14
+
L56
+
L20
+
L17
+
L974
+
R377
+
L90
+
R16
+
R971
+
R37
+
R10
+
R5
+
R59
+
R56
+
R70
+
L28
+
R379
+
R49
+
R92
+
R608
+
L724
+
R39
+
R30
+
L696
+
R42
+
R9
+
L25
+
R13
+
L59
+
R71
+
L165
+
R80
+
L1
+
R986
+
R19
+
L356
+
R98
+
R94
+
R345
+
R49
+
R51
+
L66
+
L77
+
R730
+
R13
+
R57
+
L57
+
R62
+
L720
+
L53
+
L14
+
R25
+
L97
+
R97
+
L89
+
L45
+
R734
+
R73
+
L31
+
L34
+
R92
+
L81
+
R7
+
R874
+
L53
+
R522
+
R7
+
R124
+
L55
+
R3
+
R727
+
R25
+
R85
+
L49
+
L54
+
R18
+
R89
+
L64
+
L25
+
L49
+
L51
+
L78
+
L150
+
L29
+
L53
+
R82
+
R61
+
R67
+
R61
+
L43
+
R740
+
L1
+
R43
+
R75
+
L28
+
R53
+
L8
+
R908
+
R26
+
R174
+
R145
+
L45
+
L45
+
R770
+
L75
+
L750
+
R21
+
L27
+
R99
+
L93
+
R81
+
R36
+
L586
+
R69
+
R862
+
R68
+
L30
+
R24
+
L17
+
L107
+
R979
+
L279
+
R85
+
L987
+
R73
+
R54
+
R80
+
L5
+
L60
+
L18
+
R78
+
R389
+
R951
+
R60
+
R7
+
R93
+
L76
+
R5
+
L229
+
R42
+
L592
+
R21
+
R31
+
L47
+
L755
+
R7
+
R493
+
R34
+
L34
+
R74
+
L423
+
L51
+
L775
+
R75
+
R83
+
R917
+
L38
+
L35
+
L27
+
R327
+
R73
+
L39
+
L61
+
L68
+
R30
+
R90
+
L38
+
R85
+
R98
+
R3
+
R54
+
L54
+
L6
+
R6
+
L61
+
R61
+
L705
+
R89
+
L84
+
L90
+
R391
+
R99
+
L15
+
R13
+
R22
+
L20
+
R81
+
R19
+
R21
+
L56
+
R35
+
R43
+
R757
+
L395
+
L5
+
L66
+
L536
+
R2
+
R97
+
L97
+
L86
+
R86
+
L97
+
L3
+
R23
+
R777
+
L666
+
L77
+
L257
+
L2
+
L98
+
R948
+
R33
+
L69
+
L74
+
R62
+
R33
+
R67
+
L266
+
L12
+
R77
+
R40
+
L940
+
R1
+
R52
+
L27
+
L625
+
L181
+
L73
+
R15
+
L61
+
R808
+
L53
+
L55
+
L44
+
R44
+
R85
+
R96
+
L5
+
R24
+
R16
+
R6
+
R78
+
R3
+
R203
+
R12
+
L94
+
R876
+
L71
+
L29
+
L58
+
R58
+
L44
+
L56
+
L40
+
R11
+
L71
+
L30
+
L85
+
R59
+
R81
+
R63
+
L67
+
L21
+
R40
+
L10
+
R94
+
L82
+
R64
+
L96
+
R99
+
R89
+
L87
+
R89
+
R663
+
R9
+
L67
+
R99
+
R96
+
R32
+
L32
+
R23
+
L23
+
R74
+
L79
+
R5
+
R413
+
L3
+
L529
+
L55
+
R96
+
L22
+
L58
+
L54
+
R58
+
R79
+
R75
+
L78
+
R77
+
R92
+
L91
+
L3
+
L47
+
R4
+
L85
+
R48
+
R11
+
R826
+
R77
+
L31
+
R84
+
L595
+
L5
+
L184
+
R19
+
L919
+
R27
+
R73
+
L13
+
L87
+
L97
+
R52
+
L50
+
R149
+
R35
+
R11
+
L73
+
L82
+
L96
+
R51
+
R18
+
L618
+
L1
+
L32
+
L22
+
R72
+
L17
+
R655
+
L610
+
L503
+
R52
+
R906
+
R35
+
L35
+
R924
+
R945
+
R31
+
L28
+
L72
+
L87
+
L76
+
R351
+
L88
+
L78
+
R97
+
R81
+
L22
+
R42
+
R80
+
R13
+
L34
+
L444
+
R77
+
R72
+
R756
+
L13
+
R73
+
L77
+
L29
+
R99
+
L93
+
R46
+
R354
+
R48
+
R52
+
R36
+
L36
+
L37
+
L63
+
L73
+
R73
+
R46
+
R67
+
L13
+
R6
+
R362
+
R10
+
R47
+
R85
+
R66
+
L76
+
R58
+
L58
+
L87
+
R487
+
L59
+
L76
+
R8
+
L48
+
L65
+
R528
+
R33
+
L23
+
R583
+
L581
+
L66
+
R23
+
L92
+
R88
+
R35
+
L8
+
L38
+
R605
+
L47
+
L827
+
L53
+
R26
+
R954
+
L172
+
L628
+
R59
+
L59
+
L88
+
L605
+
L7
+
L79
+
R79
+
R72
+
R86
+
R42
+
R45
+
L73
+
R28
+
R88
+
L594
+
R5
+
R96
+
R731
+
R25
+
L951
+
L73
+
L27
+
R98
+
L45
+
R64
+
L24
+
L80
+
R271
+
L50
+
R240
+
R52
+
L92
+
L508
+
L96
+
L30
+
R46
+
L64
+
R27
+
R78
+
L25
+
L62
+
L70
+
R455
+
R74
+
R65
+
L78
+
L265
+
L296
+
R86
+
L571
+
R30
+
L97
+
L83
+
R24
+
L921
+
R60
+
R6
+
L19
+
L37
+
L72
+
L91
+
L66
+
R86
+
R46
+
L66
+
R88
+
L92
+
R45
+
R59
+
L949
+
L285
+
L413
+
L13
+
L79
+
R80
+
R59
+
L16
+
L84
+
L48
+
R59
+
R89
+
R21
+
L13
+
L8
+
L59
+
R8
+
L31
+
L424
+
L9
+
R930
+
R25
+
L44
+
R19
+
L93
+
R78
+
R22
+
L22
+
R14
+
R44
+
L758
+
R810
+
R44
+
R73
+
L27
+
L61
+
L39
+
R65
+
L845
+
L61
+
R95
+
R49
+
L635
+
R32
+
L75
+
L83
+
R58
+
L27
+
R127
+
R87
+
L487
+
L22
+
R88
+
L66
+
L44
+
R55
+
L62
+
R58
+
L24
+
L83
+
R87
+
L60
+
L27
+
R9
+
R45
+
R64
+
L588
+
L77
+
R40
+
L12
+
R876
+
L78
+
L79
+
R3
+
R44
+
R50
+
R22
+
R7
+
L26
+
R69
+
L69
+
L95
+
R95
+
L35
+
R47
+
R88
+
R59
+
L59
+
L456
+
R3
+
R53
+
R14
+
R35
+
R51
+
L1
+
L4
+
L53
+
R158
+
R251
+
R26
+
R52
+
R44
+
L8
+
L90
+
R925
+
R9
+
R81
+
R83
+
L94
+
R21
+
R47
+
R447
+
L13
+
L83
+
R534
+
L15
+
L26
+
L791
+
L6
+
L594
+
L50
+
R50
+
R64
+
L256
+
L73
+
L39
+
L16
+
L17
+
R37
+
R42
+
R27
+
L575
+
L94
+
R46
+
L98
+
L65
+
L83
+
R44
+
L87
+
L57
+
L97
+
L99
+
R570
+
L139
+
R891
+
R9
+
L71
+
R93
+
R38
+
L96
+
R621
+
L920
+
R16
+
L61
+
R74
+
L629
+
L57
+
L24
+
R81
+
L318
+
R918
+
R59
+
R38
+
R3
+
L84
+
L89
+
L648
+
L79
+
R80
+
L69
+
L71
+
R60
+
L62
+
L770
+
R73
+
L27
+
R54
+
R48
+
L844
+
L72
+
R18
+
R961
+
R21
+
L93
+
L73
+
R42
+
R224
+
R67
+
L55
+
L12
+
R67
+
R19
+
L86
+
L3
+
L97
+
R90
+
R99
+
R9
+
R58
+
L535
+
R79
+
R81
+
L81
+
R9
+
R25
+
R766
+
L54
+
L185
+
R27
+
R12
+
L17
+
L83
+
R84
+
R94
+
R7
+
R267
+
R21
+
R427
+
L87
+
L13
+
R92
+
L830
+
L162
+
L71
+
R71
+
R2
+
L87
+
L42
+
R27
+
R77
+
L93
+
L70
+
L40
+
L69
+
L74
+
R867
+
R402
+
L751
+
L59
+
R36
+
L47
+
R21
+
L927
+
L75
+
L92
+
R94
+
R76
+
L76
+
R9
+
R491
+
R82
+
R79
+
L96
+
R35
+
R3
+
L72
+
L802
+
L1
+
R75
+
R97
+
L99
+
L1
+
L12
+
L88
+
L94
+
R94
+
L3
+
R3
+
R756
+
R13
+
R16
+
L54
+
L17
+
L89
+
R606
+
L75
+
L28
+
R72
+
L99
+
R99
+
L34
+
R34
+
L59
+
L41
+
L98
+
L4
+
R2
+
R81
+
L225
+
L731
+
L53
+
R830
+
L2
+
R43
+
R78
+
L27
+
L794
+
R90
+
R10
+
R1
+
R361
+
L62
+
R2
+
L86
+
R363
+
R321
+
L804
+
R873
+
L69
+
R54
+
R748
+
R515
+
L85
+
R37
+
L369
+
R11
+
L36
+
R503
+
R50
+
R99
+
L513
+
L14
+
L376
+
R876
+
L15
+
L85
+
R359
+
R203
+
L82
+
R20
+
L755
+
R27
+
L643
+
R71
+
R32
+
R55
+
R31
+
L887
+
L27
+
R96
+
R70
+
L70
+
R14
+
L14
+
R95
+
L47
+
L48
+
L906
+
L94
+
R137
+
R56
+
L493
+
L2
+
L99
+
R1
+
R256
+
R667
+
L23
+
R45
+
R20
+
R26
+
L16
+
R25
+
L89
+
R89
+
R50
+
L50
+
L368
+
L16
+
L585
+
L26
+
L43
+
R737
+
L399
+
L924
+
L1
+
L98
+
L42
+
R65
+
L120
+
L741
+
R48
+
L21
+
R54
+
R8
+
R3
+
L89
+
R58
+
L5
+
R85
+
R47
+
L27
+
R95
+
R705
+
R94
+
R28
+
R78
+
R69
+
R20
+
L89
+
L89
+
R189
+
R82
+
R18
+
L52
+
R80
+
R99
+
R882
+
R19
+
L2
+
R2
+
R91
+
L68
+
R53
+
R46
+
R41
+
L798
+
R7
+
L17
+
R60
+
L43
+
R9
+
L38
+
L73
+
R2
+
L575
+
R23
+
R352
+
R76
+
R871
+
L547
+
R647
+
L47
+
L17
+
R69
+
L3
+
L49
+
R38
+
R633
+
L20
+
R46
+
L97
+
L63
+
L58
+
L25
+
L144
+
R61
+
L71
+
R388
+
R83
+
R76
+
L55
+
L92
+
R72
+
L16
+
R44
+
L20
+
R20
+
L55
+
L10
+
L492
+
L713
+
L80
+
R50
+
L94
+
R77
+
L8
+
L45
+
L30
+
R74
+
R79
+
L99
+
R47
+
R99
+
L29
+
R27
+
L36
+
R38
+
R99
+
L85
+
L14
+
R13
+
R16
+
L66
+
L38
+
L25
+
L5
+
R82
+
R11
+
L294
+
L55
+
R29
+
L268
+
R87
+
L4
+
L83
+
L44
+
R18
+
R593
+
L57
+
L10
+
L24
+
R811
+
R9
+
R5
+
R24
+
R70
+
L95
+
R22
+
L65
+
R43
+
L13
+
L87
+
L18
+
L80
+
R98
+
L1
+
R33
+
L5
+
L54
+
L539
+
L38
+
R55
+
L51
+
R13
+
R62
+
R974
+
R51
+
L24
+
L176
+
L32
+
L11
+
L57
+
R3
+
R97
+
L13
+
R13
+
R85
+
L69
+
L59
+
L69
+
R12
+
R59
+
R41
+
R75
+
R59
+
R16
+
L2
+
L48
+
L67
+
L927
+
L68
+
L284
+
R82
+
L36
+
L73
+
R632
+
L59
+
L66
+
R66
+
L190
+
R40
+
R21
+
L96
+
L2
+
R21
+
R255
+
L41
+
R55
+
R37
+
R36
+
R364
+
R73
+
R97
+
L373
+
L97
+
L23
+
R23
+
L98
+
L2
+
R22
+
R17
+
R88
+
L27
+
L36
+
L64
+
L648
+
L52
+
R98
+
R82
+
L80
+
L4
+
L16
+
L80
+
R33
+
R37
+
L67
+
R97
+
L33
+
R79
+
R3
+
L13
+
L36
+
R77
+
R51
+
R76
+
L95
+
L45
+
L20
+
R13
+
R601
+
R23
+
R33
+
L24
+
R10
+
R85
+
R215
+
L310
+
L98
+
R457
+
L61
+
L88
+
L86
+
R43
+
R50
+
L27
+
R43
+
R82
+
L75
+
R870
+
L135
+
R780
+
L924
+
L21
+
R79
+
L82
+
L11
+
R2
+
R899
+
L587
+
L70
+
L325
+
L92
+
L74
+
R61
+
L61
+
R3
+
L933
+
R78
+
L87
+
R60
+
L660
+
L30
+
R18
+
R2
+
R7
+
L12
+
R51
+
R34
+
R41
+
L11
+
R14
+
R566
+
R82
+
R8
+
L69
+
L1
+
L95
+
R56
+
L74
+
R45
+
L890
+
R58
+
L535
+
L86
+
R44
+
L23
+
R8
+
L208
+
R23
+
R63
+
L94
+
L40
+
L17
+
R15
+
L75
+
R405
+
L18
+
L7
+
L1
+
L246
+
R92
+
R56
+
L956
+
R252
+
R49
+
L96
+
R559
+
L64
+
L97
+
R97
+
L31
+
L69
+
L741
+
L2
+
L57
+
L67
+
L33
+
L54
+
L686
+
L60
+
L26
+
R21
+
R2
+
L97
+
L41
+
L57
+
L729
+
R427
+
L74
+
R974
+
L318
+
R18
+
L18
+
R18
+
R66
+
R34
+
L25
+
R82
+
L57
+
R68
+
L68
+
L4
+
L89
+
L94
+
R87
+
R978
+
R575
+
L51
+
L2
+
R4
+
L21
+
R35
+
R28
+
L46
+
L10
+
R10
+
L53
+
L54
+
L77
+
L61
+
L55
+
L680
+
R669
+
L760
+
L49
+
R20
+
L67
+
L45
+
L69
+
L61
+
L81
+
R38
+
R37
+
L52
+
L36
+
L64
+
R18
+
L18
+
L373
+
R80
+
L207
+
R34
+
L34
+
R77
+
R69
+
L84
+
R7
+
L69
+
R98
+
L607
+
L49
+
R51
+
L89
+
L4
+
L56
+
R433
+
R1
+
L78
+
R22
+
L59
+
L97
+
L46
+
L10
+
R54
+
L89
+
R25
+
L31
+
R834
+
R37
+
L47
+
R7
+
L74
+
L46
+
L7
+
L14
+
R41
+
L30
+
L23
+
R96
+
L9
+
R66
+
R11
+
R89
+
R409
+
R4
+
L20
+
L18
+
L65
+
R63
+
L62
+
R89
+
R56
+
R322
+
R22
+
R84
+
L3
+
R52
+
L16
+
L60
+
L57
+
L370
+
L87
+
R35
+
R30
+
L955
+
R47
+
L23
+
R43
+
R66
+
R92
+
L58
+
L18
+
L2
+
L84
+
R254
+
L31
+
L1
+
R43
+
L465
+
L16
+
L71
+
R40
+
R80
+
R60
+
L9
+
R98
+
R21
+
R477
+
L96
+
L187
+
L13
+
R93
+
R49
+
R45
+
R13
+
L27
+
R84
+
L92
+
R74
+
R61
+
L98
+
R27
+
R21
+
R50
+
R44
+
L715
+
R71
+
L62
+
R62
+
R34
+
R324
+
R168
+
R65
+
L91
+
R72
+
R28
+
R181
+
L152
+
L6
+
L23
+
R93
+
R33
+
L44
+
R18
+
L59
+
R59
+
R5
+
R95
+
L76
+
L24
+
R104
+
R65
+
R31
+
R89
+
R11
+
R96
+
L19
+
L877
+
L64
+
R6
+
L733
+
R65
+
R87
+
R42
+
R85
+
L88
+
L58
+
L95
+
R53
+
R35
+
L53
+
R997
+
L79
+
R966
+
L52
+
R86
+
L91
+
L12
+
L356
+
R65
+
L51
+
R45
+
L98
+
R48
+
L63
+
L90
+
L54
+
L543
+
R89
+
R11
+
L47
+
R47
+
R33
+
R67
+
L99
+
R9
+
L10
+
R226
+
R53
+
R21
+
L45
+
R45
+
L868
+
R13
+
L45
+
R23
+
R55
+
R60
+
R572
+
L310
+
L27
+
L31
+
R865
+
L7
+
L51
+
R51
+
L28
+
L74
+
R33
+
L99
+
R26
+
R73
+
L657
+
R3
+
L77
+
R77
+
R84
+
R21
+
R18
+
L16
+
R16
+
L70
+
R91
+
R32
+
R6
+
L59
+
R441
+
R92
+
L33
+
R92
+
L91
+
R12
+
R87
+
L15
+
R15
+
L552
+
R52
+
R79
+
R721
+
R960
+
R29
+
L33
+
R42
+
L98
+
L18
+
R18
+
R99
+
R63
+
R38
+
R89
+
R11
+
L62
+
L49
+
R49
+
L790
+
R34
+
L942
+
R82
+
R4
+
L639
+
R64
+
R139
+
R18
+
R43
+
R49
+
L17
+
R67
+
L427
+
L523
+
R36
+
R64
+
R33
+
L33
+
L42
+
R42
+
L99
+
L1
+
L79
+
L105
+
L16
+
L22
+
R37
+
R85
+
L74
+
R41
+
R33
+
L19
+
R42
+
R71
+
L94
+
L774
+
L39
+
R46
+
L33
+
R61
+
R39
+
R34
+
R38
+
R14
+
R68
+
L54
+
R89
+
R11
+
L38
+
L62
+
R91
+
L64
+
L27
+
L27
+
L73
+
R42
+
R58
+
R49
+
R71
+
L20
+
R151
+
L51
+
R28
+
L78
+
L450
+
R794
+
R506
+
R52
+
L752
+
L59
+
R54
+
R5
+
L607
+
R7
+
R69
+
R31
+
L63
+
R51
+
L49
+
R982
+
L9
+
L12
+
L76
+
L324
+
L48
+
R7
+
R41
+
L54
+
L79
+
R85
+
R33
+
R53
+
R62
+
L51
+
L49
+
R83
+
R48
+
R6
+
L37
+
L20
+
L93
+
L77
+
R2
+
R288
+
R10
+
R56
+
R58
+
R8
+
L32
+
L42
+
R24
+
R18
+
L50
+
L50
+
R66
+
R34
+
R47
+
L47
+
R82
+
R18
+
L96
+
R12
+
R84
+
L23
+
L77
+
L34
+
L37
+
L29
+
L89
+
R66
+
L77
+
L90
+
R19
+
L68
+
R39
+
R20
+
L51
+
R27
+
L799
+
R90
+
L987
+
L33
+
R58
+
R75
+
L79
+
L96
+
L44
+
R18
+
R507
+
L98
+
L57
+
L68
+
R84
+
R94
+
L61
+
L253
+
L97
+
L45
+
L997
+
L8
+
L26
+
R67
+
L41
+
R23
+
L18
+
R95
+
L58
+
R35
+
L777
+
R1
+
R54
+
R79
+
L13
+
R49
+
L70
+
R43
+
R57
+
L62
+
R983
+
L92
+
L29
+
L26
+
L42
+
L32
+
R38
+
R97
+
L79
+
R218
+
L74
+
R26
+
R60
+
R96
+
L89
+
R92
+
R15
+
R35
+
R72
+
R24
+
L68
+
L63
+
R56
+
R53
+
L9
+
R575
+
R15
+
L190
+
L54
+
L35
+
R92
+
R9
+
R834
+
L46
+
R32
+
R68
+
L17
+
L73
+
R63
+
L87
+
R261
+
L47
+
L926
+
L99
+
L75
+
R77
+
L49
+
R95
+
R720
+
L643
+
R51
+
L6
+
R855
+
R282
+
R58
+
R89
+
L393
+
R13
+
R51
+
R89
+
L89
+
L730
+
L21
+
L86
+
R837
+
R86
+
L86
+
R8
+
L8
+
L235
+
L829
+
L35
+
R74
+
R25
+
L88
+
L88
+
L24
+
L76
+
R88
+
R83
+
L95
+
R868
+
R775
+
L30
+
R73
+
R78
+
R9
+
R4
+
R69
+
R31
+
L86
+
R238
+
R2
+
L41
+
R10
+
R13
+
R20
+
L74
+
R41
+
R480
+
L711
+
R42
+
R89
+
R61
+
L88
+
L792
+
L54
+
L80
+
L47
+
L99
+
L1
+
R51
+
L367
+
R96
+
L70
+
R39
+
R83
+
L896
+
R40
+
L76
+
L577
+
R523
+
R301
+
R60
+
R93
+
L335
+
R61
+
R81
+
L7
+
L30
+
R89
+
R347
+
R102
+
R92
+
L855
+
R55
+
R3
+
L83
+
R80
+
L89
+
R89
+
L87
+
R87
+
L95
+
L35
+
L81
+
L66
+
R60
+
L810
+
R27
+
R53
+
L89
+
L969
+
L95
+
L40
+
R34
+
L60
+
R9
+
R294
+
R63
+
R20
+
L61
+
R41
+
R693
+
L93
+
L15
+
R48
+
R44
+
R55
+
L32
+
L80
+
R780
+
L12
+
L64
+
R76
+
L997
+
L486
+
L588
+
R985
+
L714
+
R48
+
R14
+
R329
+
R9
+
R92
+
R8
+
R8
+
R92
+
R152
+
L52
+
L92
+
R28
+
L89
+
R76
+
R777
+
L67
+
L481
+
L52
+
L1
+
R47
+
R54
+
R678
+
R77
+
R45
+
R21
+
R79
+
R2
+
L51
+
L51
+
R92
+
L30
+
R86
+
L99
+
L49
+
L70
+
L442
+
L26
+
R937
+
L82
+
R50
+
R33
+
R20
+
R96
+
L16
+
L84
+
R684
+
L3
+
L71
+
R63
+
R27
+
L16
+
L90
+
R77
+
L74
+
L13
+
L15
+
L98
+
L87
+
R46
+
L46
+
L26
+
R467
+
R15
+
R74
+
L110
+
R53
+
R46
+
L53
+
L601
+
R2
+
R18
+
L34
+
R431
+
L82
+
L97
+
L40
+
R37
+
R8
+
R52
+
R840
+
R73
+
R27
+
L49
+
R49
+
L58
+
L7
+
R41
+
R24
+
R59
+
L576
+
L83
+
R22
+
R89
+
L11
+
L94
+
L75
+
L38
+
L493
+
R63
+
R37
+
L966
+
L91
+
R57
+
L443
+
L57
+
R74
+
R7
+
L586
+
L95
+
L97
+
L3
+
L70
+
L430
+
L33
+
R89
+
R744
+
L5
+
L95
+
R33
+
R28
+
R98
+
L59
+
L642
+
R98
+
R952
+
L82
+
R782
+
R92
+
R1
+
R99
+
L306
+
L56
+
L18
+
L20
+
R448
+
L48
+
L205
+
L95
+
L541
+
R62
+
R65
+
R14
+
L66
+
R39
+
L93
+
R20
+
L58
+
R26
+
L68
+
L33
+
L538
+
L601
+
L927
+
R44
+
L88
+
R69
+
R220
+
R71
+
R4
+
R62
+
L81
+
R9
+
R89
+
R24
+
L24
+
R20
+
R203
+
L99
+
L24
+
L44
+
R34
+
L90
+
R51
+
L73
+
L4
+
R526
+
L92
+
R4
+
R445
+
L57
+
R13
+
R42
+
R91
+
L677
+
R62
+
R14
+
R355
+
L31
+
R59
+
R72
+
L49
+
R68
+
L19
+
L49
+
L58
+
R12
+
R695
+
R37
+
R4
+
R559
+
R82
+
L25
+
R43
+
R318
+
R82
+
L90
+
R290
+
L31
+
L12
+
R641
+
L48
+
R2
+
L30
+
L21
+
L26
+
L7
+
L436
+
R68
+
L66
+
R66
+
L24
+
R43
+
L75
+
L33
+
R53
+
L64
+
R34
+
L14
+
R69
+
R99
+
R24
+
L12
+
L81
+
R81
+
R1
+
R62
+
L10
+
R722
+
R39
+
L34
+
L613
+
R33
+
R62
+
L62
+
R75
+
R25
+
L96
+
R96
+
R219
+
R70
+
R711
+
R286
+
R46
+
L32
+
R99
+
R1
+
L80
+
L707
+
L13
+
L32
+
L64
+
R70
+
R726
+
L426
+
R26
+
L30
+
R30
+
R74
+
L49
+
L25
+
R202
+
L97
+
L905
+
L65
+
L35
+
R33
+
L383
+
L8
+
R58
+
R78
+
L84
+
R276
+
L98
+
L872
+
L67
+
L12
+
L71
+
L6
+
R56
+
R329
+
R68
+
R18
+
R8
+
L58
+
L365
+
R93
+
L709
+
R70
+
R46
+
L71
+
R71
+
R93
+
L86
+
R893
+
L7
+
R107
+
R31
+
L89
+
R58
+
R65
+
L97
+
L151
+
R90
+
L48
+
L39
+
L55
+
R35
+
L964
+
L87
+
L72
+
R23
+
L63
+
L37
+
L61
+
R75
+
R86
+
R32
+
R68
+
R1
+
L81
+
R62
+
R18
+
L745
+
R45
+
R26
+
R74
+
L268
+
L57
+
L830
+
R55
+
R11
+
L11
+
L851
+
R71
+
L615
+
L26
+
R921
+
L825
+
R25
+
L44
+
R44
+
L622
+
L36
+
L42
+
L86
+
L614
+
R78
+
L78
+
L30
+
R28
+
L10
+
L88
+
L48
+
R970
+
R78
+
L9
+
L65
+
L81
+
R19
+
R586
+
L228
+
L22
+
R53
+
R47
+
L55
+
R555
+
R91
+
L40
+
R49
+
L6
+
R6
+
L7
+
L75
+
L618
+
R45
+
R55
+
R2
+
R86
+
R94
+
L82
+
L14
+
L86
+
L88
+
L363
+
L52
+
R3
+
R188
+
R67
+
R10
+
L5
+
L60
+
R50
+
L21
+
L29
+
R27
+
R73
+
R62
+
L10
+
L43
+
L23
+
R14
+
L60
+
L52
+
R123
+
L88
+
L61
+
L381
+
R99
+
L32
+
L1
+
L153
+
R608
+
R77
+
L61
+
L72
+
R57
+
R33
+
L750
+
R14
+
R66
+
L442
+
L603
+
L58
+
R837
+
L81
+
R81
+
L4
+
L96
+
L66
+
L34
+
L6
+
L94
+
L87
+
L563
+
R13
+
R16
+
R54
+
R667
+
R55
+
L78
+
R23
+
R81
+
L17
+
L409
+
L21
+
R66
+
L43
+
R18
+
L75
+
L61
+
R61
+
L3
+
R22
+
R14
+
R24
+
R87
+
R37
+
R58
+
R61
+
L4
+
L9
+
L69
+
R59
+
R77
+
R34
+
L94
+
R339
+
L43
+
R10
+
R720
+
R80
+
L19
+
L81
+
R93
+
L94
+
R28
+
R26
+
R32
+
R30
+
R46
+
L61
+
L30
+
L70
+
L27
+
L44
+
L170
+
R67
+
R850
+
R24
+
L7
+
R32
+
L25
+
L80
+
L520
+
R34
+
L34
+
R45
+
R116
+
L61
+
R30
+
L22
+
R37
+
L745
+
L27
+
L73
+
L697
+
L3
+
L74
+
R74
+
L12
+
L88
+
L691
+
L13
+
L42
+
L88
+
L948
+
L47
+
R93
+
L64
+
R1
+
L50
+
R63
+
R485
+
L99
+
R99
+
L88
+
R89
+
L20
+
L35
+
L45
+
L17
+
R17
+
L29
+
R60
+
L877
+
R23
+
R69
+
L68
+
L58
+
R61
+
L53
+
L28
+
R36
+
L42
+
L20
+
L68
+
R48
+
L54
+
L41
+
R41
+
R80
+
L80
+
R685
+
L85
+
R680
+
R20
+
R427
+
L46
+
L26
+
R79
+
L43
+
R9
+
R6
+
R276
+
L62
+
L37
+
L395
+
L48
+
R60
+
L53
+
R46
+
R55
+
R52
+
L28
+
L215
+
R15
+
L272
+
R73
+
R827
+
R95
+
L95
+
R79
+
L18
+
L2
+
L5
+
R56
+
L60
+
R50
+
L8
+
R8
+
R583
+
R19
+
R40
+
L453
+
R84
+
L22
+
R8
+
L459
+
L27
+
L73
+
R612
+
R854
+
L42
+
R29
+
L901
+
R190
+
R895
+
R63
+
L50
+
L50
+
L69
+
R69
+
R31
+
R32
+
R131
+
L48
+
R54
+
R29
+
L842
+
R13
+
L774
+
R89
+
L174
+
L92
+
L25
+
R61
+
R72
+
L457
+
R76
+
R72
+
L298
+
L46
+
R464
+
R32
+
L763
+
L337
+
L84
+
R15
+
R69
+
L7
+
R82
+
R82
+
R43
+
L73
+
L27
+
L60
+
L518
+
R170
+
R177
+
L69
+
L49
+
R86
+
R91
+
R72
+
R32
+
L851
+
L57
+
L27
+
R83
+
R38
+
L218
+
R57
+
L57
+
R88
+
L43
+
R55
+
L28
+
L93
+
R4
+
R62
+
R397
+
L69
+
R325
+
R2
+
R89
+
L89
+
L38
+
L21
+
L56
+
L6
+
L54
+
R91
+
L16
+
L499
+
R799
+
R65
+
R16
+
L165
+
R926
+
R458
+
R7
+
R72
+
R8
+
R13
+
L709
+
L26
+
R97
+
L411
+
R79
+
R25
+
L14
+
R11
+
R207
+
R27
+
L61
+
R61
+
L86
+
R41
+
L41
+
L92
+
L74
+
L612
+
L15
+
L36
+
R5
+
L76
+
L6
+
R706
+
L2
+
L98
+
L98
+
R98
+
L96
+
R96
+
R767
+
L67
+
L539
+
L1
+
L45
+
R35
+
R183
+
R68
+
L1
+
R96
+
R5
+
L1
+
R7
+
L722
+
L16
+
R43
+
L65
+
R53
+
L76
+
L32
+
R63
+
L314
+
R668
+
R82
+
R854
+
R997
+
R505
+
R86
+
L256
+
R72
+
R23
+
L72
+
L18
+
R18
+
R58
+
L381
+
L777
+
R31
+
R67
+
L42
+
R44
+
R53
+
R47
+
R42
+
R58
+
L66
+
L260
+
R74
+
R42
+
R84
+
R26
+
L853
+
R53
+
L25
+
R25
+
R221
+
R579
+
L98
+
R98
+
R49
+
L77
+
L525
+
L51
+
R4
+
R92
+
R708
+
L31
+
L87
+
L259
+
R85
+
R121
+
R46
+
L96
+
L38
+
L41
+
L71
+
R71
+
R77
+
L77
+
L5
+
L11
+
L76
+
L126
+
L34
+
L48
+
L43
+
L94
+
R37
+
L99
+
R65
+
L21
+
R21
+
R56
+
R317
+
R61
+
L45
+
L55
+
R52
+
L828
+
L24
+
R711
+
L751
+
R76
+
L36
+
L13
+
L540
+
L47
+
R47
+
R53
+
L85
+
R25
+
R41
+
L696
+
R15
+
L34
+
R71
+
R20
+
L27
+
L30
+
R33
+
R267
+
R292
+
L92
+
R97
+
L67
+
R70
+
L26
+
R26
+
L751
+
R1
+
R70
+
L19
+
R99
+
L29
+
R29
+
L82
+
L326
+
R87
+
L187
+
R316
+
L46
+
R52
+
R86
+
L39
+
L61
+
L52
+
L95
+
R62
+
R27
+
R58
+
L558
+
R369
+
R89
+
L47
+
L181
+
L72
+
L6
+
R39
+
L95
+
L38
+
R14
+
L314
+
L35
+
L65
+
L888
+
L401
+
L21
+
R34
+
R193
+
R95
+
R88
+
R32
+
L570
+
L19
+
L939
+
L19
+
R65
+
R661
+
L11
+
L93
+
L7
+
L66
+
L39
+
L703
+
L21
+
L54
+
R71
+
R760
+
R979
+
L90
+
L25
+
R88
+
L68
+
R58
+
R2
+
R6
+
L58
+
R60
+
L5
+
R12
+
R97
+
L9
+
R5
+
R17
+
L61
+
L17
+
R61
+
R876
+
L194
+
R11
+
L976
+
R56
+
R68
+
R315
+
R44
+
L2
+
L98
+
L81
+
R67
+
L86
+
R317
+
L17
+
L64
+
R64
+
L502
+
L98
+
R604
+
R288
+
L392
+
L12
+
L88
+
R786
+
L86
+
R413
+
R87
+
R76
+
R24
+
R69
+
L389
+
L80
+
R75
+
R382
+
L36
+
R91
+
L40
+
L97
+
L14
+
L49
+
R59
+
L71
+
R91
+
L91
+
L24
+
L669
+
R93
+
L443
+
R43
+
R548
+
L82
+
L41
+
L25
+
L90
+
L10
+
L32
+
L603
+
R35
+
L77
+
L91
+
R68
+
L71
+
L187
+
R58
+
L10
+
L90
+
R64
+
R77
+
L19
+
R78
+
L71
+
R71
+
L949
+
R93
+
R56
+
R42
+
L442
+
L93
+
R93
+
L92
+
L76
+
L24
+
R892
+
R31
+
L170
+
L80
+
L81
+
L64
+
R64
+
L45
+
R13
+
L68
+
R66
+
L66
+
R18
+
L77
+
R98
+
R71
+
R82
+
L36
+
L79
+
R43
+
L64
+
R44
+
R32
+
L705
+
R687
+
R86
+
L25
+
L21
+
R15
+
R28
+
L97
+
R845
+
R93
+
R949
+
R28
+
R85
+
R306
+
L63
+
L556
+
R13
+
R32
+
R96
+
L86
+
R58
+
L58
+
L516
+
L488
+
L38
+
L1
+
R97
+
R882
+
R22
+
R7
+
L71
+
L36
+
L341
+
R41
+
R86
+
L165
+
R30
+
R32
+
L604
+
R21
+
L65
+
L114
+
L64
+
L57
+
L93
+
L64
+
L31
+
R88
+
L45
+
R17
+
L66
+
L32
+
R60
+
L34
+
L12
+
L61
+
L637
+
R69
+
L59
+
L72
+
L617
+
L21
+
R79
+
L38
+
L32
+
R38
+
R53
+
R1
+
R45
+
L74
+
R52
+
R1
+
R85
+
L807
+
R13
+
R37
+
L43
+
L21
+
L79
+
R29
+
R71
+
R46
+
L46
+
L44
+
L82
+
R695
+
R59
+
L74
+
L229
+
R219
+
R56
+
L13
+
L24
+
L356
+
L7
+
L94
+
L708
+
L98
+
R47
+
L81
+
R66
+
R68
+
R430
+
R87
+
R83
+
L32
+
L96
+
L72
+
R20
+
R80
+
L378
+
R83
+
L704
+
R17
+
R560
+
R22
+
L165
+
L11
+
L185
+
R661
+
L93
+
L686
+
L84
+
L37
+
R85
+
L85
+
R99
+
L99
+
L23
+
R23
+
L75
+
R75
+
R81
+
L54
+
L58
+
L87
+
R848
+
R3
+
R67
+
R16
+
R84
+
L25
+
L77
+
R40
+
L131
+
R93
+
R29
+
R712
+
L44
+
R90
+
L16
+
R28
+
L96
+
R68
+
L71
+
L88
+
L2
+
R69
+
R84
+
L26
+
R26
+
L922
+
R96
+
L37
+
R95
+
R5
+
L92
+
L19
+
L54
+
R165
+
L9
+
L360
+
R69
+
R1
+
R957
+
L239
+
R32
+
R4
+
R545
+
R41
+
L41
+
R28
+
R31
+
R134
+
L599
+
R21
+
R427
+
L60
+
L32
+
R67
+
L42
+
R39
+
R86
+
L42
+
L28
+
L130
+
L81
+
L91
+
R740
+
R32
+
R4
+
R60
+
L64
+
L16
+
L84
+
L99
+
L52
+
L73
+
L369
+
L85
+
R78
+
R93
+
L982
+
L94
+
R383
+
L92
+
L8
+
L41
+
L681
+
R22
+
L896
+
L56
+
L87
+
L238
+
L323
+
L17
+
R574
+
R43
+
L830
+
L68
+
L57
+
L145
+
L18
+
L82
+
R63
+
L59
+
R53
+
R971
+
L16
+
L36
+
R24
+
L57
+
R57
+
R24
+
L24
+
R331
+
R22
+
R647
+
L77
+
R77
+
R990
+
L190
+
L95
+
R95
+
R33
+
R67
+
L79
+
R98
+
R6
+
R60
+
L16
+
R644
+
R77
+
L90
+
L36
+
R736
+
R84
+
L68
+
L77
+
L36
+
L40
+
L84
+
L37
+
L368
+
L63
+
R189
+
L79
+
R279
+
L394
+
R94
+
R34
+
L47
+
L98
+
R22
+
L11
+
R218
+
R82
+
R14
+
L134
+
R7
+
R54
+
R259
+
R93
+
L93
+
R15
+
L15
+
L83
+
L917
+
L4
+
R4
+
R82
+
L82
+
R74
+
L74
+
L50
+
R78
+
L28
+
L45
+
L60
+
R2
+
R3
+
R28
+
R72
+
L96
+
R96
+
L87
+
R50
+
R37
+
L16
+
L514
+
L7
+
L714
+
R59
+
L8
+
R28
+
L28
+
L52
+
L19
+
R11
+
L216
+
L39
+
L51
+
R21
+
L55
+
R54
+
L36
+
L8
+
R11
+
R55
+
R24
+
R74
+
L55
+
R81
+
R85
+
R302
+
R404
+
L91
+
R57
+
R43
+
L43
+
L304
+
L56
+
R3
+
R29
+
R71
+
L83
+
R83
+
L99
+
R97
+
R2
+
L64
+
R99
+
L940
+
R55
+
R160
+
R316
+
L59
+
R22
+
L89
+
L48
+
R248
+
L26
+
L74
+
R19
+
R76
+
R84
+
R71
+
R267
+
R973
+
R90
+
R20
+
L44
+
R15
+
L30
+
L741
+
R88
+
R12
+
L429
+
L969
+
R98
+
L24
+
L31
+
R55
+
R11
+
R69
+
R43
+
R377
+
R281
+
L51
+
L578
+
R48
+
L12
+
L88
+
L18
+
L716
+
R34
+
R53
+
R47
+
L39
+
L34
+
L27
+
R40
+
L69
+
R14
+
L63
+
L22
+
L36
+
R36
+
L32
+
R34
+
L37
+
R93
+
R88
+
L46
+
R39
+
R61
+
R30
+
L52
+
L41
+
R727
+
L41
+
R477
+
L8
+
L46
+
R481
+
L39
+
L70
+
L46
+
L72
+
L187
+
L79
+
L16
+
R82
+
L43
+
R81
+
L45
+
L98
+
R3
+
L61
+
R63
+
R47
+
R22
+
R40
+
R5
+
L51
+
L68
+
R505
+
R38
+
R62
+
R24
+
L16
+
L308
+
L70
+
R44
+
L16
+
L74
+
R16
+
L37
+
L30
+
L55
+
R4
+
R410
+
R8
+
R90
+
L769
+
R79
+
L40
+
L68
+
R97
+
R33
+
R27
+
L449
+
L95
+
L20
+
R62
+
L56
+
R270
+
L88
+
L57
+
L28
+
R98
+
L33
+
R22
+
L912
+
L159
+
R96
+
L108
+
R208
+
L53
+
R281
+
R172
+
L24
+
R75
+
L51
+
L7
+
R7
+
L55
+
R80
+
R58
+
L62
+
R18
+
R38
+
R19
+
R4
+
R59
+
L34
+
R75
+
R53
+
R247
+
R73
+
L73
+
R47
+
R542
+
L11
+
L87
+
L91
+
L80
+
L58
+
L78
+
L24
+
R40
+
L66
+
L12
+
L22
+
L83
+
R83
+
L657
+
R2
+
L38
+
L307
+
L883
+
L64
+
L53
+
R72
+
R697
+
L69
+
R87
+
R413
+
L53
+
L47
+
R80
+
L80
+
R505
+
R65
+
R14
+
R16
+
L58
+
L43
+
L32
+
L9
+
R42
+
L2
+
R2
+
R84
+
L84
+
L58
+
R217
+
L7
+
R933
+
R83
+
L134
+
L61
+
R27
+
L20
+
L83
+
R8
+
R53
+
R66
+
R976
+
L26
+
L394
+
L309
+
L159
+
L20
+
R86
+
L42
+
L44
+
L75
+
R587
+
R96
+
R80
+
L401
+
L723
+
R44
+
R62
+
L62
+
R91
+
R9
+
L474
+
R74
+
L26
+
L974
+
R3
+
L3
+
R75
+
R90
+
R130
+
R5
+
R16
+
L70
+
R454
+
R5
+
R641
+
L146
+
L88
+
R393
+
R85
+
R10
+
R69
+
L14
+
R27
+
L42
+
R47
+
L967
+
R80
+
L6
+
L60
+
R64
+
L10
+
R12
+
L91
+
R91
+
L39
+
L34
+
R59
+
L286
+
R89
+
R9
+
L898
+
L687
+
L13
+
R949
+
L50
+
R901
+
R840
+
L95
+
R155
+
R856
+
L56
+
L37
+
L63
+
R98
+
R2
+
L80
+
L20
+
L476
+
R32
+
L56
+
L30
+
R932
+
R68
+
L714
+
R53
+
L91
+
L13
+
R178
+
L18
+
R5
+
R99
+
L69
+
R88
+
R12
+
R381
+
R691
+
R92
+
R36
+
L37
+
L56
+
L7
+
L369
+
L99
+
R468
+
R90
+
L68
+
L66
+
L88
+
R25
+
L554
+
R61
+
R34
+
R757
+
R95
+
L68
+
L64
+
R32
+
L86
+
L41
+
L60
+
R67
+
R4
+
L30
+
R60
+
L51
+
L64
+
L85
+
R90
+
R82
+
R5
+
L76
+
L1
+
R57
+
L41
+
R825
+
L181
+
R80
+
L40
+
L93
+
L7
+
R75
+
R25
+
R12
+
L812
+
R7
+
R867
+
L51
+
L209
+
L14
+
R837
+
R75
+
R88
+
L57
+
R66
+
L204
+
L89
+
L676
+
L93
+
L145
+
R53
+
R16
+
L71
+
L485
+
L12
+
R197
+
R25
+
L11
+
R86
+
L90
+
R17
+
R73
+
R8
+
R92
+
R33
+
R972
+
R90
+
L58
+
R92
+
R83
+
R88
+
L22
+
R6
+
L84
+
R62
+
L5
+
R37
+
R82
+
R17
+
R96
+
R11
+
L29
+
R73
+
L44
+
R47
+
R53
+
R97
+
L53
+
R76
+
R25
+
L45
+
R7
+
R39
+
R25
+
R29
+
R44
+
R56
+
R67
+
R35
+
R92
+
L50
+
L68
+
R93
+
L69
+
L52
+
R82
+
R21
+
L47
+
R96
+
L94
+
L8
+
L37
+
L61
+
R59
+
R16
+
L72
+
R97
+
L42
+
L37
+
R47
+
L1
+
L39
+
L14
+
L8
+
L8
+
L3
+
R48
+
L39
+
R3
+
L21
+
L10
+
R35
+
R25
+
L3
+
L19
+
R45
+
R28
+
R40
+
L14
+
R14
+
L23
+
L38
+
R42
+
L22
+
L29
+
L45
+
L46
+
R39
+
L22
+
L37
+
L36
+
L33
+
R46
+
R32
+
R1
+
R17
+
L18
+
L42
+
L36
+
R10
+
R4
+
L18
+
L26
+
L31
+
R26
+
R9
+
R48
+51
nix/01/solution.nix
···
···
+
let
+
input = builtins.readFile ./input.txt;
+
lines = builtins.filter (s: builtins.isString s && s != "") (builtins.split "\n" input);
+
+
mod = a: b: a - (a / b) * b;
+
+
part1 =
+
let
+
processLine = state: line:
+
let
+
dir = builtins.substring 0 1 line == "R";
+
num = builtins.fromJSON (builtins.substring 1 (builtins.stringLength line - 1) line);
+
newDial = mod (if dir then state.dial + num else state.dial - num + 100) 100;
+
in {
+
dial = newDial;
+
count = state.count + (if newDial == 0 then 1 else 0);
+
};
+
+
result = builtins.foldl' processLine { dial = 50; count = 0; } lines;
+
in result.count;
+
+
part2 =
+
let
+
processLine = state: line:
+
let
+
dir = builtins.substring 0 1 line;
+
num = builtins.fromJSON (builtins.substring 1 (builtins.stringLength line - 1) line);
+
dialBefore = state.dial;
+
+
distToZero =
+
let raw = if dir == "R" then mod (100 - dialBefore) 100 else mod dialBefore 100;
+
in if raw == 0 then 100 else raw;
+
+
passCount = if num >= distToZero then 1 + (num - distToZero) / 100 else 0;
+
+
newDial =
+
let d = if dir == "R"
+
then mod (dialBefore + num) 100
+
else mod (100 + dialBefore - (mod num 100)) 100;
+
in mod (100 + d) 100;
+
in {
+
dial = newDial;
+
count = state.count + passCount;
+
};
+
+
result = builtins.foldl' processLine { dial = 50; count = 0; } lines;
+
in result.count;
+
+
in {
+
inherit part1 part2;
+
}