2021-12-04 00:15:03 +01:00
|
|
|
import java.io.File
|
|
|
|
import java.math.BigInteger
|
|
|
|
import java.security.MessageDigest
|
|
|
|
|
2021-12-07 21:42:37 +01:00
|
|
|
var year: Int = 2021
|
|
|
|
|
|
|
|
private fun openFile(day: Int, name: String) = File("src/year%4d/day%02d".format(year, day), "$name.txt")
|
2021-12-06 10:35:12 +01:00
|
|
|
|
2021-12-04 00:15:03 +01:00
|
|
|
/**
|
|
|
|
* Reads lines from the given input txt file.
|
|
|
|
*/
|
2021-12-06 10:35:12 +01:00
|
|
|
fun readInput(day: Int, name: String) = openFile(day, name).readLines()
|
2021-12-04 00:15:03 +01:00
|
|
|
|
2021-12-19 17:37:36 +01:00
|
|
|
fun readInputAsString(day: Int, name: String) = openFile(day, name).readText()
|
2021-12-04 14:52:48 +01:00
|
|
|
fun readInputAsInts(day: Int, name: String) = readInput(day, name).map { it.toInt() }
|
2021-12-06 10:35:12 +01:00
|
|
|
fun readInputAsCommaSeparatedInts(day: Int, name: String) = openFile(day, name)
|
|
|
|
.readText()
|
|
|
|
.split(",")
|
|
|
|
.map { it.toInt() }
|
2021-12-04 13:26:57 +01:00
|
|
|
|
2021-12-12 10:03:01 +01:00
|
|
|
fun readGraph(day: Int, name: String) = readInput(day, name).fold(mapOf<String, Set<String>>()) { currentGraph, edge ->
|
|
|
|
val (fromVertex, toVertex) = edge.split("-")
|
|
|
|
val fromNeighbours = currentGraph.getOrDefault(fromVertex, emptySet()) + toVertex
|
|
|
|
val toNeighbours = currentGraph.getOrDefault(toVertex, emptySet()) + fromVertex
|
|
|
|
|
|
|
|
currentGraph + mapOf(fromVertex to fromNeighbours, toVertex to toNeighbours)
|
|
|
|
}.toMap()
|
|
|
|
|
2021-12-04 00:15:03 +01:00
|
|
|
/**
|
|
|
|
* Converts string to md5 hash.
|
|
|
|
*/
|
|
|
|
fun String.md5(): String = BigInteger(1, MessageDigest.getInstance("MD5").digest(toByteArray())).toString(16)
|
2021-12-22 16:45:45 +01:00
|
|
|
|
2021-12-22 20:07:03 +01:00
|
|
|
fun <A, B> product(xs: Sequence<A>, ys: Sequence<B>): Sequence<Pair<A, B>> =
|
|
|
|
xs.flatMap { x -> ys.map { y -> x to y } }
|
|
|
|
|
2021-12-22 16:45:45 +01:00
|
|
|
fun <A, B, C> product(xs: Sequence<A>, ys: Sequence<B>, zs: Sequence<C>): Sequence<Triple<A, B, C>> =
|
|
|
|
xs.flatMap { x -> ys.flatMap { y -> zs.map { z -> Triple(x, y, z) } } }
|
|
|
|
|
2021-12-22 20:07:03 +01:00
|
|
|
fun <A, B> product(xs: Iterable<A>, ys: Iterable<B>): Sequence<Pair<A, B>> =
|
|
|
|
product(xs.asSequence(), ys.asSequence())
|
|
|
|
|
2021-12-22 16:45:45 +01:00
|
|
|
fun <A, B, C> product(xs: Iterable<A>, ys: Iterable<B>, zs: Iterable<C>): Sequence<Triple<A, B, C>> =
|
|
|
|
product(xs.asSequence(), ys.asSequence(), zs.asSequence())
|