1
0

Prepare for other years

This commit is contained in:
Hubert Van De Walle 2020-12-30 18:01:52 +01:00
parent 522618d106
commit 4a90257257
81 changed files with 277 additions and 253 deletions

14
2019/build.gradle.kts Normal file
View File

@ -0,0 +1,14 @@
plugins {
id("java-convention")
}
dependencies {
implementation(project(":utils"))
annotationProcessor(Libs.Micronaut.processor)
implementation(Libs.eclipseCollections)
testImplementation(Libs.Jmh.core)
testAnnotationProcessor(Libs.Jmh.processor)
}

View File

@ -0,0 +1,49 @@
package be.vandewalleh.aoc;
import be.vandewalleh.aoc.utils.factory.Days;
import be.vandewalleh.aoc.utils.input.Day;
import be.vandewalleh.aoc.utils.input.Input;
import be.vandewalleh.aoc.utils.input.Lines;
@Day(1)
public class Day01 {
public static void main(String[] args) {
var day = Days.createDay(Day01.class);
System.out.println(day.part1());
System.out.println(day.part2());
}
private final int[] input;
public Day01(@Lines Input<int[]> input) {
this.input = input.getValue();
}
private int fuel(int mass) {
return (mass / 3) - 2;
}
public int part1() {
var total = 0;
for (var mass : input) {
total += fuel(mass);
}
return total;
}
public int part2() {
var total = 0;
for (var mass : input) {
int fuel = fuel(mass);
int subTotal = fuel;
while (true) {
fuel = fuel(fuel);
if (fuel <= 0) break;
subTotal += fuel;
}
total += subTotal;
}
return total;
}
}

View File

@ -0,0 +1,100 @@
132791
78272
114679
60602
59038
69747
61672
147972
92618
70186
125826
61803
78112
124864
58441
113062
105389
125983
90716
75544
148451
73739
127762
146660
128747
148129
138635
80095
60241
145455
98730
59139
146828
113550
91682
107415
129207
147635
104583
102245
73446
148657
96364
52033
69964
63609
98207
73401
65511
115034
126179
96664
85394
128472
79017
93222
55267
102446
133150
148985
95325
57713
77370
60879
111977
99362
91581
55201
137670
127159
128324
77217
86378
112847
108265
80355
75650
106222
67793
113891
74508
139463
69972
122753
135854
127770
101085
98304
61451
146719
61225
60468
83613
137436
126303
78759
70081
110671
113234
111563

18
2020/build.gradle.kts Normal file
View File

@ -0,0 +1,18 @@
plugins {
id("kotlin-convention")
kotlin("kapt")
}
dependencies {
implementation(project(":utils"))
kapt(Libs.Micronaut.processor)
implementation(Libs.Slf4J.api)
runtimeOnly(Libs.Slf4J.simple)
implementation(Libs.eclipseCollections)
testImplementation(Libs.Jmh.core)
kaptTest(Libs.Jmh.processor)
}

View File

