Skip to content

Commit 08352da

Browse files
author
kjh
committed
2019 Day 14 Initial Solve
1 parent 0c3e298 commit 08352da

File tree

2 files changed

+89
-11
lines changed

2 files changed

+89
-11
lines changed

resources/2019/14.txt

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
156 ORE => 6 TLFQZ
2+
1 SZFV => 5 TNXGD
3+
1 BQLJ, 3 VNKPF => 8 BQXZ
4+
43 FPRFS, 5 CQJT, 20 LDKTQ, 48 ZPBLH, 21 MFVG, 43 WLWZQ, 1 ZWZQ, 11 PQZJP, 56 CTJGD, 35 SGDVW => 1 FUEL
5+
11 BQXZ, 1 PRCSN => 7 DVFD
6+
7 VWXB, 2 PRCSN, 24 VJSR, 9 MDWCG, 4 MFVG => 4 ZWZQ
7+
32 BQXZ, 5 XDSHP, 16 KTXJR, 7 VJSR, 3 MDWCG, 11 KZFZG, 3 NVBN => 5 ZPBLH
8+
2 BQLJ, 2 RSKH, 3 VWXB => 2 GWXCF
9+
6 PRCSN, 1 NCRZ => 8 VJSR
10+
5 TMQLD => 9 VDQL
11+
9 MZQZS, 1 FLRB => 5 BQLJ
12+
4 KLHS => 5 PQZJP
13+
1 WJTS, 1 NCRZ, 27 XDSHP => 8 MFVG
14+
1 FNXMV, 30 FPKM => 8 RDMDL
15+
1 TNXGD, 21 XBCLW, 5 CWNV => 3 RSKH
16+
4 KQFPJ => 2 NCRZ
17+
10 CWNV, 8 HSXW => 9 FNXMV
18+
2 TNXGD, 4 CWNV, 13 VJSR => 8 KTXJR
19+
3 NCRZ, 1 GWXCF, 8 NVBN, 6 MDWCG, 3 VWXB, 4 KTXJR, 4 DVFD, 3 QXCV => 9 FPRFS
20+
5 MZQZS, 9 TBVRN => 7 SZFV
21+
37 GWXCF, 15 RDMDL, 2 MDWCG => 7 CQJT
22+
1 VDQL, 2 HSXW => 4 NVBN
23+
18 QHMTL, 7 FLRB, 1 SZFV => 3 FPKM
24+
6 VDQL => 1 FNCN
25+
3 QPHT => 7 LDKTQ
26+
1 TLFQZ => 8 FWFR
27+
7 VDQL, 8 KZFZG => 3 HSXW
28+
9 TBVRN => 7 MZQZS
29+
1 FLRB, 44 VNKPF, 1 LVZF => 8 QXCV
30+
1 WLWZQ, 3 TBVRN, 4 TLFQZ => 9 KQFPJ
31+
1 BQLJ, 1 PRCSN, 8 DHTNG => 5 VWXB
32+
1 XDSHP, 6 NVBN => 1 BDGC
33+
8 PRCSN, 1 DHTNG => 2 WJTS
34+
19 DHTNG, 22 WLWZQ => 9 LVZF
35+
185 ORE => 7 WLWZQ
36+
1 TMQLD, 1 MZQZS => 8 KZFZG
37+
111 ORE => 4 TBVRN
38+
31 VDQL, 14 MZQZS => 7 XBCLW
39+
6 VDQL, 3 KVPK => 9 SGDVW
40+
1 FNCN => 6 QMKT
41+
1 FNCN, 3 TMQLD => 7 VNKPF
42+
2 QPHT => 6 VQXCJ
43+
2 LDKTQ, 3 VQXCJ => 5 FLRB
44+
1 FNCN, 3 FPKM, 1 SZFV => 2 DHTNG
45+
1 KZFZG => 9 QHMTL
46+
141 ORE => 5 QPHT
47+
16 TNXGD => 9 CWNV
48+
1 KQFPJ, 29 FWFR => 2 KVPK
49+
1 TNXGD, 7 KLHS => 2 XDSHP
50+
7 WJTS => 6 MDWCG
51+
3 BDGC, 3 XDSHP, 1 NCRZ => 4 CTJGD
52+
3 QMKT => 6 PRCSN
53+
24 FWFR => 2 TMQLD
54+
8 VNKPF => 3 KLHS

