Compare commits
No commits in common. "17c6a9baac256d9ec911426126e07a41c7fed377" and "f399fcdea7d5b142372a8324df4ea28e0c4817dc" have entirely different histories.
17c6a9baac
...
f399fcdea7
@ -1,56 +0,0 @@
|
|||||||
package aoc2025
|
|
||||||
|
|
||||||
import println
|
|
||||||
import readInput
|
|
||||||
|
|
||||||
/*
|
|
||||||
--- Day 3: Lobby ---
|
|
||||||
https://adventofcode.com/2025/day/3
|
|
||||||
*/
|
|
||||||
fun main() {
|
|
||||||
val inlineTestInput = """
|
|
||||||
987654321111111
|
|
||||||
811111111111119
|
|
||||||
234234234234278
|
|
||||||
818181911112111
|
|
||||||
"""
|
|
||||||
|
|
||||||
val powTenTable = generateSequence(1L) { it * 10L }.take(20).toList().toLongArray()
|
|
||||||
|
|
||||||
fun rec(i: String, si: Int, left: Int): Long {
|
|
||||||
for (dig in 9 downTo 1) {
|
|
||||||
val dp = i.indexOf('0' + dig, si)
|
|
||||||
if (dp >= 0) {
|
|
||||||
if (left == 0) {
|
|
||||||
return dig.toLong()
|
|
||||||
} else {
|
|
||||||
val lastDigits = rec(i, dp + 1, left - 1)
|
|
||||||
if (lastDigits >= 0) return lastDigits + dig * powTenTable[left]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1L
|
|
||||||
}
|
|
||||||
|
|
||||||
fun part1(input: List<String>): Long {
|
|
||||||
return input.sumOf { rec(it, 0, 1) }
|
|
||||||
}
|
|
||||||
|
|
||||||
fun part2(input: List<String>): Long {
|
|
||||||
return input.sumOf { rec(it, 0, 11) }
|
|
||||||
}
|
|
||||||
|
|
||||||
// test if implementation meets criteria from the description, like:
|
|
||||||
val testInput = inlineTestInput.trim().reader().readLines()
|
|
||||||
//val testInput = readInput("aoc2025/Day03_test")
|
|
||||||
val testInputPart1Result = part1(testInput)
|
|
||||||
println("Part 1 Test: $testInputPart1Result")
|
|
||||||
val testInputPart2Result = part2(testInput)
|
|
||||||
println("Part 2 Test: $testInputPart2Result")
|
|
||||||
check(testInputPart1Result == 357L)
|
|
||||||
check(testInputPart2Result == 3121910778619L)
|
|
||||||
|
|
||||||
val input = readInput("aoc2025/Day03")
|
|
||||||
part1(input).println()
|
|
||||||
part2(input).println()
|
|
||||||
}
|
|
||||||
@ -4,19 +4,15 @@ import com.mohamedrejeb.ksoup.html.parser.KsoupHtmlHandler
|
|||||||
import com.mohamedrejeb.ksoup.html.parser.KsoupHtmlParser
|
import com.mohamedrejeb.ksoup.html.parser.KsoupHtmlParser
|
||||||
import fuel.Fuel
|
import fuel.Fuel
|
||||||
import fuel.method
|
import fuel.method
|
||||||
import kotlinx.coroutines.delay
|
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import java.io.FileNotFoundException
|
import java.io.FileNotFoundException
|
||||||
import java.nio.charset.Charset
|
import java.nio.charset.Charset
|
||||||
import java.nio.file.Files
|
import java.nio.file.Files
|
||||||
import java.nio.file.Paths
|
import java.nio.file.Paths
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
import java.time.LocalTime
|
|
||||||
import java.time.Month
|
import java.time.Month
|
||||||
import java.time.ZoneId
|
import java.time.ZoneId
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.time.Duration.Companion.minutes
|
|
||||||
import kotlin.time.Duration.Companion.seconds
|
|
||||||
|
|
||||||
fun main() {
|
fun main() {
|
||||||
var cookie = "<insert your session cookie here or store in gradle.properties>"
|
var cookie = "<insert your session cookie here or store in gradle.properties>"
|
||||||
@ -46,7 +42,7 @@ class Downloader(val year: Int, val packageName: String, val sessionCookie: Stri
|
|||||||
if (!Files.exists(targetDir)) {
|
if (!Files.exists(targetDir)) {
|
||||||
Files.createDirectories(targetDir)
|
Files.createDirectories(targetDir)
|
||||||
}
|
}
|
||||||
val now = LocalDate.now(ZoneId.of("UTC+1"))
|
val now = LocalDate.now(ZoneId.of("UTC-1"))
|
||||||
val maxPuzzles = if (year < 2025) 25 else 12
|
val maxPuzzles = if (year < 2025) 25 else 12
|
||||||
val lastDay = if (now.isBefore(LocalDate.of(year, Month.DECEMBER, maxPuzzles))) {
|
val lastDay = if (now.isBefore(LocalDate.of(year, Month.DECEMBER, maxPuzzles))) {
|
||||||
if (now.isAfter(LocalDate.of(year, Month.NOVEMBER, 30))) {
|
if (now.isAfter(LocalDate.of(year, Month.NOVEMBER, 30))) {
|
||||||
@ -64,20 +60,6 @@ class Downloader(val year: Int, val packageName: String, val sessionCookie: Stri
|
|||||||
val descriptionFile = targetDir.resolve(DESC_FILENAME.format(day))
|
val descriptionFile = targetDir.resolve(DESC_FILENAME.format(day))
|
||||||
val genClassFile = targetDir.resolve(GENCLASS_FILENAME.format(day))
|
val genClassFile = targetDir.resolve(GENCLASS_FILENAME.format(day))
|
||||||
if (!Files.exists(inputFile)) {
|
if (!Files.exists(inputFile)) {
|
||||||
if (day == lastDay && LocalTime.now(ZoneId.of("UTC+1")).hour < 5) {
|
|
||||||
println("Puzzle will not be available within the next hour. Skipping.")
|
|
||||||
break
|
|
||||||
}
|
|
||||||
while (day == lastDay && LocalTime.now(ZoneId.of("UTC+1")).hour == 5) {
|
|
||||||
println("Waiting until puzzle is available...")
|
|
||||||
runBlocking {
|
|
||||||
if (LocalTime.now(ZoneId.of("UTC+1")).minute < 59) {
|
|
||||||
delay(1.minutes)
|
|
||||||
} else {
|
|
||||||
delay(1.seconds)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
println("Attempting to download input for day $day")
|
println("Attempting to download input for day $day")
|
||||||
val (code, data) = downloadInput(day)
|
val (code, data) = downloadInput(day)
|
||||||
if (code != 200) {
|
if (code != 200) {
|
||||||
@ -175,7 +157,7 @@ class Downloader(val year: Int, val packageName: String, val sessionCookie: Stri
|
|||||||
url = "https://adventofcode.com/$year/day/$day$suffix",
|
url = "https://adventofcode.com/$year/day/$day$suffix",
|
||||||
method = "GET",
|
method = "GET",
|
||||||
headers = mapOf(
|
headers = mapOf(
|
||||||
"User-Agent" to "git.platon42.de/chrisly42/advent-of-code (chrisly@platon42.de)",
|
"User-Agent" to "git.platon42.de/chrisly42/advent-of-code",
|
||||||
"Cookie" to "session=$sessionCookie"
|
"Cookie" to "session=$sessionCookie"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user