-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path01.ss
More file actions
executable file
·114 lines (97 loc) · 4.32 KB
/
01.ss
File metadata and controls
executable file
·114 lines (97 loc) · 4.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/usr/bin/env scheme --script
(load "utils.ss")
;; https://adventofcode.com/2019/day/1
;; --- Day 1: The Tyranny of the Rocket Equation ---
; Santa has become stranded at the edge of the Solar System while delivering
; presents to other planets! To accurately calculate his position in space,
; safely align his warp drive, and return to Earth in time to save Christmas,
; he needs you to bring him measurements from fifty stars.
;
; Collect stars by solving puzzles. Two puzzles will be made available on each
; day in the Advent calendar; the second puzzle is unlocked when you complete
; the first. Each puzzle grants one star. Good luck!
;
; The Elves quickly load you into a spacecraft and prepare to launch.
;
; At the first Go / No Go poll, every Elf is Go until the Fuel Counter-Upper.
; They haven't determined the amount of fuel required yet.
;
; Fuel required to launch a given module is based on its mass. Specifically, to
; find the fuel required for a module, take its mass, divide by three, round
; down, and subtract 2.
;
; For example:
;
; For a mass of 12, divide by 3 and round down to get 4, then subtract 2 to
; get 2. For a mass of 14, dividing by 3 and rounding down still yields 4,
; so the fuel required is also 2. For a mass of 1969, the fuel required is
; 654. For a mass of 100756, the fuel required is 33583.
;
; The Fuel Counter-Upper needs to know the total fuel requirement. To find it,
; individually calculate the fuel needed for the mass of each module (your
; puzzle input), then add together all the fuel values.
;
; What is the sum of the fuel requirements for all of the modules on your
; spacecraft?
(define (mass->fuel m)
(- (floor (/ m 3)) 2))
(assert (= (mass->fuel 12) 2))
(assert (= (mass->fuel 14) 2))
(assert (= (mass->fuel 1969) 654))
(assert (= (mass->fuel 100756) 33583))
;; 3464458
(define module-fuel
(fold-left + 0
(map mass->fuel
(map string->number (read-file "inputs/01.txt")))))
(print module-fuel)
;; --- Part Two ---
; During the second Go / No Go poll, the Elf in charge of the Rocket Equation
; Double-Checker stops the launch sequence. Apparently, you forgot to include
; additional fuel for the fuel you just added.
;
; Fuel itself requires fuel just like a module - take its mass, divide by
; three, round down, and subtract 2. However, that fuel also requires fuel, and
; that fuel requires fuel, and so on. Any mass that would require negative fuel
; should instead be treated as if it requires zero fuel; the remaining mass, if
; any, is instead handled by wishing really hard, which has no mass and is
; outside the scope of this calculation.
;
; So, for each module mass, calculate its fuel and add it to the total. Then,
; treat the fuel amount you just calculated as the input mass and repeat the
; process, continuing until a fuel requirement is zero or negative. For
; example:
;
; A module of mass 14 requires 2 fuel. This fuel requires no further fuel
; (2 divided by 3 and rounded down is 0, which would call for a negative
; fuel), so the total fuel required is still just 2. At first, a module of
; mass 1969 requires 654 fuel. Then, this fuel requires 216 more fuel (654
; / 3 - 2). 216 then requires 70 more fuel, which requires 21 fuel, which
; requires 5 fuel, which requires no further fuel. So, the total fuel
; required for a module of mass 1969 is 654 + 216 + 70 + 21 + 5 = 966. The
; fuel required by a module of mass 100756 and its fuel is: 33583 + 11192 +
; 3728 + 1240 + 411 + 135 + 43 + 12 + 2 = 50346.
;
; What is the sum of the fuel requirements for all of the modules on your
; spacecraft when also taking into account the mass of the added fuel?
(define (total-fuel f)
(define (total-fuel total last)
(cond [(<= last 0) total]
[else
(total-fuel (+ total last) (mass->fuel last))]))
(total-fuel 0 (mass->fuel f)))
(assert (= (total-fuel 14) 2))
(assert (= (total-fuel 1969) 966))
(assert (= (total-fuel 100756) 50346))
;; calculate the fuel requirements for each module separately, then add them up
;; at the end
(define (module+fuel m)
(let [(fuel (mass->fuel m))]
(+ fuel (total-fuel fuel))))
(print
(fold-left + 0
(map
(lambda (s)
(module+fuel (string->number s)))
(read-file "inputs/01.txt"))))
;; 5193796