Skip to content

Instantly share code, notes, and snippets.

@philipschwarz
Last active December 7, 2019 21:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save philipschwarz/1860a497504958b784dd4a97e0b2996a to your computer and use it in GitHub Desktop.
Save philipschwarz/1860a497504958b784dd4a97e0b2996a to your computer and use it in GitHub Desktop.
-- Solution to https://adventofcode.com/2019/day/1 by @philip_schwarz
-- Based on following solution by @runarorama:
-- https://gist.github.com/runarorama/21e6876bd62812b9d61a312c75ec87a3
use .base
use .base.test.internals.v1.Test forAll
use .base.Test
-- Part 1
fuelRequirement : Nat -> Nat
fuelRequirement mass = mass / 3 `drop` 2
fuel : [Nat] -> Nat
fuel masses =
foldl (fuelSoFar mass -> fuelSoFar + fuelRequirement mass)
0
masses
-- Part 2
fuelRequirementRec : Nat -> Nat
fuelRequirementRec mass = fuelRequirementTaiRec mass 0
fuelRequirementTaiRec : Nat -> Nat -> Nat
fuelRequirementTaiRec mass fuelSoFar =
case (fuelRequirement mass) of
fuel | fuel > 0 -> fuelRequirementTaiRec fuel (fuelSoFar + fuel)
_ -> fuelSoFar
recursiveFuel : [Nat] -> Nat
recursiveFuel masses =
foldl (fuelSoFar mass -> fuelSoFar + fuelRequirementRec mass)
0
masses
-- test code
testCases1 = [(12, 2), (14, 2), (1969, 654), (100756, 33583)]
testCases2 = [(14, 2), (1969, 966), (100756, 50346)]
checkCase f tc = case tc of (i, o) -> f i == o
checkAll : (a -> b) -> [(a, b)] -> [Result]
checkAll f cases = forAll (List.size cases) (Small cases) (checkCase f)
-- tests
test> test1 = checkAll fuelRequirement testCases1
test> answer1 = checkAll fuel [(masses, 3297626)]
test> test2 = checkAll fuelRequirementRec testCases2
test> answer2 = checkAll recursiveFuel [(masses, 4943578)]
masses =
[142195,
119326,
57976,
138834,
132685,
113092,
88731,
52063,
122899,
78681,
117881,
121912,
112633,
85163,
145655,
76668,
92939,
81941,
62645,
126482,
114642,
55588,
95934,
68172,
62160,
111109,
141496,
97453,
83723,
50309,
82930,
66124,
142265,
100066,
147434,
149708,
77906,
71147,
76590,
59528,
67973,
68187,
135534,
129331,
147054,
89062,
63159,
80990,
103402,
139627,
87251,
66561,
102708,
91307,
121287,
149077,
142275,
144917,
98677,
114912,
102236,
56147,
130660,
63523,
112577,
75086,
136006,
142090,
80446,
53900,
144975,
143195,
138974,
60145,
132474,
62640,
62270,
76275,
62315,
85065,
99617,
73579,
97553,
79715,
81297,
77342,
142907,
114001,
137846,
122398,
71457,
133929,
110617,
68928,
56741,
87754,
53907,
68322,
85782,
140916]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment