adamratzman
12/07/2020, 2:54 AMbjonnh
12/07/2020, 3:48 AMbjonnh
12/07/2020, 4:59 AMadamratzman
12/07/2020, 5:27 AMprivate val input = readInput("input7.txt")
fun main() {
val bags = input.split("\n").map { line ->
val bag = line.split(" bags contain")[0]
val others = if (line.contains("contain no other bags")) listOf()
else line.split("bags contain ")[1].removeSuffix(".").split(", ").map {
it.split(" ")[0].toInt() to it.split(" ").subList(1, it.split(" ").size - 1).joinToString(" ")
}
bag to others
}
fun recursePart1(startingBag: String, currentBag: String = startingBag): List<String> =
if (currentBag == "shiny gold") listOf(startingBag)
else bags.first { it.first == currentBag }.second.map { recursePart1(startingBag, it.second) }.flatten()
println("Part 1: ${bags.map { recursePart1(it.first) }.flatten().toSet().size - 1}")
fun recursePart2(startingBag: String, currentBag: String = startingBag): Int =
if (bags.first { it.first == currentBag }.second.isEmpty()) 1
else 1 + bags.first { it.first == currentBag }.second.sumBy { it.first * recursePart2(startingBag, it.second) }
println("Part 2: ${recursePart2("shiny gold") - 1}")
}
adamratzman
12/07/2020, 5:27 AMKroppeb
12/07/2020, 5:44 AMadamratzman
12/07/2020, 5:47 AMadamratzman
12/07/2020, 5:49 AMadamratzman
12/07/2020, 5:49 AMKroppeb
12/07/2020, 5:51 AMephemient
12/07/2020, 7:58 AMandyb
12/07/2020, 9:25 AMdata class Luggage(val colour: String, val contents: Map<String, Int>){
companion object {
private val LUGGAGE_REGEX = """^([a-z ]+) bags contain (.+)\.$""".toRegex()
private val CONTENTS_REGEX = """^(\d+) ([a-z ]+) bags?$""".toRegex()
fun of(input: String): Luggage {
val (colour, contents) = LUGGAGE_REGEX.matchEntire(input)!!.destructured
val innerBags: Map<String, Int> = when (contents){
"no other bags" -> emptyMap()
else -> {
contents.split(", ").map {
val (count, childColour) = CONTENTS_REGEX.matchEntire(it)!!.destructured
Pair(childColour, count.toInt())
}.toMap()
}
}
return Luggage(colour, innerBags)
}
}
}
fun main() {
val luggageItems = resourceFile("day07/Bags.txt").readLines().map { Luggage.of(it) }
val reverseMap = luggageItems.flatMap {
parent -> parent.contents.keys.map { childColour -> Pair(childColour, parent.colour) }
}.groupBy(keySelector = {it.first}){it.second}
val luggageMap = luggageItems.map { it.colour to it.contents }.toMap()
println("Part 1: ${findAncestors("shiny gold", reverseMap).size}")
println("Part 2: ${countBags("shiny gold", luggageMap) - 1}")
}
fun countBags(colour: String, luggageMap : Map<String, Map<String,Int>>) : Int {
return 1 + luggageMap[colour]!!.entries.sumBy { it.value * countBags(it.key, luggageMap) }
}
fun findAncestors(colour: String, reverseMap:Map<String,List<String>>): Set<String> {
val visited = mutableSetOf<String>()
val stack : Deque<String> = ArrayDeque<String>()
reverseMap[colour]!!.forEach { stack.add(it) }
while (!stack.isEmpty()){
val nextParent = stack.pop()!!
if (visited.add(nextParent)){
reverseMap[nextParent]?.let{ it.forEach { stack.add(it) } }
}
}
return visited
}
Michael de Kaste
12/07/2020, 10:47 AMobject Day7 : AdventOfCode() {
val parsed: Map<String, List<Pair<Int, String>>> = parseInput(input)
override fun part1() = mutableMapOf("shiny gold" to true).let { mem -> parsed.keys.count { containsShinyGold(mem, it) } - 1 }
private fun containsShinyGold(memory: MutableMap<String, Boolean>, currentColor: String) : Boolean = memory.getOrPut(currentColor){
parsed.getValue(currentColor).any { containsShinyGold(memory, it.second) }
}
override fun part2() = countBags(mutableMapOf(), "shiny gold") - 1
private fun countBags(memory: MutableMap<String, Int>, color: String) : Int = memory.getOrPut(color){
1 + parsed.getValue(color).sumBy { (amount, other) -> amount * countBags(memory, other) }
}
private fun parseInput(input: String) : Map<String, List<Pair<Int, String>>>{
return input.lines().map { line ->
val (main, rest) = line.split(" bags contain ")
main to when (rest) {
"no other bags." -> emptyList()
else -> rest.split(", ").map {
it.substringBefore(" ").toInt() to it.substringAfter(" ").substringBefore(" bag")
}
}
}.toMap()
}
}
Joris PZ
12/07/2020, 11:02 AMJakub Gwóźdź
12/07/2020, 1:59 PMNir
12/07/2020, 3:04 PMdata class ContainedBag(val num: Int, val name: String)
data class Rule(val containing: String, val contained: List<ContainedBag>)
fun String.toRule(): Rule {
val (containing, contained) = split(" contain ")
val containingBag = containing.popSuffix(" bags")!!
if (contained == "no other bags.") return Rule(containingBag, emptyList<ContainedBag>())
val containedBags = contained.split(", ", ".").filter { it.isNotEmpty() }.map {
val droppedSuffix = it.popSuffix(" bags") ?: it.popSuffix(" bag")!!
val result = droppedSuffix.split(" ", limit=2)
ContainedBag(result.first().toInt(), result.last())
}
return Rule(containingBag, containedBags)
}
fun getData() = (aocDataDir / "day7.txt").useLines { it.map { it.toRule() }.toList() }
fun addParents(parentGraph: Map<String, List<String>>, key: String, alreadyFound: MutableSet<String>): Unit {
for (bag in parentGraph[key] ?: return) {
if (bag in alreadyFound) continue
alreadyFound.add(bag)
addParents(parentGraph, bag, alreadyFound)
}
}
fun part1(): Int {
val parentMap = mutableMapOf<String, MutableList<String>>()
getData().forEach { rule -> rule.contained.forEach {
parentMap.getOrPut(it.name) { mutableListOf<String>() }.add(rule.containing)
} }
val bagSet = mutableSetOf<String>()
addParents(parentMap, "shiny gold", bagSet)
return bagSet.size
}
fun sumChildren(graph: Map<String, List<ContainedBag>>, key: String): Int {
return graph[key]!!
.map { it.num * (1 + sumChildren(graph, it.name)) }
.sum()
}
fun part2(): Int {
val graph = getData().associate { it.containing to it.contained }
return sumChildren(graph, "shiny gold")
}
Nir
12/07/2020, 3:05 PMNir
12/07/2020, 3:05 PMadamratzman
12/07/2020, 4:15 PMtodd.ginsberg
12/07/2020, 4:36 PMclass Day07(input: List<String>) {
private val bags: Map<String, Bag> = parseInput(input)
fun solvePart1(): Int =
bags.getValue("shiny gold").findAllParents().size
fun solvePart2(): Int =
bags.getValue("shiny gold").calculateCost() - 1
private fun parseInput(input: List<String>): Map<String, Bag> {
val relationships = input.filterNot { it.contains("no other") }.flatMap { row ->
val parts = row.replace(unusedText, "").split(whitespace)
val parent = parts.take(2).joinToString(" ")
parts.drop(2).windowed(3, 3, false).map { child ->
// Tuple = (Parent, Cost, Child)
Triple(parent, child.first().toInt(), child.drop(1).joinToString(" "))
}
}
return mutableMapOf<String, Bag>().apply {
relationships.forEach {
computeIfAbsent(it.first) { name -> Bag(name) }.apply {
val child = computeIfAbsent(it.third) { name -> Bag(name) }
children.add(Pair(child, it.second))
child.parents.add(this)
}
}
}
}
class Bag(
val name: String,
val parents: MutableSet<Bag> = mutableSetOf(),
val children: MutableSet<Pair<Bag, Int>> = mutableSetOf()
) {
fun findAllParents(): Set<Bag> =
parents.flatMap { setOf(it) + it.findAllParents() }.toSet()
fun calculateCost(): Int =
1 + children.sumBy { it.second * it.first.calculateCost() }
override fun equals(other: Any?): Boolean = when {
this === other -> true
other is Bag && name == other.name -> true
else -> false
}
override fun hashCode() = name.hashCode()
}
companion object {
private val unusedText = """bags|bag|contain|,|\.""".toRegex()
private val whitespace = """\s+""".toRegex()
}
}
andyb
12/07/2020, 4:40 PMtodd.ginsberg
12/07/2020, 6:05 PMtodd.ginsberg
12/07/2020, 6:36 PMCasey Brooks
12/07/2020, 7:12 PMJakub Gwóźdź
12/07/2020, 7:43 PMNir
12/07/2020, 7:49 PMandyb
12/07/2020, 8:21 PMfun main() {
val LUGGAGE_REGEX = """^([a-z ]+) bags contain (.+)\.$""".toRegex()
val CONTENTS_REGEX = """^(\d+) ([a-z ]+) bags?$""".toRegex()
// Rules held as a Tuple ( outer bag, inner bag, number required )
val rules : List<Triple<String, String, Int>> = resourceFile("day07/Bags.txt").readLines().flatMap {
val (colour, contents) = LUGGAGE_REGEX.matchEntire(it)!!.destructured
when (contents) {
"no other bags" -> emptyList()
else -> {
contents.split(", ").map {
val (count, childColour) = CONTENTS_REGEX.matchEntire(it)!!.destructured
Triple(colour,childColour, count.toInt())
}
}
}
}
fun ancestors(colour: String) : List<String> {
val ancestors = rules.filter{it.second == colour}
return ancestors.map { it.first } + ancestors.flatMap { ancestors(it.first) }
}
fun contents(colour: String) : Int {
return 1 + rules.filter{it.first == colour}.sumBy { it.third * contents(it.second) }
}
println("Part 1: ${ancestors("shiny gold").toSet().size}")
println("Part 2: ${contents("shiny gold") -1}")
}
Nir
12/07/2020, 8:28 PMNir
12/07/2020, 8:30 PMandyb
12/07/2020, 8:32 PMtodd.ginsberg
12/07/2020, 8:36 PMandyb
12/07/2020, 8:37 PMNir
12/07/2020, 8:38 PMNir
12/07/2020, 8:38 PMdata class ContainedBag(val num: Int, val name: String)
data class Rule(val containing: String, val contained: List<ContainedBag>)
Nir
12/07/2020, 8:38 PMandyb
12/07/2020, 8:38 PMfun ancestors(colour: String) : List<String> {
return rules
.filter{it.childColour == colour}
.flatMap { ancestors(it.parentColour) + it.parentColour }
}
fun contents(colour: String) : Int {
return 1 + rules.filter{it.parentColour == colour}.sumBy { it.count * contents(it.childColour) }
}
bjonnh
12/07/2020, 9:01 PMdata class Bag(
val name: String,
val content: MutableMap<Bag, Int>
) {
fun contains(name: String): Boolean = content.keys.any { it -> (it.name == name) || it.contains(name) }
fun count(): Int = content.map { (k, v) -> v * (1 + k.count()) }.sum()
}
fun main() {
val absoluteBags = mutableMapOf<String, Bag>()
linesFile("data/2020/07_input.txt").forEach {
val (bagName, rest) = it.replace("""\sbags?[\.,]?""".toRegex(), "").split(" contain ")
absoluteBags.putIfAbsent(bagName, Bag(bagName, mutableMapOf()))
rest.split(" ").chunked(3).filter { it[1] != "other" }.forEach {
val name = "${it[1]} ${it[2]}"
absoluteBags.putIfAbsent(name, Bag(name, mutableMapOf()))
absoluteBags[bagName]!!.content[absoluteBags[name]!!] = it[0].toInt()
}
}
println(absoluteBags.count { (k, v) -> v.contains("shiny gold") }) // 185
println(absoluteBags["shiny gold"]?.count()) // 89084
}
bjonnh
12/07/2020, 9:02 PMbjonnh
12/07/2020, 9:05 PMtodd.ginsberg
12/07/2020, 10:11 PMmickeelm
12/08/2020, 12:24 AM