J茅r么me Gully
12/08/2020, 9:07 PMbjonnh
12/08/2020, 9:15 PMJ茅r么me Gully
12/08/2020, 9:18 PMJ茅r么me Gully
12/08/2020, 9:19 PMfun String.asBags(): HashMap<String, List<String>> {
val bags = hashMapOf<String, List<String>>()
lines().filterNot { it.endsWith("no other bags.") }
.filterNot { it.startsWith("shiny gold") }
.also { println("size ${it.size}") }
.forEach { line ->
val (bagName, children) = line.split(" bags contain ")
val childrenList = children.dropLast(1)
.split(", ")
.map { bag -> bag.drop(2) }
.map { it.replace(" bags", "").replace(" bag", "") }
bags += bagName to childrenList
}
return bags
}
This is for the data structure creationadamratzman
12/08/2020, 9:19 PMJ茅r么me Gully
12/08/2020, 9:20 PMfun isShinyInside(bagName: String, bags: HashMap<String, List<String>>): Boolean {
println("next bag name: $bagName")
val children = bags[bagName]
if (children?.any { child -> child == "shiny gold" } == true) {
println(" ** shiny found **")
return true
} else {
println("no shiny found, go deeper")
indent++
children?.forEach { child ->
return isShinyInside(child, bags)
}
}
return false
}
Recursive partadamratzman
12/08/2020, 9:20 PMJ茅r么me Gully
12/08/2020, 9:20 PM@Test
fun `sum of shiny gold bags`() {
val bags = realInput.asBags()
val sum = bags.keys.sumBy { bagName ->
if (isShinyInside(bagName, bags)) 1 else 0
}
println("Part A: $sum")
}
Use real input with isShinyInside
to count shiny goldJ茅r么me Gully
12/08/2020, 9:21 PMJ茅r么me Gully
12/08/2020, 9:22 PMclass Day7 {
@Nested
inner class PartA {
@Nested
inner class `Example data` {
@Test
fun `assert sum of shiny gold bags is 4`() {
val bags = exampleInput.asBags()
val sum = bags.keys.sumBy { bagName ->
// println("loop $bagName")
if (isShinyInside(bagName, bags)) 1 else 0
}
assertEquals(4, sum)
}
}
@Nested
inner class `Real data` {
@Test
fun `sum of shiny gold bags`() {
val bags = realInput.asBags()
val sum = bags.keys.sumBy { bagName ->
if (isShinyInside(bagName, bags)) 1 else 0
}
println("Part A: $sum")
}
}
}
fun isShinyInside(bagName: String, bags: HashMap<String, List<String>>): Boolean {
println("next bag name: $bagName")
val children = bags[bagName]
if (children?.any { child -> child == "shiny gold" } == true) {
println(" ** shiny found **")
return true
} else {
println("no shiny found, go deeper")
children?.forEach { child ->
return isShinyInside(child, bags)
}
}
return false
}
// data class Bag(val name: String, val childrenBags: List<Bag> = emptyList(), var count: Int = 1)
fun String.asBags(): HashMap<String, List<String>> {
val bags = hashMapOf<String, List<String>>()
lines().filterNot { it.endsWith("no other bags.") }
.filterNot { it.startsWith("shiny gold") }
.also { println("size ${it.size}") }
.forEach { line ->
val (bagName, children) = line.split(" bags contain ")
val childrenList = children.dropLast(1)
.split(", ")
.map { bag -> bag.drop(2) }
.map { it.replace(" bags", "").replace(" bag", "") }
bags += bagName to childrenList
}
return bags
}
}
I used the test approach, I ommited the companion object with inputJ茅r么me Gully
12/08/2020, 9:23 PMbjonnh
12/08/2020, 9:26 PMJ茅r么me Gully
12/08/2020, 9:27 PMJ茅r么me Gully
12/08/2020, 9:28 PMbjonnh
12/08/2020, 9:28 PMbjonnh
12/08/2020, 9:29 PMchildren?.forEach { child ->
return isShinyInside(child, bags)
}
not sure that's rightbjonnh
12/08/2020, 9:30 PMadamratzman
12/08/2020, 9:30 PMbjonnh
12/08/2020, 9:30 PMbjonnh
12/08/2020, 9:30 PMadamratzman
12/08/2020, 9:31 PMJ茅r么me Gully
12/08/2020, 9:32 PMJ茅r么me Gully
12/08/2020, 9:32 PMadamratzman
12/08/2020, 9:35 PMfun isShinyInside(bagName: String, bags: HashMap<String, List<String>>): Boolean {
val children = bags[bagName]
return bagName == "shiny gold" || children != null &&
(children.any { child -> child == "shiny gold" } || children.any { child -> isShinyInside(child, bags) })
}
bjonnh
12/08/2020, 9:35 PMJ茅r么me Gully
12/08/2020, 9:36 PMJ茅r么me Gully
12/08/2020, 9:36 PMJ茅r么me Gully
12/08/2020, 9:38 PMJ茅r么me Gully
12/08/2020, 9:39 PMbjonnh
12/08/2020, 9:39 PMbjonnh
12/08/2020, 9:40 PMbjonnh
12/08/2020, 9:40 PMadamratzman
12/08/2020, 9:42 PMJ茅r么me Gully
12/08/2020, 9:43 PMJ茅r么me Gully
12/08/2020, 9:43 PMbjonnh
12/08/2020, 9:44 PMbjonnh
12/08/2020, 9:44 PMbjonnh
12/08/2020, 9:44 PMbjonnh
12/08/2020, 9:44 PMbjonnh
12/08/2020, 9:45 PMadamratzman
12/09/2020, 1:01 AM