src/main/kotlin/advent2019/Day14.kt

+35-11
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ class Day14(override val adventOfCode: AdventOfCode) : Day {
1212
val input = adventOfCode.getInput(2019, day).lines()
1313

1414

15-
data class Element(val quantity: Int, val name: String) {
16-
val producedBy = mutableMapOf<Element, Int>()
15+
data class Element(val quantity: Long, val name: String) {
16+
val producedBy = mutableMapOf<Element, Long>()
1717

1818
fun distanceToOre() : Int {
1919
if (name == "ORE")
@@ -43,8 +43,7 @@ class Day14(override val adventOfCode: AdventOfCode) : Day {
4343
}
4444
}
4545

46-
override fun part1() : Any {
47-
46+
fun generateElementMap() : Map<String, Element> {
4847
val elemMap = mutableMapOf<String, Element>()
4948

5049
elemMap["ORE"] = Element(1, "ORE")
@@ -53,7 +52,7 @@ class Day14(override val adventOfCode: AdventOfCode) : Day {
5352
val (_, output) = line.split("=>")
5453

5554
val (outName, outQty) = regex.find(output)!!.let {
56-
Pair(it.groups[2]!!.value, it.groups[1]!!.value.toInt())
55+
Pair(it.groups[2]!!.value, it.groups[1]!!.value.toLong())
5756
}
5857

5958
elemMap[outName] = Element(outQty, outName)
@@ -64,12 +63,12 @@ class Day14(override val adventOfCode: AdventOfCode) : Day {
6463
val splitInputs = inputs.split(",")
6564

6665
val (outName, _) = regex.find(output)!!.let {
67-
Pair(it.groups[2]!!.value, it.groups[1]!!.value.toInt())
66+
Pair(it.groups[2]!!.value, it.groups[1]!!.value.toLong())
6867
}
6968

7069
splitInputs.map {
7170
regex.find(it)!!.let {
72-
Pair(it.groups[2]!!.value, it.groups[1]!!.value.toInt())
71+
Pair(it.groups[2]!!.value, it.groups[1]!!.value.toLong())
7372
}
7473
}.forEach { (elemName, qty) ->
7574
elemMap[elemName]!!.let { toProduce ->
@@ -78,9 +77,15 @@ class Day14(override val adventOfCode: AdventOfCode) : Day {
7877
}
7978
}
8079

81-
val needed = NeverNullMap<Element, Int> {0}
80+
return elemMap
81+
}
82+
83+
fun getOreRequired(fuelWanted: Long) : Long {
84+
val elemMap = generateElementMap()
85+
86+
val needed = NeverNullMap<Element, Long> {0}
8287

83-
needed[elemMap["FUEL"]!!] = 1
88+
needed[elemMap["FUEL"]!!] = fuelWanted
8489

8590
while (!needed.containsKey(elemMap["ORE"]!!) || needed.size > 1) {
8691
val cur = needed.keys.maxBy { it.distanceToOre() }!!
@@ -89,7 +94,7 @@ class Day14(override val adventOfCode: AdventOfCode) : Day {
8994
needed.remove(cur)
9095

9196
var timesNeeded = quantity / cur.quantity
92-
if (quantity % cur.quantity != 0)
97+
if (quantity % cur.quantity != 0L)
9398
timesNeeded += 1
9499

95100
cur.producedBy.forEach { (elem, qty) ->
@@ -100,7 +105,26 @@ class Day14(override val adventOfCode: AdventOfCode) : Day {
100105
return needed.values.single()
101106
}
102107

108+
override fun part1(): Any = getOreRequired(1)
109+
103110
override fun part2() : Any {
104-
return ""
111+
var upper = 1000000000000L
112+
var lower = 1000000000000L / getOreRequired(1)
113+
114+
115+
116+
while (upper - lower > 1) {
117+
val middle = (upper + lower) / 2
118+
119+
val oreRequired = getOreRequired(middle)
120+
121+
if (oreRequired > 1000000000000L) {
122+
upper = middle
123+
} else {
124+
lower = middle
125+
}
126+
}
127+
128+
return lower
105129
}
106130
}

0 commit comments

Comments
 (0)