-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsol_14.aes
127 lines (116 loc) · 5.08 KB
/
sol_14.aes
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
@compiler >= 4.2.0
include "List.aes"
contract Day14 =
entrypoint solve_1() =
let rm = react_map(input())
solve([(1, "FUEL")], {}, rm)
entrypoint solve_2() =
let ore = 1000000000000
let rm = react_map(input())
bsearch(rm, ore, 0, ore)
function bsearch(rm, lim, x0, x1) =
let x = (x1 + x0) / 2
if(x == x0 || x == x1) x0
else
let y = solve([(x, "FUEL")], {}, rm)
if(y > lim) bsearch(rm, lim, x0, x)
else bsearch(rm, lim, x, x1)
function
solve([], have, _) = have["ORE"]
solve((k, "ORE") :: need, have, rm) =
solve(need, have{["ORE" = 0] @ o = k + o}, rm)
solve((k, i) :: need, have, rm) =
let (k, have) = in_store(k, i, have)
if(k == 0) solve(need, have, rm)
else
let (n, need') = rm[i]
let fac = (k + n - 1) / n
let rest = fac * n - k
let have = if(rest > 0) have{[i = 0] @ x = x + rest } else have
solve(add_need(fac, need', need), have, rm)
function
add_need(_, [], need0) = need0
add_need(k, (n, x) :: need1, need0) = (n * k, x) :: add_need(k, need1, need0)
function in_store(k, i, have) =
let l = have[i = 0]
if(l > k) (0, have{[i] = l - k})
else (k - l, Map.delete(i, have))
function react_map(rs : list(list(int * string) * (int * string))) =
let flip((rs, (n, m))) = (m, (n, rs))
Map.from_list(List.map(flip, rs))
function input0() =
[([(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"))]
function input1() =
[([(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") )]
function input() =
[([(4, "JWXL")], (8, "SNBF")),
([(23, "MPZQF"), (10, "TXVW"), (8, "JWXL")], (6, "DXLB")),
([(1, "SNZDR"), (5, "XMWHC"), (1, "NJSC")], (7, "MHSB")),
([(2, "TDHD"), (11, "TXVW")], (4, "RFNZ")),
([(2, "VRCD"), (1, "FGZG"), (3, "JWXL"), (1, "HQTL"), (2, "MPZQF"), (1, "GTPJ"), (5, "HQNMK"), (10, "CQZQ")], (9, "QMTZB")),
([(3, "SRDB"), (2, "ZMVLP")], (3, "DHFD")),
([(1, "DFQGF")], (1, "CVXJR")),
([(193, "ORE")], (3, "TRWXF")),
([(23, "MFJMS"), (4, "HJXJH")], (1, "WVDF")),
([(5, "TRWXF")], (5, "RXFJ")),
([(4, "GZQH")], (7, "SNZDR")),
([(160, "ORE")], (4, "PLPF")),
([(1, "PLPF")], (5, "NJSC")),
([(2, "QKPZ"), (2, "JBWFL")], (7, "HBSC")),
([(15, "DXLB"), (1, "TDHD"), (9, "RFNZ")], (5, "DBRPW")),
([(7, "PLPF"), (4, "GMZH")], (7, "PVNX")),
([(3, "JWXL"), (1, "XWDNT"), (4, "CQZQ")], (2, "TPBXV")),
([(2, "SNZDR")], (9, "WQWT")),
([(1, "WMCF")], (2, "XWDNT")),
([(1, "DFQGF"), (8, "FGZG")], (5, "LMHJQ")),
([(168, "ORE")], (9, "GMZH")),
([(18, "PVNX"), (3, "RXFJ")], (4, "JBWFL")),
([(5, "WQWT")], (1, "CQZQ")),
([(6, "QMTZB"), (28, "NVWM"), (8, "LMHJQ"), (1, "SNBF"), (15, "PLPF"), (3, "KMXPQ"), (43, "WVDF"), (52, "SVNS")], (1, "FUEL")),
([(164, "ORE")], (9, "RXRMQ")),
([(2, "MFJMS"), (1, "HJXJH"), (7, "WVDF")], (7, "NXWC")),
([(8, "QDGBV"), (1, "WMCF"), (2, "MHSB")], (6, "HQTL")),
([(1, "XMWHC")], (8, "MLSK")),
([(2, "GMZH"), (1, "RXRMQ")], (2, "GZQH")),
([(4, "MPZQF"), (7, "WVDF")], (9, "KHJMV")),
([(4, "ZMVLP"), (19, "MLSK"), (1, "GZQH")], (8, "MFJMS")),
([(1, "HQTL"), (1, "SXKQ")], (2, "PWBKR")),
([(3, "SXKQ"), (16, "TXVW"), (4, "SVNS")], (5, "PSRF")),
([(4, "MPZQF"), (3, "SVNS")], (9, "QDGBV")),
([(7, "NXWC")], (8, "FGZG")),
([(7, "TDHD"), (1, "WQWT"), (1, "HBSC")], (9, "TXVW")),
([(14, "JBWFL")], (5, "LMXB")),
([(1, "VRCD"), (3, "KHJMV")], (3, "RTBL")),
([(16, "DHFD"), (2, "LBNK")], (9, "SXKQ")),
([(1, "QDGBV"), (1, "NJSC")], (6, "JWXL")),
([(4, "KHJMV")], (3, "HQNMK")),
([(5, "GZQH")], (6, "LBNK")),
([(12, "KHJMV"), (19, "FGZG"), (3, "XWDNT")], (4, "VRCD")),
([(5, "DHFD"), (3, "MLSK")], (8, "QKPZ")),
([(4, "KHJMV"), (1, "CQDR"), (3, "DBRPW"), (2, "CQZQ"), (1, "TPBXV"), (15, "TXVW"), (2, "TKSLM")], (5, "NVWM")),
([(2, "KHJMV")], (5, "CQDR")),
([(1, "CVXJR")], (8, "SVNS")),
([(35, "RXFJ"), (5, "NJSC"), (22, "PVNX")], (9, "HJXJH")),
([(5, "LMXB")], (3, "DFQGF")),
([(1, "RXFJ")], (2, "SRDB")),
([(20, "TPBXV"), (1, "RTBL"), (13, "PWBKR"), (6, "RFNZ"), (1, "LMXB"), (2, "CVXJR"), (3, "PSRF"), (25, "MPZQF")], (9, "KMXPQ")),
([(1, "MHSB"), (8, "MPZQF")], (3, "TDHD")),
([(6, "DHFD"), (3, "LBNK")], (7, "WMCF")),
([(1, "SRDB")], (7, "ZMVLP")),
([(3, "RXFJ")], (8, "XMWHC")),
([(1, "MPZQF")], (8, "TKSLM")),
([(9, "JBWFL"), (22, "WQWT")], (8, "MPZQF")),
([(12, "HBSC"), (15, "TKSLM")], (1, "GTPJ"))]