@@ -12,8 +12,8 @@ class Day14(override val adventOfCode: AdventOfCode) : Day {
12
12
val input = adventOfCode.getInput(2019 , day).lines()
13
13
14
14
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 >()
17
17
18
18
fun distanceToOre () : Int {
19
19
if (name == " ORE" )
@@ -43,8 +43,7 @@ class Day14(override val adventOfCode: AdventOfCode) : Day {
43
43
}
44
44
}
45
45
46
- override fun part1 () : Any {
47
-
46
+ fun generateElementMap () : Map <String , Element > {
48
47
val elemMap = mutableMapOf<String , Element >()
49
48
50
49
elemMap[" ORE" ] = Element (1 , " ORE" )
@@ -53,7 +52,7 @@ class Day14(override val adventOfCode: AdventOfCode) : Day {
53
52
val (_, output) = line.split(" =>" )
54
53
55
54
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 ())
57
56
}
58
57
59
58
elemMap[outName] = Element (outQty, outName)
@@ -64,12 +63,12 @@ class Day14(override val adventOfCode: AdventOfCode) : Day {
64
63
val splitInputs = inputs.split(" ," )
65
64
66
65
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 ())
68
67
}
69
68
70
69
splitInputs.map {
71
70
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 ())
73
72
}
74
73
}.forEach { (elemName, qty) ->
75
74
elemMap[elemName]!! .let { toProduce ->
@@ -78,9 +77,15 @@ class Day14(override val adventOfCode: AdventOfCode) : Day {
78
77
}
79
78
}
80
79
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 }
82
87
83
- needed[elemMap[" FUEL" ]!! ] = 1
88
+ needed[elemMap[" FUEL" ]!! ] = fuelWanted
84
89
85
90
while (! needed.containsKey(elemMap[" ORE" ]!! ) || needed.size > 1 ) {
86
91
val cur = needed.keys.maxBy { it.distanceToOre() }!!
@@ -89,7 +94,7 @@ class Day14(override val adventOfCode: AdventOfCode) : Day {
89
94
needed.remove(cur)
90
95
91
96
var timesNeeded = quantity / cur.quantity
92
- if (quantity % cur.quantity != 0 )
97
+ if (quantity % cur.quantity != 0L )
93
98
timesNeeded + = 1
94
99
95
100
cur.producedBy.forEach { (elem, qty) ->
@@ -100,7 +105,26 @@ class Day14(override val adventOfCode: AdventOfCode) : Day {
100
105
return needed.values.single()
101
106
}
102
107
108
+ override fun part1 (): Any = getOreRequired(1 )
109
+
103
110
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
105
129
}
106
130
}
0 commit comments