Initial commit

This commit is contained in:
Dimitri Lozeve 2024-11-12 21:43:32 +01:00
commit f242d2b0df
420 changed files with 62521 additions and 0 deletions

81
2019/day14/day14.rkt Normal file
View file

@ -0,0 +1,81 @@
#lang racket
(module+ test
(require rackunit))
(module+ main
(displayln "Day 14"))
(define (read-rules filename)
(with-input-from-file filename
(lambda ()
(define h (make-hash))
(for ([line (in-lines)])
(define rule
(for/list ([elt (regexp-match* #rx"([0-9]+) ([A-Z]+)" line #:match-select cdr)])
(list (string->number (car elt)) (string->symbol (cadr elt)))))
(define output (last rule))
(hash-set! h
(cadr output)
(cons (car output)
(make-hash (for/list ([elt (drop-right rule 1)])
(cons (cadr elt) (car elt)))))))
h)))
(define (generate! rules needed available)
(for ([(target target-amount) (in-hash needed)]
#:unless (eq? target 'ORE))
(define inputs (cdr (hash-ref rules target)))
(define output-amount (car (hash-ref rules target)))
(define new-target-amount (- target-amount (hash-ref available target 0)))
(define multiple (ceiling (/ new-target-amount output-amount)))
(hash-set! available target (- (* multiple output-amount) new-target-amount))
(hash-set! needed target 0)
(for ([(input input-amount) (in-hash inputs)])
(hash-update! needed input (lambda (v) (+ v (* multiple input-amount))) 0))))
(define (ore-per-fuel rules amount)
(define needed (make-hash `((FUEL . ,amount))))
(define available (make-hash))
(for ([i (in-naturals)]
#:break (= (apply + (hash-values needed)) (hash-ref needed 'ORE 0)))
(generate! rules needed available))
(hash-ref needed 'ORE))
(define (part1 filename)
(define rules (read-rules filename))
(ore-per-fuel rules 1))
(module+ test
(check-eq? 31 (part1 "test1"))
(check-eq? 165 (part1 "test2"))
(check-eq? 13312 (part1 "test3"))
(check-eq? 180697 (part1 "test4"))
(check-eq? 2210736 (part1 "test5")))
(module+ main
(display "Part 1: ")
(displayln (part1 "input")))
(define (part2 filename)
(define rules (read-rules filename))
(define max-fuel 1000000000000)
(define min-fuel 1)
(bisect rules 1000000000000 min-fuel max-fuel))
(define (bisect rules target-ore min-fuel max-fuel)
(define mid-fuel (floor (+ min-fuel (/ (- max-fuel min-fuel) 2))))
(define ore (ore-per-fuel rules mid-fuel))
(cond
[(= 1 (- max-fuel min-fuel)) min-fuel]
[(< ore target-ore) (bisect rules target-ore mid-fuel max-fuel)]
[(< target-ore ore) (bisect rules target-ore min-fuel mid-fuel)]))
(module+ test
(check-eq? 82892753 (part2 "test3"))
(check-eq? 5586022 (part2 "test4"))
(check-eq? 460664 (part2 "test5")))
(module+ main
(display "Part 2: ")
(displayln (part2 "input")))

60
2019/day14/input Normal file
View file

@ -0,0 +1,60 @@
29 PQJGK => 4 SRPZP
6 XKJP, 4 LDSMT => 6 ZVSMJ
9 CGCPW, 2 CFVS => 7 DWZH
1 VQWZC, 1 FRTJG => 1 MGLKL
3 GCTBC, 4 RGKB => 4 RLZR
2 LGLCP => 9 GCTBC
3 DFPW, 12 FRTJG => 2 XVSRT
1 VBXFG => 3 VQWZC
1 GCTBC, 1 BVHM => 8 DGMZB
7 DFPW, 3 JQNL => 7 FRTJG
6 BHQN, 4 VXNP => 5 HBLQT
1 XNBR, 27 FTBNQ, 2 RGKB => 7 JZPMK
6 HKMV, 4 JHDHS, 11 NMSKF => 9 STCX
129 ORE => 5 NVXTP
13 BVHM, 5 XNBR => 3 LKXML
3 SBPM, 4 LDSMT, 13 GPBG => 6 HXFCJ
1 XVSRT, 1 JHDHS => 4 FTBNQ
6 LKXML, 6 HRLWP => 5 PSJK
5 HRLWP, 19 PDHVG => 1 VRQD
3 FTBNQ, 1 QLKTZ => 7 SBPM
2 VXNP => 3 XKJP
4 SRPZP, 7 XVSRT => 8 LMVF
2 GPBG, 8 DWZH, 3 JTCHR, 10 RLZR, 1 CFVS, 20 BFCZ => 2 WZSTV
130 ORE => 9 JQNL
100 ORE => 4 VBXFG
4 XNBR => 8 RDSHN
2 CDBTL, 2 XNBR, 8 QLKTZ => 6 CGCPW
7 CGCPW => 6 BFCZ
7 FTBNQ, 7 VXNP => 1 BVHM
1 HXFCJ, 15 CSXD => 1 DFXPB
1 MCRW, 6 MGLKL, 1 HBLQT => 8 SWRV
19 BZQGL, 10 NMSKF, 20 WZSTV, 15 LVGB, 26 FTBNQ, 45 DWZH, 2 FJWVP, 56 JZPMK => 1 FUEL
12 JTCHR => 4 CDBTL
1 MGLKL => 6 PQJGK
1 NVXTP => 1 LDSMT
3 SWRV, 1 LGLCP => 2 GHVJ
4 DGMZB, 11 HXFCJ, 2 RLZR => 4 SHTB
5 GHVJ, 1 RGKB, 1 GCTBC => 6 HKMV
1 SRPZP => 9 XNBR
1 ZVSMJ => 2 JHDHS
9 SWRV => 5 NMSKF
1 NVXTP => 3 XKBS
7 BHQN => 2 GPBG
21 NMSKF, 12 FTBNQ, 12 SBPM => 3 CMXK
2 GPBG, 12 ZVSMJ, 2 PDHVG => 4 LGLCP
158 ORE => 8 DFPW
3 BVHM, 1 HXFCJ, 5 CGCPW, 5 BFCZ, 6 VRQD, 3 LDSMT => 7 LVGB
1 XVSRT, 1 XKJP => 8 PDHVG
3 VRQD, 16 SHTB, 5 SBPM => 9 BZQGL
1 BVHM, 3 HKMV => 4 CFVS
13 JQNL => 7 VXNP
1 XKJP, 6 XVSRT => 7 MCRW
15 NVXTP, 19 XKBS => 4 BHQN
8 JHDHS, 5 CMXK, 2 GPBG => 8 CSXD
1 JZBR, 13 LKXML, 1 HKMV, 9 DFXPB, 3 XKBS, 2 PSJK, 2 LMVF, 15 HRLWP => 7 FJWVP
1 CGCPW, 3 RDSHN => 8 JZBR
24 PQJGK => 5 JTCHR
1 XVSRT, 5 LDSMT => 6 QLKTZ
17 GPBG => 7 RGKB
4 STCX => 1 HRLWP

6
2019/day14/test1 Normal file
View file

@ -0,0 +1,6 @@
10 ORE => 10 A
1 ORE => 1 B
7 A, 1 B => 1 C
7 A, 1 C => 1 D
7 A, 1 D => 1 E
7 A, 1 E => 1 FUEL

7
2019/day14/test2 Normal file
View file

@ -0,0 +1,7 @@
9 ORE => 2 A
8 ORE => 3 B
7 ORE => 5 C
3 A, 4 B => 1 AB
5 B, 7 C => 1 BC
4 C, 1 A => 1 CA
2 AB, 3 BC, 4 CA => 1 FUEL

9
2019/day14/test3 Normal file
View file

@ -0,0 +1,9 @@
157 ORE => 5 NZVS
165 ORE => 6 DCFZ
44 XJWVT, 5 KHKGT, 1 QDVJ, 29 NZVS, 9 GPVTF, 48 HKGWZ => 1 FUEL
12 HKGWZ, 1 GPVTF, 8 PSHF => 9 QDVJ
179 ORE => 7 PSHF
177 ORE => 5 HKGWZ
7 DCFZ, 7 PSHF => 2 XJWVT
165 ORE => 2 GPVTF
3 DCFZ, 7 NZVS, 5 HKGWZ, 10 PSHF => 8 KHKGT

12
2019/day14/test4 Normal file
View file

@ -0,0 +1,12 @@
2 VPVL, 7 FWMGM, 2 CXFTF, 11 MNCFX => 1 STKFG
17 NVRVD, 3 JNWZP => 8 VPVL
53 STKFG, 6 MNCFX, 46 VJHF, 81 HVMC, 68 CXFTF, 25 GNMV => 1 FUEL
22 VJHF, 37 MNCFX => 5 FWMGM
139 ORE => 4 NVRVD
144 ORE => 7 JNWZP
5 MNCFX, 7 RFSQX, 2 FWMGM, 2 VPVL, 19 CXFTF => 3 HVMC
5 VJHF, 7 MNCFX, 9 VPVL, 37 CXFTF => 6 GNMV
145 ORE => 6 MNCFX
1 NVRVD => 8 CXFTF
1 VJHF, 6 MNCFX => 4 RFSQX
176 ORE => 6 VJHF

17
2019/day14/test5 Normal file
View file

@ -0,0 +1,17 @@
171 ORE => 8 CNZTR
7 ZLQW, 3 BMBT, 9 XCVML, 26 XMNCP, 1 WPTQ, 2 MZWV, 1 RJRHP => 4 PLWSL
114 ORE => 4 BHXH
14 VRPVC => 6 BMBT
6 BHXH, 18 KTJDG, 12 WPTQ, 7 PLWSL, 31 FHTLT, 37 ZDVW => 1 FUEL
6 WPTQ, 2 BMBT, 8 ZLQW, 18 KTJDG, 1 XMNCP, 6 MZWV, 1 RJRHP => 6 FHTLT
15 XDBXC, 2 LTCX, 1 VRPVC => 6 ZLQW
13 WPTQ, 10 LTCX, 3 RJRHP, 14 XMNCP, 2 MZWV, 1 ZLQW => 1 ZDVW
5 BMBT => 4 WPTQ
189 ORE => 9 KTJDG
1 MZWV, 17 XDBXC, 3 XCVML => 2 XMNCP
12 VRPVC, 27 CNZTR => 2 XDBXC
15 KTJDG, 12 BHXH => 5 XCVML
3 BHXH, 2 VRPVC => 7 MZWV
121 ORE => 7 VRPVC
7 XCVML => 6 RJRHP
5 BHXH, 4 VRPVC => 5 LTCX