Add archive from Advent of Code 2017.
This commit is contained in:
commit
ad81a01063
19
day10_1.rb
Normal file
19
day10_1.rb
Normal file
|
@ -0,0 +1,19 @@
|
|||
initial_string = [*0..255]
|
||||
# initial_string = [*0..4]
|
||||
shifts = File.open('puzzle_10.txt').read.split(',').map(&:to_i)
|
||||
# shifts = [3, 4, 1, 5]
|
||||
skip_size = 0
|
||||
offset = 0
|
||||
for shift in shifts do
|
||||
initial_string.rotate! offset
|
||||
if shift > 0 then
|
||||
rotated_bit = initial_string[0..shift - 1]
|
||||
kept_bit = initial_string[shift..initial_string.length-1]
|
||||
initial_string = rotated_bit.reverse + kept_bit
|
||||
end
|
||||
initial_string.rotate! -offset
|
||||
offset += shift + skip_size
|
||||
skip_size += 1
|
||||
end
|
||||
print initial_string[0] * initial_string[1]
|
||||
|
27
day10_2.rb
Normal file
27
day10_2.rb
Normal file
|
@ -0,0 +1,27 @@
|
|||
initial_string = [*0..255]
|
||||
suffix = [17, 31, 73, 47, 23]
|
||||
# shifts = File.open('puzzle_10.txt').read.split(',').map(&:to_i) + suffix
|
||||
# shifts = [1, 2, 3] + suffix
|
||||
# shifts = suffix
|
||||
string = '129,154,49,198,200,133,97,254,41,6,2,1,255,0,191,108' # File.open('puzzle_10.txt').read
|
||||
shifts = string.split('').map(&:ord)
|
||||
shifts = shifts + suffix
|
||||
skip_size = 0
|
||||
offset = 0
|
||||
shifts = shifts * 64
|
||||
for shift in shifts do
|
||||
initial_string.rotate! offset
|
||||
if shift > 0 then
|
||||
rotated_bit = initial_string[0..shift - 1]
|
||||
kept_bit = initial_string[shift..initial_string.length-1]
|
||||
initial_string = rotated_bit.reverse + kept_bit
|
||||
end
|
||||
initial_string.rotate! -offset
|
||||
offset += shift + skip_size
|
||||
skip_size += 1
|
||||
end
|
||||
blocks = initial_string.each_slice(16).to_a
|
||||
hash = blocks.map do |block|
|
||||
block.inject(0) { |x, y| x^y }.to_s(16)
|
||||
end
|
||||
puts hash.join('')
|
24
day11.kt
Normal file
24
day11.kt
Normal file
|
@ -0,0 +1,24 @@
|
|||
import java.io.File
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val directions = mapOf("n" to (0 to 1),
|
||||
"s" to (0 to-1),
|
||||
"ne" to (1 to 1),
|
||||
"nw" to (-1 to 1),
|
||||
"se" to (1 to -1),
|
||||
"sw" to (-1 to -1))
|
||||
// val instructionString = File("../puzzle_10.txt").readLines().first()
|
||||
val instructionString = "sw,sw,sw,nw"
|
||||
var indexX = 0
|
||||
var indexY = 0
|
||||
var maxDistance = 0
|
||||
instructionString.split(",").forEach {
|
||||
name: String ->
|
||||
val (dx, dy) = directions[name]!!
|
||||
indexX += dx
|
||||
indexY += dy
|
||||
maxDistance = Math.max(maxDistance, Math.max(Math.abs(indexX), Math.abs(indexY)))
|
||||
}
|
||||
println("${Math.max(Math.abs(indexX), Math.abs(indexY))}")
|
||||
println("$maxDistance")
|
||||
}
|
39
day12.kt
Normal file
39
day12.kt
Normal file
|
@ -0,0 +1,39 @@
|
|||
import java.io.File
|
||||
|
||||
fun findPath(current: String, to: String, connections: Map<String, List<String>>, visited: MutableList<String> = mutableListOf()): Boolean {
|
||||
if(current == to) return true
|
||||
if(visited.contains(current)) return false
|
||||
visited.add(current)
|
||||
return connections[current]!!.any { findPath(it, to, connections, visited) }
|
||||
}
|
||||
|
||||
fun findGroup(current: String, connections: Map<String, List<String>>, visited: MutableList<String> = mutableListOf()): MutableList<String> {
|
||||
if(visited.contains(current)) return visited
|
||||
visited.add(current)
|
||||
for(connection in connections[current]!!) findGroup(connection, connections, visited)
|
||||
return visited
|
||||
}
|
||||
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val sourceFile = File("../puzzle_12.txt")
|
||||
// val sourceFile = File("test.txt")
|
||||
val connectionMaps = mutableMapOf<String, MutableList<String>>()
|
||||
sourceFile.readLines().forEach {
|
||||
val programId = it.split(" <-> ")[0]
|
||||
val programs = it.split(" <-> ")[1].split(", ")
|
||||
programs
|
||||
.map { connectionMaps.computeIfAbsent(it) { mutableListOf() } }
|
||||
.forEach { it.add(programId) }
|
||||
connectionMaps.computeIfAbsent(programId) { mutableListOf() }.addAll(programs)
|
||||
}
|
||||
val total = connectionMaps.keys.sumBy { if(findPath(it, "0", connectionMaps)) 1 else 0 }
|
||||
val programs = connectionMaps.keys
|
||||
var groups = 0
|
||||
while(programs.size > 0) {
|
||||
programs.removeAll(findGroup(programs.first(), connectionMaps))
|
||||
groups++
|
||||
}
|
||||
println(total)
|
||||
println(groups)
|
||||
}
|
35
day13.kt
Normal file
35
day13.kt
Normal file
|
@ -0,0 +1,35 @@
|
|||
import java.io.File
|
||||
|
||||
fun updateScanners(depths: MutableMap<Int, Int>, scannerPos: MutableMap<Int, Int>, scannerDirection: MutableMap<Int, Int>){
|
||||
depths.forEach { t, u ->
|
||||
val absent = !scannerPos.contains(t)
|
||||
val position = scannerPos.computeIfAbsent(t) { -1 }
|
||||
val direction = scannerDirection.computeIfAbsent(t) { 1 }
|
||||
val nextPosition = (position + direction)
|
||||
if(nextPosition == u - 1 || (nextPosition == 0 && !absent)) scannerDirection.put(t, -direction)
|
||||
scannerPos.put(t, nextPosition)
|
||||
}
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
// val sourceFile = File("../puzzle_13.txt")
|
||||
val sourceFile = File("test.txt")
|
||||
val allLines = sourceFile.readLines()
|
||||
val firstLine = allLines.first()
|
||||
val depthMap = mutableMapOf<Int, Int>()
|
||||
allLines.forEach {
|
||||
depthMap.put(it.split(": ")[0].toInt(), it.split(": ")[1].toInt())
|
||||
}
|
||||
val scannerPos = mutableMapOf<Int, Int>()
|
||||
val scannerDir = mutableMapOf<Int, Int>()
|
||||
var currentIndex = 0
|
||||
var cost = 0
|
||||
val goalIndex = depthMap.keys.sorted().last()
|
||||
while(currentIndex <= goalIndex) {
|
||||
updateScanners(depthMap, scannerPos, scannerDir)
|
||||
if(!depthMap.containsKey(currentIndex)) {}
|
||||
else if(scannerPos[currentIndex]!! == 0) cost += depthMap[currentIndex]!! * currentIndex
|
||||
currentIndex++
|
||||
}
|
||||
println(cost)
|
||||
}
|
33
day13_2.kt
Normal file
33
day13_2.kt
Normal file
|
@ -0,0 +1,33 @@
|
|||
import java.io.File
|
||||
import kotlin.math.cos
|
||||
import kotlin.system.measureTimeMillis
|
||||
|
||||
fun main(args: Array<String>){
|
||||
val file = File("../puzzle_13.txt")
|
||||
// val file = File("test.txt")
|
||||
val lines = file.readLines()
|
||||
val scannerDepths = mutableMapOf<Int, Int>()
|
||||
lines.forEach {
|
||||
val pieces = it.split(": ")
|
||||
scannerDepths.put(pieces[0].toInt(), pieces[1].toInt())
|
||||
}
|
||||
var offset = 0
|
||||
|
||||
val cost = scannerDepths.map {
|
||||
if(it.key + offset % ((it.value - 1) * 2) == 0) it.value * it.key else 0
|
||||
}.fold(0) { a, b -> a + b}
|
||||
|
||||
val time = measureTimeMillis {
|
||||
while(offset < Int.MAX_VALUE){
|
||||
val cost = scannerDepths.map {
|
||||
if((it.key + offset) % ((it.value - 1) * 2) == 0) it.value * it.key + 1 else 0
|
||||
}.fold(0) { a, b -> a + b}
|
||||
if(cost == 0) {
|
||||
println(offset)
|
||||
break
|
||||
}
|
||||
offset++
|
||||
}
|
||||
}
|
||||
println(time)
|
||||
}
|
15
day13_2_crt.kt
Normal file
15
day13_2_crt.kt
Normal file
|
@ -0,0 +1,15 @@
|
|||
import java.io.File
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
// val file = File("../puzzle_13.txt")
|
||||
val file = File("test.txt")
|
||||
val lines = file.readLines()
|
||||
val list = lines.map {
|
||||
val pieces = it.split(": ")
|
||||
val index = pieces[0].toInt()
|
||||
val depth = pieces[1].toInt()
|
||||
val period = (depth - 1) * 2
|
||||
val congruentTo = (-(index % period) + period) % period
|
||||
period to congruentTo
|
||||
}.sortedByDescending { it.first }.toMutableList()
|
||||
}
|
7
day14.kt
Normal file
7
day14.kt
Normal file
|
@ -0,0 +1,7 @@
|
|||
import java.io.File
|
||||
|
||||
fun main(args: Array<String>){
|
||||
val inputFile = File("../day_14.txt")
|
||||
val lines = inputFile.readLines()
|
||||
val firstLine = lines.first()
|
||||
}
|
89
day14_1.rb
Normal file
89
day14_1.rb
Normal file
|
@ -0,0 +1,89 @@
|
|||
require 'set'
|
||||
|
||||
def hash_code(string)
|
||||
initial_string = [*0..255]
|
||||
suffix = [17, 31, 73, 47, 23]
|
||||
# shifts = File.open('puzzle_10.txt').read.split(',').map(&:to_i) + suffix
|
||||
# shifts = [1, 2, 3] + suffix
|
||||
# shifts = suffix
|
||||
shifts = string.split('').map(&:ord)
|
||||
shifts = shifts + suffix
|
||||
skip_size = 0
|
||||
offset = 0
|
||||
shifts = shifts * 64
|
||||
for shift in shifts do
|
||||
initial_string.rotate! offset
|
||||
if shift > 0 then
|
||||
rotated_bit = initial_string[0..shift - 1]
|
||||
kept_bit = initial_string[shift..initial_string.length-1]
|
||||
initial_string = rotated_bit.reverse + kept_bit
|
||||
end
|
||||
initial_string.rotate! -offset
|
||||
offset += shift + skip_size
|
||||
skip_size += 1
|
||||
end
|
||||
blocks = initial_string.each_slice(16).to_a
|
||||
hash = blocks.map do |block|
|
||||
block.inject(0) { |x, y| x^y }.to_s(16).rjust(2, '0')
|
||||
end
|
||||
return hash.join('')
|
||||
end
|
||||
|
||||
input = "jxqlasbh"
|
||||
# input = "flqrgnkx"
|
||||
total = 0
|
||||
map = []
|
||||
128.times do |time|
|
||||
hash_input = input + '-' + time.to_s
|
||||
computed_hash = hash_code(hash_input)
|
||||
binary = computed_hash.split('').map do |it|
|
||||
it.to_i 16
|
||||
end.map do |it|
|
||||
(it.to_s 2).rjust(4, '0')
|
||||
end.join('')
|
||||
total += binary.count '1'
|
||||
map.push(binary.split(''))
|
||||
end
|
||||
|
||||
puts total
|
||||
|
||||
puts "#{map[0][0..3]}"
|
||||
puts "#{map[1][0..3]}"
|
||||
puts "#{map[2][0..3]}"
|
||||
puts "#{map[3][0..3]}"
|
||||
|
||||
enabled = []
|
||||
128.times do |x|
|
||||
128.times do |y|
|
||||
if map[x][y] != '1' then next end
|
||||
enabled.push [[x, y]]
|
||||
end
|
||||
end
|
||||
|
||||
def is_neighbor(a, b)
|
||||
a_neighbors = [[a[0]+1,a[1]],[a[0]-1, a[1]], [a[0],a[1]+1], [a[0],a[1]-1]]
|
||||
return a_neighbors.include? b
|
||||
end
|
||||
|
||||
final_groups = []
|
||||
modified = true
|
||||
while modified do
|
||||
modified = false
|
||||
i = 0
|
||||
while i < enabled.length do
|
||||
current = enabled[i]
|
||||
j = i + 1
|
||||
while j < enabled.length do
|
||||
other = enabled[j]
|
||||
if (current.product other).any? { |a| is_neighbor(a[0], a[1]) } then
|
||||
current.concat other
|
||||
enabled.delete_at(j)
|
||||
modified = true
|
||||
else
|
||||
j += 1
|
||||
end
|
||||
end
|
||||
i += 1
|
||||
end
|
||||
end
|
||||
puts enabled.length
|
45
day15.kt
Normal file
45
day15.kt
Normal file
|
@ -0,0 +1,45 @@
|
|||
import java.io.File
|
||||
|
||||
fun generateANext(current: Long): Long {
|
||||
return (current * 16807) % 2147483647
|
||||
}
|
||||
|
||||
fun generateBNext(current: Long): Long {
|
||||
return (current * 48271) % 2147483647
|
||||
}
|
||||
|
||||
fun generateACertain(current: Long): Long {
|
||||
var toReturn = current
|
||||
do {
|
||||
toReturn = generateANext(toReturn)
|
||||
} while (toReturn % 4L != 0L)
|
||||
return toReturn
|
||||
}
|
||||
|
||||
fun generateBCertain(current: Long): Long {
|
||||
var toReturn = current
|
||||
do {
|
||||
toReturn = generateBNext(toReturn)
|
||||
} while (toReturn % 8L != 0L)
|
||||
return toReturn
|
||||
}
|
||||
|
||||
fun main(args: Array<String>){
|
||||
val initialAValue = 873L
|
||||
val initialBValue = 583L
|
||||
var i = 0
|
||||
var count = 0
|
||||
var currentA = initialAValue
|
||||
var currentB = initialBValue
|
||||
while(i < 5000000) {
|
||||
currentA = generateACertain(currentA)
|
||||
currentB = generateBCertain(currentB)
|
||||
// println(currentA.toString(2))
|
||||
// println(currentB.toString(2))
|
||||
val firstA = currentA.toShort()
|
||||
val firstB = currentB.toShort()
|
||||
if(firstA == firstB) count++
|
||||
i++
|
||||
}
|
||||
println(count)
|
||||
}
|
85
day16.kt
Normal file
85
day16.kt
Normal file
|
@ -0,0 +1,85 @@
|
|||
import java.io.File
|
||||
|
||||
fun <T> MutableList<T>.shift(num: Int) {
|
||||
var left = num;
|
||||
while(left > 0) {
|
||||
add(0, removeAt(size - 1))
|
||||
left--
|
||||
}
|
||||
}
|
||||
|
||||
fun <T> MutableList<T>.switch(a: T, b: T) {
|
||||
val indexA = indexOf(a)
|
||||
val indexB = indexOf(b)
|
||||
set(indexB, a)
|
||||
set(indexA, b)
|
||||
}
|
||||
|
||||
fun <T> MutableList<T>.switch(a: Int, b: Int){
|
||||
val elA = elementAt(a)
|
||||
val elB = elementAt(b)
|
||||
set(a, elB)
|
||||
set(b, elA)
|
||||
}
|
||||
|
||||
fun main(args: Array<String>){
|
||||
val inputFile = File("../puzzle_16.txt")
|
||||
val inputLines = inputFile.readLines()
|
||||
val firstLine = inputLines.first()
|
||||
// "s1,x3/4,pe/b".split(",") //
|
||||
val instructions = firstLine.split(",")
|
||||
|
||||
val programs = MutableList('p'-'a' + 1) {
|
||||
('a' + it).toString()
|
||||
}
|
||||
val original = MutableList('p'-'a' + 1) {
|
||||
('a' + it).toString()
|
||||
}
|
||||
val swapMap = mutableMapOf<Int, Int>()
|
||||
var count = 0
|
||||
instructions.forEach {
|
||||
if(it.startsWith("s")) programs.shift(it.substring(1).toInt())
|
||||
else {
|
||||
val split = it.substring(1).split("/")
|
||||
if(it.startsWith("x")) {
|
||||
programs.switch(split[0].toInt(), split[1].toInt())
|
||||
} else {
|
||||
programs.switch(split[0], split[1])
|
||||
}
|
||||
}
|
||||
}
|
||||
println(programs.joinToString(""))
|
||||
val output = programs.joinToString("")
|
||||
while(true){
|
||||
instructions.forEach {
|
||||
if(it.startsWith("s")) programs.shift(it.substring(1).toInt())
|
||||
else {
|
||||
val split = it.substring(1).split("/")
|
||||
if(it.startsWith("x")) {
|
||||
programs.switch(split[0].toInt(), split[1].toInt())
|
||||
} else {
|
||||
programs.switch(split[0], split[1])
|
||||
}
|
||||
}
|
||||
}
|
||||
val newOutput = programs.joinToString("")
|
||||
count++
|
||||
if(newOutput == "abcdefghijklmnop") break
|
||||
}
|
||||
println(count)
|
||||
println(programs.joinToString(""))
|
||||
for(i in 0 until (1000000000 % (count + 1))){
|
||||
instructions.forEach {
|
||||
if(it.startsWith("s")) original.shift(it.substring(1).toInt())
|
||||
else {
|
||||
val split = it.substring(1).split("/")
|
||||
if(it.startsWith("x")) {
|
||||
original.switch(split[0].toInt(), split[1].toInt())
|
||||
} else {
|
||||
original.switch(split[0], split[1])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
println(original.joinToString(""))
|
||||
}
|
21
day17.kt
Normal file
21
day17.kt
Normal file
|
@ -0,0 +1,21 @@
|
|||
import java.io.File
|
||||
import java.util.*
|
||||
import kotlin.system.measureTimeMillis
|
||||
|
||||
fun main(args: Array<String>){
|
||||
println(measureTimeMillis {
|
||||
val numSteps = 301
|
||||
var iterations = 1
|
||||
var index = 0
|
||||
var memorizedNumber = 0
|
||||
while(iterations <= 50000000) {
|
||||
index = (index + numSteps) % iterations
|
||||
if(index == 0) {
|
||||
memorizedNumber = iterations
|
||||
}
|
||||
index++
|
||||
iterations++
|
||||
}
|
||||
println(memorizedNumber)
|
||||
})
|
||||
}
|
70
day18.kt
Normal file
70
day18.kt
Normal file
|
@ -0,0 +1,70 @@
|
|||
import java.io.File
|
||||
|
||||
fun getValue(map: MutableMap<String, Long>, value: String): Long {
|
||||
return if(value.contains(Regex("\\d"))) value.toLong() else (map[value] ?: 0)
|
||||
}
|
||||
|
||||
class Program(val lines: List<String>){
|
||||
var numSent = 0
|
||||
var index = 0
|
||||
var queue = mutableListOf<Long>()
|
||||
val registerMap = mutableMapOf<String, Long>()
|
||||
var partner: Program? = null
|
||||
var wait = false
|
||||
fun step(){
|
||||
if(index >= lines.size) return
|
||||
val it = lines[index]
|
||||
val split = it.split(" ")
|
||||
if(it.startsWith("add")) {
|
||||
registerMap[split[1]] = getValue(registerMap, split[1]) + getValue(registerMap, split[2])
|
||||
} else if(it.startsWith("set")) {
|
||||
registerMap[split[1]] = getValue(registerMap, split[2])
|
||||
} else if(it.startsWith("snd")) {
|
||||
partner!!.queue.add(getValue(registerMap, split[1]))
|
||||
numSent++
|
||||
} else if(it.startsWith("mul")) {
|
||||
registerMap[split[1]] = getValue(registerMap, split[1]) * getValue(registerMap, split[2])
|
||||
} else if(it.startsWith("mod")) {
|
||||
registerMap[split[1]] = getValue(registerMap, split[1]) % getValue(registerMap, split[2])
|
||||
} else if(it.startsWith("rcv")) {
|
||||
if(queue.isEmpty()) {
|
||||
wait = true
|
||||
return
|
||||
}
|
||||
else {
|
||||
registerMap[split[1]] = queue.removeAt(0)
|
||||
wait = false
|
||||
}
|
||||
} else if(it.startsWith("jgz")) {
|
||||
if(getValue(registerMap, split[1]) > 0) {
|
||||
index += getValue(registerMap, split[2]).toInt()
|
||||
return
|
||||
}
|
||||
}
|
||||
index++
|
||||
}
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val file = File("../day18.txt")
|
||||
// val file = File("test.txt")
|
||||
val lines = file.readLines()
|
||||
val firstLine = lines.first()
|
||||
|
||||
val registerMap = mutableMapOf<String, Long>()
|
||||
var last = 0L
|
||||
lines.forEach {
|
||||
}
|
||||
var index = 0;
|
||||
val program1 = Program(lines)
|
||||
val program2 = Program(lines)
|
||||
program1.partner = program2
|
||||
program2.partner = program1
|
||||
program1.registerMap["p"] = 0
|
||||
program2.registerMap["p"] = 1
|
||||
while(!(program1.wait && program2.wait) && !(program1.index >= lines.size && program2.index >= lines.size)){
|
||||
program1.step()
|
||||
program2.step()
|
||||
}
|
||||
println(program2.numSent)
|
||||
}
|
28
day19.txt.kt
Normal file
28
day19.txt.kt
Normal file
|
@ -0,0 +1,28 @@
|
|||
import java.io.File
|
||||
|
||||
fun nextIndex(x: Int, y: Int, dir: Int) = listOf(1 + x to y, x to y-1, x-1 to y, x to y+1)[dir]
|
||||
fun canMove(x: Int, y: Int, dir: Int, path: List<CharArray>): Boolean {
|
||||
val (newX, newY) = nextIndex(x, y, dir)
|
||||
return (newY in 0 until path.size) && (newX in 0 until path[newY].size) && path[newY][newX] != ' '
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val file = File("../puzzle_19.txt")
|
||||
val path = file.readLines().toList().map { it.toCharArray() }
|
||||
var (indexX, indexY) = (163 to 0)
|
||||
var direction = 3
|
||||
val letterStack = mutableListOf<Char>()
|
||||
var count = 1
|
||||
while(true){
|
||||
if(path[indexY][indexX] in ('A'..'Z')) letterStack.add(path[indexY][indexX])
|
||||
if(!canMove(indexX, indexY, direction, path)) { direction = (direction + 1) % 4 }
|
||||
if(!canMove(indexX, indexY, direction, path)) { direction = (direction + 2) % 4 }
|
||||
if(!canMove(indexX, indexY, direction, path)) break
|
||||
count++
|
||||
val moveBy = nextIndex(indexX, indexY, direction)
|
||||
indexX = moveBy.first
|
||||
indexY = moveBy.second
|
||||
}
|
||||
println(letterStack.joinToString(""))
|
||||
println(count)
|
||||
}
|
16
day1_1.cpp
Normal file
16
day1_1.cpp
Normal file
|
@ -0,0 +1,16 @@
|
|||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main(){
|
||||
std::string input;
|
||||
std::cin >> input;
|
||||
long total = 0;
|
||||
for(int i = 0; i < input.size(); i++){
|
||||
int next_index = (i + 1) % input.size();
|
||||
if(input[i] == input[next_index]){
|
||||
total += input[i] - '0';
|
||||
}
|
||||
}
|
||||
std::cout << total;
|
||||
}
|
16
day1_2.cpp
Normal file
16
day1_2.cpp
Normal file
|
@ -0,0 +1,16 @@
|
|||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main(){
|
||||
std::string input;
|
||||
std::cin >> input;
|
||||
long total = 0;
|
||||
for(int i = 0; i < input.size(); i++){
|
||||
int next_index = (i + input.size() / 2) % input.size();
|
||||
if(input[i] == input[next_index]){
|
||||
total += input[i] - '0';
|
||||
}
|
||||
}
|
||||
std::cout << total;
|
||||
}
|
38
day20.kt
Normal file
38
day20.kt
Normal file
|
@ -0,0 +1,38 @@
|
|||
import java.io.File
|
||||
import kotlin.math.absoluteValue
|
||||
|
||||
data class Particle(var x: Long, var y: Long, var z: Long,
|
||||
var vx: Long, var vy: Long, var vz: Long,
|
||||
var ax: Long, var ay: Long, var az: Long) {
|
||||
fun distance() = x.absoluteValue + y.absoluteValue + z.absoluteValue
|
||||
fun step(){
|
||||
vx += ax
|
||||
vy += ay
|
||||
vz += az
|
||||
x += vx
|
||||
y += vy
|
||||
z += vz
|
||||
}
|
||||
}
|
||||
|
||||
fun main(args: Array<String>){
|
||||
val file = File("../puzzle_20.txt")
|
||||
// val file = File("test.txt")
|
||||
val lines = file.readLines()
|
||||
val firstLine = lines.first()
|
||||
val particles = lines.map {
|
||||
val split = it.split("=")
|
||||
val (x, y, z) = split[1].substring(1).substringBefore(">").split(",").map { it.toLong() }
|
||||
val (vx, vy, vz) = split[2].substring(1).substringBefore(">").split(",").map { it.toLong() }
|
||||
val (ax, ay, az) = split[3].substring(1).substringBefore(">").split(",").map { it.toLong() }
|
||||
Particle(x, y, z, vx, vy, vz, ax, ay, az)
|
||||
}
|
||||
var count = 0
|
||||
while(count < 1000){
|
||||
particles.forEach {
|
||||
it.step()
|
||||
}
|
||||
count++
|
||||
}
|
||||
println(particles.indexOf(particles.minBy { it.distance() }))
|
||||
}
|
40
day20_2.kt
Normal file
40
day20_2.kt
Normal file
|
@ -0,0 +1,40 @@
|
|||
import java.io.File
|
||||
import kotlin.math.absoluteValue
|
||||
|
||||
fun main(args: Array<String>){
|
||||
val file = File("../puzzle_20.txt")
|
||||
// val file = File("test.txt")
|
||||
val lines = file.readLines()
|
||||
val firstLine = lines.first()
|
||||
val particles = lines.map {
|
||||
val split = it.split("=")
|
||||
val (x, y, z) = split[1].substring(1).substringBefore(">").split(",").map { it.toLong() }
|
||||
val (vx, vy, vz) = split[2].substring(1).substringBefore(">").split(",").map { it.toLong() }
|
||||
val (ax, ay, az) = split[3].substring(1).substringBefore(">").split(",").map { it.toLong() }
|
||||
Particle(x, y, z, vx, vy, vz, ax, ay, az)
|
||||
}.toMutableList()
|
||||
var count = 0
|
||||
while(count < 1000){
|
||||
particles.forEach {
|
||||
it.step()
|
||||
}
|
||||
val collidedParticles = mutableListOf<Particle>()
|
||||
var index = 0
|
||||
while(index < particles.size){
|
||||
val par1 = particles[index]
|
||||
var index2 = index + 1;
|
||||
while(index2 < particles.size){
|
||||
val par2 = particles[index2]
|
||||
if(par1.x == par2.x && par1.y == par2.y && par1.z == par2.z) {
|
||||
collidedParticles.add(par1)
|
||||
collidedParticles.add(par2)
|
||||
}
|
||||
index2++
|
||||
}
|
||||
index++
|
||||
}
|
||||
particles.removeAll(collidedParticles)
|
||||
count++
|
||||
}
|
||||
println(particles.size)
|
||||
}
|
162
day21.kt
Normal file
162
day21.kt
Normal file
|
@ -0,0 +1,162 @@
|
|||
import java.io.File
|
||||
|
||||
class Pattern(val size: Int){
|
||||
val map = Array(size) { CharArray(size) { ' ' } }
|
||||
fun flipV(): Pattern {
|
||||
val newPattern = Pattern(size)
|
||||
for(x in 0 until size){
|
||||
for(y in 0 until size){
|
||||
val newX = size - 1 - x
|
||||
val newY = y
|
||||
newPattern.map[newY][newX] = map[y][x]
|
||||
}
|
||||
}
|
||||
return newPattern
|
||||
}
|
||||
fun flipH(): Pattern {
|
||||
val newPattern = Pattern(size)
|
||||
for(x in 0 until size){
|
||||
for(y in 0 until size){
|
||||
val newX = x
|
||||
val newY = size - 1 - y
|
||||
newPattern.map[newY][newX] = map[y][x]
|
||||
}
|
||||
}
|
||||
return newPattern
|
||||
}
|
||||
fun rotate(): Pattern {
|
||||
val newPattern = Pattern(size)
|
||||
for(x in 0 until size){
|
||||
for(y in 0 until size){
|
||||
val newX = y
|
||||
val newY = size - 1 - x
|
||||
newPattern.map[newY][newX] = map[y][x]
|
||||
}
|
||||
}
|
||||
return newPattern
|
||||
}
|
||||
override operator fun equals(other: Any?): Boolean {
|
||||
if(other !is Pattern) return false
|
||||
return oneEquals(other)
|
||||
}
|
||||
fun equalsPattern(other: Pattern): Boolean {
|
||||
if(other.size != size) return false
|
||||
for(x in 0 until size) {
|
||||
for(y in 0 until size){
|
||||
if(other.map[y][x] != this.map[y][x]) return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
fun oneEquals(other: Pattern): Boolean {
|
||||
val first = rotate()
|
||||
val flipH = flipH()
|
||||
val flipV = flipV()
|
||||
val thisMatches = equalsPattern(other) ||
|
||||
rotate().equalsPattern(other) ||
|
||||
rotate().rotate().equalsPattern(other) ||
|
||||
rotate().rotate().rotate().equalsPattern(other)
|
||||
val flipHMatches = flipH.equalsPattern(other) ||
|
||||
flipH.rotate().equalsPattern(other) ||
|
||||
flipH.rotate().rotate().equalsPattern(other) ||
|
||||
flipH.rotate().rotate().rotate().equalsPattern(other)
|
||||
val flipVMatches = flipV.equalsPattern(other) ||
|
||||
flipV.rotate().equalsPattern(other) ||
|
||||
flipV.rotate().rotate().equalsPattern(other) ||
|
||||
flipV.rotate().rotate().equalsPattern(other)
|
||||
return thisMatches || flipHMatches || flipVMatches
|
||||
}
|
||||
|
||||
fun toStrings(): List<String>{
|
||||
return map.map { it.joinToString(" ") }
|
||||
}
|
||||
|
||||
fun split(): List<List<Pattern>> {
|
||||
val toReturn = mutableListOf<MutableList<Pattern>>()
|
||||
if(size % 2 == 0){
|
||||
for(y in 0 until size / 2){
|
||||
val newRow = mutableListOf<Pattern>()
|
||||
for(x in 0 until size / 2){
|
||||
val newPattern = Pattern(2)
|
||||
for(newX in 0..1){
|
||||
for(newY in 0..1){
|
||||
newPattern.map[newY][newX] = map[y * 2 + newY][x * 2 + newX]
|
||||
}
|
||||
}
|
||||
newRow.add(newPattern)
|
||||
}
|
||||
toReturn.add(newRow)
|
||||
}
|
||||
} else {
|
||||
for(y in 0 until size / 3){
|
||||
val newRow = mutableListOf<Pattern>()
|
||||
for(x in 0 until size / 3){
|
||||
val newPattern = Pattern(3)
|
||||
for(newX in 0..2){
|
||||
for(newY in 0..2){
|
||||
newPattern.map[newY][newX] = map[y * 3 + newY][x * 3 + newX]
|
||||
}
|
||||
}
|
||||
newRow.add(newPattern)
|
||||
}
|
||||
toReturn.add(newRow)
|
||||
}
|
||||
}
|
||||
return toReturn
|
||||
}
|
||||
}
|
||||
|
||||
fun fromString(s: String): Pattern {
|
||||
val lines = s.split("/")
|
||||
val newPattern = Pattern(lines.size)
|
||||
for(i in 0 until newPattern.size){
|
||||
newPattern.map[i] = lines[i].toCharArray()
|
||||
}
|
||||
return newPattern
|
||||
}
|
||||
|
||||
fun combine(list: List<List<Pattern>>): Pattern {
|
||||
val newPattern = Pattern(list[0][0].size * list.size)
|
||||
for(y in 0 until list.size){
|
||||
for(x in 0 until list.size){
|
||||
val copying = list[y][x]
|
||||
for(oldY in 0 until copying.size){
|
||||
for(oldX in 0 until copying.size){
|
||||
newPattern.map[y * copying.size + oldY][x * copying.size + oldX] =
|
||||
copying.map[oldY][oldX]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return newPattern
|
||||
}
|
||||
|
||||
fun Map<Pattern, Pattern>.findMatching(pattern: Pattern): Pattern? {
|
||||
return keys
|
||||
.firstOrNull { it == pattern }
|
||||
?.let { get(it) }
|
||||
}
|
||||
|
||||
fun main(args: Array<String>){
|
||||
// val file = File("test.txt")
|
||||
val file = File("../puzzle_21.txt")
|
||||
val lines = file.readLines()
|
||||
val patternMap = mutableMapOf<Pattern, Pattern>()
|
||||
lines.forEach {
|
||||
val split = it.split(" => ")
|
||||
patternMap.put(fromString(split[0]), fromString(split[1]))
|
||||
}
|
||||
val inputPattern = fromString(".#./..#/###")
|
||||
var pattern = inputPattern
|
||||
var count = 0
|
||||
while (count < 18){
|
||||
val split = pattern.split()
|
||||
pattern = combine(split.map { it.map { patternMap.findMatching(it)!! } })
|
||||
pattern.toStrings().forEach { println(it) }
|
||||
println()
|
||||
count += 1
|
||||
}
|
||||
println(pattern.toStrings().joinToString("").count { it == '#' })
|
||||
|
||||
}
|
33
day22.kt
Normal file
33
day22.kt
Normal file
|
@ -0,0 +1,33 @@
|
|||
import java.io.File
|
||||
import kotlin.math.roundToLong
|
||||
|
||||
fun dirToCoords(index: Int) = listOf(1L to 0L, 0L to 1L, -1L to 0L, 0L to -1L)[index]
|
||||
|
||||
fun main(args: Array<String>){
|
||||
val file = File("../puzzle_22.txt")
|
||||
// val file = File("test.txt")
|
||||
val lines = file.readLines()
|
||||
val coordMap = mutableMapOf<Pair<Long, Long>, Int>()
|
||||
lines.forEachIndexed { y, string -> string.toCharArray().forEachIndexed { x, c -> coordMap[x.toLong() to (lines.size - 1 - y).toLong()] = if(c == '#') 2 else 0 } }
|
||||
var x = Math.ceil(coordMap.keys.maxBy { it.first }!!.first.toDouble() / 2).roundToLong()
|
||||
var y = Math.ceil(coordMap.keys.maxBy { it.second }!!.second.toDouble() / 2).roundToLong()
|
||||
println(x to y)
|
||||
var direction = 1
|
||||
var count = 0
|
||||
var infectedCount = 0
|
||||
while(count < 10000000) {
|
||||
val isInfected = coordMap.computeIfAbsent(x to y) { 0 }
|
||||
if(isInfected == 0) direction += 1
|
||||
else if(isInfected == 1) {}
|
||||
else if(isInfected == 2) direction -= 1
|
||||
else direction = (direction + 2) % 4
|
||||
direction = (direction + 4) % 4
|
||||
coordMap[x to y] = (isInfected + 1) % 4
|
||||
if(coordMap[x to y] == 2) infectedCount++
|
||||
val (dx, dy) = dirToCoords(direction)
|
||||
x += dx
|
||||
y += dy
|
||||
count++
|
||||
}
|
||||
println(infectedCount)
|
||||
}
|
31
day22_2.kt
Normal file
31
day22_2.kt
Normal file
|
@ -0,0 +1,31 @@
|
|||
import java.io.File
|
||||
import kotlin.math.roundToLong
|
||||
|
||||
fun main(args: Array<String>){
|
||||
val file = File("../puzzle_22.txt")
|
||||
// val file = File("test.txt")
|
||||
val lines = file.readLines()
|
||||
val coordMap = mutableMapOf<Pair<Long, Long>, Boolean>()
|
||||
lines.forEachIndexed { y, string -> string.toCharArray().forEachIndexed { x, c -> coordMap[x.toLong() to (lines.size - 1 - y).toLong()] = c == '#'} }
|
||||
var x = Math.ceil(coordMap.keys.maxBy { it.first }!!.first.toDouble() / 2).roundToLong()
|
||||
var y = Math.ceil(coordMap.keys.maxBy { it.second }!!.second.toDouble() / 2).roundToLong()
|
||||
println(x to y)
|
||||
var direction = 1
|
||||
var count = 0
|
||||
var infectedCount = 0
|
||||
while(count < 10000) {
|
||||
val isInfected = coordMap.computeIfAbsent(x to y) { false }
|
||||
if(isInfected) direction -= 1
|
||||
else {
|
||||
direction += 1
|
||||
infectedCount++
|
||||
}
|
||||
direction = (direction + 4) % 4
|
||||
coordMap[x to y] = !isInfected
|
||||
val (dx, dy) = dirToCoords(direction)
|
||||
x += dx
|
||||
y += dy
|
||||
count++
|
||||
}
|
||||
println(infectedCount)
|
||||
}
|
39
day23.kt
Normal file
39
day23.kt
Normal file
|
@ -0,0 +1,39 @@
|
|||
import java.io.File
|
||||
|
||||
fun getValue(map: Map<String, Long>, key: String): Long {
|
||||
return if(key.contains(Regex("\\d+"))) key.toLong() else map.getOrDefault(key, 0L)
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val file = File("../puzzle_23.txt")
|
||||
// val file = File("test.txt")
|
||||
val lines = file.readLines().map { it.split(" ") }
|
||||
val firstLine = lines.first()
|
||||
|
||||
val registers = mutableMapOf<String, Long>()
|
||||
var index = 0
|
||||
var count = 0
|
||||
lines.forEach {
|
||||
}
|
||||
registers["a"] = 1
|
||||
while(index < lines.size){
|
||||
val split = lines[index]
|
||||
if(split[0] == "set") {
|
||||
registers[split[1]] = getValue(registers, split[2])
|
||||
} else if (split[0] == "sub") {
|
||||
registers[split[1]] = (registers[split[1]] ?: 0) - getValue(registers, split[2])
|
||||
} else if(split[0] == "mul") {
|
||||
registers[split[1]] = (registers[split[1]] ?: 0) * getValue(registers, split[2])
|
||||
} else if(split[0] == "jnz") {
|
||||
val cond = getValue(registers, split[1])
|
||||
val offset = getValue(registers, split[2])
|
||||
if(cond != 0L) {
|
||||
index += offset.toInt()
|
||||
continue
|
||||
}
|
||||
}
|
||||
index++
|
||||
}
|
||||
println(count)
|
||||
println(registers["h"])
|
||||
}
|
68
day24.kt
Normal file
68
day24.kt
Normal file
|
@ -0,0 +1,68 @@
|
|||
import java.io.File
|
||||
|
||||
typealias Piece = List<Int>
|
||||
typealias Bridge = List<Piece>
|
||||
|
||||
fun Bridge.cost(): Int {
|
||||
val lastcost = last().first()
|
||||
val betweenCost = (0 until size - 1).map {
|
||||
this[it].first() * 2
|
||||
}.sum()
|
||||
return betweenCost + lastcost
|
||||
}
|
||||
|
||||
fun getPaths(bridge: Bridge, pieces: List<Piece>): List<Bridge> {
|
||||
val compatiblePieces = pieces.filter { it.contains(bridge.last().first() ) }
|
||||
if(compatiblePieces.size != 0) {
|
||||
return compatiblePieces.map {
|
||||
val newPiece = it.toMutableList()
|
||||
newPiece.remove(bridge.last().first())
|
||||
val newPieces = pieces.toMutableList()
|
||||
newPieces.remove(it)
|
||||
val newBridge = bridge.toMutableList()
|
||||
newBridge.add(newPiece)
|
||||
getPaths(newBridge, newPieces)
|
||||
}.fold(mutableListOf()) {
|
||||
a, b ->
|
||||
val list = mutableListOf<Bridge>()
|
||||
list.addAll(a)
|
||||
list.addAll(b)
|
||||
list
|
||||
}
|
||||
} else return mutableListOf(bridge)
|
||||
}
|
||||
|
||||
fun main(args: Array<String>){
|
||||
val file = File("../puzzle_24.txt")
|
||||
// val file = File("test.txt")
|
||||
val lines = file.readLines()
|
||||
val firstLine = lines.first()
|
||||
val transformedLines = lines.toMutableList().map {
|
||||
val split = it.split("/")
|
||||
mutableListOf(split[0].toInt(), split[1].toInt())
|
||||
}
|
||||
var index = 0
|
||||
var initialCombinations = transformedLines
|
||||
.filter { it.contains(0) }
|
||||
.map {
|
||||
val withoutZero = it.toMutableList()
|
||||
withoutZero.remove(0)
|
||||
val withoutZeroPiece = transformedLines.toMutableList()
|
||||
withoutZeroPiece.remove(it)
|
||||
mutableListOf(withoutZero) to withoutZeroPiece
|
||||
}.toMutableList()
|
||||
val paths = initialCombinations.map {
|
||||
val (bridge, pieces) = it
|
||||
getPaths(bridge, pieces)
|
||||
}.fold(mutableListOf<Bridge>()) {
|
||||
a, b ->
|
||||
val list = mutableListOf<Bridge>()
|
||||
list.addAll(a)
|
||||
list.addAll(b)
|
||||
list
|
||||
}
|
||||
println(paths.map { it.cost() }.max())
|
||||
val maxLength = paths.map { it.size }.max()
|
||||
val maxLenghtMaxStrength = paths.filter { it.size == maxLength }.maxBy { it.cost() }
|
||||
println(maxLenghtMaxStrength!!.cost())
|
||||
}
|
46
day25.kt
Normal file
46
day25.kt
Normal file
|
@ -0,0 +1,46 @@
|
|||
import java.io.File
|
||||
|
||||
data class TuringValue(val toWrite: Int, val toMove: Int, val nextState: Char)
|
||||
data class TuringState(val ifZero: TuringValue, val ifOne: TuringValue, val name: Char)
|
||||
|
||||
fun readValue(lines: List<String>, index: Int): TuringValue{
|
||||
val firstLine = lines[index]
|
||||
val toWrite = firstLine[firstLine.length - 2].toInt() - '0'.toInt()
|
||||
val toMove = if(lines[index+1].endsWith("left.")) -1 else 1
|
||||
val thirdLine = lines[index + 2]
|
||||
val state = thirdLine[thirdLine.length - 2]
|
||||
return TuringValue(toWrite, toMove, state)
|
||||
}
|
||||
|
||||
fun readState(lines: List<String>, index: Int): TuringState {
|
||||
val lineA = lines[index]
|
||||
val name = lineA[lineA.length - 2]
|
||||
return TuringState(readValue(lines, index + 2), readValue(lines, index + 6), name)
|
||||
}
|
||||
|
||||
fun main(args: Array<String>){
|
||||
// val file = File("../puzzle_25.txt")
|
||||
val file = File("test.txt")
|
||||
val lines = file.readLines()
|
||||
val firstLine = lines.first()
|
||||
|
||||
val states = mutableMapOf<Char, TuringState>()
|
||||
(0 until 6)
|
||||
.map { readState(lines, it * 10) }
|
||||
.forEach { states.put(it.name, it) }
|
||||
|
||||
val tape = mutableMapOf<Int, Int>()
|
||||
var currentState: Char = 'A'
|
||||
var steps = 12134527
|
||||
var index = 0
|
||||
while(steps > 0){
|
||||
val tapeValue = tape.getOrDefault(index, 0)
|
||||
val state = states.get(currentState)!!
|
||||
val value = if(tapeValue == 0) state.ifZero else state.ifOne
|
||||
tape[index] = value.toWrite
|
||||
index += value.toMove
|
||||
currentState = value.nextState
|
||||
steps--
|
||||
}
|
||||
println(tape.values.count { it == 1 })
|
||||
}
|
12
day2_1.rb
Normal file
12
day2_1.rb
Normal file
|
@ -0,0 +1,12 @@
|
|||
total = 0
|
||||
|
||||
while(true) do
|
||||
line = gets
|
||||
if line == nil then break end
|
||||
numbers = line.split(' ').map do |number| number.to_i end
|
||||
top = numbers.max
|
||||
bottom = numbers.min
|
||||
total += (top - bottom)
|
||||
end
|
||||
|
||||
puts(total)
|
21
day2_2.rb
Normal file
21
day2_2.rb
Normal file
|
@ -0,0 +1,21 @@
|
|||
total = 0
|
||||
|
||||
while(true) do
|
||||
line = gets
|
||||
if line == nil then break end
|
||||
numbers = line.split(' ').map do |num| num.to_i end
|
||||
for i in (0..numbers.length - 1) do
|
||||
for j in ((i + 1)..numbers.length - 1) do
|
||||
pair = [numbers[i], numbers[j]]
|
||||
max = pair.max
|
||||
min = pair.min
|
||||
|
||||
if max % min == 0 then
|
||||
total += max / min
|
||||
next
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
puts(total)
|
26
day3_1.rb
Normal file
26
day3_1.rb
Normal file
|
@ -0,0 +1,26 @@
|
|||
def corner_num(corner)
|
||||
return corner**2 - corner
|
||||
end
|
||||
|
||||
puzzle_input = 289326
|
||||
corner = (1 + Math.sqrt(1 + 4*(puzzle_input - 1))) / 2
|
||||
puts corner
|
||||
next_corner = corner_num(corner.ceil)
|
||||
prev_corner = corner_num(corner.floor)
|
||||
distance = 0
|
||||
if(next_corner == prev_corner) then
|
||||
distance = 2*((corner / 2).floor)
|
||||
else
|
||||
halfway_point = (next_corner + prev_corner) / 2
|
||||
edge_length = next_corner - halfway_point
|
||||
start_from = (puzzle_input > halfway_point) ? halfway_point : prev_corner
|
||||
progress = (puzzle_input - 1 - start_from).to_f / edge_length
|
||||
if(corner.floor % 2 == 1 and puzzle_input < halfway_point) then distance -= 1 end
|
||||
previous_distance = (corner.ceil / 2).floor
|
||||
next_distance = ((corner.floor)/2).floor
|
||||
puts previous_distance
|
||||
puts next_distance
|
||||
distance += (corner / 2).floor
|
||||
distance += (-previous_distance + (previous_distance + next_distance)*progress).abs
|
||||
end
|
||||
puts distance
|
56
day3_2.rb
Normal file
56
day3_2.rb
Normal file
|
@ -0,0 +1,56 @@
|
|||
states = {
|
||||
"left" => "down",
|
||||
"down" => "right",
|
||||
"right" => "up",
|
||||
"up" => "left"
|
||||
}
|
||||
stepsx = {
|
||||
"right" => 1,
|
||||
"left" => -1
|
||||
}
|
||||
stepsy = {
|
||||
"up" => 1,
|
||||
"down" => -1
|
||||
}
|
||||
increases = {
|
||||
"left" => 1,
|
||||
"right" => 1
|
||||
}
|
||||
stepsx.default = 0
|
||||
stepsy.default = 0
|
||||
increases.default = 0
|
||||
|
||||
memory = Array.new(399)
|
||||
399.times do |time|
|
||||
memory[time] = Array.new(399, 0)
|
||||
end
|
||||
|
||||
step = 1
|
||||
x = 199
|
||||
y = 199
|
||||
memory[x][y] = 1
|
||||
x += 1
|
||||
state = "up"
|
||||
memory[x][y] = 1
|
||||
|
||||
input = 289326
|
||||
|
||||
while(true) do
|
||||
dx = stepsx[state]
|
||||
dy = stepsy[state]
|
||||
step.times do |time|
|
||||
x += dx
|
||||
y += dy
|
||||
total = 0
|
||||
for i in -1..1 do
|
||||
for j in -1..1 do
|
||||
if(!(j == 0 && i == 0)) then total += memory[x + i][y + j] end
|
||||
end
|
||||
end
|
||||
puts total
|
||||
if(total > input) then exit() end
|
||||
memory[x][y] = total
|
||||
end
|
||||
state = states[state]
|
||||
step += increases[state]
|
||||
end
|
9
day4_1.rb
Normal file
9
day4_1.rb
Normal file
|
@ -0,0 +1,9 @@
|
|||
def is_unique(line)
|
||||
original = line.split(' ')
|
||||
unique = original.uniq
|
||||
return original.length == unique.length
|
||||
end
|
||||
|
||||
contents = File.open("puzzle_4.txt", "rb").read
|
||||
lines = contents.split("\n")
|
||||
puts lines.select {|line| is_unique(line)}.length
|
27
day4_2.rb
Normal file
27
day4_2.rb
Normal file
|
@ -0,0 +1,27 @@
|
|||
def frequency(string)
|
||||
keys = {}
|
||||
keys.default = 0
|
||||
for letter in string.split('') do
|
||||
keys[letter] = keys[letter] + 1
|
||||
end
|
||||
return keys
|
||||
end
|
||||
|
||||
def is_anagram(first, second)
|
||||
return frequency(first) == frequency(second)
|
||||
end
|
||||
|
||||
def is_unique(line)
|
||||
words = line.split(' ')
|
||||
for i in 0..words.length - 1 do
|
||||
word = words[i]
|
||||
for j in (i+1)..words.length - 1 do
|
||||
if is_anagram(word, words[j]) then return false end
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
contents = File.open("puzzle_4.txt", "rb").read
|
||||
lines = contents.split("\n")
|
||||
puts lines.select {|line| is_unique(line)}.length
|
9
day5_1.rb
Normal file
9
day5_1.rb
Normal file
|
@ -0,0 +1,9 @@
|
|||
jumpArray = File.open('puzzle_5.txt').read.split("\n").map(&:to_i)
|
||||
num_steps = 0
|
||||
index = 0
|
||||
while (index < jumpArray.length) do
|
||||
jumpArray[index] += 1
|
||||
index += jumpArray[index] - 1
|
||||
num_steps += 1
|
||||
end
|
||||
puts num_steps
|
10
day5_2.rb
Normal file
10
day5_2.rb
Normal file
|
@ -0,0 +1,10 @@
|
|||
jumpArray = File.open('puzzle_5.txt').read.split("\n").map(&:to_i)
|
||||
num_steps = 0
|
||||
index = 0
|
||||
while (index < jumpArray.length) do
|
||||
change = (jumpArray[index] >= 3) ? -1 : 1
|
||||
jumpArray[index] += change
|
||||
index += jumpArray[index] - change
|
||||
num_steps += 1
|
||||
end
|
||||
puts num_steps
|
20
day6_1.rb
Normal file
20
day6_1.rb
Normal file
|
@ -0,0 +1,20 @@
|
|||
input = File.open('puzzle_6.txt').read.split(' ').map(&:to_i)
|
||||
combinations = [ input.dup ]
|
||||
while(true) do
|
||||
to_distribute = input.max
|
||||
start_at = input.index to_distribute
|
||||
input[start_at] = 0
|
||||
start_at += 1
|
||||
while(to_distribute > 0) do
|
||||
start_at %= input.length
|
||||
to_distribute -= 1
|
||||
input[start_at] += 1
|
||||
start_at += 1
|
||||
end
|
||||
if(combinations.include? input) then
|
||||
puts combinations.index input
|
||||
break
|
||||
end
|
||||
combinations.push input.clone
|
||||
end
|
||||
puts combinations.length
|
107
day7.kt
Normal file
107
day7.kt
Normal file
|
@ -0,0 +1,107 @@
|
|||
import java.io.File
|
||||
|
||||
abstract class Tree(val weight: Int) {
|
||||
abstract fun walk(parent: Tree?, name: String, function: (Tree?, String, Tree) -> Unit)
|
||||
abstract fun <T> reduce(transformFunction: (Tree) -> T, combineFunction: (T, List<T>) -> T): T
|
||||
|
||||
val combinedWeight: Int
|
||||
get() {
|
||||
val reduceFunction: (Tree) -> Int = {
|
||||
it.weight
|
||||
}
|
||||
val combineFunction: (Int, List<Int>) -> Int = {
|
||||
parent, children ->
|
||||
parent + children.fold(0) { a, b -> a + b}
|
||||
}
|
||||
return reduce(reduceFunction, combineFunction)
|
||||
}
|
||||
}
|
||||
class Placeholder : Tree(0) {
|
||||
override fun <T> reduce(transformFunction: (Tree) -> T, combineFunction: (T, List<T>) -> T): T {
|
||||
return transformFunction(this)
|
||||
}
|
||||
|
||||
override fun walk(parent: Tree?, name: String, function: (Tree?, String, Tree) -> Unit) {
|
||||
function(parent, name, this)
|
||||
}
|
||||
}
|
||||
|
||||
class Child(weight: Int) : Tree(weight) {
|
||||
override fun <T> reduce(transformFunction: (Tree) -> T, combineFunction: (T, List<T>) -> T): T {
|
||||
return transformFunction(this)
|
||||
}
|
||||
|
||||
override fun walk(parent: Tree?, name: String, function: (Tree?, String, Tree) -> Unit) {
|
||||
function(parent, name, this)
|
||||
}
|
||||
}
|
||||
|
||||
class Parent(weight: Int) : Tree(weight) {
|
||||
val children = mutableMapOf<String, Tree>()
|
||||
|
||||
override fun <T> reduce(transformFunction: (Tree) -> T, combineFunction: (T, List<T>) -> T): T {
|
||||
return combineFunction(transformFunction(this), children.map { it.value.reduce(transformFunction, combineFunction) })
|
||||
}
|
||||
|
||||
override fun walk(parent: Tree?, name: String, function: (Tree?, String, Tree) -> Unit) {
|
||||
function(parent, name, this)
|
||||
children.forEach { t, u -> u.walk(this, t, function) }
|
||||
}
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val extractionPattern = Regex("([a-z]+)\\s*\\((\\d+)\\)\\s*(?:->\\s*(.+))?")
|
||||
val baseMap = mutableMapOf<String, Tree>()
|
||||
val nodesWithParent = mutableListOf<Tree>()
|
||||
File("../puzzle_7.txt").readLines().forEach {
|
||||
val match = extractionPattern.matchEntire(it)!!
|
||||
val name = match.groupValues[1]
|
||||
val weight = match.groupValues[2].toInt()
|
||||
val childrenString = match.groupValues[3]
|
||||
val children = if(childrenString.isEmpty()) emptyList() else childrenString.split(", ")
|
||||
val newNode = if(children.isEmpty()) {
|
||||
Child(weight)
|
||||
} else {
|
||||
val newParent = Parent(weight)
|
||||
children.forEach { childName -> newParent.children.put(childName, Placeholder()) }
|
||||
newParent
|
||||
}
|
||||
baseMap.put(name, newNode)
|
||||
}
|
||||
baseMap.forEach {
|
||||
val treeNode = it.value as? Parent ?: return@forEach
|
||||
|
||||
treeNode.children.forEach {
|
||||
pair ->
|
||||
val (childKey, _) = pair
|
||||
val childNode = baseMap[childKey]!!
|
||||
treeNode.children[childKey] = childNode
|
||||
nodesWithParent.add(childNode)
|
||||
}
|
||||
}
|
||||
val (name, node) = baseMap.filterValues { !nodesWithParent.contains(it) }.entries.first()
|
||||
node.walk(null, name) {
|
||||
parent, name, node ->
|
||||
if(parent == null) println("root node is $name")
|
||||
if(node is Parent){
|
||||
val childWeightPairs = node.children.map { it.value.combinedWeight to it.key }
|
||||
val childWeights = childWeightPairs.map { it.first }
|
||||
if(childWeights.toSet().size != 1) {
|
||||
val frequencyMap = mutableMapOf<Int, Int>()
|
||||
childWeights.forEach { frequencyMap[it] = frequencyMap.getOrDefault(it, 0) + 1 }
|
||||
val culpritWeight = frequencyMap.filter { it.value == 1 }.keys.first()
|
||||
val properWeight = frequencyMap.filter { it.key != culpritWeight }.keys.first()
|
||||
val culpritNode = childWeightPairs.filter { it.first == culpritWeight }.first()
|
||||
val culpritChildren = (node.children[culpritNode.second] as Parent).children.values
|
||||
val culpritChildrenWeights = culpritChildren.map { it.combinedWeight }
|
||||
if(culpritChildrenWeights.toSet().size == 1) {
|
||||
println("$culpritNode has balanced children, but doesn't weight right.")
|
||||
println("Correct weight is $properWeight, but actually is $culpritWeight")
|
||||
val difference = properWeight - culpritWeight
|
||||
println("The difference is $difference, and must be adjusted with node weight.")
|
||||
println("Correct node weight is ${difference + node.children[culpritNode.second]!!.weight}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
40
day8.kt
Normal file
40
day8.kt
Normal file
|
@ -0,0 +1,40 @@
|
|||
import java.io.File
|
||||
|
||||
val instructionMap = mapOf(
|
||||
"inc" to { left: Int, right: Int -> left + right},
|
||||
"dec" to { left: Int, right: Int -> left - right }
|
||||
)
|
||||
val conditionMap = mapOf(
|
||||
"==" to { left: Int, right: Int -> left == right },
|
||||
"!=" to { left: Int, right: Int -> left != right },
|
||||
">=" to { left: Int, right: Int -> left >= right },
|
||||
"<=" to { left: Int, right: Int -> left <= right },
|
||||
">" to { left: Int, right: Int -> left > right },
|
||||
"<" to { left: Int, right: Int -> left < right }
|
||||
)
|
||||
data class Instruction(val register: String, val op: String, val operand: Int,
|
||||
val conditionRegister: String, val condition: String, val conditionOperand: Int) {
|
||||
fun execute(registers: MutableMap<String, Int>) {
|
||||
if(conditionMap[condition]!!(registers.getOrDefault(conditionRegister, 0), conditionOperand))
|
||||
registers[register] = instructionMap[op]!!(registers.getOrDefault(register, 0), operand)
|
||||
}
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val registerMap = mutableMapOf<String, Int>()
|
||||
val extractionPattern = Regex("([a-z]+) (inc|dec) (-?\\d+) if ([a-z]+) ([^\\s]+) (-?\\d+)")
|
||||
val instructions = File("../puzzle_8.txt").readLines().map {
|
||||
val resultingPattern = extractionPattern.matchEntire(it) ?: return
|
||||
with(resultingPattern.groupValues){
|
||||
Instruction(get(1), get(2), get(3).toInt(), get(4), get(5), get(6).toInt())
|
||||
}
|
||||
}
|
||||
var maxValue = Int.MIN_VALUE
|
||||
instructions.forEach {
|
||||
it.execute(registerMap)
|
||||
val currentMax = registerMap.values.sorted().last()
|
||||
maxValue = Math.max(currentMax, maxValue)
|
||||
}
|
||||
println("Largest value in any register is ${registerMap.values.sorted().last()}")
|
||||
println("Largest possible max value is $maxValue")
|
||||
}
|
33
day9.kt
Normal file
33
day9.kt
Normal file
|
@ -0,0 +1,33 @@
|
|||
import java.io.File
|
||||
|
||||
fun main(args: Array<String>){
|
||||
val line = File("../puzzle_9.txt").readLines().first()
|
||||
// val line = "<!!!>>"
|
||||
var indent = 0
|
||||
var totalScore = 0
|
||||
var currentIndex = 0
|
||||
var garbage = 0
|
||||
while(currentIndex < line.length) {
|
||||
when {
|
||||
line[currentIndex] == '{' -> indent++
|
||||
line[currentIndex] == '<' -> {
|
||||
while(currentIndex < line.length && line[currentIndex] != '>') {
|
||||
if(line[currentIndex] != '!') {
|
||||
garbage += 1
|
||||
currentIndex += 1
|
||||
} else {
|
||||
currentIndex += 2
|
||||
}
|
||||
}
|
||||
garbage -= 1
|
||||
}
|
||||
line[currentIndex] == '}' -> {
|
||||
totalScore += indent
|
||||
indent--
|
||||
}
|
||||
}
|
||||
currentIndex++
|
||||
}
|
||||
println("The score is $totalScore")
|
||||
println("The garbage amount is $garbage")
|
||||
}
|
16
test.kt
Normal file
16
test.kt
Normal file
|
@ -0,0 +1,16 @@
|
|||
import kotlin.math.roundToInt
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
var count = 0
|
||||
var startAt = 84 * 100 + 100000
|
||||
var iterations = 0
|
||||
while(iterations <= 1000) {
|
||||
for(i in 2 until startAt) if(startAt % i == 0) {
|
||||
count++
|
||||
break
|
||||
}
|
||||
startAt += 17
|
||||
iterations++
|
||||
}
|
||||
println(count)
|
||||
}
|
Loading…
Reference in New Issue
Block a user