@ -3,7 +3,6 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
@Day(1)
class Day01(@Lines input: Input<IntArray>) {
@ -31,7 +30,3 @@ class Day01(@Lines input: Input<IntArray>) {
}
fun main() = with(createDay<Day01>()) {
println(part1())
println(part2())
}

View File

@ -3,12 +3,11 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
data class PasswordEntry(val range: IntRange, val letter: Char, val password: String)
@Day(2)
class Day02(@Lines input: Input<List<String>>) {
private data class PasswordEntry(val range: IntRange, val letter: Char, val password: String)
private val regex = "^(\\d+)-(\\d+) ([a-z]): (.*)$".toRegex()
private val passwords = input.value.map {
@ -22,8 +21,3 @@ class Day02(@Lines input: Input<List<String>>) {
(pwd[range.first - 1] == letter) xor (pwd[range.last - 1] == letter)
}
}
fun main() = with(createDay<Day02>()) {
println(part1())
println(part2())
}

View File

@ -3,14 +3,12 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
data class Slope(val x: Int, val y: Int)
@Day(3)
class Day03(@Lines val input: Input<List<String>>) {
private data class Slope(val x: Int, val y: Int)
fun part1(slope: Slope = Slope(x = 3, y = 1)): Int {
private fun findSlope(slope: Slope): Int {
val grid = input.value
var trees = 0
var x = 0
@ -28,6 +26,8 @@ class Day03(@Lines val input: Input<List<String>>) {
return trees
}
fun part1() = findSlope(Slope(x = 3, y = 1))
fun part2(): Long = listOf(
Slope(x = 1, y = 1),
Slope(x = 3, y = 1),
@ -35,11 +35,6 @@ class Day03(@Lines val input: Input<List<String>>) {
Slope(x = 7, y = 1),
Slope(x = 1, y = 2),
)
.map { part1(it).toLong() }
.map { findSlope(it).toLong() }
.reduce { acc, trees -> acc * trees }
}
fun main() = with(createDay<Day03>()) {
println(part1())
println(part2())
}

View File

@ -3,10 +3,9 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Text
import be.vandewalleh.aoc.utils.input.createDay
typealias Entry = Pair<String, String>
typealias Entries = List<Entry>
private typealias Entry = Pair<String, String>
private typealias Entries = List<Entry>
@Day(4)
class Day04(@Text val input: Input<String>) {
@ -42,8 +41,3 @@ class Day04(@Text val input: Input<String>) {
fun part2() = entries.count { it.hasRequiredKeys() && it.all { it.isValid() } }
}
fun main() = with(createDay<Day04>()) {
println(part1())
println(part2())
}

View File

@ -3,7 +3,6 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
@Day(5)
class Day05(@Lines val input: Input<List<String>>) {
@ -22,8 +21,3 @@ class Day05(@Lines val input: Input<List<String>>) {
.find { (a, b) -> b - a > 1 }!!
.first() + 1
}
fun main() = with(createDay<Day05>()) {
println(part1())
println(part2())
}

View File

@ -3,7 +3,6 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Text
import be.vandewalleh.aoc.utils.input.createDay
import org.eclipse.collections.impl.factory.primitive.CharBags
@Day(6)
@ -23,8 +22,3 @@ class Day06(@Text val input: Input<String>) {
}
}
fun main() = with(createDay<Day06>()) {
println(part1())
println(part2())
}

View File

@ -3,17 +3,16 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
import org.eclipse.collections.api.factory.Stacks
import org.eclipse.collections.api.multimap.list.ImmutableListMultimap
import org.eclipse.collections.api.stack.MutableStack
import org.eclipse.collections.impl.factory.Multimaps
data class Bag(val count: Int, val color: String)
@Day(7)
class Day07(@Lines val input: Input<List<String>>) {
private data class Bag(val count: Int, val color: String)
private val map: ImmutableListMultimap<String, Bag>
init {
@ -50,8 +49,3 @@ class Day07(@Lines val input: Input<List<String>>) {
fun part2() = bagSequence("shiny gold").sumBy { it.count }
}
fun main() = with(createDay<Day07>()) {
println(part1())
println(part2())
}

View File

@ -3,7 +3,6 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
import org.eclipse.collections.impl.factory.primitive.IntLists
import org.eclipse.collections.impl.factory.primitive.IntSets
@ -15,7 +14,12 @@ class Day08(@Lines val input: Input<List<String>>) {
Instruction(Operation.valueOf(words[0].capitalize()), words[1].toInt())
}.toTypedArray()
fun part1() = run(instructions)
fun part1() = run(instructions).let {
when (it) {
is VmResult.Looped -> it.acc
is VmResult.Terminated -> it.acc
}
}
private fun run(instructions: Array<Instruction>): VmResult {
var acc = 0
@ -41,7 +45,7 @@ class Day08(@Lines val input: Input<List<String>>) {
return VmResult.Looped(acc)
}
fun part2(): VmResult {
fun part2(): Int {
val possibleMutations = IntLists.mutable.empty()
instructions.forEachIndexed { i, e ->
if (e.operation == Operation.Jmp || e.operation == Operation.Nop) possibleMutations.add(i)
@ -54,7 +58,7 @@ class Day08(@Lines val input: Input<List<String>>) {
}
val res = run(copy)
if (res is VmResult.Terminated) return res
if (res is VmResult.Terminated) return res.acc
}
error("No result found")
@ -62,17 +66,11 @@ class Day08(@Lines val input: Input<List<String>>) {
}
enum class Operation { Acc, Jmp, Nop }
private enum class Operation { Acc, Jmp, Nop }
data class Instruction(val operation: Operation, val argument: Int)
private data class Instruction(val operation: Operation, val argument: Int)
sealed class VmResult {
private sealed class VmResult {
data class Looped(val acc: Int) : VmResult()
data class Terminated(val acc: Int) : VmResult()
}
fun main() {
val day = createDay<Day08>()
println(day.part1())
println(day.part2())
}

View File

@ -3,7 +3,6 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
@Day(9)
class Day09(@Lines val input: Input<LongArray>) {
@ -49,8 +48,3 @@ class Day09(@Lines val input: Input<LongArray>) {
}
}
fun main() = with(createDay<Day09>()) {
println(part1())
println(part2())
}

View File

@ -3,7 +3,6 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
import org.eclipse.collections.api.list.primitive.MutableIntList
import org.eclipse.collections.impl.factory.primitive.IntLists
import org.eclipse.collections.impl.factory.primitive.IntLongMaps
@ -43,8 +42,3 @@ class Day10(@Lines val input: Input<IntArray>) {
}
}
fun main() = with(createDay<Day10>()) {
println(part1())
println(part2())
}

View File

@ -3,27 +3,26 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
typealias Seats = Array<CharArray>
private typealias Seats = Array<CharArray>
fun Seats.deepClone(): Seats = map { it.clone() }.toTypedArray()
private fun Seats.deepClone(): Seats = map { it.clone() }.toTypedArray()
operator fun Seats.get(x: Int, y: Int): Char = this[y][x]
operator fun Seats.set(x: Int, y: Int, value: Char) {
private operator fun Seats.get(x: Int, y: Int): Char = this[y][x]
private operator fun Seats.set(x: Int, y: Int, value: Char) {
this[y][x] = value
}
operator fun Seats.contains(xy: Pair<Int, Int>): Boolean {
private operator fun Seats.contains(xy: Pair<Int, Int>): Boolean {
val (x, y) = xy
return x in 0 until width && y in 0 until height
}
val Seats.width get() = first().size
val Seats.height get() = size
private val Seats.width get() = first().size
private val Seats.height get() = size
fun Seats.asGridString() = joinToString("\n") { it.joinToString("") }
fun Seats.countOccupied() = sumBy { it.count { it == '#' } }
private fun Seats.asGridString() = joinToString("\n") { it.joinToString("") }
private fun Seats.countOccupied() = sumBy { it.count { it == '#' } }
@Day(11)
class Day11(@Lines val input: Input<List<String>>) {
@ -116,8 +115,3 @@ class Day11(@Lines val input: Input<List<String>>) {
fun part2() = findLastRepeating(seats, ::progress2).countOccupied()
}
fun main() = with(createDay<Day11>()) {
println(part1())
println(part2())
}

View File

@ -3,7 +3,6 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
import kotlin.math.abs
@Day(12)
@ -79,8 +78,3 @@ class Day12(@Lines val input: Input<List<String>>) {
return abs(x) + abs(y)
}
}
fun main() = with(createDay<Day12>()) {
println(part1())
println(part2())
}

View File

@ -3,10 +3,9 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
import kotlin.math.abs
data class Bus(val index: Int, val id: Long)
private data class Bus(val index: Int, val id: Long)
@Day(13)
class Day13(@Lines val input: Input<List<String>>) {
@ -48,8 +47,3 @@ class Day13(@Lines val input: Input<List<String>>) {
return t
}
}
fun main() = with(createDay<Day13>()) {
println(part1())
println(part2())
}

View File

@ -3,7 +3,6 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
import kotlin.math.pow
import org.eclipse.collections.impl.factory.primitive.IntObjectMaps
import org.eclipse.collections.impl.factory.primitive.LongIntMaps
@ -93,8 +92,3 @@ class Day14(@Lines val input: Input<List<String>>) {
}
}
fun main() = with(createDay<Day14>()) {
println(part1())
println(part2())
}

View File

@ -3,7 +3,6 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Csv
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.createDay
import kotlin.math.abs
import org.eclipse.collections.impl.factory.primitive.IntObjectMaps
@ -43,11 +42,3 @@ class Day15(@Csv val input: Input<IntArray>) {
fun part2() = run(until = 30000000)
}
fun main() {
// val input = Input(intArrayOf(3, 1, 2))
with(createDay<Day15>()) {
println(part1())
println(part2())
}
}

View File

@ -3,7 +3,6 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Groups
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.createDay
import org.eclipse.collections.api.multimap.list.ListMultimap
import org.eclipse.collections.api.multimap.list.MutableListMultimap
import org.eclipse.collections.api.multimap.set.MutableSetMultimap
@ -148,8 +147,3 @@ class Day16(@Groups val input: Input<List<List<String>>>) {
return rangesByName
}
}
fun main() = with(createDay<Day16>()) {
println(part1())
println(part2())
}

View File

@ -3,12 +3,11 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
data class Point(val x: Int, val y: Int, val z: Int)
data class Point4(val x: Int, val y: Int, val z: Int, val blah: Int)
private data class Point(val x: Int, val y: Int, val z: Int)
private data class Point4(val x: Int, val y: Int, val z: Int, val blah: Int)
enum class State { Active, Inactive }
private enum class State { Active, Inactive }
@Day(17)
class Day17(@Lines val input: Input<List<String>>) {
@ -87,8 +86,3 @@ class Day17(@Lines val input: Input<List<String>>) {
}
}
fun main() = with(createDay<Day17>()) {
println(part1())
println(part2())
}

View File

@ -3,14 +3,13 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
import java.util.*
import org.slf4j.Logger
import org.slf4j.LoggerFactory
enum class Operator { Add, Multiply }
private enum class Operator { Add, Multiply }
operator fun Operator.invoke(a: Long, b: Long) = when (this) {
private operator fun Operator.invoke(a: Long, b: Long) = when (this) {
Operator.Add -> a + b
Operator.Multiply -> a * b
}
@ -170,8 +169,3 @@ class Day18(@Lines val input: Input<List<String>>) {
.reduce { t, u -> t + u }
.get()
}
fun main() = with(createDay<Day18>()) {
println(part1())
println(part2())
}

View File

@ -3,7 +3,6 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Groups
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.createDay
import java.util.*
import kotlin.collections.ArrayList
@ -56,8 +55,3 @@ class Day19(@Groups val input: Input<List<List<String>>>) {
}
}
fun main() = with(createDay<Day19>()) {
println(part1())
println(part2())
}

View File

@ -6,7 +6,6 @@ import be.vandewalleh.aoc.days.geometry.transformations
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Groups
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.createDay
import java.util.*
import kotlin.collections.ArrayList
import kotlin.math.sqrt
@ -204,8 +203,3 @@ class Day20(@Groups val input: Input<List<List<String>>>) {
}
}
fun main() = with(createDay<Day20>()) {
println(part1())
println(part2())
}

View File

@ -3,7 +3,6 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
import org.eclipse.collections.api.factory.Bags
import org.eclipse.collections.api.multimap.set.MutableSetMultimap
import org.eclipse.collections.impl.factory.Multimaps
@ -57,8 +56,3 @@ class Day21(@Lines val input: Input<List<String>>) {
return map
}
}
fun main() = with(createDay<Day21>()) {
println(part1())
println(part2())
}

View File

@ -3,9 +3,8 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Groups
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.createDay
data class PlayedGame(val a: List<Int>, val b: List<Int>)
private data class PlayedGame(val a: List<Int>, val b: List<Int>)
@Day(22)
class Day22(@Groups val input: Input<List<List<String>>>) {
@ -76,9 +75,3 @@ class Day22(@Groups val input: Input<List<List<String>>>) {
return if (one.isEmpty()) 2 else 1
}
}
fun main() = with(createDay<Day22>()) {
println(part1())
println(part2())
}

View File

@ -3,7 +3,6 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Text
import be.vandewalleh.aoc.utils.input.createDay
@Day(23)
class Day23(@Text val input: Input<String>) {
@ -111,8 +110,3 @@ class Day23(@Text val input: Input<String>) {
return current.next
}
}
fun main() = with(createDay<Day23>()) {
println(part1())
println(part2())
}

View File

@ -3,7 +3,6 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
import org.eclipse.collections.api.bag.Bag
import org.eclipse.collections.api.bag.MutableBag
import org.eclipse.collections.api.factory.Bags
@ -65,8 +64,3 @@ class Day24(@Lines val input: Input<List<String>>) {
return bag.selectBlacks().size()
}
}
fun main() = with(createDay<Day24>()) {
println(part1())
println(part2())
}

View File

@ -3,7 +3,6 @@ package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
@Day(25)
class Day25(@Lines val input: Input<IntArray>) {
@ -44,7 +43,3 @@ class Day25(@Lines val input: Input<IntArray>) {
}
}
fun main() = with(createDay<Day25>()) {
println(part1())
}

View File

@ -0,0 +1,7 @@
package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.factory.createDay
fun main() = with(createDay<Day25>()) {
println(part1())
}

View File

@ -0,0 +1,6 @@
org.slf4j.simpleLogger.logFile=System.out
org.slf4j.simpleLogger.showDateTime=true
org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z
org.slf4j.simpleLogger.defaultLogLevel=info
org.slf4j.simpleLogger.log.io.micronaut=info
org.slf4j.simpleLogger.log.io.micronaut.context.lifecycle=info

View File

@ -1,7 +1,7 @@
package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.factory.createDay
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.createDay
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Nested

View File

@ -1,6 +1,6 @@
package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.createDay
import be.vandewalleh.aoc.utils.factory.createDay
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test

View File

@ -1,6 +1,6 @@
package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.createDay
import be.vandewalleh.aoc.utils.factory.createDay
import java.util.concurrent.TimeUnit
import org.openjdk.jmh.annotations.*
import org.openjdk.jmh.infra.Blackhole

View File

@ -1,6 +1,6 @@
package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.createDay
import be.vandewalleh.aoc.utils.factory.createDay
import java.util.concurrent.TimeUnit
import org.openjdk.jmh.annotations.*
import org.openjdk.jmh.infra.Blackhole

View File

@ -1,5 +1,5 @@
plugins {
id("advent-of-code")
id("advent-of-code-downloader")
}
adventOfCode {

View File

@ -1,3 +1,5 @@
import java.io.File
import java.time.LocalDateTime
import kong.unirest.Unirest
import org.gradle.api.GradleException
import org.gradle.api.Plugin
@ -5,15 +7,13 @@ import org.gradle.api.Project
import org.gradle.api.tasks.SourceSetContainer
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.getByType
import java.io.File
import java.time.LocalDateTime
open class AdventOfCodeExtension {
var session: String? = null
var year: Int = 2020
}
class AdventOfCodePlugin : Plugin<Project> {
class AdventOfCodeDownloaderPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.tasks.create("aoc") {
group = "Advent of Code"

View File

@ -0,0 +1 @@
implementation-class=AdventOfCodeDownloaderPlugin

View File

@ -1 +0,0 @@
implementation-class=AdventOfCodePlugin

View File

@ -1,27 +0,0 @@
plugins {
id("kotlin-convention")
kotlin("kapt")
}
dependencies {
implementation(project(":utils"))
implementation(Libs.Micronaut.core)
implementation(Libs.Micronaut.inject)
implementation(Libs.Micronaut.kotlin)
kapt(Libs.Micronaut.processor)
implementation(Libs.Slf4J.api)
runtimeOnly(Libs.Slf4J.simple)
implementation(Libs.eclipseCollections) {
because("Primitive collections mostly")
}
implementation(Libs.Arrow.core) {
because("Just in case")
}
testImplementation(Libs.Jmh.core)
kaptTest(Libs.Jmh.processor)
}

View File

@ -1,3 +1,4 @@
rootProject.name = "aoc-2020"
rootProject.name = "Advent of Code"
include("utils")
include("days")
include("2020")
include("2019")

View File

@ -5,7 +5,7 @@ plugins {
dependencies {
implementation(Libs.Micronaut.core)
implementation(Libs.Micronaut.inject)
api(Libs.Micronaut.inject)
implementation(Libs.Micronaut.kotlin)
kapt(Libs.Micronaut.processor)

View File

@ -0,0 +1,27 @@
@file:JvmName("Days")
package be.vandewalleh.aoc.utils.factory
import be.vandewalleh.aoc.utils.input.TempFileResourceLoader
import io.micronaut.context.BeanContext
import java.io.File
fun <T> createDay(beanType: Class<T>): T = BeanContext.run().getBean(beanType)
inline fun <reified T> createDay() = createDay(T::class.java)
// A custom resourceLoader that returns a string should be more appropriate but ¯\_(ツ)_/¯
private fun BeanContext.registerExampleLoader(example: String) {
registerSingleton(TempFileResourceLoader(File.createTempFile("aoc-example", ".txt").apply {
writeText(example)
}))
}
fun <T> createDay(beanType: Class<T>, example: String): T {
return BeanContext.build()
.apply { registerExampleLoader(example) }
.start()
.getBean(beanType)
}
inline fun <reified T> createDay(example: String): T = createDay(T::class.java, example)

View File

@ -10,7 +10,7 @@ import javax.inject.Qualifier
@Qualifier
@Introspected
@Target(AnnotationTarget.CLASS)
annotation class Day(val day: Int)
annotation class Day(val value: Int)
@Qualifier
@Prototype

View File

@ -90,7 +90,7 @@ class InputFactory(private val resourceLoader: ResourceLoader) {
if (dayAnnotation.isEmpty)
error("@DayInput cannot only be used on classes annotated with ${Day::class.qualifiedName}")
return dayAnnotation.get().intValue("day").asInt
return dayAnnotation.get().intValue("value").asInt
}
companion object {

View File

@ -1,36 +1,11 @@
package be.vandewalleh.aoc.utils.input
import io.micronaut.context.BeanContext
import io.micronaut.context.getBean
import io.micronaut.core.annotation.AnnotationMetadataDelegate
import io.micronaut.core.annotation.AnnotationMetadataProvider
import io.micronaut.core.annotation.AnnotationValue
import io.micronaut.core.beans.BeanIntrospection
import java.io.File
import java.util.*
internal inline fun <reified T> getIntrospection(): BeanIntrospection<T> =
BeanIntrospection.getIntrospection(T::class.java)
internal inline fun <reified T : Annotation> AnnotationMetadataDelegate.getAnnotation(): AnnotationValue<T>? =
getAnnotation(T::class.java)
internal inline fun <reified T : Annotation> AnnotationMetadataProvider.findAnnotation(): Optional<AnnotationValue<T>> =
findAnnotation(T::class.java)
internal inline fun <reified T : Annotation> AnnotationMetadataProvider.hasAnnotation(): Boolean =
findAnnotation(T::class.java).isPresent
inline fun <reified T> createDay() = BeanContext.run().getBean<T>()
// A custom resourceLoader that returns a string should be more appropriate but ¯\_(ツ)_/¯
fun BeanContext.registerExampleLoader(example: String) {
registerSingleton(TempFileResourceLoader(File.createTempFile("aoc-example", ".txt").apply {
writeText(example)
}))
}
inline fun <reified T> createDay(example: String): T = BeanContext.build()
.apply { registerExampleLoader(example) }
.start()
.getBean()

View File

@ -1,12 +1,13 @@
package be.vandewalleh.aoc.utils.input
import be.vandewalleh.aoc.utils.factory.createDay
import com.google.common.jimfs.Jimfs
import io.micronaut.context.annotation.Replaces
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import javax.inject.Singleton
import kotlin.io.path.ExperimentalPathApi
import kotlin.io.path.writeText
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
class DayTest {