├── .gitignore ├── README.md ├── build.gradle.kts ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle.kts └── src ├── common └── positionXY.kt ├── day1 ├── balance.kt └── input.txt ├── day10 ├── adapters.kt └── input.txt ├── day11 ├── input.txt └── seats.kt ├── day12 ├── ferry.kt └── input.txt ├── day13 ├── bus.kt └── input.txt ├── day14 ├── input.txt └── masks.kt ├── day15 └── numbers.kt ├── day16 ├── input.txt └── tickets.kt ├── day17 └── life4d.kt ├── day18 ├── input.txt └── mathwork.kt ├── day19 ├── input.txt └── rules.kt ├── day2 ├── input.txt └── passwords.kt ├── day20 ├── input.txt └── tiles.kt ├── day21 ├── allergens.kt └── input.txt ├── day22 ├── cards.kt └── input.txt ├── day23 └── cups.kt ├── day24 ├── hexgrid.kt └── input.txt ├── day25 └── handshake.kt ├── day3 ├── input.txt └── slopes.kt ├── day4 ├── input.txt └── passports.kt ├── day5 ├── boarding.kt └── input.txt ├── day6 ├── customs.kt └── input.txt ├── day7 ├── bags.kt └── input.txt ├── day8 ├── bootloop.kt └── input.txt └── day9 ├── input.txt └── sums.kt /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /build/ 3 | 4 | .idea 5 | !.idea/vcs.xml 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Advent of Code 2020 2 | 3 | Advent of code 2020 solutions in Kotlin 1.4 4 | -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | import org.jetbrains.kotlin.gradle.tasks.KotlinCompile 2 | 3 | plugins { 4 | kotlin("jvm") version "1.4.21" 5 | } 6 | 7 | group = "org.test" 8 | version = "1.0-SNAPSHOT" 9 | 10 | repositories { 11 | mavenCentral() 12 | } 13 | 14 | sourceSets { 15 | main { 16 | java.srcDir("src") 17 | } 18 | test { 19 | java.srcDir("test") 20 | } 21 | } 22 | 23 | kotlin { 24 | sourceSets.all { 25 | languageSettings.useExperimentalAnnotation("kotlin.time.ExperimentalTime") 26 | languageSettings.useExperimentalAnnotation("kotlin.io.path.ExperimentalPathApi") 27 | languageSettings.useExperimentalAnnotation("kotlin.ExperimentalStdlibApi") 28 | } 29 | } 30 | 31 | tasks.withType() { 32 | kotlinOptions.jvmTarget = "1.8" 33 | } 34 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilya-g/advent-of-code-2020/9714fb3a5f8a0446624d870babca7574aa2204e2/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | mavenCentral() 5 | maven { url = uri("https://dl.bintray.com/kotlin/kotlin-eap") } 6 | } 7 | 8 | } 9 | rootProject.name = "AdventOfCode2020" 10 | 11 | -------------------------------------------------------------------------------- /src/common/positionXY.kt: -------------------------------------------------------------------------------- 1 | package common.positionXY 2 | 3 | data class Pos(val x: Int, val y: Int) { 4 | override fun toString() = "(x:$x, y:$y)" 5 | } -------------------------------------------------------------------------------- /src/day1/balance.kt: -------------------------------------------------------------------------------- 1 | package day1_ 2 | 3 | import kotlin.io.path.Path 4 | import kotlin.io.path.readLines 5 | 6 | fun List.findPairOfSum(sum: Int): Pair? { 7 | val residuals = associateBy { sum - it } 8 | return mapNotNull { a -> residuals[a]?.let { b -> a to b } }.firstOrNull() 9 | } 10 | fun main() { 11 | val items = Path("src/day1/input.txt").readLines().map { it.toInt() } 12 | val pair = items.findPairOfSum(2020) 13 | println(pair) 14 | println(pair?.let { (a, b) -> a * b }) 15 | 16 | val triples = items.associateWith { items.findPairOfSum(2020 - it) }.filterValues { it != null } 17 | println(triples) 18 | 19 | println(triples.entries.first().let { (k, v) -> k * v!!.first * v.second }) 20 | } -------------------------------------------------------------------------------- /src/day1/input.txt: -------------------------------------------------------------------------------- 1 | 1863 2 | 1750 3 | 1767 4 | 1986 5 | 1180 6 | 1719 7 | 1946 8 | 1866 9 | 1939 10 | 1771 11 | 1766 12 | 1941 13 | 1728 14 | 1322 15 | 1316 16 | 1775 17 | 1776 18 | 1742 19 | 1726 20 | 1994 21 | 1949 22 | 1318 23 | 1223 24 | 1741 25 | 1816 26 | 1111 27 | 1991 28 | 1406 29 | 1230 30 | 1170 31 | 1823 32 | 1792 33 | 1148 34 | 1953 35 | 1706 36 | 1724 37 | 1307 38 | 1844 39 | 1943 40 | 1862 41 | 1812 42 | 1286 43 | 1837 44 | 1785 45 | 1998 46 | 1938 47 | 1248 48 | 1822 49 | 1829 50 | 1903 51 | 1131 52 | 1826 53 | 1892 54 | 1143 55 | 1898 56 | 1981 57 | 1225 58 | 1980 59 | 1850 60 | 1885 61 | 324 62 | 289 63 | 1914 64 | 1249 65 | 1848 66 | 1995 67 | 1962 68 | 1875 69 | 1827 70 | 1931 71 | 1244 72 | 1739 73 | 1897 74 | 1687 75 | 1907 76 | 1867 77 | 1922 78 | 1972 79 | 1842 80 | 1757 81 | 1610 82 | 1945 83 | 1835 84 | 1894 85 | 1265 86 | 1872 87 | 1963 88 | 1712 89 | 891 90 | 1813 91 | 1800 92 | 1235 93 | 1879 94 | 1732 95 | 1522 96 | 1335 97 | 1936 98 | 1830 99 | 1772 100 | 1700 101 | 2005 102 | 1253 103 | 1836 104 | 1935 105 | 1137 106 | 1951 107 | 1849 108 | 1883 109 | 1192 110 | 1824 111 | 1918 112 | 1965 113 | 1759 114 | 1195 115 | 1882 116 | 1748 117 | 1168 118 | 1200 119 | 1761 120 | 1896 121 | 527 122 | 1769 123 | 1560 124 | 1947 125 | 1997 126 | 1461 127 | 1828 128 | 1801 129 | 1877 130 | 1900 131 | 1924 132 | 1782 133 | 1718 134 | 515 135 | 1814 136 | 1744 137 | 1126 138 | 1791 139 | 1149 140 | 1932 141 | 1690 142 | 1707 143 | 1808 144 | 1957 145 | 1313 146 | 1132 147 | 1942 148 | 1934 149 | 1798 150 | 2009 151 | 1708 152 | 1774 153 | 1710 154 | 1797 155 | 1747 156 | 959 157 | 1955 158 | 1717 159 | 1716 160 | 1290 161 | 1654 162 | 1857 163 | 1968 164 | 1874 165 | 1853 166 | 1175 167 | 1493 168 | 1425 169 | 1125 170 | 1973 171 | 1790 172 | 467 173 | 1804 174 | 987 175 | 1944 176 | 2001 177 | 1895 178 | 1917 179 | 1218 180 | 1147 181 | 1884 182 | 1819 183 | 1179 184 | 1859 185 | 620 186 | 1219 187 | 2008 188 | 1871 189 | 1852 190 | 1263 191 | 1751 192 | 1989 193 | 1381 194 | 1250 195 | 1754 196 | 1725 197 | 1665 198 | 1352 199 | 1805 200 | 1325 -------------------------------------------------------------------------------- /src/day10/adapters.kt: -------------------------------------------------------------------------------- 1 | package day10 2 | 3 | import java.math.BigInteger 4 | import kotlin.io.path.Path 5 | import kotlin.io.path.readLines 6 | 7 | fun List.totalOptions(): BigInteger { 8 | val mem = mutableMapOf() 9 | fun optionsStartingAt(index: Int): BigInteger = mem.getOrPut(index) { 10 | val n = this[index] 11 | val next = (index + 1..index + 3).takeWhile { it < size && this[it] <= n + 3 } 12 | println("for $n next options are ${next.map { this[it] }}") 13 | if (next.isEmpty()) 1.toBigInteger() else next.sumOf { optionsStartingAt(it) } 14 | } 15 | for (cache in lastIndex downTo 1) optionsStartingAt(cache) 16 | return optionsStartingAt(0) 17 | } 18 | 19 | 20 | fun main() { 21 | val input = Path("src/day10/input.txt").readLines().map { it.toInt() } 22 | // (1..64000).scan(1) { acc, _ -> acc + if (Random.nextDouble() < 0.1) 1 else 3 } 23 | val joltageValues = (input + 0).sorted() 24 | println(joltageValues) 25 | val diffs = joltageValues.zipWithNext { a, b -> b - a } //.onEach(::println) // println("$a, $b: ${b - a}")} 26 | 27 | (diffs + 3).groupingBy { it }.eachCount().also(::println) 28 | .values.fold(1L) { acc, e -> acc * e }.also(::println) 29 | 30 | println("total options: " + joltageValues.totalOptions()) 31 | } -------------------------------------------------------------------------------- /src/day10/input.txt: -------------------------------------------------------------------------------- 1 | 99 2 | 3 3 | 1 4 | 11 5 | 48 6 | 113 7 | 131 8 | 43 9 | 82 10 | 19 11 | 4 12 | 153 13 | 105 14 | 52 15 | 56 16 | 109 17 | 27 18 | 119 19 | 147 20 | 31 21 | 34 22 | 13 23 | 129 24 | 17 25 | 61 26 | 10 27 | 29 28 | 24 29 | 12 30 | 104 31 | 152 32 | 103 33 | 80 34 | 116 35 | 79 36 | 73 37 | 21 38 | 133 39 | 44 40 | 18 41 | 74 42 | 112 43 | 136 44 | 30 45 | 146 46 | 100 47 | 39 48 | 130 49 | 91 50 | 124 51 | 70 52 | 115 53 | 81 54 | 28 55 | 151 56 | 2 57 | 122 58 | 87 59 | 143 60 | 62 61 | 7 62 | 126 63 | 95 64 | 75 65 | 20 66 | 123 67 | 63 68 | 125 69 | 53 70 | 45 71 | 141 72 | 14 73 | 67 74 | 69 75 | 60 76 | 114 77 | 57 78 | 142 79 | 150 80 | 42 81 | 78 82 | 132 83 | 66 84 | 88 85 | 140 86 | 139 87 | 106 88 | 38 89 | 85 90 | 37 91 | 51 92 | 94 93 | 98 94 | 86 95 | 68 -------------------------------------------------------------------------------- /src/day11/input.txt: -------------------------------------------------------------------------------- 1 | LLLLLLLLL.L.LLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLL 2 | LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLLL 3 | LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL 4 | LLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLL.LLLLL.LLLLLLL.LLLLL.LLLLLL.LLLLLLLL 5 | LLLLLLLLL.LLLLLL..LLLLLLL.LLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLL 6 | LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLL 7 | LLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLLL.LLLL..LLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLLL 8 | LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLLL 9 | L.LLLL.L..L.LL....L......L...LL.LL..L....L...LL.LL.L.LL.LL..LL............L..L...LL.L.L.L..LLL...L 10 | LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.L.LLLLLL.LLLLLLLLLL.LLLL.LL.LLLLL.LLLLLLLL.LLLLLL 11 | LLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LL.LLLL.LLLLLLLLL.LLL.LLLL..LLL.LLLLL.LL.LLLL.LLLLL.LLLLLLLLLLLLLLL 12 | LLLLLLLLLLLLLLLLLLLLLLLLL..LLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLL..LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLL 13 | LLLLLLLLL.LL.LLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLLL 14 | LL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL..LLLLLLLL..LLL.LLLLL.LL.LLLLLLLLLL.LLLLLLLLLLLLLLL 15 | LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLL 16 | LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLL 17 | ....LL.....LL..LLL..L......LL.LL......L.....L.....LL.LLLL..L.L.......LL.LL.....L.........L...L..L. 18 | LLLLLLL.L.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL 19 | LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLLLLL 20 | LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLLLLL 21 | LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL 22 | LLLLLLLLL.LLLLLL.L.LLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLL 23 | LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLL 24 | .LLL....L....LL....L..........LL.L................L...L...LL......L.....LLLL...LL..L.....L.L..L.L. 25 | LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLL.LLLLL.LLLLLLLLLLLLL.LLLLL.LL.LLLLLLLLLL.LLLL..LLLLLLLLL 26 | LLLLLLLLL..LLLLLLLLLL.LLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLL.LLLLL.LLL..LLLL 27 | LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL 28 | LLLLLLLLLLLLLL.L.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.L.LLLLLL.LLLLLLLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLLL 29 | LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLL 30 | .L.LL..L.....L...L...L.L...L..L..L.L.L.L........L..LL....L...L...L.....LL.L............L..L..L.... 31 | LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLL 32 | LLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLL.LLLLLLLLLLLLLL.LLLLL.LL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.L. 33 | LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.L.LLLL.LLLLLLLLL.LLLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLL 34 | LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLL 35 | LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLLLL.LL.LLLL..LLLLLLLLL 36 | LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLL.L.LLLLL.LLLLLLLLL 37 | L.L..L.L..L.....LL...LL..LL..L.L...L...L.....L...L.......L...LL.............LL.LL.LL....L.L.LL.L.. 38 | LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL 39 | LLLLLLLLLLLLLLLL.LL.LLLLL.LLL.LLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLL.L.LLLLL.LLLLL.LLLLLLLLL 40 | LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLL 41 | LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLL 42 | .........L.L.L.LL.LLLLL..LL..LL......LL.L.L.L...L.L.....L.LL.....LLL.L.L.L.....LL...L..L....L..L.L 43 | LLLLLLLLL.LLLLLL.LLLLLLLL.L.LLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLLL 44 | LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLL..LLLLLL.LL.LL.LLLL.LLLLL.LLLL 45 | LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLL.LLL.LLLLL 46 | LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLL.LLLL.LLLL 47 | .L.........LL....L..LL.LLL.LL.L...L..L.....LLLL..........L.LLL...LLLL.L..L.L.LLL...LLL..L.L......L 48 | LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LL.LLLLLL 49 | LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLL..LLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLL 50 | LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLL 51 | LLLLL.LLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLL 52 | .LL.L.LL.LLL.LLL.L....L....LL..L.L............L.....L.....L....LLLL..L......L.L...LL...LL.L...L.L. 53 | LLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLL 54 | LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLLL.LLLLL.L.LLLLLLL 55 | LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL.LLL.LLLLLLL.LLLLLLLLL 56 | LLLLLLLLLLLLLLLL.LLLLLLLL.LLL.LLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL. 57 | L.LLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLLL 58 | .L..L.L....L.........L.L...L..L.L..LL.........L.L....L..LL...L....L.L...LLL.L.LL.LL.L..L...LL....L 59 | LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLL..LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL 60 | LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLL 61 | LLLLLLLLLLLLLLLLLLLLLLLLL..LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLLLLL 62 | LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLL.LLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLL 63 | LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLL.LL.LLLLL.LLLLL.LLLLLLLLL 64 | LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.L.LL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLL.LLL.L.LLLLL.LL.LLLLLL 65 | LLLLLL.LL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLL.LL.LLLLL.LLLL..LLLLLLLLL 66 | LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLL.LLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLLLLL.LL.LLLLLL 67 | LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLLLLL 68 | .LL..L....L.....L......LLL......L...LLLL....LLL......L..L......L..LL...LL...L......LL.LL....L..L.. 69 | LLLLLLLLL.LLLLLL.LLLLLLLLLL..L.LL.LLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL 70 | LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLL...LLLLLLL.LLLLLLLL.LLLL.LLLL.LL.LLLLLLLLLLL.LLLLL.LLLLLLLLL 71 | LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL 72 | LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLL 73 | LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLLL 74 | LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLL 75 | ...L.LL..........L....L.L.L....L......LL..........L.L.....LL..LL..L..L..L..L...L..L..L..L.....L... 76 | LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL 77 | LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLL..LL.L.LLLLLLLLLLLLL.LLLLL.LLLLLLLLL 78 | LLLLLLL.LLLLLLL..LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLL.LLLLLLL..LLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLL 79 | LLLLLLLLL.L.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLLL 80 | LLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLL.LL.LL.LLLLL.LLLLLLLLL 81 | LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLL.LL..LLL.LLL.L.LLLLL.LLLLLLLLL 82 | LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLL.LLLL.LLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLL 83 | LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLL.L.LLLLL.LLLLLLLLLLLLLLL 84 | ..L..L.LL..L.L..LL...L.L...L....LL..L.....L..L..L..L.....LL.L..L.LL......L.LLLL.LLL.LL.....L.L.... 85 | LLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLL.LLLL.L.LLLLLLLLL 86 | LLLLLLLLL.LLLLLL.LL.LLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLL 87 | LLLLL.LLL.LLLLLLLLLLLLL.L.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLL.LLLLLLLLLL.LLLLLLLLLL 88 | LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLL.L.LLLL.LLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLL 89 | LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLL.L.LLLLL.LLLLLLLLLLLLLLL 90 | LLLLLL.LLLLLLLL..LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL 91 | LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLL.L.LLLL.LLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLL.LLLLLL.LLLLLLLLL 92 | LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLLL 93 | L.LLLLLLL.LLLLLL.L.LLLLLL..LLLLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLL 94 | LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLL.LLLLLLLL.LLLLLLLLLLL.L.LLL.L.LLLLLLLLLLLLLLL 95 | .LLLLLLLL.LLLLLL.LLLLLLLL.LLLL.LL.LLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLLLLL 96 | LLLLLLLLLLLL.LLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLL.LLLLL.LLLLL.LLLLLLLLL 97 | LLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LL.LLLLLLL.LLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLLLLL 98 | LLLLLLLL..LLLLLL.LLL.LLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLL.LLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLL -------------------------------------------------------------------------------- /src/day11/seats.kt: -------------------------------------------------------------------------------- 1 | package day11 2 | 3 | import kotlin.io.path.Path 4 | import kotlin.io.path.readLines 5 | 6 | typealias Field = List 7 | operator fun Field.get(x: Int, y: Int): Char = 8 | getOrNull(y)?.getOrNull(x) ?: '.' 9 | 10 | inline fun Field.mapCells(f: (x: Int, y: Int, c: Char) -> Char): Field = 11 | mapIndexed { y, r -> CharArray(r.size) { x -> f(x, y, r[x]) } } 12 | 13 | inline fun IntRange.firstInSight(f: (d: Int) -> Char): Char? { 14 | for (d in this) { 15 | f(d).let { if (it != '.') return it } 16 | } 17 | return null 18 | } 19 | 20 | inline fun repeatUntilStable(getValue: () -> Any?, action: () -> Unit) { 21 | var value = getValue() 22 | while(true) { 23 | action() 24 | value = getValue().also { if (value == it) return } 25 | } 26 | } 27 | 28 | fun main() { 29 | val input = Path("src/day11/input.txt").readLines() 30 | 31 | var map: Field = input.map { it.toCharArray() } 32 | 33 | 34 | val rows = map.size 35 | val cols = map[0].size 36 | 37 | fun printMap() { 38 | map.forEach { row -> println(row.concatToString()) } 39 | println() 40 | } 41 | 42 | fun countSeats() = map.sumOf { row -> row.count { it == '#' } } 43 | val directions = (-1..1).flatMap { x -> (-1..1).map { y -> x to y } }.filterNot { (x, y) -> x == 0 && y == 0 } 44 | 45 | fun neighbours1(x: Int, y: Int) = 46 | directions.count { (dx, dy) -> map[x + dx, y + dy] == '#' } 47 | 48 | repeatUntilStable(::countSeats) { 49 | map = map.mapCells { x, y, c -> 50 | when { 51 | c == 'L' && neighbours1(x, y) == 0 -> '#' 52 | c == '#' && neighbours1(x, y) >= 4 -> 'L' 53 | else -> c 54 | } 55 | } 56 | // printMap() 57 | // println(neighbours(2, 0)) 58 | } 59 | println(countSeats()) 60 | 61 | map = map.mapCells { x, y, c -> if (c == '.') c else 'L' } 62 | // printMap() 63 | 64 | val maxRange = 1..maxOf(rows, cols) 65 | fun neighbours2(x: Int, y: Int) = 66 | directions.count { (dx, dy) -> maxRange.firstInSight { d -> map[x + dx * d, y + dy * d] } == '#' } 67 | 68 | repeatUntilStable(::countSeats) { 69 | map = map.mapCells { x, y, c -> 70 | when { 71 | c == 'L' && neighbours2(x, y) == 0 -> '#' 72 | c == '#' && neighbours2(x, y) >= 5 -> 'L' 73 | else -> c 74 | } 75 | } 76 | } 77 | println(countSeats()) 78 | 79 | } -------------------------------------------------------------------------------- /src/day12/ferry.kt: -------------------------------------------------------------------------------- 1 | package day12 2 | 3 | import common.positionXY.Pos 4 | import kotlin.io.path.Path 5 | import kotlin.io.path.readLines 6 | import kotlin.math.abs 7 | 8 | enum class Direction { N, E, S, W } 9 | enum class Side { L, R } 10 | val directions: List = Direction.values().toList() 11 | 12 | sealed class Instruction { 13 | companion object { 14 | fun parse(s: String): Instruction { 15 | val n = s.drop(1).toInt() 16 | return when (val i = s.take(1)) { 17 | in "NESW" -> Move(Direction.valueOf(i), n) 18 | in "LR" -> Turn(Side.valueOf(i), (n / 90).also { require(n % 90 == 0) }) 19 | "F" -> Forward(n) 20 | else -> error(s) 21 | } 22 | } 23 | } 24 | } 25 | data class Move(val direction: Direction, val n: Int) : Instruction() { 26 | override fun toString(): String = "$direction$n" 27 | } 28 | data class Turn(val side: Side, val times: Int) : Instruction() { 29 | override fun toString(): String = "${side}x${times}" 30 | } 31 | data class Forward(val n: Int) : Instruction() { 32 | override fun toString(): String = "F$n" 33 | } 34 | 35 | 36 | fun Pos.moveIn(dir: Direction, n: Int): Pos = when (dir) { 37 | Direction.N -> copy(y = y + n) 38 | Direction.S -> copy(y = y - n) 39 | Direction.E -> copy(x = x + n) 40 | Direction.W -> copy(x = x - n) 41 | } 42 | 43 | fun Direction.turn(side: Side): Direction = when(side) { 44 | Side.R -> directions[(ordinal + 1) % directions.size] 45 | Side.L -> directions[(ordinal + directions.size - 1) % directions.size] 46 | } 47 | 48 | fun Pos.rotate(side: Side): Pos = when(side) { 49 | Side.R -> Pos(y, -x) 50 | Side.L -> Pos(-y, x) 51 | } 52 | fun Pos.distance() = abs(x) + abs(y) 53 | 54 | fun main() { 55 | val input = Path("src/day12/input.txt").readLines() 56 | 57 | val moves = input.map(Instruction::parse) 58 | println(moves) 59 | 60 | 61 | var pos = Pos(0, 0) 62 | var dir = Direction.E 63 | for (move in moves) { 64 | when (move) { 65 | is Forward -> pos = pos.moveIn(dir, move.n) 66 | is Move -> pos = pos.moveIn(move.direction, move.n) 67 | is Turn -> { 68 | repeat(move.times) { 69 | dir = dir.turn(move.side) 70 | } 71 | } 72 | } 73 | } 74 | println(pos.distance()) 75 | 76 | var wp = Pos(10, 1) 77 | pos = Pos(0, 0) 78 | for (move in moves) { 79 | when (move) { 80 | is Forward -> pos = Pos(pos.x + wp.x * move.n, pos.y + wp.y * move.n) 81 | is Move -> wp = wp.moveIn(move.direction, move.n) 82 | is Turn -> repeat(move.times) { wp = wp.rotate(move.side) } 83 | } 84 | println("move $move, pos $pos, wp $wp") 85 | } 86 | println(pos.distance()) 87 | 88 | } -------------------------------------------------------------------------------- /src/day12/input.txt: -------------------------------------------------------------------------------- 1 | R180 2 | E1 3 | N1 4 | R90 5 | E4 6 | F84 7 | W3 8 | F19 9 | E5 10 | N1 11 | W5 12 | W4 13 | R90 14 | S1 15 | F70 16 | R90 17 | W2 18 | S3 19 | L180 20 | E2 21 | R90 22 | E1 23 | R90 24 | N2 25 | E3 26 | F55 27 | W3 28 | R90 29 | S2 30 | E4 31 | L90 32 | F33 33 | W4 34 | S3 35 | F11 36 | N4 37 | W4 38 | F88 39 | W3 40 | F62 41 | L90 42 | S3 43 | W3 44 | N1 45 | E3 46 | E2 47 | N1 48 | E3 49 | S3 50 | E5 51 | S4 52 | W5 53 | L90 54 | W5 55 | R90 56 | E4 57 | F36 58 | N4 59 | E4 60 | E5 61 | F47 62 | R90 63 | N3 64 | E3 65 | L180 66 | S5 67 | R90 68 | S5 69 | W2 70 | S3 71 | F43 72 | W2 73 | R180 74 | W2 75 | S2 76 | L180 77 | E2 78 | F49 79 | L90 80 | F77 81 | S5 82 | E1 83 | S2 84 | F39 85 | L180 86 | F12 87 | W1 88 | L90 89 | F60 90 | S2 91 | E3 92 | N1 93 | E5 94 | R90 95 | E1 96 | N4 97 | W4 98 | S4 99 | E2 100 | L90 101 | F100 102 | E3 103 | F58 104 | S2 105 | E4 106 | F83 107 | W3 108 | N1 109 | R90 110 | F99 111 | W5 112 | W4 113 | F19 114 | N3 115 | W1 116 | W5 117 | F70 118 | R180 119 | R90 120 | F58 121 | E5 122 | N3 123 | R90 124 | N4 125 | F86 126 | N4 127 | F70 128 | L90 129 | F36 130 | R90 131 | S4 132 | R180 133 | N5 134 | F81 135 | W5 136 | R90 137 | E5 138 | L90 139 | F73 140 | S5 141 | E3 142 | N1 143 | F27 144 | E2 145 | N3 146 | L180 147 | W2 148 | F24 149 | N2 150 | L90 151 | F69 152 | N2 153 | E3 154 | F49 155 | L90 156 | S4 157 | W5 158 | F18 159 | R180 160 | F62 161 | S2 162 | F65 163 | E3 164 | F100 165 | N1 166 | F96 167 | W1 168 | F75 169 | L180 170 | W2 171 | S2 172 | F93 173 | E5 174 | S3 175 | R90 176 | S2 177 | F34 178 | R90 179 | F83 180 | S1 181 | W1 182 | F58 183 | L180 184 | N4 185 | E1 186 | R90 187 | W2 188 | F93 189 | S3 190 | F20 191 | R90 192 | N3 193 | E3 194 | N3 195 | L90 196 | F8 197 | S3 198 | F18 199 | S3 200 | N2 201 | F6 202 | L270 203 | F70 204 | W5 205 | S3 206 | F54 207 | E2 208 | F75 209 | E3 210 | R90 211 | N2 212 | W3 213 | L90 214 | E4 215 | F58 216 | N5 217 | F97 218 | W2 219 | L90 220 | W5 221 | S2 222 | W1 223 | S5 224 | F85 225 | N1 226 | E1 227 | N4 228 | E4 229 | L90 230 | E1 231 | R90 232 | S5 233 | L180 234 | R270 235 | N1 236 | L90 237 | E4 238 | N3 239 | F45 240 | N2 241 | F68 242 | R90 243 | F36 244 | N5 245 | F82 246 | S5 247 | E4 248 | R180 249 | S2 250 | L180 251 | N3 252 | R270 253 | W5 254 | F70 255 | L90 256 | W5 257 | F80 258 | W4 259 | N2 260 | R90 261 | S3 262 | W1 263 | F23 264 | N1 265 | W1 266 | N4 267 | F70 268 | S3 269 | L180 270 | F57 271 | R90 272 | L90 273 | F55 274 | L90 275 | N4 276 | F87 277 | L90 278 | F1 279 | L270 280 | F17 281 | N5 282 | R180 283 | F84 284 | R90 285 | W5 286 | F7 287 | W1 288 | S1 289 | E3 290 | F46 291 | S5 292 | E2 293 | F23 294 | R90 295 | E4 296 | W2 297 | F96 298 | E5 299 | L90 300 | F65 301 | F3 302 | S5 303 | E5 304 | N3 305 | W4 306 | L90 307 | S2 308 | F57 309 | E1 310 | R90 311 | F68 312 | E3 313 | L90 314 | W1 315 | F29 316 | N5 317 | W5 318 | N1 319 | F95 320 | N1 321 | L90 322 | F31 323 | S5 324 | L180 325 | N2 326 | W5 327 | R90 328 | F27 329 | E1 330 | R90 331 | E3 332 | S5 333 | F10 334 | R90 335 | N4 336 | E2 337 | F25 338 | S4 339 | E5 340 | F51 341 | N3 342 | W2 343 | L90 344 | S3 345 | L180 346 | F17 347 | E4 348 | F93 349 | E3 350 | L90 351 | F41 352 | L90 353 | S5 354 | L90 355 | W5 356 | N1 357 | F81 358 | L90 359 | E4 360 | W2 361 | R90 362 | W1 363 | S5 364 | R90 365 | F39 366 | W3 367 | R90 368 | N5 369 | E1 370 | L90 371 | F82 372 | S3 373 | R90 374 | W4 375 | F66 376 | F4 377 | L90 378 | F77 379 | R90 380 | E1 381 | L90 382 | F53 383 | S4 384 | F35 385 | W1 386 | F64 387 | R90 388 | F9 389 | S1 390 | E1 391 | L90 392 | W4 393 | R90 394 | S2 395 | W5 396 | R90 397 | S4 398 | L90 399 | N3 400 | F8 401 | L180 402 | N5 403 | E5 404 | N4 405 | F35 406 | N5 407 | W1 408 | N1 409 | E5 410 | F15 411 | R180 412 | F92 413 | W3 414 | L90 415 | F4 416 | L90 417 | E1 418 | S3 419 | W3 420 | R90 421 | F37 422 | N5 423 | F19 424 | S2 425 | F98 426 | L90 427 | F24 428 | W3 429 | F68 430 | N5 431 | R90 432 | W3 433 | L90 434 | W3 435 | L90 436 | S1 437 | L90 438 | S4 439 | W3 440 | F56 441 | N4 442 | R90 443 | E3 444 | W1 445 | L90 446 | E4 447 | N3 448 | R180 449 | E1 450 | S1 451 | W2 452 | R90 453 | N3 454 | F82 455 | N2 456 | F37 457 | S3 458 | L180 459 | E2 460 | L180 461 | F6 462 | N2 463 | F96 464 | E2 465 | R180 466 | E2 467 | W3 468 | R90 469 | E2 470 | S5 471 | S1 472 | F23 473 | R90 474 | W5 475 | F75 476 | S1 477 | L90 478 | S3 479 | E1 480 | F83 481 | W4 482 | L180 483 | W5 484 | L90 485 | N1 486 | E1 487 | S2 488 | F17 489 | L90 490 | S2 491 | F53 492 | R90 493 | S3 494 | N3 495 | W1 496 | N4 497 | L180 498 | L90 499 | E3 500 | F9 501 | S5 502 | F24 503 | W3 504 | E5 505 | N2 506 | F73 507 | N1 508 | F28 509 | N2 510 | W4 511 | N3 512 | F53 513 | E5 514 | F47 515 | W2 516 | F60 517 | L90 518 | E2 519 | F19 520 | S1 521 | F63 522 | W5 523 | F100 524 | N3 525 | L180 526 | F83 527 | N4 528 | W5 529 | F37 530 | S1 531 | F50 532 | E1 533 | N2 534 | W3 535 | R90 536 | F85 537 | S4 538 | F72 539 | N4 540 | L90 541 | F48 542 | R90 543 | F99 544 | R90 545 | F58 546 | W3 547 | W4 548 | F64 549 | E1 550 | R90 551 | F74 552 | L90 553 | F23 554 | N3 555 | N3 556 | E1 557 | S1 558 | W5 559 | L180 560 | F98 561 | L90 562 | F36 563 | W4 564 | S2 565 | W3 566 | F9 567 | F72 568 | W5 569 | F78 570 | N2 571 | F65 572 | S3 573 | F47 574 | S5 575 | R90 576 | F68 577 | L180 578 | W2 579 | F7 580 | E2 581 | E3 582 | S4 583 | R90 584 | N2 585 | L180 586 | W2 587 | R180 588 | E4 589 | R90 590 | W3 591 | L90 592 | E4 593 | F54 594 | L180 595 | E2 596 | F6 597 | W5 598 | F82 599 | E4 600 | R90 601 | E4 602 | F25 603 | N2 604 | R270 605 | N4 606 | F18 607 | N5 608 | R90 609 | S3 610 | R90 611 | F38 612 | R90 613 | F97 614 | W4 615 | F85 616 | S4 617 | F56 618 | E4 619 | S1 620 | F40 621 | W3 622 | F52 623 | L90 624 | F76 625 | N4 626 | F15 627 | S2 628 | F22 629 | S5 630 | L180 631 | F91 632 | L180 633 | F8 634 | L90 635 | E4 636 | N4 637 | F67 638 | L90 639 | S3 640 | R180 641 | R90 642 | N4 643 | F71 644 | W3 645 | F34 646 | E2 647 | N1 648 | F43 649 | W5 650 | L180 651 | N5 652 | W2 653 | F42 654 | R90 655 | W3 656 | F39 657 | E1 658 | S2 659 | L180 660 | N5 661 | E3 662 | N5 663 | F28 664 | E1 665 | R90 666 | S3 667 | F40 668 | L90 669 | S2 670 | S2 671 | L90 672 | W5 673 | L90 674 | F93 675 | R180 676 | W4 677 | S4 678 | W4 679 | F100 680 | S3 681 | R90 682 | E2 683 | L180 684 | W1 685 | E3 686 | S5 687 | L90 688 | F87 689 | N1 690 | R90 691 | F3 692 | R90 693 | E5 694 | R90 695 | S3 696 | F45 697 | L90 698 | S2 699 | F42 700 | R90 701 | F95 702 | L90 703 | E1 704 | N3 705 | R90 706 | F73 707 | S3 708 | E1 709 | L90 710 | S2 711 | E3 712 | L90 713 | L270 714 | F38 715 | S5 716 | R90 717 | F42 718 | L90 719 | N1 720 | F7 721 | S3 722 | F65 723 | N2 724 | F42 725 | L180 726 | W5 727 | S4 728 | E4 729 | F65 730 | S4 731 | E5 732 | F51 733 | E4 734 | R180 735 | F70 736 | R90 737 | F28 738 | N5 739 | W5 740 | N1 741 | F96 742 | L90 743 | W4 744 | S3 745 | W3 746 | F89 747 | W1 748 | L90 749 | F75 750 | L270 751 | S3 752 | R90 753 | L90 754 | F7 755 | E2 756 | F24 757 | R180 758 | S2 759 | L180 760 | F48 761 | R90 762 | F37 763 | W2 764 | R90 765 | W4 766 | L90 767 | W3 768 | F81 769 | E4 770 | N2 771 | F39 772 | E4 773 | N1 774 | W1 775 | L90 776 | F59 -------------------------------------------------------------------------------- /src/day13/bus.kt: -------------------------------------------------------------------------------- 1 | package day13 2 | 3 | import java.util.* 4 | import kotlin.io.path.Path 5 | import kotlin.io.path.readLines 6 | 7 | fun main() { 8 | val input = Path("src/day13/input.txt").readLines() 9 | Locale.getDefault() 10 | val minwait = input.first().toInt() 11 | val buses = input[1].split(",").map { it.toIntOrNull() } 12 | // doesn't work for non-co-primes in input, e.g. listOf(2,null,4) 13 | 14 | val busNumbers = buses.filterNotNull() 15 | println(busNumbers) 16 | 17 | data class Departure(val number: Int, val time: Int?, val addWait: Int) 18 | val departures = busNumbers.map { n -> 19 | val d = minwait / n 20 | val r = minwait % n 21 | val w = if (r == 0) 0 else n - r 22 | Departure(n, d * n + if (r == 0) 0 else n, w) 23 | } 24 | println(departures) 25 | departures.minByOrNull { it.time!! }!!.also(::println) 26 | .let { it.number * it.addWait }.also(::println) 27 | 28 | val busWaits = buses 29 | .mapIndexedNotNull { index, n -> n?.let { Departure(n, null, -index) } } 30 | 31 | val m = busNumbers.fold(1L) { acc, n -> acc * n }.also { println("M = $it") } 32 | println("ri, Mi, Mi_inv") 33 | busWaits 34 | .map { (n, _, r) -> 35 | val mi = m / n 36 | val minv = inverseMod(mi, n.toLong()) 37 | println("$r, $mi, $minv") 38 | r * mi * minv 39 | } 40 | .sum() 41 | .let { ((it % m) + m) % m }.also(::println) 42 | 43 | 44 | 45 | } 46 | 47 | fun inverseMod(a: Long, b: Long): Long { 48 | var p = a % b 49 | var r = 1L 50 | while (p != 1L) { 51 | p = (p + a) % b 52 | r += 1 53 | } 54 | return r 55 | } -------------------------------------------------------------------------------- /src/day13/input.txt: -------------------------------------------------------------------------------- 1 | 1007153 2 | 29,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,37,x,x,x,x,x,433,x,x,x,x,x,x,x,x,x,x,x,x,13,17,x,x,x,x,19,x,x,x,23,x,x,x,x,x,x,x,977,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,41 -------------------------------------------------------------------------------- /src/day14/input.txt: -------------------------------------------------------------------------------- 1 | mask = X100110110X011000101000101XX11001X11 2 | mem[5201] = 1838761 3 | mem[32099] = 25747352 4 | mem[36565] = 72187 5 | mem[31494] = 369864 6 | mem[17260] = 3138 7 | mem[64903] = 91484814 8 | mask = 0X00100101000XX0011110X10110X100X010 9 | mem[54866] = 120526 10 | mem[57614] = 430839 11 | mem[17916] = 648 12 | mem[43192] = 325890 13 | mem[23626] = 313518443 14 | mem[45988] = 50484 15 | mask = 01001001X0001X00XXX110X010010XX0X001 16 | mem[60805] = 1352 17 | mem[37516] = 5942314 18 | mem[63169] = 237020309 19 | mem[31655] = 274507 20 | mask = 010011010001110000010000X101X0X11X01 21 | mem[49875] = 15349586 22 | mem[6956] = 13765452 23 | mem[675] = 886107857 24 | mask = 01000001X1XX11011X1111X111X000X01X11 25 | mem[2135] = 5930 26 | mem[1861] = 1009 27 | mem[62754] = 145160 28 | mem[1333] = 1153712 29 | mem[15455] = 7454 30 | mask = 01X01X011X0011X0X10110001X1X1000X110 31 | mem[53253] = 667716 32 | mem[47571] = 745817 33 | mem[48582] = 5810 34 | mem[3620] = 7851685 35 | mem[41836] = 14080244 36 | mem[39150] = 84103 37 | mask = 01001X01100X100010X111111X11100XX111 38 | mem[249] = 514 39 | mem[25687] = 48545 40 | mem[62083] = 208926 41 | mem[39872] = 2590 42 | mem[28491] = 267 43 | mem[25340] = 115744 44 | mem[31101] = 6781 45 | mask = 0100100100011101000XX001XX0010100X10 46 | mem[6053] = 6291996 47 | mem[37941] = 514441 48 | mem[22984] = 108425255 49 | mem[30540] = 127685 50 | mask = 000X100101011X1X1010X1011110XX10X1X0 51 | mem[42567] = 253905 52 | mem[45241] = 15790 53 | mem[57132] = 480344 54 | mem[29971] = 22597051 55 | mask = XXX0111110001100010X1X01X10X0000000X 56 | mem[44680] = 428361054 57 | mem[17571] = 4884 58 | mask = X1X001010X0111101X11X100X10100101100 59 | mem[55107] = 2922 60 | mem[8605] = 5742 61 | mem[63754] = 289191 62 | mask = 01101001010X11000110111X11000X01X000 63 | mem[48186] = 7310 64 | mem[30306] = 413 65 | mem[1980] = 538481 66 | mask = 010011011XX011X110011111101X01101X1X 67 | mem[45241] = 11454771 68 | mem[65349] = 36152803 69 | mem[62368] = 34863 70 | mem[26794] = 5220 71 | mask = 010X10XXX1001100011101X00X0110011110 72 | mem[15496] = 898 73 | mem[59847] = 32170699 74 | mem[5411] = 130682 75 | mem[27017] = 205172 76 | mem[48688] = 3072 77 | mask = 001X000X111X110000110XX0010100001110 78 | mem[17575] = 12630818 79 | mem[51454] = 28544 80 | mem[52745] = 45251 81 | mask = 000000010100X110X11101X101X1011010X1 82 | mem[49456] = 637756 83 | mem[63169] = 99927 84 | mem[50318] = 7599616 85 | mem[42115] = 48825 86 | mem[20469] = 5931716 87 | mem[56899] = 2884 88 | mask = 01XX100X0100X10001XX011111X000001XX0 89 | mem[45630] = 2305 90 | mem[28560] = 118602807 91 | mem[45644] = 52185 92 | mem[3682] = 56264 93 | mem[63201] = 237495702 94 | mem[63572] = 7683 95 | mem[24477] = 370 96 | mask = 01X0X0XX0X011100011110000X0XX00X1111 97 | mem[14028] = 3492 98 | mem[28452] = 213847 99 | mem[57663] = 203516 100 | mem[24701] = 45071697 101 | mem[30226] = 856135 102 | mem[59279] = 100557 103 | mask = 0110100001X0X1X0010XX1XX00X100000000 104 | mem[4237] = 60693 105 | mem[51454] = 56389 106 | mem[44364] = 12145 107 | mem[53190] = 3825966 108 | mask = 0X0010000X011X0011111001100010X10100 109 | mem[45988] = 84435 110 | mem[43613] = 171165 111 | mem[39150] = 2025 112 | mask = 000001010X111100111101001000X00X000X 113 | mem[7204] = 243074994 114 | mem[30540] = 2829011 115 | mem[16986] = 171341 116 | mask = 01101X0101001X101X1111110X0X01X0010X 117 | mem[40006] = 276307 118 | mem[50601] = 45 119 | mem[2907] = 7955 120 | mem[61049] = 14014170 121 | mem[20722] = 52156072 122 | mem[12299] = 1701485 123 | mem[4643] = 2041760 124 | mask = X1101000010X110X0111X011001101000000 125 | mem[29309] = 29638912 126 | mem[23626] = 127552394 127 | mem[39357] = 2743410 128 | mask = XXX01000000110001111101X101X1XX0XX01 129 | mem[32322] = 110798340 130 | mem[38758] = 20398089 131 | mem[62368] = 6402 132 | mem[12381] = 125762 133 | mem[34042] = 46630 134 | mask = 0X1X100X0X01100X11X11111101100100001 135 | mem[56680] = 52806 136 | mem[3416] = 5097254 137 | mem[21217] = 959 138 | mem[11134] = 22705 139 | mem[39515] = 607 140 | mem[31858] = 527794383 141 | mask = 011110010100X10001110111X0XXX00110X1 142 | mem[37752] = 3783 143 | mem[27543] = 180509 144 | mem[56503] = 26998899 145 | mem[33984] = 2996098 146 | mem[6471] = 16602683 147 | mem[18585] = 5056811 148 | mem[3477] = 16274 149 | mask = 010110011XXX110X01011XX11X0100110X00 150 | mem[43993] = 784 151 | mem[12295] = 412860764 152 | mem[62707] = 11253 153 | mem[27017] = 1813664 154 | mask = 1XX0X001010X1010101100X000X0100XX000 155 | mem[25364] = 640 156 | mem[35537] = 489258314 157 | mem[356] = 47335 158 | mem[46814] = 130 159 | mem[21071] = 32074 160 | mem[23980] = 1969160 161 | mem[43457] = 28765451 162 | mask = 0X0XX00110XX1X00X10111110011X01X1001 163 | mem[37516] = 3409 164 | mem[32451] = 486160 165 | mem[31704] = 494261 166 | mem[64905] = 489121330 167 | mask = 10001001X101111010X010X1X11X1001010X 168 | mem[19927] = 125979 169 | mem[16164] = 163616 170 | mem[41291] = 11806544 171 | mem[13074] = 22666 172 | mem[65160] = 1102 173 | mem[21338] = 53735104 174 | mask = 00X00101X10111XX111101XX10X111111100 175 | mem[44736] = 13061 176 | mem[62844] = 31422 177 | mem[4643] = 59264 178 | mem[45417] = 5454 179 | mask = X0001X010X001101011X11001XX000101000 180 | mem[33984] = 13200 181 | mem[15462] = 316464 182 | mem[2638] = 1434216 183 | mem[29044] = 1370180 184 | mem[57663] = 77699993 185 | mem[39191] = 9595034 186 | mask = 100X1X0X010111X011101011111111XX1000 187 | mem[60509] = 275540 188 | mem[65073] = 8066 189 | mem[64726] = 78129 190 | mem[15719] = 724 191 | mem[52499] = 43989105 192 | mem[57518] = 6805488 193 | mem[27827] = 1522993 194 | mask = 0X010110X011X100111X00000111X1110X10 195 | mem[395] = 16602 196 | mem[21477] = 62043769 197 | mem[24630] = 663408947 198 | mem[3983] = 31082032 199 | mem[30545] = 456250 200 | mask = 0100XX01X000X10X10011101100X11101X10 201 | mem[28174] = 110183887 202 | mem[9644] = 12911 203 | mem[62113] = 145 204 | mask = 010010X10000100100110000101X1XX11011 205 | mem[63016] = 127052 206 | mem[49130] = 37 207 | mem[25394] = 187810 208 | mem[29779] = 11708792 209 | mem[36144] = 1033 210 | mask = 00101001X10XX10X11111X1100000111X001 211 | mem[35746] = 498408 212 | mem[15462] = 7839193 213 | mem[5741] = 168870 214 | mask = 0010100100X011XX1111X1001001X1X10101 215 | mem[2256] = 10474689 216 | mem[57428] = 8228 217 | mem[34062] = 16609889 218 | mem[45031] = 106065 219 | mem[17162] = 138367053 220 | mem[23302] = 14262 221 | mask = 001100110X1X11XX110100X0010100XX1000 222 | mem[33186] = 1012027 223 | mem[34051] = 148436 224 | mem[4762] = 25019364 225 | mem[41825] = 102071658 226 | mem[32580] = 739 227 | mem[15455] = 151015 228 | mask = 01X1XX00X10001000100011001000000XX10 229 | mem[31330] = 300785 230 | mem[30222] = 206857068 231 | mem[27739] = 774225 232 | mem[47798] = 12155 233 | mem[57437] = 440075165 234 | mem[49892] = 58 235 | mem[44723] = 116116 236 | mask = 100X1X00000X100011X1X00100101X00010X 237 | mem[35368] = 5187 238 | mem[24769] = 1425443 239 | mem[62844] = 277 240 | mem[30729] = 11517370 241 | mask = 0110100X0010110111X10X111000X11011X1 242 | mem[63295] = 139 243 | mem[60805] = 381899 244 | mem[6956] = 3979616 245 | mem[12295] = 1828 246 | mask = 010010X10X00X00X00X11XX00001X1001X00 247 | mem[39150] = 459766 248 | mem[52621] = 1962 249 | mem[11891] = 5261559 250 | mask = X11011X11X00110001011X1X110010000000 251 | mem[48473] = 3539 252 | mem[13808] = 331 253 | mem[30016] = 676 254 | mem[9736] = 3140258 255 | mem[12233] = 388562584 256 | mem[42686] = 1048145655 257 | mem[26132] = 67723 258 | mask = 01001X0X010X0001001X10101111X10110X1 259 | mem[35042] = 230878861 260 | mem[8611] = 488144 261 | mem[4290] = 942073 262 | mem[12381] = 17121117 263 | mem[15011] = 225 264 | mem[8378] = 9255 265 | mask = 00001X0XX01X11X01101001101011110101X 266 | mem[49708] = 312037855 267 | mem[19488] = 93439469 268 | mem[57113] = 7931 269 | mem[29037] = 210754 270 | mask = 0100X001X0X01X0100110X11X110001110X1 271 | mem[8519] = 38940 272 | mem[49033] = 10564 273 | mem[58481] = 4187786 274 | mem[5201] = 230275712 275 | mem[39296] = 886 276 | mask = 1000100X010X11101X1011011X0110X11XXX 277 | mem[38587] = 50240362 278 | mem[42581] = 116256847 279 | mem[37181] = 4441034 280 | mem[16281] = 23027479 281 | mem[32451] = 71649158 282 | mem[33316] = 6511 283 | mask = 000001X11101111011X1X10X1X001X1X1000 284 | mem[26168] = 390 285 | mem[11548] = 29301 286 | mem[2731] = 3188615 287 | mask = 1100XX00X0X110001X111X000011X0X10001 288 | mem[32136] = 6436 289 | mem[46206] = 225594 290 | mem[33132] = 7862942 291 | mem[15264] = 198 292 | mask = 01001001000X1101000111011X0011XXX10X 293 | mem[33733] = 14993993 294 | mem[9905] = 246637292 295 | mem[6373] = 2090 296 | mem[53539] = 29386 297 | mask = 0X1010X1X01011XX11111100100XX110X00X 298 | mem[41520] = 452041 299 | mem[8605] = 43647 300 | mem[62764] = 3241680 301 | mask = 0X1X10X1010111X0X1110XXX00000110X001 302 | mem[38517] = 3338 303 | mem[52745] = 4455 304 | mem[33218] = 850605 305 | mem[20495] = 315451 306 | mask = 0XX0X001010X11X01X111X1101X11X101000 307 | mem[32284] = 615642818 308 | mem[62844] = 46924 309 | mem[31120] = 146622 310 | mem[21925] = 518931 311 | mem[29515] = 1112 312 | mem[31241] = 130404 313 | mem[9905] = 5469165 314 | mask = 01101000001X110X1101101110XX1X1XX101 315 | mem[46432] = 346428972 316 | mem[64522] = 218092103 317 | mem[42311] = 2316477 318 | mem[20060] = 565 319 | mem[62919] = 261004 320 | mem[50103] = 42134 321 | mask = 0101100101000100X1X01XX11X0X00111010 322 | mem[41199] = 48367827 323 | mem[40992] = 886149 324 | mem[19927] = 93429 325 | mask = 01001X01X0XX110X0XX1110X011110001101 326 | mem[40019] = 187824261 327 | mem[3416] = 35491 328 | mem[51276] = 173825792 329 | mask = X100100110001X000X11010X00001010X001 330 | mem[21071] = 3775434 331 | mem[41466] = 601899 332 | mem[29191] = 163888869 333 | mem[64981] = 1094832 334 | mem[36745] = 7560 335 | mem[44434] = 3179 336 | mem[5040] = 16142 337 | mask = 0X101X011XX011111111010100010X0X01X0 338 | mem[44140] = 22478 339 | mem[26863] = 31310307 340 | mem[56680] = 131716 341 | mem[3983] = 22050 342 | mask = 1X0X10010X011X1X101X1000X1100X000010 343 | mem[45724] = 5130 344 | mem[38747] = 147724 345 | mem[39515] = 58764331 346 | mask = 0X001101X10000010X1X00010XX001010101 347 | mem[50201] = 65493 348 | mem[44879] = 7688011 349 | mem[29782] = 85876639 350 | mem[63157] = 57556 351 | mask = 00X00001010111X010X1X01X0101X01010XX 352 | mem[37667] = 539 353 | mem[65058] = 928398 354 | mem[16037] = 2162946 355 | mask = X010100000X11X001111001011011001XX11 356 | mem[20601] = 689238135 357 | mem[62832] = 22132331 358 | mem[20030] = 421255 359 | mem[38454] = 4898563 360 | mask = 01101XX0000111X001111100011000X01111 361 | mem[40968] = 287372 362 | mem[32860] = 121630361 363 | mem[6956] = 54910 364 | mask = 01101001100X11X0010X0101101010001X11 365 | mem[52270] = 852273185 366 | mem[44434] = 5773 367 | mem[40591] = 363113 368 | mem[31075] = 550 369 | mem[1148] = 237482 370 | mask = 0110100000001100X111X111111010X00X10 371 | mem[9807] = 919 372 | mem[10050] = 284353 373 | mem[11553] = 99307 374 | mask = 11X1X0X0010001000101100X1XX10X100X10 375 | mem[51707] = 59769 376 | mem[17916] = 456671254 377 | mem[15968] = 74716184 378 | mem[61681] = 11534 379 | mask = 0X0010010000110X01X1X111X001X111100X 380 | mem[63572] = 19584 381 | mem[12382] = 54348210 382 | mem[7204] = 62681 383 | mem[58309] = 718 384 | mask = XX0X0X11X0XX1100X10110111101X1000101 385 | mem[19172] = 49321 386 | mem[3972] = 156574486 387 | mem[53411] = 371993 388 | mem[34118] = 1245490 389 | mem[63786] = 28834 390 | mem[44434] = 1679 391 | mask = 0X010XX1101111001101110X1X0X1X1000X0 392 | mem[65433] = 41829624 393 | mem[5383] = 3874764 394 | mem[58309] = 40586 395 | mem[34516] = 1861 396 | mask = 0X00100X000X1100111X0011100010011100 397 | mem[30691] = 6349 398 | mem[26045] = 2259746 399 | mem[35285] = 2525303 400 | mem[56918] = 64290918 401 | mem[34521] = 495146 402 | mem[41173] = 1892852 403 | mem[62708] = 2610505 404 | mask = X1001000010XX10001011X10101000011000 405 | mem[41877] = 606935473 406 | mem[10746] = 30201 407 | mem[7236] = 2402617 408 | mem[31075] = 394149597 409 | mem[62893] = 2808512 410 | mem[44723] = 5738170 411 | mem[61147] = 2124552 412 | mask = 01X0100X0X0X1100X1111X11X00X01X01001 413 | mem[9905] = 376 414 | mem[56967] = 457904468 415 | mem[55040] = 2448 416 | mem[65513] = 2222 417 | mem[25340] = 23079 418 | mem[39876] = 4874 419 | mem[38909] = 16667453 420 | mask = X0001X0X01011110101X10XX1X1X10X01100 421 | mem[19488] = 3061762 422 | mem[26132] = 292794 423 | mask = 010010X101X01001001110X000X1011X11X0 424 | mem[1980] = 12162025 425 | mem[37165] = 15333747 426 | mem[39210] = 152686 427 | mask = 01X010X0010XX100011110000X000XX00101 428 | mem[27917] = 944976 429 | mem[25099] = 11114 430 | mem[7777] = 577171 431 | mem[27080] = 16334871 432 | mem[14285] = 531 433 | mask = X1X0100001X01100X10X1111100X00111010 434 | mem[28216] = 2511 435 | mem[37165] = 7141 436 | mem[55924] = 439753 437 | mem[11901] = 464 438 | mem[38571] = 407 439 | mem[782] = 10823 440 | mask = 0XX00X01010111XX11111110XX010010000X 441 | mem[54749] = 360481 442 | mem[20495] = 5280 443 | mem[37684] = 6039 444 | mem[6345] = 2073116 445 | mem[63110] = 22301539 446 | mask = X0X1010110111100110X1001100X1X100100 447 | mem[20722] = 9600365 448 | mem[19084] = 76987 449 | mem[23777] = 740859 450 | mask = 001X000111X01X000X11X000110111101100 451 | mem[27917] = 52797296 452 | mem[57636] = 322 453 | mem[11553] = 70582 454 | mem[8605] = 30966411 455 | mem[25394] = 812862 456 | mem[48296] = 317 457 | mem[60466] = 1411129 458 | mask = X110000X0XXX11101111001X100110100000 459 | mem[33339] = 4981 460 | mem[40073] = 5710720 461 | mem[33814] = 13208 462 | mem[14664] = 1950645 463 | mem[35042] = 35994943 464 | mask = 10101000X0X1X0XXX1X1101011001100000X 465 | mem[61417] = 114327 466 | mem[26863] = 706549 467 | mem[5651] = 118955 468 | mask = 011X10000010110111X10111X1001100101X 469 | mem[7679] = 272716 470 | mem[24077] = 12277996 471 | mask = X11XX000010001X00X011X1111X001XX0000 472 | mem[46531] = 35092779 473 | mem[1116] = 11777757 474 | mem[5932] = 519743 475 | mem[36187] = 318 476 | mem[38758] = 718897339 477 | mask = 01001X0110001000X0010X010010X01000X0 478 | mem[31101] = 257 479 | mem[39813] = 30972074 480 | mem[23252] = 1761211 481 | mask = 0X10100X00X0110X1111X1111010X1001101 482 | mem[17132] = 2823025 483 | mem[62368] = 442239906 484 | mem[24553] = 339245 485 | mem[64751] = 66303 486 | mem[56967] = 870173 487 | mem[15383] = 342572184 488 | mem[1647] = 20517 489 | mask = 00001XX000X11X0011X110X110XX1X010101 490 | mem[16037] = 1478 491 | mem[33316] = 30615219 492 | mem[6729] = 209640491 493 | mask = 01001000X1X1X100X1110100000X1X011X01 494 | mem[62368] = 29355190 495 | mem[48784] = 1522851 496 | mem[26590] = 14698075 497 | mask = 0XX0X0011X00X0000X11011010011110X101 498 | mem[249] = 746 499 | mem[11553] = 236505210 500 | mem[38328] = 823888 501 | mem[58433] = 125568672 502 | mask = X000X0000101X1101X10110X000X00111100 503 | mem[37813] = 4058843 504 | mem[32745] = 9417061 505 | mask = 000XX110001111X01XX1XX01X00111110100 506 | mem[22103] = 2397 507 | mem[40229] = 47978173 508 | mem[3477] = 14703 509 | mem[8594] = 2471 510 | mem[22603] = 44648051 511 | mem[11340] = 25471 512 | mask = 000001X1010111001X11X1X1100XX0101X0X 513 | mem[41160] = 52 514 | mem[2907] = 827 515 | mem[15719] = 107392281 516 | mem[43537] = 19084747 517 | mem[53742] = 3326211 518 | mem[46206] = 51870 519 | mem[30694] = 6031208 520 | mask = 0X10100000011100111X11100010X1111X01 521 | mem[31885] = 3110667 522 | mem[40041] = 30422 523 | mask = 00XX0XX101X111XX11X10111001101001000 524 | mem[2874] = 10110 525 | mem[21776] = 28380745 526 | mem[32004] = 7076 527 | mem[9644] = 526 528 | mask = 011010110001X1000XX110X0X0110000X011 529 | mem[35281] = 4670 530 | mem[7204] = 115940579 531 | mem[58380] = 17616 532 | mem[40735] = 46877007 533 | mem[30986] = 20371 534 | mask = 0XX01001010010X100111010110001111X10 535 | mem[43046] = 2060276 536 | mem[20743] = 553391345 537 | mem[20821] = 3685352 538 | mem[43943] = 39969 539 | mask = 0010100101010X0011XXX01XX100XXX11111 540 | mem[29261] = 60453 541 | mem[63512] = 94339357 542 | mem[34827] = 18871625 543 | mem[52359] = 322200 544 | mem[38003] = 25491 545 | mem[24795] = 461240689 546 | mask = 0000010X01011100101X010100X1X1101010 547 | mem[26894] = 3512 548 | mem[1023] = 9354 549 | mask = 11010XXX100011001101011X1111011001X1 550 | mem[45476] = 4571 551 | mem[2838] = 7601404 552 | mem[30540] = 187 553 | mask = X1X01X01X000110001011X010X0111X01001 554 | mem[32944] = 381053 555 | mem[63110] = 7479218 556 | mem[59783] = 121082 557 | mem[56918] = 1237706 558 | mem[32355] = 472 559 | mem[44080] = 131839645 560 | mem[56680] = 38523 -------------------------------------------------------------------------------- /src/day14/masks.kt: -------------------------------------------------------------------------------- 1 | package day14 2 | 3 | import kotlin.io.path.Path 4 | import kotlin.io.path.readLines 5 | 6 | fun main() { 7 | val input = Path("src/day14/input.txt").readLines() 8 | 9 | println(processInstructions(input, addressMode = false)) 10 | 11 | println(processInstructions(input, addressMode = true)) 12 | } 13 | 14 | 15 | val memRegex = Regex("""mem\[(\d+)] = (\d+)""") 16 | 17 | fun processInstructions(input: List, addressMode: Boolean): Long { 18 | val mem = mutableMapOf() 19 | var maskMask: Long = 0 20 | var maskVal: Long = 0 21 | for (line in input) { 22 | when { 23 | line.startsWith("mask = ") -> { 24 | val mask = line.removePrefix("mask = ") 25 | maskVal = mask.replace('X', '0').toLong(2) 26 | maskMask = mask.replace('1', '0').replace('X', '1').toLong(2) 27 | } 28 | line.startsWith("mem") -> { 29 | val match = memRegex.matchEntire(line)!! 30 | val baseAddr = match.groupValues[1].toLong() 31 | val value = match.groupValues[2].toLong() 32 | if (!addressMode) { 33 | mem[baseAddr] = value and maskMask or maskVal 34 | } else { 35 | for (a in decodeAddress(baseAddr, maskMask, maskVal)) { 36 | mem[a] = value 37 | } 38 | } 39 | } 40 | else -> error(line) 41 | } 42 | } 43 | // println("count = ${mem.size}") 44 | return mem.values.sum() 45 | } 46 | 47 | fun decodeAddress(address: Long, maskMask: Long, maskVal: Long): Sequence = sequence { 48 | val base = address and maskMask.inv() or maskVal 49 | // println("mask: ${maskMask.toString(2).padStart(36, '0')}") 50 | // println("addr: ${address.toString(2).padStart(36, '0')}") 51 | // println("base: ${base.toString(2).padStart(36, '0')}") 52 | val xs = maskMask.countOneBits() 53 | if (xs == 0) { 54 | yield(base) 55 | return@sequence 56 | } 57 | val maskBits = maskMask.oneBits() 58 | for (v in 0L until 1.shl(xs)) { 59 | var addr = base 60 | for (bit in 0 until xs) { 61 | if (v and 1L.shl(bit) != 0L) { 62 | addr = addr or maskBits[bit] 63 | } 64 | } 65 | // println("addr->${addr.toString(2).padStart(36, '0')}") 66 | yield(addr) 67 | } 68 | } 69 | 70 | fun Long.oneBits(): List = buildList { 71 | var rem = this@oneBits 72 | while (rem != 0L) { 73 | val bit = rem.takeLowestOneBit() 74 | rem = rem and bit.inv() 75 | add(bit) 76 | } 77 | } 78 | 79 | -------------------------------------------------------------------------------- /src/day15/numbers.kt: -------------------------------------------------------------------------------- 1 | package day15 2 | 3 | fun main() { 4 | val starting = listOf(5,1,9,18,13,8,0) 5 | 6 | val numbers = sequence { 7 | val memory = starting.dropLast(1).withIndex().associate { it.value to it.index }.toMutableMap() 8 | yieldAll(starting.dropLast(1)) 9 | var current = starting.last() 10 | var turn = starting.lastIndex 11 | while (true) { 12 | yield(current) 13 | val prevTurn = memory[current] 14 | val value = when (prevTurn) { 15 | null -> 0 16 | else -> turn - prevTurn 17 | } 18 | // println("current: $current, prevTurn: $prevTurn, turn: $turn") 19 | memory[current] = turn 20 | current = value 21 | turn++ 22 | } 23 | } 24 | 25 | println(numbers.take(10).toList()) 26 | println(numbers.elementAt(2020 - 1)) 27 | println(numbers.elementAt(30000000 - 1)) 28 | } -------------------------------------------------------------------------------- /src/day16/input.txt: -------------------------------------------------------------------------------- 1 | departure location: 29-458 or 484-956 2 | departure station: 40-723 or 738-960 3 | departure platform: 30-759 or 784-956 4 | departure track: 37-608 or 623-964 5 | departure date: 31-664 or 685-950 6 | departure time: 27-498 or 508-959 7 | arrival location: 36-245 or 269-961 8 | arrival station: 35-808 or 814-973 9 | arrival platform: 40-831 or 856-951 10 | arrival track: 36-857 or 875-971 11 | class: 43-161 or 167-963 12 | duration: 25-75 or 91-966 13 | price: 37-708 or 724-972 14 | route: 39-370 or 396-971 15 | row: 47-280 or 299-949 16 | seat: 41-105 or 125-952 17 | train: 43-351 or 359-966 18 | type: 34-575 or 586-965 19 | wagon: 27-397 or 420-953 20 | zone: 48-206 or 226-965 21 | 22 | your ticket: 23 | 61,151,59,101,173,71,103,167,127,157,137,73,181,97,179,149,131,139,67,53 24 | 25 | nearby tickets: 26 | 136,368,517,218,187,318,185,172,146,646,804,747,816,625,695,701,420,588,167,302 27 | 144,452,191,495,196,652,878,605,607,61,932,897,539,82,456,806,587,595,153,168 28 | 517,981,569,738,886,608,935,882,943,627,884,644,228,698,640,53,748,570,880,322 29 | 65,428,312,692,61,465,626,312,644,645,539,189,485,182,310,555,442,493,550,275 30 | 701,547,434,796,278,451,179,397,233,645,741,512,442,800,693,213,188,429,654,707 31 | 898,573,456,132,190,898,705,447,875,160,688,592,627,520,434,81,517,634,240,185 32 | 155,433,198,917,513,425,143,149,421,131,815,13,69,887,928,451,497,923,623,347 33 | 908,896,430,539,532,406,439,75,857,134,589,631,552,541,633,933,522,557,807,917 34 | 367,397,712,343,276,195,334,131,137,881,884,912,197,548,817,744,54,226,457,899 35 | 340,453,916,915,430,487,816,543,485,712,703,899,638,756,431,649,364,925,238,815 36 | 525,70,427,894,279,430,792,365,278,946,624,568,371,61,453,595,324,947,598,104 37 | 986,444,243,741,822,745,484,878,457,486,937,368,746,652,126,589,907,317,828,741 38 | 171,830,687,65,815,368,508,799,71,230,560,595,364,303,312,757,112,274,597,881 39 | 917,135,661,130,898,699,618,58,206,73,149,488,458,818,69,803,572,328,888,75 40 | 270,133,228,458,519,56,425,450,277,750,365,538,591,522,925,201,533,982,857,190 41 | 810,599,315,529,515,898,857,605,92,438,629,533,899,491,360,603,537,458,542,597 42 | 307,128,930,489,156,323,924,900,309,216,101,127,312,647,605,491,237,523,746,875 43 | 632,660,660,701,700,106,169,144,341,625,432,196,799,880,808,944,443,200,341,750 44 | 349,881,943,793,541,772,643,171,540,572,647,55,882,569,934,365,944,199,278,568 45 | 703,755,639,929,140,196,897,235,342,79,360,370,302,314,818,786,565,535,186,444 46 | 936,458,393,624,509,563,540,830,788,902,200,628,896,917,795,95,496,332,941,308 47 | 154,234,305,793,927,947,632,661,367,271,273,205,527,638,151,547,285,806,186,328 48 | 641,530,616,660,626,274,368,171,280,149,269,456,658,336,306,194,659,102,318,149 49 | 322,72,125,138,550,365,688,280,442,303,491,509,136,696,996,235,202,704,334,913 50 | 640,571,170,700,803,650,592,545,421,703,600,638,590,242,316,203,3,531,906,233 51 | 424,899,571,333,226,66,159,698,326,330,62,662,140,191,933,742,755,478,349,99 52 | 645,790,316,205,637,935,187,700,565,485,746,947,130,188,436,726,311,827,309,58 53 | 153,200,307,361,169,634,608,312,228,163,313,654,520,511,527,705,300,173,306,433 54 | 125,56,770,177,237,447,425,55,557,192,275,652,160,568,495,508,525,100,487,588 55 | 877,457,275,799,205,889,890,304,568,893,237,825,597,202,911,175,917,164,337,822 56 | 312,306,427,893,562,326,904,931,703,693,946,71,181,631,328,566,552,190,750,709 57 | 91,137,910,193,277,702,142,457,562,335,228,568,672,195,349,139,759,754,946,57 58 | 548,892,303,808,883,514,69,705,942,615,128,822,514,366,54,934,554,420,433,926 59 | 306,518,931,549,652,792,282,808,157,752,60,857,341,104,632,202,806,98,336,940 60 | 144,991,568,185,756,367,893,695,784,631,901,797,607,69,545,696,369,944,948,641 61 | 60,542,350,690,178,793,273,322,688,321,719,433,592,67,518,808,449,758,180,447 62 | 901,740,339,828,898,913,895,284,93,794,789,894,529,238,75,439,519,797,54,890 63 | 301,314,556,624,202,207,161,277,140,138,330,740,908,553,190,432,99,532,789,54 64 | 534,67,160,994,129,272,550,599,657,630,786,556,626,319,245,692,64,948,397,532 65 | 518,545,351,652,920,142,105,706,185,167,268,549,540,184,140,347,597,830,653,753 66 | 275,75,743,916,512,918,162,805,150,798,797,178,67,935,603,300,94,494,491,452 67 | 555,322,542,648,363,787,747,747,909,245,305,203,455,758,920,110,349,150,451,315 68 | 640,309,891,542,541,519,69,720,699,435,799,131,699,686,948,541,520,703,529,696 69 | 918,924,201,345,458,359,821,535,528,431,164,93,563,497,657,187,606,102,325,897 70 | 154,877,828,160,346,675,144,300,304,174,605,708,437,831,934,234,234,911,550,793 71 | 428,128,570,341,530,891,303,184,366,752,485,573,156,277,335,104,217,202,174,149 72 | 500,558,336,927,881,135,640,440,931,242,648,304,338,235,895,232,126,61,308,551 73 | 201,899,52,447,175,624,677,518,519,915,343,788,429,664,647,233,420,276,655,490 74 | 396,884,892,744,877,186,988,203,639,103,143,181,900,510,346,556,631,788,742,177 75 | 630,534,685,517,134,590,908,627,370,525,541,907,320,807,302,186,706,340,815,247 76 | 791,490,78,232,73,273,890,589,543,271,655,169,180,530,441,137,629,918,278,920 77 | 814,0,436,661,362,458,497,787,72,318,900,341,190,130,897,896,487,602,95,904 78 | 918,179,141,508,886,99,307,894,686,634,641,318,546,232,563,165,543,885,705,929 79 | 652,807,144,143,642,265,420,887,55,51,157,513,748,169,420,427,651,692,880,937 80 | 318,565,305,929,754,587,318,308,306,825,568,457,72,218,146,805,160,342,269,70 81 | 555,688,323,557,816,651,229,491,237,795,694,517,931,827,629,586,150,229,108,663 82 | 907,230,149,455,109,536,910,601,801,548,346,942,159,125,158,59,74,174,446,496 83 | 396,756,177,597,157,940,802,337,122,623,795,938,883,746,397,227,741,70,900,55 84 | 536,159,803,195,336,426,228,888,434,911,887,753,888,735,309,185,876,920,799,623 85 | 280,920,396,155,202,367,656,454,454,875,324,24,240,562,885,821,493,519,702,142 86 | 491,199,150,134,433,186,949,200,101,97,546,152,706,788,337,56,760,366,145,857 87 | 644,528,644,422,752,165,351,593,549,347,941,243,244,512,757,537,99,626,905,804 88 | 631,901,747,424,904,510,206,99,594,820,180,910,357,171,231,488,59,328,805,656 89 | 229,923,194,517,656,364,74,485,99,804,943,190,946,343,573,751,392,819,420,236 90 | 616,823,922,633,149,746,565,558,322,593,319,897,695,496,914,568,552,511,94,587 91 | 119,568,129,320,302,305,804,554,232,647,303,194,923,891,915,744,485,551,540,68 92 | 74,336,432,197,715,923,914,527,278,660,910,53,692,452,422,513,568,531,650,944 93 | 787,604,243,646,429,56,73,546,553,883,170,883,432,200,634,701,920,22,54,896 94 | 318,271,875,590,360,445,177,63,999,154,746,637,535,329,92,892,949,204,442,435 95 | 51,558,155,421,441,325,920,568,820,300,804,537,544,423,74,231,91,616,245,312 96 | 659,652,941,431,349,351,50,662,520,646,305,642,96,490,350,697,671,637,495,797 97 | 776,131,949,887,272,457,910,642,940,425,702,176,746,510,271,245,885,928,886,562 98 | 313,420,594,938,946,571,193,999,938,534,161,100,607,136,101,894,934,595,561,590 99 | 269,745,143,347,305,593,722,69,487,662,60,137,569,240,653,71,590,891,648,632 100 | 542,623,629,806,515,178,898,230,496,143,748,509,485,604,518,445,918,981,818,626 101 | 706,303,536,635,196,190,642,884,300,55,179,920,813,634,520,328,796,189,560,101 102 | 239,542,116,685,104,801,759,52,567,436,322,745,628,487,687,520,203,856,191,641 103 | 332,748,664,896,929,593,740,881,318,654,427,148,7,235,939,205,422,348,128,800 104 | 919,553,103,430,426,727,437,663,368,368,795,103,912,751,933,922,361,492,231,516 105 | 231,586,567,204,101,574,762,167,567,567,161,568,317,934,603,510,68,655,892,907 106 | 491,273,431,135,161,192,930,484,167,361,396,197,247,830,938,454,939,363,605,931 107 | 339,888,500,830,328,630,629,750,273,300,279,603,562,103,57,277,127,342,309,306 108 | 733,68,884,341,650,602,804,656,307,891,551,789,201,485,185,488,69,188,183,600 109 | 525,601,168,649,235,519,922,453,130,193,87,105,529,943,799,880,898,788,320,56 110 | 822,164,814,195,519,700,546,896,595,94,916,492,457,745,491,919,597,278,67,894 111 | 703,310,529,551,898,564,857,924,915,538,530,61,529,788,920,819,730,314,493,699 112 | 497,337,168,443,698,502,911,496,700,800,814,905,422,62,493,202,881,820,430,891 113 | 185,794,689,155,191,797,131,103,163,91,897,602,902,154,520,927,686,447,364,277 114 | 927,607,746,440,322,752,202,596,427,101,194,22,346,630,127,128,752,947,561,508 115 | 159,513,441,763,644,856,146,698,527,595,239,439,178,918,142,600,149,494,820,552 116 | 343,557,340,70,452,655,381,883,785,137,130,908,496,653,877,894,940,791,151,433 117 | 169,586,177,757,332,717,367,540,826,536,815,750,542,800,520,792,831,364,324,902 118 | 935,516,687,946,99,337,447,625,936,422,351,518,79,661,149,826,184,457,73,434 119 | 744,289,881,568,484,703,640,334,520,917,828,133,199,328,304,137,345,370,560,439 120 | 804,487,367,273,67,239,739,587,892,697,158,508,929,143,523,909,418,637,184,135 121 | 297,627,931,235,828,324,941,586,703,520,934,634,423,439,941,158,67,180,883,902 122 | 432,155,443,557,254,311,340,450,807,239,277,243,628,817,789,689,591,554,696,517 123 | 307,73,278,429,881,197,328,792,900,918,882,332,105,740,58,758,933,195,92,81 124 | 697,759,167,816,537,430,875,444,790,943,498,649,144,525,655,359,463,909,324,573 125 | 370,883,875,67,428,97,206,143,518,124,920,513,439,201,918,179,791,176,650,641 126 | 792,63,139,564,738,520,175,520,365,591,694,932,631,249,887,438,103,946,174,98 127 | 945,909,559,597,605,270,928,692,881,149,366,571,703,754,784,744,572,898,495,162 128 | 754,316,191,157,704,153,111,551,883,535,362,800,925,130,929,949,425,686,91,923 129 | 551,440,753,714,104,749,691,445,143,340,427,555,277,167,758,606,300,305,314,302 130 | 433,604,649,372,751,889,568,305,654,160,194,536,921,930,573,337,230,552,303,817 131 | 568,926,140,332,144,183,724,924,313,935,132,935,795,535,798,823,146,201,591,233 132 | 351,605,724,662,56,704,443,562,896,787,347,234,793,816,494,561,659,898,552,454 133 | 857,893,188,127,184,93,562,795,125,490,54,243,361,943,276,348,988,818,103,540 134 | 308,787,793,232,426,273,704,397,740,907,830,311,126,100,985,542,628,636,157,485 135 | 650,551,594,909,534,514,277,554,745,432,569,494,582,230,590,922,750,562,126,311 136 | 814,904,444,204,821,160,492,205,324,489,792,912,699,454,828,341,983,275,830,187 137 | 637,924,804,175,948,515,211,604,624,827,746,820,798,742,485,451,785,488,184,100 138 | 153,208,199,827,200,56,530,185,655,821,177,700,148,170,535,337,707,900,343,521 139 | 192,878,310,319,922,133,898,368,794,804,898,96,311,622,787,894,564,690,589,942 140 | 242,899,820,143,58,623,811,52,661,342,702,562,878,146,538,510,307,206,795,900 141 | 928,893,947,827,895,161,275,266,99,338,882,930,227,445,129,50,192,626,337,906 142 | 756,554,564,101,96,287,198,800,192,92,798,639,687,878,932,321,785,694,153,631 143 | 789,743,557,565,915,188,481,740,538,422,159,625,70,270,660,143,139,695,523,701 144 | 437,657,397,336,698,592,329,175,452,913,492,816,492,478,313,923,915,181,819,645 145 | 926,248,489,490,180,526,273,91,819,515,742,875,65,875,62,307,439,930,701,442 146 | 787,892,816,592,332,299,331,786,151,547,161,755,798,95,572,235,499,567,644,311 147 | 754,125,490,559,71,553,514,279,397,437,929,5,204,327,228,132,234,340,560,633 148 | 913,87,426,522,242,240,184,193,708,750,510,558,697,103,151,651,625,332,948,571 149 | 300,427,555,241,423,949,59,230,339,590,685,806,647,914,100,630,544,213,71,100 150 | 755,343,926,350,822,445,943,693,932,200,905,97,129,664,159,916,251,450,557,589 151 | 698,54,529,201,71,55,693,187,488,24,607,915,456,448,179,489,454,160,876,545 152 | 437,756,54,565,445,901,194,206,945,821,349,59,696,496,902,532,166,160,633,150 153 | 101,177,158,698,165,928,572,364,60,545,547,554,706,350,319,200,95,97,327,697 154 | 51,68,223,67,883,827,533,432,949,643,497,906,519,66,312,593,188,97,635,66 155 | 306,98,918,128,664,184,428,140,181,492,758,325,291,922,590,441,231,878,562,789 156 | 468,541,235,433,334,946,192,97,449,940,168,61,495,155,560,639,657,825,587,948 157 | 451,541,754,99,586,534,692,19,132,758,441,366,929,531,420,690,633,876,178,532 158 | 553,331,320,193,887,433,104,817,241,374,91,700,708,498,269,708,151,269,635,739 159 | 630,824,178,166,829,645,68,339,397,747,103,132,857,243,596,204,690,97,898,335 160 | 550,741,634,426,58,381,934,363,456,895,345,487,898,703,99,906,528,498,635,360 161 | 907,934,498,698,793,810,691,275,423,238,313,438,575,425,141,563,322,884,135,201 162 | 14,330,588,105,146,173,309,897,59,176,334,891,785,656,492,315,571,426,104,795 163 | 153,876,887,321,657,931,855,510,362,333,556,92,64,591,180,641,54,179,931,910 164 | 361,328,275,565,359,532,894,133,61,567,701,632,470,67,509,806,626,747,911,271 165 | 2,198,322,698,608,447,817,454,532,68,888,540,690,447,434,921,949,705,946,97 166 | 182,361,485,348,368,922,52,799,433,187,298,369,238,168,693,797,156,631,200,936 167 | 754,553,559,545,685,191,490,634,589,539,392,879,128,105,701,509,549,815,511,687 168 | 882,564,261,156,564,655,455,908,739,359,137,516,485,426,904,933,597,307,349,660 169 | 419,896,64,802,443,543,804,300,746,914,793,593,426,314,489,803,929,743,275,59 170 | 171,636,681,93,927,315,520,587,168,694,50,130,333,441,795,628,702,202,68,920 171 | 139,738,164,895,128,344,806,653,438,887,136,939,351,458,361,239,746,102,510,594 172 | 921,911,367,799,548,897,51,122,366,934,929,229,625,157,685,945,130,513,916,367 173 | 947,195,626,827,707,535,439,700,707,326,657,455,109,179,147,450,599,96,690,159 174 | 438,95,521,520,937,226,794,364,522,127,883,645,424,423,524,704,312,917,1,344 175 | 947,635,455,738,814,740,422,450,793,138,519,988,232,947,792,64,426,65,663,428 176 | 840,367,447,188,909,333,130,245,927,241,73,315,574,173,229,325,273,508,878,689 177 | 882,143,361,90,309,447,909,929,330,234,509,363,743,50,931,756,336,603,516,332 178 | 129,829,154,143,646,350,105,155,524,443,171,65,338,345,336,742,302,644,982,688 179 | 575,739,805,347,944,747,308,509,686,569,928,203,757,92,436,912,822,281,205,808 180 | 744,710,565,141,237,67,694,569,147,434,664,949,700,528,820,623,337,597,68,340 181 | 719,185,486,550,369,316,831,175,420,632,490,629,899,364,912,485,923,657,61,646 182 | 885,276,511,745,789,313,400,545,573,708,687,650,72,692,876,625,202,823,750,608 183 | 74,930,695,875,635,608,335,658,642,689,227,657,743,16,896,142,944,795,167,525 184 | 423,831,603,795,452,351,794,238,857,97,606,360,735,426,426,895,931,336,514,315 185 | 902,227,487,754,520,177,98,191,316,332,745,738,502,645,828,240,148,826,703,541 186 | 136,173,317,265,640,348,653,894,75,686,563,125,949,443,641,183,634,104,650,334 187 | 191,628,943,661,808,657,645,160,316,148,316,637,166,606,652,344,277,943,565,448 188 | 370,949,693,569,147,938,204,926,796,700,880,437,328,891,172,308,5,100,635,145 189 | 498,304,533,453,446,52,184,310,634,527,933,59,405,913,650,624,545,521,59,446 190 | 451,14,454,313,143,799,643,784,485,690,651,58,565,938,330,742,300,756,193,556 191 | 799,103,882,650,785,603,820,317,636,453,111,593,626,902,630,795,638,928,534,527 192 | 303,134,527,820,145,127,548,825,200,232,801,573,594,598,920,456,925,723,593,341 193 | 829,540,461,605,702,534,785,237,587,155,635,143,176,489,930,205,126,705,228,320 194 | 915,144,484,559,142,804,158,76,237,335,921,660,531,370,194,457,891,660,627,508 195 | 426,239,910,745,557,805,435,154,431,795,528,856,989,539,206,346,659,231,182,326 196 | 54,893,815,195,567,142,940,452,628,638,533,319,936,760,547,425,569,695,749,818 197 | 663,157,244,699,323,129,489,510,93,100,143,821,72,543,549,172,335,648,165,228 198 | 597,426,936,829,799,315,787,148,98,259,913,497,200,326,344,641,276,278,201,822 199 | 250,941,689,157,312,639,631,588,572,902,632,334,311,226,921,522,647,240,566,820 200 | 746,928,535,791,342,51,931,167,637,935,155,655,848,831,926,342,881,882,126,136 201 | 437,792,745,628,556,69,91,893,161,436,64,877,186,436,533,679,423,184,552,170 202 | 147,192,755,556,570,199,181,642,103,128,125,549,593,741,934,202,984,435,101,308 203 | 275,948,568,340,538,947,338,156,541,487,334,336,219,561,738,365,530,188,624,422 204 | 531,397,664,617,908,57,93,171,149,364,598,148,875,818,199,823,455,128,328,820 205 | 193,489,794,169,159,365,76,803,75,484,915,634,276,330,229,421,156,98,587,456 206 | 324,159,6,66,237,458,489,167,887,155,530,934,321,53,226,97,748,605,359,179 207 | 744,596,339,431,759,453,889,456,441,130,12,485,927,877,498,561,746,545,457,300 208 | 944,194,517,587,426,489,129,96,136,885,801,788,554,157,457,538,615,154,527,428 209 | 628,485,820,803,883,203,888,599,204,794,784,564,245,692,606,288,327,906,434,146 210 | 510,314,660,644,698,568,262,351,359,513,946,361,657,607,56,310,351,884,624,498 211 | 798,928,439,531,555,159,4,331,742,75,931,790,532,822,425,792,144,196,305,902 212 | 786,751,749,893,808,91,190,445,944,877,921,887,686,165,97,820,135,234,337,662 213 | 829,925,635,819,559,748,205,594,803,71,791,319,449,937,203,132,71,386,62,520 214 | 892,226,631,900,803,172,203,305,495,397,143,175,328,194,72,171,588,130,722,320 215 | 301,518,630,913,143,548,226,132,184,448,304,229,662,231,608,763,245,906,828,437 216 | 453,273,189,550,269,600,441,703,125,299,631,759,436,321,882,125,644,263,815,426 217 | 787,879,590,455,154,203,74,95,334,359,559,314,552,319,513,454,24,299,364,656 218 | 429,437,322,739,827,230,168,197,708,701,186,441,749,312,635,856,445,777,902,635 219 | 946,4,831,146,508,326,450,206,492,662,69,98,897,650,658,547,333,889,197,129 220 | 300,917,642,791,661,825,306,450,278,237,940,943,188,158,138,713,630,946,550,817 221 | 511,340,588,630,545,554,359,443,269,824,325,639,752,829,128,423,493,936,787,123 222 | 928,92,807,754,161,280,317,337,877,493,299,546,940,802,820,877,716,143,707,902 223 | 207,424,789,178,179,552,707,785,275,233,455,598,887,68,921,641,522,754,432,738 224 | 514,116,60,191,534,633,598,427,327,369,341,54,130,599,347,572,707,337,102,232 225 | 807,530,347,364,543,330,695,93,901,190,333,603,615,57,648,697,449,320,592,822 226 | 878,696,303,298,892,366,697,234,754,186,443,572,488,188,172,700,443,935,927,183 227 | 495,147,901,788,647,197,171,925,745,919,701,941,73,568,542,390,429,912,529,131 228 | 800,696,330,793,655,914,59,180,447,816,50,321,806,917,58,51,78,900,430,881 229 | 166,808,924,185,139,428,64,888,659,151,519,336,277,194,91,484,875,488,526,363 230 | 875,172,904,364,919,794,926,236,915,816,816,135,909,118,595,750,530,925,656,193 231 | 807,379,919,57,440,741,931,426,307,757,487,940,487,362,485,195,226,623,323,493 232 | 206,789,424,130,573,831,355,945,60,658,790,368,931,944,548,534,757,942,341,486 233 | 948,280,664,190,126,560,436,885,571,893,550,785,68,281,159,889,881,312,942,705 234 | 557,542,818,697,913,351,635,130,801,930,66,946,351,230,170,260,508,93,438,903 235 | 890,570,314,658,785,245,882,510,325,636,929,322,337,710,923,451,303,550,187,458 236 | 891,790,943,449,689,549,519,588,2,443,304,160,556,240,553,75,320,275,436,572 237 | 56,946,556,623,142,930,875,318,686,285,454,562,637,935,152,902,496,704,97,917 238 | 637,102,294,643,179,522,493,442,546,453,884,185,351,652,178,206,129,341,931,168 239 | 522,626,821,308,198,547,637,792,984,827,693,456,596,330,73,204,646,234,698,149 240 | 198,327,324,564,815,904,947,702,798,70,203,758,233,129,647,96,880,269,2,904 241 | 682,420,455,944,928,168,368,943,947,273,940,556,552,424,924,135,346,324,56,561 242 | 508,101,190,526,934,622,945,925,341,159,586,549,180,703,437,820,65,368,635,396 243 | 748,787,876,487,158,589,169,653,905,334,631,637,329,270,338,615,625,324,238,228 244 | 183,803,751,563,206,204,320,876,13,949,594,647,568,317,750,628,877,155,546,880 245 | 90,818,606,509,636,172,59,599,818,498,435,229,234,801,904,168,802,315,567,458 246 | 522,327,105,857,186,641,131,234,821,154,817,887,718,608,232,140,566,598,804,485 247 | 645,744,827,913,103,602,229,525,569,187,544,163,370,793,450,925,245,510,68,738 248 | 932,365,93,115,147,237,654,137,50,913,485,92,458,787,342,174,898,58,817,910 249 | 315,488,205,645,638,699,235,364,663,74,687,597,771,749,896,631,139,532,897,550 250 | 145,130,336,914,322,76,492,338,359,798,536,64,361,509,917,370,95,586,934,935 251 | 525,544,796,226,96,572,367,916,652,71,634,745,161,998,591,942,547,344,227,626 252 | 794,806,486,897,231,361,808,739,183,370,227,192,69,136,560,439,887,109,269,331 253 | 496,928,270,550,800,179,788,646,197,789,906,511,640,550,904,227,592,81,895,92 254 | 396,334,738,230,104,929,502,137,302,440,927,175,449,169,304,451,421,559,901,513 255 | 899,187,303,161,608,545,638,160,496,537,338,426,516,374,66,303,650,430,453,758 256 | 95,991,554,932,943,95,740,276,323,190,856,697,888,270,498,595,600,786,149,454 257 | 384,155,54,630,181,230,645,58,540,745,548,520,430,935,155,755,171,571,592,892 258 | 892,695,529,937,330,605,60,901,520,539,553,330,205,588,538,472,689,753,934,423 259 | 53,195,67,817,21,625,543,912,368,945,509,183,425,486,367,922,156,829,755,793 260 | 271,337,271,229,827,947,313,163,548,278,823,186,687,747,59,328,149,897,926,892 -------------------------------------------------------------------------------- /src/day16/tickets.kt: -------------------------------------------------------------------------------- 1 | package day16 2 | 3 | import kotlin.io.path.Path 4 | import kotlin.io.path.readText 5 | 6 | fun main() { 7 | val input = Path("src/day16/input.txt").readText() 8 | val groups = input.split("\n\n", "\r\n\r\n").map { it.lines() } 9 | 10 | data class FieldRule(val name: String, val ranges: List) { 11 | operator fun contains(value: Int): Boolean = ranges.any { value in it } 12 | } 13 | 14 | val rules = groups[0].map { 15 | FieldRule( 16 | it.substringBefore(": "), 17 | it.substringAfter(": ").split(" or ").map { r -> 18 | r.split("-").let { (s, e) -> s.toInt()..e.toInt() } 19 | }) 20 | } 21 | val your = groups[1][1].split(",").map { it.toInt() } 22 | val others = groups[2].drop(1).map { it.split(",").map { it.toInt() } } 23 | 24 | rules.forEach(::println) 25 | // others.forEach(::println) 26 | // your.let(::println) 27 | 28 | 29 | val sum = others.asSequence().flatten().filter { n -> rules.none { n in it } }.sum() 30 | println(sum) 31 | 32 | val validOthers = others.filter { t -> t.all { f -> rules.any { f in it } } } 33 | 34 | val fields = validOthers.map { it.size }.distinct().single() 35 | val possible = (0 until fields).map { field -> 36 | val possibleRules = rules.filter { r -> validOthers.all { t -> t[field] in r } } 37 | println("Field #$field: possible $possibleRules") 38 | possibleRules.toMutableList() 39 | } 40 | println() 41 | 42 | val singles = possible.filter { it.size == 1 }.flatten().toMutableSet() 43 | val ambiguous = possible.filter { it.size > 1 }.toMutableList() 44 | while (ambiguous.isNotEmpty()) { 45 | ambiguous.removeAll { p -> 46 | p.removeAll { it in singles } 47 | if (p.size == 1) singles.add(p.single()) 48 | p.size == 1 49 | }.also { check(it) { "Cannot infer further: $possible" } } 50 | } 51 | val fieldRules = possible.map { it.single() }.withIndex() 52 | fieldRules.forEach { println("Field #${it.index}: ${it.value.name}") } 53 | println() 54 | 55 | your.let(::println) 56 | fieldRules.filter { it.value.name.startsWith("departure") } 57 | .also { r -> println(r.joinToString { "#${it.index}: ${it.value.name}" }) } 58 | .map { your[it.index] }.also(::println) 59 | .fold(1L) { acc, e -> acc * e }.let(::println) 60 | 61 | } -------------------------------------------------------------------------------- /src/day17/life4d.kt: -------------------------------------------------------------------------------- 1 | package day17 2 | 3 | data class Vec4(val x: Int, val y: Int, val z: Int, val w: Int) 4 | 5 | fun Vec4.around(neighbors: List): List = neighbors.map { n -> 6 | Vec4(x + n.x, y + n.y, z + n.z, w + n.w) 7 | } 8 | 9 | fun main() { 10 | val initialState = """ 11 | .##.#### 12 | .#.....# 13 | #.###.## 14 | #####.## 15 | #...##.# 16 | #######. 17 | ##.##### 18 | .##...#. 19 | """.trimIndent().lines() 20 | 21 | val neighbors3b = 22 | (-1..1).flatMap { x -> 23 | (-1..1).flatMap { y -> 24 | (-1..1).map { z -> Vec4(x, y, z, 0) } 25 | } 26 | } 27 | 28 | val zero = Vec4(0, 0, 0, 0) 29 | val neighbors3 = neighbors3b - zero 30 | val neighbors4 = neighbors3b.flatMap { (-1..1).map { w -> it.copy(w = w) } } - zero 31 | 32 | 33 | val initialField = buildSet { 34 | initialState.forEachIndexed { y, row -> 35 | row.forEachIndexed { x, c -> 36 | if (c == '#') add(Vec4(x, y, 0, 0)) 37 | } 38 | } 39 | } 40 | 41 | fun oneCycle(field: Set, neighbors: List): Set = buildSet { 42 | addAll(field) // all current active cubes 43 | field.forEach { addAll(it.around(neighbors)) } // all potentially affected neighbors 44 | retainAll { e -> 45 | val n = e.around(neighbors).count { it in field } 46 | n == 3 || (n == 2 && (e in field)) 47 | } 48 | } 49 | 50 | /* 51 | // generic approach 52 | fun oneCycle(field: Set, neighbors: Point.() -> List): Set = buildSet { 53 | addAll(field) 54 | field.forEach { addAll(it.neighbors()) } 55 | retainAll { e -> 56 | val n = e.neighbors().count { it in field } 57 | n == 3 || (n == 2 && (e in field)) 58 | } 59 | } 60 | */ 61 | 62 | val field1 = (1..6).fold(initialField) { field, _ -> oneCycle(field, neighbors3) } 63 | println(field1.size) 64 | 65 | val field2 = (1..6).fold(initialField) { field, _ -> oneCycle(field, neighbors4) } 66 | println(field2.size) 67 | 68 | // fun Iterable.rangeOf(selector: (T) -> Int): IntRange = minOf(selector)..maxOf(selector) 69 | // println("xs: ${field2.rangeOf { it.x }}") 70 | // println("ys: ${field2.rangeOf { it.y }}") 71 | // println("zs: ${field2.rangeOf { it.z }}") 72 | // println("ws: ${field2.rangeOf { it.w }}") 73 | } -------------------------------------------------------------------------------- /src/day18/input.txt: -------------------------------------------------------------------------------- 1 | (8 * 4 + 6 + (7 + 3 * 9 + 4 * 3) + 2 + 2) * 3 * 8 * 2 * 9 * (5 * 5 * 2 * 6) 2 | 3 + 4 + 2 * ((6 * 2 + 4 + 5 * 6 * 8) + (3 * 8 * 6 + 8 * 7) + 2 + (7 + 3) * 9 * 5) * 8 3 | (4 + 3 * 8) * (7 * 3 * 8 * 3 + 4) + (8 + 2 + (7 + 4 * 3 * 3)) * (4 * (8 * 6 + 4 + 8 * 5) + 4 + 5 * 7 * (8 + 8 * 4 * 5 * 7)) + (9 * 6 + 8) * (6 + 8 + 5 + 5) 4 | 7 + 9 + 3 + ((2 + 6 * 6 * 6 * 5 + 4) * 8 * (9 + 5 + 4) * 7) + 5 5 | ((9 + 6 + 2 * 4 + 3 + 9) * (8 * 6 * 9) * 8 * 2 * 7) + 9 6 | 7 * 2 + (9 * (7 * 5 + 3 + 9 + 4) + 3 + 7 + 2 * (4 * 8 + 9 + 2 * 8)) + 9 * 7 + 8 7 | 9 * 7 + 8 + 3 8 | (9 + (6 + 7 * 2 + 5 + 9) * (2 * 8) * 8 * 5) * 4 9 | (5 * 8 + 6) + 2 * 8 + 2 * ((8 * 8 + 2) + (8 + 2 + 7 + 7) * (5 + 6 + 8 * 4 * 2) * 7) * (6 + 3 + 5 * 6 + 3) 10 | 2 + 6 * (7 + 2 + 7 * 9 + (9 + 6 * 5 + 8 + 8) + (4 + 9 * 6)) 11 | 8 + 5 + 8 * 9 + (4 + 5) + (4 * 9 + 2) 12 | 5 + (4 + 3 + 3) * ((6 * 8) * 6 * 3 * 8 + 3 * 8) * 2 13 | (9 + 9 + 3 + (9 * 5 * 8) + 3 + (8 * 2 + 8 + 9)) * 8 14 | (5 * 9 * (7 * 5 * 3 + 3 + 6 * 4)) + 3 * 4 + 3 15 | (9 * 8 + 7) + (3 + 9 * 6 * (8 * 4 + 5 + 8 + 8 * 5) * (2 + 3 + 8)) + (7 * (5 + 8 + 7 * 4 * 7)) 16 | (5 * 5 + 2 * 2 * 9 + 6) * 2 17 | (7 * 6 * 3 + 6 + 3 * 6) + 7 + 7 * 8 * (3 + 2 * 5) * 7 18 | 3 * 2 + 8 + 2 + ((3 + 2 * 5) + 3 * (3 + 6 + 5 * 3 + 8 * 3)) * (9 + 9) 19 | ((8 + 7 * 6) * 4 + 2) + 6 + 2 + 2 20 | 8 * (6 * 8 * 8 * 7 * 4 * (6 + 9 * 5 + 6 + 9 + 3)) + 5 21 | (2 * 6 * 7 * 6) + 6 * (6 + 4) * (8 * 7) 22 | 9 * 2 + 6 * 2 * (7 + 9 + 9) + 3 23 | 7 * 4 + 5 + 7 * (5 * (9 + 7 * 3 + 5 + 3 + 3)) * 4 24 | (3 + 4 * 2 + 4 * (2 * 8 + 4) * (4 + 2 + 6)) * 7 + 7 + 4 25 | 8 * 9 + 2 * 4 * (4 + 3) * 4 26 | 9 * 7 + (3 + 5 + 7) + 8 * 5 + 4 27 | 3 * (3 + 7 * 7 + 7 + (9 * 4 * 2 * 6 * 6)) + 2 + 8 28 | 7 + (8 * (9 * 5 + 4 * 6 + 5) + 3 + 3 + (4 * 4 + 7 + 7 * 4 + 7) + 9) + 2 + 2 29 | ((4 * 2 * 3 * 8 + 2 + 5) + 9) + (3 + 9) + 8 * 7 * (3 * 2 + 5 * 4 + 4) + 2 30 | 7 + 3 * 9 * (2 + 7 * (6 * 2) * 7 * 8 + 7) * 3 * 5 31 | (2 + (9 + 6 + 5 * 5) * 7 * 9) + 3 32 | 4 + 2 + (4 * (3 + 8 * 9 + 9 * 2 + 2) * (7 * 4 + 5 + 6 * 4 + 5) + 5) + 8 + 4 + 7 33 | (7 * 6 * 8 * 8 * 8 * 4) * ((5 + 7) + 9) + 2 * 4 + (9 + 7 + 4 + (6 * 7 + 4) * 3 * 5) + 8 34 | (5 + (3 + 3 * 3 + 3 + 4 + 5) + 9) * 5 * 5 + 5 + 7 * (6 + 8 + (8 + 4 * 3 * 7 * 3) * (7 * 7 + 4 * 3) * 7 + 8) 35 | (4 + 4 + 9 * (9 * 2 * 6 * 3 * 8) + 7) * 6 * 3 + 4 36 | (9 + (7 * 4 * 8 * 6 + 5) * 6 + 8 * (6 * 3 * 8 * 6 + 9) * 2) * 5 + 9 37 | (3 + 8 + 7) * 5 + 9 + 7 38 | 5 * (4 * 2 + 7 + 2) * 2 39 | (4 + 9 * 2) + (3 + 6 + (2 + 4 * 7)) * 2 40 | 3 + 8 41 | 8 * (2 + 9 * 2 + 2) + 7 * 6 * (7 + 3 * 7 + 7 * 9 + 4) + 8 42 | 6 * ((7 + 9 + 7) + 7 * 6 * (7 * 7) * 7) * 6 43 | 4 * (8 * (3 + 9)) 44 | 2 + (7 * 8 * 8 + (8 + 4 * 8 + 3) * (4 * 8) * 8) * 2 45 | 7 * 5 * 6 + 2 * 5 * 7 46 | 2 * 2 * (2 * (6 + 3 + 2 * 3 + 3) * 8 * 6) + 4 47 | 8 * 2 + 5 + (9 * 7 + 8 * 6 + 2 + 3) 48 | 6 + (3 + 2 + 3 + 4 * 9) 49 | (9 + 8 * 2) * 9 + ((2 * 6 + 8 * 7 * 7 * 2) + 5 * 6) + 8 + 7 50 | 8 + ((3 + 9) * 5 + 3 * 3 + 8 + 7) * 6 * 3 * 4 * 9 51 | (6 + 5 * 7) + ((2 + 9 + 3 * 2) * (3 + 8 + 9 * 5) + 2 * (3 + 9 + 3) + 2 * (2 + 8 + 9)) 52 | 8 + 9 + (6 * (2 * 4 * 9) + 5 + 9) + ((8 * 2 * 7 + 9 + 4 + 9) * (5 + 2 + 4 + 4)) + 4 53 | (6 * 9 + 4 * 6 + 7 * (9 + 8)) + 3 + 4 + (6 * 2 + 3 + 2 + 8) * 6 + (4 + 7) 54 | 3 + 6 + (6 + 7 + (4 * 5 + 4 + 5 * 3 * 7)) * 6 * 6 55 | 3 + (2 + 4 + 8 * 4 * 6) + ((4 * 7 + 2 + 4 + 3) * 8) * 8 * 9 + 4 56 | 4 * 9 + 2 * 9 * (4 * 7 * 9 * 6 + 8) + (6 + 6 + 7 + 6) 57 | (9 * 5 + (7 + 9 * 9 + 5)) * 9 + 5 * 7 58 | (2 + 2 * (3 * 6) * 8) * 5 * (8 + (7 + 6 + 2 + 9 * 9 * 9) * 2 * 4 + 4) + 2 59 | 6 * 2 * (6 * (7 + 6) * 4) 60 | 8 * 9 + 3 * 8 61 | 4 * 2 * 6 + (8 * 5) 62 | 9 * 9 + 2 63 | 7 * 6 * 4 + 9 * ((8 * 5 + 5) + 8 + 7) 64 | ((3 + 2 * 9 + 4 * 6) * 9 + 3 + 4) * 4 * 2 65 | 4 * 5 + (6 * 4 * 8 * 5 + 6) 66 | 9 + (6 * (5 + 7 + 3 * 2 * 2 + 4) * (8 + 5) * 6 + 2) * 2 + (2 * 7 + 3 * 3 * 7 + (5 * 6 + 2)) * 9 67 | (8 + 8 * 5) + (4 + 8) * 4 * 6 + 8 68 | 9 + 9 + 5 69 | ((9 * 7 + 4 + 3) * 9 * 5 + 3 + 7) * 2 70 | 7 * 4 * (7 * (6 * 7 + 2 * 9) + 5) * 5 71 | ((9 * 4 * 6 + 2) + 9 * 6 + 8 * 4 + 7) + 7 * 4 * 3 + 2 72 | 6 + 8 73 | 5 + 6 * (9 * 9 + 6 * 3 + 3 * 9) * (8 * 9 * 6 + (3 * 8) + 5 + 6) * (5 * 6 * 6 + 2 + 5 * 7) * 9 74 | (6 + (2 + 8 * 6 * 4) * (5 + 2 + 8 + 4 + 3) + (9 + 2) + (6 * 6 + 2 + 3)) + 2 75 | 6 + (5 * 3) * (5 * 9 + 9 + (7 + 8 + 2 * 7 * 2) * 5) + (2 * 9 * 8) 76 | 3 * (6 * 2 * 4 + (7 * 7) + 4) + (6 + (8 + 3 * 6) * 3 + 3 * 5 * 6) * (4 + 3 + 2 * 7 + 8 * 5) + 3 77 | (2 * (7 + 2 + 6 + 7 + 4) + 3 * 6 * (6 + 6) + 2) * 7 78 | 8 * 3 + 5 + (6 + 2 * 5 * 3 * 6) 79 | ((5 * 7 + 4 * 8 * 9 + 5) + 6 * 9 * 8 + 4) + (4 * 4 * 2 * 5 * 5) + 6 80 | 3 * ((5 + 2 * 7 + 9 * 9) * 3 + 8 * 6 + 2) + 9 81 | (8 + (3 * 9 * 6 * 4) + 8 * 7) * 4 + 7 82 | 7 * (2 * 7 + (6 * 8 * 3 * 2 * 7 + 6) + 2 + 7 + 7) 83 | (2 * (3 * 9) * 4 + 5 * 9) + 7 * 3 84 | 3 + ((9 + 6 + 7 + 6 + 8 + 6) * 3 * 8 * 2) * (9 * (8 * 8 * 8) * 4 * 7 + 6 * 6) 85 | ((6 + 8 + 8 * 2) * (7 * 2 * 7)) * 3 + 4 * (3 + 5 + 3) 86 | 3 + 4 * (4 + 2 + 2 * 4) + (6 + (6 + 7 + 5 * 4) + 9 * 2 + 3 * 2) * 7 87 | (3 * 5 + 7 + 2 * 4) * ((8 * 2 + 2) * (8 * 9 + 9)) * 7 + (9 + 3 + 4 * 2 + 5) * (3 + 9 + 4 * 4) * 2 88 | 3 * 3 * 3 + ((5 * 5) * 4 * 7 * 5 * 2 * 6) * 4 * 7 89 | 2 * (9 * 7 + 2 * 5 * 5) * 7 * (6 * 4 * 4) + 4 90 | (7 * 9 * 2) + 8 * (3 + 4 * (2 + 2 + 6 + 4 + 6) + (9 + 2) * 7 + 4) 91 | 9 * (3 + 3 + 2) * 6 + 9 92 | (5 * 3 + 7 * 8) * 3 93 | (7 * 8 * (5 + 5 * 7 * 6)) * 5 + 9 + (7 + (2 + 5 * 9 + 9 * 9) + 5 * 8 + 3) * 9 94 | (3 + (9 * 6 + 5) * 2 + 4 + 9 * (9 + 4 * 9 * 8 + 5)) + 6 + 2 + 6 + 9 95 | 9 + (4 + (5 * 2 + 5 + 2 * 9) * 2 + (8 * 6)) 96 | 4 * (9 * 5) + 6 97 | 4 * 9 + 6 + ((2 * 9 + 4 * 4 * 9 + 9) + (4 * 5 + 6 * 6) + 9 * 8 + 9) 98 | 8 * 2 + ((2 * 4 + 5 + 2 * 6) * (8 * 8 * 9 * 4) * 5 + 3) + (8 * 4 * (5 + 3 + 6 + 2 + 6) * (2 * 8 + 6 + 2 * 4)) + 3 99 | 3 + (8 + 6 * (4 + 7 + 8 * 2 + 9) * 8 + (7 + 3) + 5) + 2 * (9 + (2 + 6)) * 3 + 7 100 | 2 + 4 * 2 * (2 + 9 * (4 + 2) + 8 * 2) 101 | 4 + 2 + 2 * (9 * 7 + (8 * 8) + 5) + 5 * 2 102 | 8 * (9 * 7 * 9 + 6 * 7 + (5 * 9)) * 6 + 2 * 3 * 5 103 | 6 + (7 + 6) * 5 * 9 104 | 8 + 4 105 | 2 + 3 * (4 + 3) + 9 * (3 * 5 * 3) 106 | 9 + 4 * 9 + 4 * (2 * 9 + (7 + 9 * 2 + 9)) 107 | 8 + 2 * 7 * (5 * 7 + 4 + 6 + 4) + (8 * 7 + (7 + 3 + 3 + 7 * 6)) * 2 108 | 5 + 6 + (3 + 4 + (8 + 7 + 8 * 8 + 8 + 8) * 9 * 7 * 7) 109 | 9 * (4 * 6) 110 | ((3 * 4 * 2 + 4 + 5) * (7 * 3 + 6) + 6 * 4 + 4) * (5 + 9 + 6 * 9 * 2 * 5) + 7 + 6 * 4 111 | 5 * ((7 * 3 + 7 * 4 * 2) * 3) + 5 * 9 112 | (6 * 9 * 3) + 8 * 7 * 7 * 3 113 | (6 * (2 * 9 + 9 + 5 + 9 * 4) + 6) * 4 + 7 + 7 + 3 * 5 114 | (9 + 6 * 8) * 9 115 | 8 * ((7 * 7 * 5 * 2 + 8 + 7) * 2 * 9) * 9 116 | (2 + 6 * 2 * 6) * (3 + 4 * 2 + 9 + 3 + 2) + 4 * 4 + 8 117 | 6 + 3 * 6 + (7 + 8 * 9 + 4 + (6 + 6 * 9)) + 8 118 | (4 * (7 * 4 + 7 * 8 * 2) + (3 + 7) + 2) + 5 + (4 * 2) 119 | 5 * (8 + 3 * 8 * (4 * 8 * 5 + 3 * 8)) * 3 * 3 + 5 * 3 120 | (6 + 4 * (9 * 9 + 6 + 5 + 2) * (8 * 8 + 5 + 9)) + ((5 + 2 + 4) * 8 + 4 + (6 * 5) + 7) * 8 * 6 * 9 + 8 121 | 5 + 9 + 8 + ((6 * 2 + 2) + 4 + 6 * 6 * 9) 122 | 5 + 7 * (4 * (7 * 3) + 9 + 6 + 8) + (4 + 3) * 8 123 | 2 + 6 + 3 * (3 + 7) + 6 + (3 * 5) 124 | (7 + 2 + 3 * 4 * 8) + (6 * 3 + 5 * 6) * 2 * 7 + 4 125 | 5 * 2 * 8 + 6 * ((7 + 7 + 5 * 8 + 6 + 3) * 3 + 7 * 2 + 7 + 4) 126 | (9 * 8) + 5 * (3 * 5 + (8 * 3) + (2 + 7 * 5 + 6 + 8 + 6)) + 8 * 5 127 | 3 + 3 + 5 128 | 6 * 2 + 7 + (5 + 9 * 5) * 6 * 3 129 | 6 + 3 + 5 * 5 + 9 130 | 2 + 7 + (4 * 3 * 4 * (7 * 5 + 9 + 2 * 5) * 5 + 8) + 6 + 9 131 | 2 + 4 + (9 * 3) 132 | 6 * 5 * 8 + 5 * (8 * 9 * 3 * 9) * ((6 * 7 * 7 + 5 * 9 * 9) + 5 * 3 + 9 + 5 + 6) 133 | 9 * 7 + (2 * 2 * 2 + 4 + 4 + 2) + 6 + 4 * 6 134 | (4 * (8 * 8 + 7 * 5) + 3 + 9 * (9 * 6 * 8 * 5) + 7) + 8 * 6 + 5 * 7 * (7 + 5) 135 | ((5 * 9 * 9 + 4 * 7 + 2) + 8 * 8 + 9 * (2 * 5 + 4 + 9) + 2) + 7 * 3 136 | (4 + 8 * 5 * 7 + 2 * 6) * 7 * (8 + (6 + 9 * 7) + 8 * (6 * 2) * 5 + 8) + 5 + 5 * 4 137 | 4 + (4 * (4 + 4 * 3)) * 2 138 | ((2 * 4 * 7 * 6) * (5 + 8 + 2 * 4 + 6 * 2) + (3 * 2 + 7 * 5 + 2) + 8 * 9) + 5 * 8 + 6 + 9 * 4 139 | 9 + 4 * ((3 + 3 + 8 * 4 * 7 * 6) * (4 + 3 * 9 * 5 + 7 + 5) + (4 + 2) * (7 * 5 + 9)) + 9 140 | ((7 + 7 + 7 * 2 * 6) * (9 + 9 + 2 * 5) * 2) * 6 141 | (6 + (8 + 6 * 4)) * 9 * 8 + 6 * 8 142 | 9 + 5 + 7 + 2 + 9 + 4 143 | 4 * ((4 * 4 + 9) + 8) * 2 144 | 3 * ((7 * 8 * 9 + 7) + (2 * 4 + 4 + 9) * 9 + 8) 145 | (7 + 8 * 5 + 6 * 9) * 5 + 2 + 4 146 | 7 + 5 * (7 * 6 + (4 + 3 * 5) * 9) 147 | (3 + 4 * 5 + 9 + 9) + 8 + (4 + 8 + 3 * (8 * 4 + 7 * 4 * 4)) + 9 148 | 6 * (7 * 4) * 5 + (8 * 9 * 4 * (8 * 2 * 7 + 8 + 2) + 6) + 5 + 5 149 | 5 * 2 * 9 * (4 + 4 + (4 + 2) + 7) * 3 150 | 2 * 4 + (5 + 8 + 8) 151 | (7 + 7 * 8 + 3 + 3) + (8 + 3 * 4 + 9 * 4 * (7 + 8 + 5)) + 2 * 7 * 2 + 6 152 | 6 * 9 + 8 * 8 + ((9 * 4 * 9 * 2 * 7) * 5 * 5 * 8 * 8 + 7) + 9 153 | 2 + 3 + 2 * 2 * 7 + (5 + 7 + 4 + 5 * 4) 154 | 2 * 6 * 7 * ((4 + 6 + 5 * 4) + 4 + 4 + 5) + 6 + 9 155 | (2 + 9 + 7 * 4 * 4) + ((9 * 5) * 5 * 9 + 7) + 5 + 4 + 3 * 8 156 | (6 + (6 * 7) + 3 + 3 * (6 + 6 + 9 + 8 * 2)) + 3 + 4 157 | 5 + 5 * (4 * 8 + 2 + 2 * 8) * (2 * 8 * 6 * 2 + (5 * 2 * 8 + 5 + 3) * 5) * 6 158 | 4 + (5 + 3 * 9) * (6 * 8 + 4 * (6 + 4 * 5 * 2)) 159 | ((7 + 6 + 9 * 6) + 2 + 8 * 8) + (2 * 5 + 7) * 4 * (9 + 7 + 5 + 6) * 8 * 5 160 | 9 * (4 + 8 + 4 * 8 + (2 * 7 * 2 * 3)) + 2 * 2 + 2 + 8 161 | 7 * 6 + 9 * 6 + 9 + (3 + 3 + (5 + 8 * 6 * 5) * (5 + 6 + 4 + 2) + 3 + 3) 162 | (5 * 3) + 4 * 5 * 8 163 | ((7 + 4) + 4) * (9 + 5 * 5 * 5) + ((9 + 3 + 7 * 3) * 4 + 5 * 6 * 9 * 5) 164 | 9 * 2 * 5 * 4 165 | 6 + 3 * 9 * ((3 + 2) * (7 * 4 * 6 * 7 * 9) * 4 * 6 * 8 * 6) 166 | (7 * 6) + 9 + (5 + (6 * 2 * 3 * 8 * 8 + 4)) * 4 167 | (8 * 5 * (9 * 7 + 8 + 2) * 6 * (5 + 3)) * 4 168 | (2 + 6 + 6 + 7) + ((2 * 2) * 9) 169 | 6 * 3 + ((2 * 9 + 4) + (8 * 7 * 8 * 9 * 7 + 7) + 3 + 8 + (2 * 5 + 4 + 2 * 2 * 3)) + 2 170 | (9 + 8 * 6) * 7 * 4 + (2 * 3 + 9) * 4 + 9 171 | 5 + 5 + ((5 + 8 * 4 + 6) * 3 + (4 * 6 + 3) + 2 * 9 + 8) 172 | 2 + 2 * 5 + (4 * (9 * 5 * 6) + 4 + 6) 173 | (8 + 5 + (8 * 4) + 2) + 7 174 | 9 + (8 + 9 * 4 + 7 + (3 * 7) * 8) + (6 + (8 + 9 + 9) * 3) + 7 * 5 * 8 175 | (3 + 9 + 3) + 3 * 2 * (5 + (7 + 4 + 3 + 8) + 7) * 5 176 | ((2 * 7 * 2 * 7 + 8 * 3) + (5 * 8 + 7) * 3 + 2 * 9 + 4) + (4 * 9) * 4 * 7 + ((9 + 4 + 4) + 6) * 7 177 | 5 * 9 + 4 * 9 + (6 * 6 + 7) * ((8 * 3 * 3 * 8 + 2 + 5) * (8 + 9 + 7 * 4 * 3 + 8) + 3 * 7) 178 | 6 * 9 + ((9 * 7 * 8 * 3) * (5 * 5) * (4 * 9) + 4) + 9 179 | (5 + 4) * 9 + 3 * (7 * 2 * 3 + 3 * 3) 180 | (7 + 8 * 8 * (5 + 9 * 4 * 3 * 3) + (3 + 3 * 9 * 2 * 9 + 4) + (8 + 5 + 6 * 9)) * 2 * 8 + (7 * 8) * 4 * 3 181 | 6 + 2 * 6 182 | 5 * 5 + ((7 + 9) + (9 + 7 * 3 * 6 * 9 + 3)) * 8 + 6 * 3 183 | (3 + 6 * 8 * 7 * 2) + 3 * 5 + 8 * 8 184 | (8 * 4 * 7 * (4 * 5) + 9 + (9 + 6 * 5 * 3 + 9)) + 5 + 9 * 7 185 | 8 + (8 + 9) * 5 * (8 + 4 + 3 + 6 + 6 + 8) * 6 186 | 7 * 5 * 8 + 8 * 7 187 | 7 + 5 + ((7 + 4 * 2 * 3 * 6) * 7 * 9 + 3) * ((5 + 5 * 7 * 6) * 7 + 7 + 3 + 5 * 4) + (5 * 8 * (4 * 4 + 6 * 2 * 4 + 2) + 8 * 7) * 5 188 | (3 * 6 + (3 + 4 + 4 + 9 + 2) + 8 + 8 + 5) + 2 * 9 * 6 + (6 * (5 + 4 + 4) + 4 * 6) 189 | 8 * (3 + 9 * (5 * 2 * 7 + 5 * 2 * 4)) + 9 + 6 * 9 190 | (5 * (5 + 6 + 5) + 6 * 7) + 6 + ((9 + 2 * 3 + 7 * 3 + 2) * 9 * 3) + (4 + 4 + (5 + 8 * 9 + 5 + 7 + 9)) + ((2 * 2) + 4 * (9 * 7 + 4 + 9 * 3) + 8 + 3 * 6) 191 | (4 + (9 + 2 + 6 * 4) + 6 + (8 * 9 * 2 * 8 * 2 + 4) * (4 + 5 * 7 + 9 + 4 + 7) + (3 * 2 + 6)) * 4 * 6 + 8 * 4 + 9 192 | (7 + (3 * 3 + 5 + 6 + 2) * 7) + 3 * 6 + (3 * 6 * 4 * 7 + 6 + 7) + 5 193 | (5 + (2 * 4 * 6 + 9 + 3 + 9) * (5 + 3 * 2) * 3 * 8 * 3) * (3 + (3 + 2 + 4 * 5 + 3 * 3) + 9 * 2 * 5 + (2 + 4 * 2 * 6 + 6 + 9)) + (6 + 6 * 7) 194 | (8 + 5 + 8 * 4 + (3 * 5 * 8)) * 7 195 | 4 * 8 + 4 + 9 * (6 * (8 + 8 * 5 * 6 * 5) * 8) + (3 * 4) 196 | 4 * (2 + 9 * 7 + (2 + 3)) + 6 197 | 5 + 9 * (2 + 6 + (3 * 7) * 2 + 5 + (5 + 9 * 2)) * (7 * 6 * 4 + 7 + 9 + 8) + ((5 + 2 * 5 + 2 * 9) * (7 * 6) + (2 * 8 * 8 * 9 * 3 + 4)) * 5 198 | 4 * 2 + 2 + 5 * (2 + 5 + 5 * 6 + 9) 199 | 3 + 7 * 7 + (3 + 8 * 4 + 8 * 4 + 9) * 3 200 | 2 + (7 + 6 * 9 * 7 + 4 + 6) 201 | (4 + 2 * 9 + 3) * 4 * 2 * 7 * 7 202 | 5 + 7 + (4 * 9 * 2 * 9 * 4 + 9) + 2 + 5 203 | (2 * 7) + (9 * 7 * 9 * 8) + 4 * 7 204 | 4 * (8 * 6 + 2 * (9 * 8) + 5 + 6) + 3 205 | 8 + 4 + 8 * 8 * 9 * 4 206 | 7 + ((9 + 4 * 6 * 5) * (5 * 3 * 8 * 3 + 4 * 6) + (5 * 8 + 2)) * 9 + 2 207 | 7 + 3 * (4 + 3 * 8) + (2 * 8 * 5 + 2 * 2 + 4) + 9 * 8 208 | (5 * (9 * 3) + 5) * 8 * (2 * 3 + (5 * 8 + 2 * 3) + 3) * 5 209 | 5 * (8 + 7 * 3) * (4 + 5) * 5 * ((8 * 3 * 9) * 2 * 3 * 6) 210 | 3 * 6 * (8 + 8 * 4 + 9) + 6 211 | 3 + 3 * (4 + 8) + ((9 * 4) * 6) 212 | (3 + 2 * 2 + 5 + (7 * 4 * 2 * 3 * 3 + 8)) + 7 + (3 * (6 * 6 * 7 * 5) * 8 * 4) 213 | 6 + 4 * 4 * (3 + (2 * 2 * 5 * 9 * 8) + 4 + 8 * 4) * 4 * 2 214 | 4 * (3 * 4 + 8 * 2) * 8 + (3 + (9 + 9)) * 6 * ((6 + 5 * 5) + 8) 215 | 3 + 2 + (9 * (5 + 9) * 5 + 6) + 8 + 6 216 | 8 + 8 + 7 * (2 + 7 + 2) * 5 217 | 2 * (2 + 8 * 5 + 2 * (6 * 6 * 6)) + 2 218 | 5 + 2 * (2 + 2 + 5 + 2) + 9 * ((9 * 8 + 2 + 3 + 8) * 7) 219 | 6 + 8 + 6 + 4 * (4 * 4) + ((5 * 3) + 2 + 5 + 3 + 5) 220 | (7 + 8 * 9) * (8 + 2 + 2 * 4 + (2 * 3 + 7 + 3 + 4 * 8) * 5) + 9 + 3 221 | 7 * (6 * 9 * 4 * (5 + 4 + 8 + 3) + 5) 222 | 2 + 7 * 4 + (7 + (9 + 3) * (2 * 9 * 4 + 4)) 223 | 3 + 2 * 3 * 8 * (5 + 9 * 5 + 4) 224 | (5 * 4 * 6 * 8) + 2 + 8 * 4 225 | 7 + (6 + 6 * 7) 226 | 2 * 7 * 6 * (8 + 6 + (8 * 3 + 3 * 4 + 7)) + 4 227 | 2 * (5 + 4 + 9) * 9 * 8 * (2 + 9 * 6) * 6 228 | 4 * ((2 * 2 + 9 * 3) + (7 + 6 * 7 + 5 + 4)) * 4 * 3 229 | 7 * 5 * 6 + 8 * (6 * 8 + 6 * (9 + 7 + 9 + 9 * 7 * 9)) 230 | 7 * 6 + ((4 * 4 * 3) + 9 * 4) 231 | 4 + 6 * 3 + 9 + (6 + 9 * (8 * 3) * 2 * (9 + 8 * 3) + 9) * (8 + 6) 232 | 6 + 7 + 8 * 4 + (8 * 6 + 2 * 4 * 8 * 6) * 7 233 | (6 * 5 + 4) + 2 * (3 + 3 * 2) + ((4 + 6) + 7) 234 | 8 * 5 * 9 * 3 * 2 * (6 * 8) 235 | 4 + 6 + 2 + 5 * 6 236 | 2 * 3 * 6 * 6 237 | 6 + ((5 + 2 * 3) + (9 + 5)) * 2 + 5 238 | (4 * 9) + 6 239 | 8 * 3 * 7 * 9 * 7 * 4 240 | (2 + 9 + 3 * 8) * (2 + 2 + 2 + (2 * 7 * 2) * 3 * 3) * 7 * 6 + (9 + 8 * 6 + (5 * 3 + 2 + 3)) + 9 241 | 9 + 6 * ((8 + 7) + (3 * 7 + 5) + (8 + 3 + 4 * 6 * 8) + 8) * 6 242 | 4 * (7 * 2 + 2) + (4 * (4 * 4 * 5) + 9 + 2) + 7 * 6 243 | 6 + 9 + 4 + (8 * 8 + 2) 244 | (5 + 8 + 9) * 8 * (7 * 9) 245 | 6 * (6 * 4 * (7 + 4 * 7) * 4 + (3 * 2 * 5 + 8 * 3)) + 9 246 | (2 * 9 * 4 + 5 + 8) + 4 * 5 * (7 + (6 + 6 * 7 * 2) + (7 * 8 + 7 * 5 * 2 * 3) + 5 + 6 + (6 * 9 + 8 * 2 + 9 + 2)) + 6 + (3 + 3 + (9 * 6 * 6 + 5 + 9 * 2) + 6 * 2) 247 | (5 + 3 * 2) + 6 * 9 + (2 * (8 + 9 + 2) + 4 + 4 * (9 + 4 * 2)) 248 | (6 * (2 * 2 + 2) * (2 + 2 * 8 * 4 * 6) * 8 * 7) * 5 * 5 + (8 * 8) * (5 * 9 * 8) 249 | 6 * 2 * 8 * ((4 * 2 * 6 + 3) + 6) * 5 250 | (4 * 5 + 5 + 5 * 7 + 4) + (5 + 8 * 5 + 9 + (9 * 7 * 2 * 4 + 5 * 4) + 2) * 4 * 8 + 3 251 | (7 * 5) + ((8 * 7 + 4 * 6 * 4) + 9 + 4 + 7) 252 | 2 + (7 * 7) * 5 * 7 + 6 * 6 253 | 4 + (5 + 3 + (4 + 5) * 3) + 5 + 2 254 | (3 * 6 * (3 * 5 * 3 * 4 + 6) + 8) * (3 * 2 * 9 * 4 * (2 + 8 * 6 + 4 * 4) + 4) + 5 * 5 255 | 7 + (5 * 6 * (6 * 2) * (7 + 4 + 3) + 6 * 7) 256 | (7 * 4 + 6 + 7 + 8 + (2 * 2 * 6 * 4 + 2)) * 2 + 4 * 2 257 | 7 * ((5 * 7 * 3 + 2) + (3 * 2 + 9 + 6 + 8 * 2) + 8 + 7 * 7 + 2) * 8 + 7 + ((9 * 8 + 3 + 3 + 9 * 9) + 8 * 2 + 7 * 5) * 7 258 | (7 * 5 * 2 + 7) + 9 * 6 259 | 6 * 4 * 4 + (3 * 3 + 7 * 5) * 4 * 9 260 | 2 * ((3 * 6 * 4) * 4 * 5 * (5 * 2 + 4 * 2 * 3 + 8) * 4 + 6) * 5 + 8 261 | 2 + (5 * 3) * (5 + 6 + 9 + 4 * (9 + 7 + 7)) * 8 + 4 + 2 262 | ((2 + 5) * 4 + 2 + 7 * 6) + ((6 + 2) * 2 + 7) + (3 + (3 + 2) * 5 + 8 + (8 * 7) + 3) * 9 * (4 * 7 * 7 + (7 + 5 + 8 + 4 + 4 + 2) + 8) + 5 263 | 8 + (6 + 2 + 5 + 2) + 5 * 2 + 4 264 | 4 * 2 * ((7 + 8 + 8 * 6 * 5 + 3) * 5 * (6 + 6 * 6) + (5 + 5 + 7) * 8 * 3) * (2 * 5 * 2 * 3) * 7 + 5 265 | 8 * (9 + (7 + 8 + 7 * 4 * 4 + 9) + (5 * 7 * 6 * 3) * 6 * 4) + (6 + 8 * (4 + 2 * 8 + 4 * 4) + 8) * (8 * 3 + 3) * 5 266 | ((5 + 4 + 3) * 2) + 6 * 3 + (3 + 6 * 4) + 9 + (4 + (8 + 3 * 4 + 2 + 6) * 5 * 2) 267 | 4 * ((5 * 6 * 4 + 7) + 6 * 6) 268 | 3 + ((5 + 6 * 9) * 5) * ((8 + 5 * 7) + (5 * 3 + 5 + 4) * 7 * 8) * 4 * (3 + 3 * 9 * 4) 269 | 8 * 8 * (6 * 7 * 7) * 8 270 | ((2 * 4 + 8 * 4) + 6) + ((9 + 2) + 3) + 8 271 | 3 + 5 + 6 + 7 * ((3 * 6 + 2) + 9) + 6 272 | 9 + 2 * (9 * 9 + 4 * 9) 273 | (8 * 6 * (9 * 2 + 2 + 2) * 4 + 6) + (2 * 8 * 8) + 3 * (7 * 5 + 5) + 3 274 | 9 * 9 + (6 + 7 * 6 + 2 + 9 * 7) * (9 + 7) + 6 275 | 5 + (8 * 9 * 7 + (3 * 6 + 4 + 9) + 8 * 5) * 8 * (2 + 2 + 7 + (5 * 3 * 2 * 7)) * 3 * 7 276 | 2 + 3 + 8 * 4 * 5 + (5 * 9 * 5 * 8) 277 | 6 * 6 * ((7 + 5 * 5 * 9 * 3 * 6) * (3 * 7 + 9 * 8 * 8) + 9 * 5 + 7) * 6 * 3 278 | (5 * (5 * 6 * 5 + 5 + 5) * 2 + 8 * 5) * 9 279 | 4 + ((9 * 2 * 6 * 2 * 6) * 4 * 6 * 4 * 5 + 9) * (3 + 3 * 8 * 8 * (3 + 5 * 5 * 8)) + (8 * 5 + 7 * 6 + 9) * 9 280 | 4 * 9 * (4 + 5 * 7 * 8 + 3) * 2 + 4 * (2 * 6 * (3 + 2 * 7 + 6 + 2) + 5) 281 | ((8 * 4 * 9 + 3 * 3 + 2) * 3 * (9 * 7 + 6 + 7 + 3 + 3) * 6 * 2 + 9) + 4 + 5 282 | 3 + 9 + 3 + 7 283 | ((6 + 9 + 3 + 3 + 4) + 7 * 7) + (3 * (6 * 3 + 6 * 8 + 9) + 8 + (2 * 5 + 7 * 6 * 6 + 7)) * 9 + 2 + 8 * 6 284 | 3 + (8 + (2 + 5 + 7 + 7 * 9) + 8) 285 | (4 * 3) * 7 + 6 + 8 + 9 * 3 286 | (4 * 9 * 4 * 9 + 6 * 7) * 7 * 9 + 6 + 9 * 2 287 | (4 * 2 * (9 + 5 * 3 + 8 + 5 * 4) + 6 + (3 * 3 * 2 + 2 * 3)) * 4 + 6 + 3 + 8 288 | 9 * 9 + (7 * 8 + 4 * (9 * 8 * 5 + 5 * 3) + 7) * 3 289 | 7 * (7 * (5 * 7 * 9 + 8 * 9) + (7 * 8 * 5) + (9 * 2 + 6 + 3 + 3)) * 6 + 6 + 6 290 | 8 + 9 + 5 + 6 * ((8 * 7 * 5 * 3 * 9) + (7 + 6 + 7) + 4 * 3 * 8) 291 | 2 + (7 * 4 + 6 * 4) 292 | (9 * 8 * 5 + (7 * 6) * 9 + (6 + 8 * 3 + 9)) + 8 293 | 2 * 5 * (3 * 4 * 7 * 8) + (9 * 3 + (5 + 8 + 9 * 5 * 9 + 7)) + 3 294 | 6 * (8 * (6 + 6) + 9 * 7) + 8 + 7 + 3 295 | (9 * (5 + 2 + 9 * 8 * 4) * 9 + 7) * (2 + 9) + 6 296 | 9 + ((2 + 6) + 5 + 8) * 3 + (7 * 2 * (8 + 6 * 2 * 4 * 7) + 8 + 5 * (7 + 4)) 297 | 8 * 4 * (8 * 7 + 6 + 8 + 9) * 2 298 | 4 + 4 * 8 + (2 * 9 * 9 + (5 + 7 + 4) + 7 * (5 + 7 + 7 * 3)) * ((4 + 3 + 5 + 7) * 3 + 7 + 7 + 2) + 3 299 | 5 * 9 * 9 + 6 + (9 + 2 + 4 * 5 + 6 * (6 + 3 + 6 * 3)) 300 | 9 + 3 + 3 * 9 * 4 301 | 5 + (4 + 3) + 2 + ((2 * 4 * 6 * 8) * 5) * 5 302 | (5 * (4 + 3 + 7) + 2) + (3 * (6 * 6 * 2)) + 4 + (7 * 7 + 3 + 5 * 6) + (5 * (4 + 4 + 9 * 5 + 7)) 303 | (3 + 7 + 5) + ((6 * 8 + 7 * 4) + 8 + 6 + 7 * 2 + 8) 304 | (3 + 7 + 3) * 4 * 6 + 2 * (4 + 7 * 3 + 3) + 7 305 | (2 * 7) + 6 * 9 + 5 * ((3 + 9 * 5 + 5 * 2) * 3 * 9) + 6 306 | ((9 + 2 * 3 + 7) + 9 + 6) * 8 * 6 * 4 + ((4 + 9 + 2 * 6 * 9 + 2) * 9 + 9 * (4 + 3 * 9 + 3) + 7 * 3) 307 | 2 * 3 + 4 + 7 * 6 * (9 * 5 + 9) 308 | 9 + 3 * (8 * 8 + 4 * (8 * 8 + 6 + 3)) * 6 + 2 309 | 6 * 7 * (9 * 7) + 9 * 5 310 | 4 + 8 + (5 * (9 + 8 + 3 + 5 + 9) * 6 * 9 * 5 * 8) + 2 * ((8 + 2 + 3 + 8) + 3 * (8 * 4 + 4 * 2)) + 7 311 | (3 * 8) * 7 * 2 + 9 * 2 312 | 4 * (8 * (4 * 3 * 2 + 6 * 4) * 3 * 5 + 6) + 6 313 | (2 + 8 + 9 * 4) + 2 + 9 + 7 + (6 + 4 + 6 + 6) 314 | 5 * 6 * (5 * 6 + (7 * 9 + 5 + 6 * 7 * 5) + 9) * 8 * (9 * 8) + 7 315 | (5 * 6 * 7 + 4 + 9 + 2) * 3 * 4 * 3 + (2 + (4 + 6 + 2 * 3) + 4) 316 | (5 + 3 * 8 + (7 + 6)) + 3 * 7 + 7 317 | 8 + 5 * (3 + (5 * 6 * 5) + 6 + 2 * 7 + (9 * 4 + 3)) + 6 318 | 2 + (3 * 3 + (4 * 6) * 4 + 5) + (4 + 4) * (8 + 2 + (7 + 6 * 4 * 9 * 7)) + 6 + ((8 + 3) + 7 + 5 + 3) 319 | (9 * 2) * (3 + 8 + 3 * 4) + 4 * 3 + 7 * 8 320 | 4 * 3 * 5 321 | ((5 + 2 * 5 * 9) * 7 * 3 * 9 + (8 * 5 * 3 * 9 + 7 + 3)) * (9 * 9 + 6) 322 | (9 + (5 * 3 * 4) * 2 + 3 + 5 + 2) + 4 * 5 * 5 323 | 2 * 6 * 4 * ((3 * 7 * 4 + 8 * 8) * 4 + 5) + ((6 + 4 * 2 + 9 * 3) + (7 * 7 + 7) * 2 + 7 + 3) 324 | 2 + 9 + 6 * (2 * 5 + 9 + 9 * (5 + 8 + 2 * 3) + 5) 325 | (9 + 9 * 9 + 3 * (7 * 2 * 5 + 8)) + 9 326 | 8 + 7 * 8 + ((4 * 3 * 4 * 9 + 5 + 6) * (3 * 2)) 327 | 4 + 3 * (8 * 3) + 6 + (9 + 3 * 3) + (3 * 8) 328 | 2 + 3 + 8 * (8 + (4 + 9)) * ((5 + 7 + 9 * 4 + 6) * 2) 329 | 6 + 4 + 8 * (4 * 6 + 3) * (8 * 9) + 3 330 | (3 + 5 + 8 * 5) + 7 * (6 + 8 + (7 * 6 + 9 + 5 + 2 * 2) + 2 * 2 * 2) + 6 + ((3 + 4 + 6 * 6 * 3 * 6) + 3 * 3) + 6 331 | 7 + 8 * 9 * 6 + 7 + 3 332 | (5 * 7 * 5 * 5 + (3 * 3)) + 9 + 8 * (2 + (6 * 9) * (9 * 6 * 4 * 9) + (9 * 5)) + 4 333 | (4 + (7 * 8 * 4 * 6 * 7 + 6) + 7 * 6) + 4 + 2 + 7 * 4 334 | 4 * (5 + 4 + (9 * 4 * 7) + 4 + 2 + (2 + 9)) + (3 + (2 + 3 + 5 + 9 + 4 + 9) * (2 + 7 * 3) * 5) + 8 335 | 5 + (5 + (9 + 8 * 9 + 9 + 4) * 6 * 5) 336 | 7 * ((7 + 9 * 6 + 9 + 7) + (9 + 3 * 9 * 8 * 4 * 6) * 6 * 9) * 9 * 5 337 | (4 * 5 * 6) * 6 * 6 * (5 + 5 + (2 * 3 * 4)) * 5 338 | 9 * (5 + 3 * 9 * (6 * 5 + 9) + 3 + 9) + 6 + ((8 + 8 * 5) * 7 + 4 * 5 + 8 * (8 * 3 * 5)) * 5 * 8 339 | 4 + ((7 * 2 * 7 + 2) + 9 * 2 * 4) * (7 + (3 + 9 * 9) + (6 * 5) + (9 + 9 + 5 + 3 + 3)) * 8 340 | (3 + 9 * 8 + 2 * 9 + 9) * 8 * 6 341 | 9 * 8 342 | 9 * (8 * 4 * 5 + 3 * (9 * 2 * 7 * 6)) * 6 + 4 * 3 343 | 9 + 3 * 9 * 4 * (9 * 3 + 3 + 2 * 6) + 9 344 | ((4 * 3 + 2 + 7) * 3 * 8 + 2) + 5 * 9 345 | 8 + 5 * 9 + (3 + 8 * 4 + 8 * 8) * 5 346 | (6 + 4 * (2 + 9 + 6 + 3 + 9 * 6) + 6) + 2 347 | 7 * 6 + ((2 * 6 * 6 * 7) * 2 + (8 * 3 * 2 + 8) * 5 + 6) * 7 * 5 348 | (6 * 6 * 3 * 5 * 6) + 2 + (4 * 6) + 7 + (9 + 6 * 2 * (5 + 9 * 9 + 7 * 5)) * (6 * 3 * 9 + 8) 349 | 9 + (2 * (8 + 8 * 7) + 2 * 9 + (6 + 5 + 4 * 2 + 6)) * ((5 * 5 * 2 + 5) + 2 + (7 * 5) + 4 * 2) + 3 + 2 350 | 6 * ((6 * 3 + 4 * 4 + 8 + 9) * 9 + 2 * 9 * 4) + 7 351 | 2 * 2 * (8 + 6 + 2 * 5 * (5 + 3 * 6 + 3) + 7) + 5 + 9 * 4 352 | (2 + 9 * 2 * 5) + 5 * 6 * 7 + 6 * (8 * 5 * 4 * 2) 353 | 8 * ((9 + 6 + 4) * 8 + 9 + 3) + 2 354 | (2 + 2 + 9 + 9) + ((4 * 2 + 7) * 8 * 3 * 9 + 2 + 5) + (6 * 9 * (7 + 8 * 5 + 4 * 8 * 3) * (6 + 5 + 5 * 5 + 6 * 7)) * 5 * 6 355 | 6 * 5 356 | 4 * ((9 * 7 * 7 + 8 + 5) + 9 * 4 * 4 * 4) * 4 + 7 + 4 357 | 7 + (4 * 2 + 6 * 8) * 7 * 6 + 5 + 9 358 | 8 + 6 * 4 * (5 * 5) + 7 * ((5 * 8 * 6 * 9 + 6) + 9) 359 | (4 + 9) + 6 + (6 + 4) * (3 + 6 * (8 + 4 * 8 * 2) + 9) * 5 360 | 6 * (6 + (7 * 9 * 9 * 2) * 3 * 7) + 7 * 8 361 | 4 * (9 + 4 + 9 * 7 * 6) + 4 362 | 7 + 3 * (2 * 5 * 4 * 6 + (4 * 3)) + 5 * 5 363 | 6 * 5 + 8 * 2 + 5 364 | 6 + 2 * (6 * 3 + (2 * 5) + 7 + 7) + (9 + (4 + 3) + (4 + 6 + 7 + 9 * 5) + 3) 365 | ((5 + 9 * 4) + 8 * 2 * 5) * 3 + 2 * 8 + (5 * (9 + 3 * 6 + 4 * 2) + 5 * 5) + 5 366 | 5 * (6 * 7 * 2 * 4 + 8 * 3) * 9 + 8 367 | (8 + (6 * 3 + 8 * 4)) + (9 + 3 + 7 + 7 * 8 * 4) + (4 * (2 + 8) * 8 * 2 * 9 * 6) + 5 368 | 3 + (8 + 4 * 2) * 6 369 | ((9 * 2 * 8) * 4) * 4 + 6 370 | ((3 * 9) * 5 * 2 * 5 * 3) + ((4 + 4 + 2 + 8) * 3 + (5 + 7) * 6 * 2 + (8 + 6)) + ((9 * 5 * 3 + 3) + (7 * 8 * 4 * 8 * 3) * 7 + 9) + 4 + 4 * 8 371 | 2 + 5 + 2 * 3 + 8 + ((2 + 3 * 8) * 4) 372 | 9 * (6 + 8 + 5) * 6 + 9 * 2 373 | 7 + (6 * 9 + (7 * 4 + 7 + 5 + 7 + 3) * 5 + 7) 374 | 9 + 5 * (4 * 6 * 7 + 5 + 4 + 6) * (2 * 8 * 4 + 4 + (2 * 5 * 6) + (9 * 6 * 4 + 9)) + 4 + 6 -------------------------------------------------------------------------------- /src/day18/mathwork.kt: -------------------------------------------------------------------------------- 1 | package day18 2 | 3 | import kotlin.io.path.* 4 | 5 | enum class Operation(val symbol: String, val invoke: (Long, Long) -> Long) { 6 | Add("+", Long::plus), 7 | Mul("*", Long::times); 8 | companion object { 9 | private val values = values() 10 | fun forSymbolOrNull(symbol: String) = values.singleOrNull { it.symbol == symbol } 11 | } 12 | } 13 | 14 | val tokenRegex = Regex("(\\d+)|[*+()]") 15 | fun String.tokens(): Sequence = tokenRegex.findAll(this).map { 16 | it.value.toLongOrNull() ?: 17 | Operation.forSymbolOrNull(it.value) ?: 18 | it.value as Any 19 | } 20 | 21 | fun evalExpr(s: String, notLowerPrecedenceThan: Operation.(Operation) -> Boolean): Long { 22 | // println(s.tokens().toList()) 23 | val argStack = mutableListOf() 24 | val opStack = mutableListOf() 25 | fun evalOp(op: Operation) { 26 | val arg2 = argStack.removeLast() 27 | val arg1 = argStack.removeLast() 28 | argStack.add(op.invoke(arg1, arg2)) 29 | } 30 | for (t in s.tokens()) { 31 | when (t) { 32 | is Long -> argStack.add(t) 33 | is Operation -> { 34 | while (true) { 35 | val op = (opStack.lastOrNull() as? Operation)?.takeIf { it.notLowerPrecedenceThan(t) } ?: break 36 | opStack.removeLast() 37 | evalOp(op) 38 | } 39 | opStack.add(t) 40 | } 41 | "(" -> opStack.add(t) 42 | ")" -> while (true) { 43 | val op = opStack.removeLastOrNull()?.takeUnless { it == "(" } ?: break 44 | evalOp(op as Operation) 45 | } 46 | } 47 | // println("$argStack // $opStack") 48 | } 49 | while (opStack.isNotEmpty()) evalOp(opStack.removeLast() as Operation) 50 | return argStack.single() 51 | } 52 | 53 | fun main() { 54 | val input = Path("src/day18/input.txt").readLines() 55 | val samePrecedence: Operation.(Operation) -> Boolean = { true } 56 | val addPrecedence: Operation.(Operation) -> Boolean = { next -> this == next || this == Operation.Add } 57 | 58 | evalExpr("5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))", samePrecedence).also(::println) 59 | evalExpr("5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))", addPrecedence).also(::println) 60 | 61 | input.map { evalExpr(it, samePrecedence) }.sum().also(::println) 62 | input.map { evalExpr(it, addPrecedence) }.sum().also(::println) 63 | } -------------------------------------------------------------------------------- /src/day19/input.txt: -------------------------------------------------------------------------------- 1 | 70: 90 92 | 53 50 2 | 99: 90 102 | 53 22 3 | 24: 130 90 4 | 125: 85 53 | 100 90 5 | 61: 53 58 | 90 26 6 | 88: 33 53 | 46 90 7 | 32: 65 90 | 90 53 8 | 48: 46 53 9 | 116: 53 50 | 90 18 10 | 40: 53 83 | 90 81 11 | 54: 46 53 | 5 90 12 | 36: 50 90 | 130 53 13 | 58: 92 90 | 130 53 14 | 2: 19 53 | 75 90 15 | 95: 53 46 | 90 19 16 | 124: 46 53 | 33 90 17 | 79: 91 53 | 7 90 18 | 46: 90 90 | 53 90 19 | 87: 9 90 | 84 53 20 | 122: 90 46 | 53 33 21 | 15: 89 90 | 79 53 22 | 41: 90 4 | 53 119 23 | 7: 53 128 | 90 128 24 | 93: 53 120 | 90 37 25 | 121: 15 53 | 103 90 26 | 91: 90 33 | 53 110 27 | 5: 53 90 | 65 53 28 | 26: 53 19 | 90 107 29 | 44: 53 75 | 90 32 30 | 23: 107 53 | 50 90 31 | 33: 90 53 | 90 90 32 | 75: 53 53 | 90 90 33 | 18: 65 65 34 | 59: 53 107 | 90 32 35 | 104: 90 33 | 53 46 36 | 20: 121 90 | 123 53 37 | 100: 90 75 | 53 46 38 | 131: 18 90 | 46 53 39 | 9: 90 67 | 53 105 40 | 37: 53 75 | 90 128 41 | 3: 53 29 | 90 22 42 | 120: 53 92 | 90 33 43 | 35: 55 53 | 30 90 44 | 115: 65 107 45 | 106: 90 46 | 53 19 46 | 89: 90 59 | 53 68 47 | 83: 90 46 | 53 130 48 | 25: 90 87 | 53 41 49 | 11: 42 31 50 | 84: 53 117 | 90 34 51 | 8: 42 52 | 53: "a" 53 | 86: 53 6 | 90 12 54 | 76: 53 78 | 90 97 55 | 52: 126 90 | 115 53 56 | 31: 53 35 | 90 20 57 | 112: 110 90 | 32 53 58 | 82: 101 90 | 127 53 59 | 119: 53 27 | 90 93 60 | 117: 90 81 | 53 23 61 | 57: 82 53 | 43 90 62 | 105: 90 126 | 53 21 63 | 111: 53 32 | 90 110 64 | 68: 53 18 | 90 46 65 | 73: 71 90 | 24 53 66 | 49: 77 90 | 48 53 67 | 81: 90 50 | 53 75 68 | 102: 32 53 | 128 90 69 | 12: 92 53 | 19 90 70 | 60: 62 90 | 108 53 71 | 101: 53 104 | 90 62 72 | 65: 53 | 90 73 | 50: 53 90 74 | 97: 53 56 | 90 64 75 | 63: 99 90 | 39 53 76 | 43: 90 125 | 53 60 77 | 66: 130 90 | 33 53 78 | 27: 53 2 | 90 14 79 | 4: 3 90 | 74 53 80 | 118: 53 76 | 90 57 81 | 113: 86 53 | 13 90 82 | 56: 90 28 | 53 54 83 | 38: 36 90 | 69 53 84 | 39: 10 53 | 23 90 85 | 14: 90 50 | 53 18 86 | 45: 53 72 | 90 40 87 | 21: 130 90 | 107 53 88 | 30: 90 113 | 53 1 89 | 19: 53 53 | 90 53 90 | 130: 53 53 91 | 110: 53 65 | 90 90 92 | 0: 8 11 93 | 77: 53 110 | 90 92 94 | 62: 53 33 | 90 19 95 | 126: 50 90 96 | 29: 75 53 | 5 90 97 | 129: 98 53 | 47 90 98 | 47: 53 94 | 90 95 99 | 71: 107 53 100 | 92: 53 53 | 90 65 101 | 127: 22 53 | 109 90 102 | 6: 92 53 | 32 90 103 | 51: 26 90 | 66 53 104 | 107: 90 53 | 53 90 105 | 72: 90 124 | 53 104 106 | 1: 53 96 | 90 52 107 | 103: 53 73 | 90 61 108 | 74: 2 90 | 131 53 109 | 64: 90 7 | 53 122 110 | 67: 53 70 | 90 104 111 | 42: 53 25 | 90 118 112 | 123: 63 90 | 80 53 113 | 17: 46 53 | 130 90 114 | 10: 19 90 | 33 53 115 | 13: 53 112 | 90 17 116 | 28: 90 128 | 53 110 117 | 114: 53 5 | 90 50 118 | 78: 49 90 | 51 53 119 | 16: 111 53 | 14 90 120 | 90: "b" 121 | 85: 130 90 | 50 53 122 | 80: 38 53 | 16 90 123 | 69: 110 53 | 107 90 124 | 98: 53 44 | 90 88 125 | 94: 5 53 | 46 90 126 | 108: 18 53 | 75 90 127 | 55: 90 129 | 53 45 128 | 128: 90 90 129 | 34: 106 90 | 114 53 130 | 109: 90 110 | 53 50 131 | 96: 36 90 | 116 53 132 | 22: 75 53 | 18 90 133 | 134 | aaaaaaaabbbbaabaabbbaaba 135 | aaaaaaaaabbaaabbbaabaaaaabbaaabaaabbbbbb 136 | babaabaaabaaabbbaaaabbba 137 | baaaabbbabbabbbbabaababa 138 | aaaaabaabbbabbbabaaabababaabaabbbaaaabba 139 | babababbbaababbabaaaaaab 140 | bbabbbabbabaaabaaaaaaaba 141 | bbaabbaaaababbabbbabbbbb 142 | babbbbbbbbbababaaaabbbab 143 | abbbbbbaaaabbaaaaabbaaababbbbbababbaaaab 144 | aabbaabaaabaabaababbbaaa 145 | baaabaabaaabaabbbbaaaaba 146 | aabababbaabaaaabbaaaabaaabbbbbaa 147 | bbbbbababbaabaaabaababbababbaabababbababbaabbabaaaabbbba 148 | bbbaabbbaababbaaaaaaaabb 149 | aaababbbbbaaababababaabb 150 | bbabaabbababbbaabbababaa 151 | baaabababbbbbaaababbabab 152 | aaaababaaabbaababbaaaabb 153 | ababbabaaabaaaabbbbaaaba 154 | bbaaababbbbababbabbaabba 155 | babbbbbbbbbababababbaaab 156 | babaabbbbababaababbaabaabbabaabb 157 | baaaaabaaaaaabaabbaaabaa 158 | aabbabaaabaaabababbbbaab 159 | bababaabaabbaabbababaaab 160 | babaababbbbbbabababbbaaa 161 | babaaabbaababaaaaaaabbbb 162 | bbbbbabbbbaabaaabbaabbaabaabbaabaababbaa 163 | bbababaaaaaaaababbbaabbabbbaabbabbabbaabaaaaaaaaabbbabbbbaabbaababaaaaabaabbaaaa 164 | abaaabababaaabaabbbaaaaa 165 | baabbbbbabbbabbbbbaababbaababaaabbbbaaaa 166 | abbbabbbabbbaabbbaaaabab 167 | babbabbbabbbbabbaaabbaaabbababbabbbbbbaababaabbb 168 | babaabaaabbaabaaaaabbbbbabaabaaaabbbbaaaaaaababbabbaabbbaaabaaaababaaaba 169 | aabbababbaaaaaaabbbbababbaabbbbaaababbbbaaaabbabbabbbbaaaabbababbbbbabba 170 | bbaaabbaabaabaaabbaaaabb 171 | bbaabaaaabbabbababbbbbabbaaaaaababbaabbb 172 | baaababaabbbabaabbaaaaabaaababab 173 | abababbabbaabaabbaaabbaa 174 | bbbbabbaababaaaabbbbaaaababbabbbabbbbbabbbaaabbabbbbbbbabbbaabababaabbbb 175 | bbabaaaaaaababbababbabaaaaaaabaabbbbbaaabababbaaaaaaaabbbbabaabaaaaaabbbbababaabaabbaababbaaabab 176 | babaaaabbaaabababbaaabbbbaaaaaaa 177 | babbbabbbaabbababbbaaabb 178 | abbbabaaabbabbbbbbabababaaaaabba 179 | baaaaaaaaababaaaabbbbbaabbaaaaba 180 | bbbabbbababbaababaabbabaaabbbabbabaaaababbbaaaab 181 | bbbaabaaabbaaaaabbabaaaa 182 | abababbabaababbaaabaabaaaaababbbbaaabbaabbbababbababaaba 183 | bbbaabbbbbbbbbaababbaabababbaabaabbbbaba 184 | babbaaaaaabaaabaabaabaabbbaaaababaaaaabaabbbaaaabbbabaabbabbbaabbbabaaab 185 | bbabbbbaababaabbababbbbaaaaabaabbaababbbabaabaaaaababaaabbabbbba 186 | abbabaaaaabbbbbabbaaabbb 187 | aababaaaaaaabaaabbababbb 188 | babbbbbbbbbababaaaabaaab 189 | bbbabaabababaaaabaaaabba 190 | aaababbbbabbaabbbabbbabbbbababaa 191 | abbbbaaaabaaaabaabaaaaba 192 | bbabaabbbaabbabbaaaababbbbbaabbaabaaaaaabbabbbbaababaaba 193 | abaaababaaaaaaabbbabbbbaabbababbbbbaababbbbbabbaabbbbbababbabbbb 194 | bababaababbaaaaaaabbabab 195 | baaabbaabbaabaaababbababbbabbbabbbbbbaab 196 | baaaaababaababbaaaababab 197 | abbaabaabbbabbaaaaabaaab 198 | abbbabbaabbaaaaabbbbaaaabaababbabaabbbaa 199 | bbaabbbbbaabbaaaabaabaaaababbaaa 200 | aaabaaaaabbabbabaaababaa 201 | aabaabbaaabbbbbaabbbbbbaabaabbba 202 | aababbaababbbabbabbbabab 203 | bbabbaaaaabbbbbaaabababa 204 | aaabbbbbabbbbbaababaabba 205 | aaaaaaaabbabaaabbbabbbaa 206 | bbbabaaaaaabaaaaaaababaa 207 | aabbbabbbabbabababbbabbbbbbbabba 208 | baababbababbaabaabbbbaba 209 | abbbaabbbabbbabbabbabbaa 210 | aabbaabbabbbbbbabaabbabbabbbbbbbaaabbbbbaaaabbba 211 | bababaabaabaaabaaaabbbaa 212 | bbbabaabbaaababababbbbba 213 | abbbaabbbbbaaaabbabbbbabababbabb 214 | baabaaaabbababbbabbaabbabaaaabab 215 | babaabbabbaabbbabbaabbababbbbabb 216 | aaaaabbbaaabbbbbabbabbbbbbbabaabbbabbbababaaaaaa 217 | babaaaabbababbaaababaababaaaabba 218 | bababaabbbbabababbabaaba 219 | aaabbbbbaabababbababbabb 220 | bbbaabbbbabbbbbbaabaabab 221 | baababbabbbbbabaabaabbbb 222 | abbbabaabbbbaabaababbbaa 223 | aababaaaaabaaabaaaaaaaba 224 | abbbbaaaababaaabbaaaaaaababbaaaababbbaabbaabbbbbaabbababbaaabbbb 225 | bbbbbbaabbbababaabaaaababbbbbaabaabbaaaabbbbaaababababaa 226 | bbbaabbaaaabaaababbabbaaaabbabbabaabbbaaaabaaaaa 227 | bbbabbbabbbbbaababaaabbbaaababbaabaabaaa 228 | abbbabbaabbaaaaaaabababa 229 | baabaabbabaaabbabbbaaabb 230 | aaabaabaabaaabaaababbbaa 231 | babbaabaabaaaabbabbbbaba 232 | bbbbaabbbaabbaabbbabbbbaabaaababaaaaabab 233 | baabaabbaaaaabaaaabbabaabbbbbabaaababbabbbbbababbabaabbbbbabaaba 234 | abaaabbaaabaabbaaaaabbba 235 | ababaaaabbaaaaaaabbbaabbabbbbabb 236 | babaabbababbbabbabaabaabbbbbaabbbabaaabbaaabbbba 237 | baabbbbbbbbabbbbbababbab 238 | ababbababaaaaabbbbbabbbbabaaaabbaaaaabaaabaababb 239 | aaabaabababaabababbababb 240 | aaabbbbaaaaabbbbbbabbabbbabaabaabbaaaaaabaaaaabbbbbabbbabaaaaabaababaaba 241 | bbaabbaaaaaababbbaababaa 242 | aaaaabbbbbaaaaabbaababaa 243 | aaabbbbbabbbbbababbbaabbaaabbabbabaaabbb 244 | baaaaabbbbbbbbbabbbbbabbbaabbbababbbbbaa 245 | abbabababbbbabbabbaabbaabaaaabaabbbbbaaabbbbbbaaabbabbbabbbaaabbbbaaabab 246 | bbabbbabbbbabaaaabbabbabbaaabbab 247 | aabbaaabaabbbabbbbbaaaba 248 | ababbabaabbbaabbaaaaabbbaabaabbbbbbbbbbbbaaabbbbbaabaaabbaaaabba 249 | bbabbbababababaabbaaabbb 250 | babbabbbbbbabbbabbabaabbabbaaabbababbababbabbbbbabababaa 251 | bbaaaaabaabaabaabbbabbbbaabbbbbbaaaaaaba 252 | aaaaababbaaaaababaaabaaaaaaaaaabababbabbabbaaaaa 253 | abaaabbbaaabaabaaabaaaabaaabbbaa 254 | baaaaababbabbbbaaaaaaaaabbbbabba 255 | bbaabbaabbbbbabaaabbbbbabaaabaaaaaabbaba 256 | bbaaabbabaaaaabbaabbaababaaaabaaababbbab 257 | aabbaaababbbbbbbaabbabba 258 | abbabbabbbaaabbababaaaaa 259 | abbaabaabbbbbbbbbbbabbbbbabaabaa 260 | aabbabaaababbabaabbbaaaa 261 | bbabaababbabbaaaaaabbbbbabbaabaabaaabbbbbabbaabbbaaaaababbaababbbbababab 262 | bbabbaabbbabbbbabaaabbaa 263 | aaaabbababbaaabbabbbabaabbbaaababababbab 264 | aaaababbaaabaabbbaabaaab 265 | aabbaabbaaabaaaabbaabbab 266 | babababbaabbbbabbbabbaabbaaaaababaabbabbabbabbbaabababaabbabbbaa 267 | baabbaabbababbbbabaaaaba 268 | aabaaabbababbbaaabbbabaabaaaabbbabaabbaaabbbaabaaaabaaaaabaaabbabbbabbbb 269 | aabbbbbbaabaaabaaabbbbabaaabaabaababbaababbaabab 270 | bbbabbbaaaaabaabbbbbbaaaaabbbbbabbabaaabbbbaabba 271 | aabbbaaaabaaaabbbbbabbab 272 | bbaaaaaaabbbbbbbababbbaa 273 | baaaabbbabbbbbbbbbaababa 274 | abbabaaaaabbbbbaaabbaaaa 275 | bbbbbbbbaabaabbbbaaaabba 276 | aabaaaaaaabbbaababbaabbbbababbabababaaab 277 | aaaabbabaabbabaaaaabbbab 278 | baaabbbbbbbabaabbbaabaabaaaaababbaabbbbababbbbababbbbababbbbbbab 279 | baabbbbbbababbbbabaaaaaa 280 | bbbbbbbbbaaaaababbabbbbbbbbaaabb 281 | abbaaabbaaaabbabbaabbabbbbaababbbbbbbabb 282 | abbabababbaabaaaabbbaaba 283 | abbabaaaaabbbbbbaaaabbbb 284 | bbaabaababababbabbabaaaa 285 | ababbbbbbabbabbababbaababbbabbabbbabbabaaaaaababaaaabaabbbaababa 286 | bbabbabbabbababaaaababaa 287 | baabbaaabaabaaaaabaaaaab 288 | bbbabbaabbaaababbaaaaaab 289 | bbbbaabaababbabababbaaaa 290 | babbbabbabbabbabbbaaabbaaabbaabababbbabb 291 | aaaababbbaaaaababbbbbbaaabaababb 292 | bbbbaaaabbbbaaaaaabaaababbaabaababababaa 293 | baabbbabaaababababbbabab 294 | aaaaaaabbbbbbabaababbabb 295 | aaaaaababbbaaaaabababbab 296 | baaabbbbaaaabababababbba 297 | ababbbabaaaabbabaaaaabababaabbba 298 | abbabbbbbabbaabaabaababb 299 | baaaaababbbaabababbaabab 300 | babbaaaaaabbbbaabbabbbabbbbbbababaabbabbababaaba 301 | bbbbbaaaaabababbaabaabbaabbbaabbabaabbba 302 | bbbbaabaaaabbbbbbabbaaab 303 | baaababaaababbaaaabbbbbbabaaaaaa 304 | aaabbaaaababaabbabbbbabbbbaaaaaaaaabbaaabaabbaabbbbabbabbabbaaabaaabaabb 305 | aabaabbabbbabbbaabaaaaab 306 | abaabaaaaabaabaaabaabbba 307 | aabbbbabaaababbbababbbaa 308 | bbabaaababbabbabaabbaabbbbbbabba 309 | aabbbaaaaabbbbbbbababaaabaabbbaa 310 | abbbbabbaabbabaabaababaaabbabaaabaabaabbaaaaabaabbaaabbabbaaaaab 311 | bbbabaaabbaabbbbaaaaaaba 312 | baaaaabbaaaaabaabbababbb 313 | bbbabbbbbabbbbbbbbbbabab 314 | abbbabaabbaaababbbbbabaa 315 | aaaaabaaaaababbbabaaaabbabaaaaba 316 | abbababbbbbaaabbaaaabbbabaaabbbaaaaabbaababaaaababaaaabb 317 | abaabbbbbbbabaabababbabbbbabaaabbabababbaaabbaabbaababab 318 | baabbababbbabbaaaaaaaaba 319 | aabbbabbaaaabaaaababaaab 320 | abbabaaaaabbbbabbabbbbaaabbbbbabbbaaaabbbbaababb 321 | abbbbbbaaaabaababbaabbaa 322 | bbbbaabaabaaababaaabbabbaabbbabbbbababbbaabbabbabaabaaba 323 | abbbabaaaababaaaababaaab 324 | bbabaaababbaabbababbabaabaababaa 325 | aaaabbbaaaaabbbbabbbbbbabbbabaabbbabbbaabbaabababababaaabbbaabbabbabaaaabbbbbbbbabaaabba 326 | abbaabaabbbabbbbabaaaaab 327 | abbaaaaababbbbbbbabbabbaabbababbaaaaaabbabbaaaabaabbbaba 328 | aababaaaaabaaabbbaabaaab 329 | bbbabababbbabbbbabbabaaababaaaaa 330 | abbbbaaababbaaabbaaaabbabaabaaab 331 | abaabaabbbbabaabaabababa 332 | aaaaaaaaabaaababbbabbabbaaaaaaabaaaabbababababaa 333 | abababbbabababbaaabbabbbbbaabbbbbbaaababbbabbbbaabbabbaa 334 | bbbbbabaaabbbbabaaabbabbabababbaaaaabbbb 335 | aabbbbaaaaababbbaabbabba 336 | baaaaababaaaaababbabbbbaaaaaabaaababbaaabaaaaaaa 337 | abaaaabbabbaaababbabbbbb 338 | bbaabaaabaaaaabbbabbaabaaaabaabbaaaaabba 339 | abbbbbbbbabbbbaabbabaaaaabbabbbabaaabaaa 340 | bbbaabaaabaaaababbbbbabbbbbbbabbbbaaaaba 341 | abbaaabbbaabaabbbbbbaaab 342 | aaabbaaabbabbaabbababbaa 343 | abbbabbbabababbababaaaaa 344 | bbabbbbabaaaaababbaababbbbbaabaabbabbaaaaaaaabbbaaabbaab 345 | abaaababbbaabaaababbabaa 346 | bbaabaabbaaabbbbbaaaaabbaabbbbbbabbabaaabbaabababababbbabaaaabab 347 | abbaaaaaaabbabaababbbbba 348 | bbbababababaaabbabaaaaaa 349 | babbbabbbbbabaabababbabb 350 | abbaaaaaabbabaaabbbbaabbbabababa 351 | abbabbbbbbabaabbbabbabba 352 | baabaaaaaaaabaabbbbababaaaabbaaabbbaaabbbabbbaba 353 | baaabaababbaaabbabbbbabb 354 | abaabaabbbbbaabbababbbaa 355 | bbbbaabaabbababbbbababaabaaabbabbbbbabbabbbabbab 356 | bbabaaababbabaaaaaabaabbaabaaabaaabbaababbaaabbbbbbbabba 357 | bbbabaaaabbabbabbbbabbab 358 | bababaaababbbbbbbaabbbaa 359 | abbbbbbbbbabbaaabbababbb 360 | aabbaaabaabbbaaabbbaaaba 361 | aabbabbbbabaabababbabbaa 362 | abbbabaababaaabbabaabaaaaabbbbababaaabaababbaaaa 363 | aaaaabaabaaababaabaaaaab 364 | bbbaabbbbbaabbaababaabbb 365 | abaaaabbabbabbbbbbbbaaab 366 | aabababbbaaabababbabbabbaaaaabab 367 | bbabbaaaaaaaaaabbaaababb 368 | baaaaabaaaabaaaabbbabbbbaabbbbaaabaabbabbabbbbbababaaaaa 369 | aaababbaaababaaaaaabaababbbabaaa 370 | babbaabbbaaabaababaabbba 371 | abbbabaaabbababaaababbbb 372 | abbbaabbbabbababaabbaaabbabbaaaa 373 | bbbaabababbaaabaaaababab 374 | aaaaaaaaabbabbabababaabbbbaaaabbbbababbaaaabbaaaabababaabaabababbbbaaabaaaabaabb 375 | bbbbbaaabababbabaabbbbaabaaaaabbabbbabbabaabbbbaaabaababbbaabbba 376 | aaabbabbaabbaaabbbaaabbaaabbbbbabaaaaabaaababaaabaabaaab 377 | bbaababbaabbbbbbaabbbaaaabaabbab 378 | bbbbababababaaaaabbbaabbaaababbbababbabaaabbbaaa 379 | bababaaaaabaaabbbbabbababbbbbaaa 380 | babababbaaaaaaababaababb 381 | bbaaaaaaaabababbabbaabab 382 | abbaaaaabbbbbbaaaababaab 383 | babaababaababbaabbbabbbbbabbabbb 384 | aabbbbbbaababaaaababaabb 385 | aaaababbabababbabbabbabbbbaaababbabbbaab 386 | bbabbaaaaabaaababaabbaabaaaaabab 387 | aaaaaaaabbbbbaaaabbaabab 388 | abaaaabbbabbbabbabaabaabbbaaaaabbbbaabbb 389 | babaaabbabababbabbaaaaba 390 | baaababaabbabaabbaababbb 391 | aababaaaabaaabbaabaababa 392 | bbbabaabbabbbabbbbaaabbb 393 | abaaabbabbaabbaabaaabbaa 394 | bbbababbbbbbbaaabababbbaabbbaabbbaabaaabbabbabbabbaabaaaababbbbbbbbbbababbbabbaa 395 | bbbbaaaaaabbbabbabbaabaababbababaabbabaaaaababbbbaababaa 396 | bababbbbbaabbaababababbbabbbaaab 397 | bbaababbabbbaabbbababbab 398 | baabaabbaabbaabbbaaaabab 399 | aaaaabbbbababaabaabaaaaa 400 | bbbabaababbabaaabbbbabab 401 | bbbabaabaaaaaaaabaabbbababbaaabaaaabbabbaaaaabbbabbaaabb 402 | aabbabaabbbbaabaaababaaaabbbabbbbbbaaaaababbbbab 403 | aaaaaaabbabaaabbababaabb 404 | abaaabaabbabbaaabbbbbaab 405 | aabaabbaabbabaaabbabbabbabbbbbbbaaaabbbb 406 | baabaaaabbbabaabaabbaabbaababbaaaabbaaaaaababaab 407 | baabbaaaaabbbbbbabbabbba 408 | aabbbbbbbbaababbaaabaabaabbbabaababbbabaabbababb 409 | bbabaabbbabbaababbababba 410 | bbbbaabbbbaabbaaabbbbaba 411 | aaababbabaabbabbabaaaaab 412 | aaabaabaaaaaabaaabababab 413 | ababbabaabbbbbabbabbaababababbba 414 | abbaaabbbbbabaabaabbbbbababaababaabaabaabbaabbbaabbbbaaa 415 | baabbaabbbaaabbaabaaaabbbbbbbbaaabaaababababbbba 416 | aaaababaaaaabbabaabbaaaababaabaabaabababababbbbaaabbaaaa 417 | aaabaabbbbbaabaaababaaba 418 | bababaabaabbbabbaaaabbababbabbaa 419 | baabaaaaaabbaababaaababb 420 | baaaabaaaaaaaaaabbabbbaa 421 | babbaabbabaaabaaabbaabaabababbbabaababababaaaaaaabaaaaabaaabbbba 422 | abbaaaaabaabbbbbabaaaaaabbbbbbba 423 | aaabbaaaabaaaabbbaababab 424 | baaabbbbaabbbabbaabbbaab 425 | babbaabbbabbabaaababbbababaababbbabbbbbbbbaabaaaabaaabbbbaabbbbbbaaabbbb 426 | bbabbabaaaaaaaabaaaaaabb 427 | ababbbbbababbabaaabbaababababbbbabbbbaaaaaaaaaaaabbbbbbabbbaabba 428 | aaababbaaabababbababaaba 429 | aaaaababbababbabbaaabbbbbbaaaabaaaabbabb 430 | baabbbbbabbbabbbaaabaaab 431 | babaaababaababbbababbbbabbababababbbbaab 432 | abaabaabbabababbbaababbbbabbbbab 433 | baababbababaaaaaaababaababbaabaaaabaaabaabbbbbbabbbbabaabbbababbaaaabbbabaaaaababbbababaabaaabab 434 | bbbbbbaaabbababaabbbbaab 435 | abbaaaaabbabbabaababbaaa 436 | baaabbbbaabaabbbbbbabbbbbaaaabab 437 | bbbbbbaaaabaabaabaaabbaa 438 | aabaabbabbbabbbaabaaabbb 439 | bbaababbaabbbbabbbababbb 440 | bababaaabbabbbabaaaaabbbaaabbaab 441 | babbabbbbbabaabbbbabbbbaaabbbaaabaabbbbaaabbaaaabbbbabbb 442 | babbababbbabbabaabbbbaab 443 | aaaabbabbbabbbbabbbbaabaabbabababaaabaabbbbbbbbabaaaabba 444 | bbbbaaabaaabaaaaabbaabababaaabbbabbabbbb 445 | bbbabababbbbbbaaabbbbbaa 446 | baababbabaabbabbaabaabbbaabbbbbabbabbbaa 447 | bbaabbbbbbabbababaaabbaa 448 | aaaaaababaabbbbbbaabbabbbababaaaaababababaaabbabaaaabbbbaaaabbabbabbbaab 449 | babbbabbbaaabbbbbbaaaaaaaaabaabbbaabbaaaaababaabababaaba 450 | abababbbaaaababbbbaaabaa 451 | ababbabaaaaababbabaaaaaa 452 | bababaaaabbaaabbbababbab 453 | bbaabbbaabbabbbbaabababa 454 | baabbbbbabbabbabbbbbaaab 455 | abbaaaaaaaaabaaabaaaabba 456 | aabbaabbbbbabbaababbababaaabaabb 457 | bbaababbbbbabbbaaaababbabbaababbabababbabbababaabbaaabaaabaabbaa 458 | abbbbbabaaabbabbababbaab 459 | aaaaabaaaabaaaababbbbaaa 460 | aabaaabbbabbabbbabababaa 461 | aabbbabbaaaaabbbaababaab 462 | abababbbbbaabbaaabbbaabbaaaaabaabaaaabaabbbaaababbaababaabaababaababbbbb 463 | babbaabaabababbbaaabbaab 464 | abbbaabbabbbbbbbbaaababababbbaabbababbab 465 | aaaababbabbaaaaabaabaabbbbabbbaaaaaaabba 466 | bababbbbbbbbaabbaaaabbba 467 | bbaabbbaaaaaabbbbabbbbaa 468 | aabbaabaabbbabaabababbbbbbbbabab 469 | babababbabbbabaabbbabaaaabababaa 470 | babaaababbaaaabbbaabbbba 471 | ababaaaaabbbbbbbbaabbabbbabbaabbaaaabababaababaa 472 | bbaaaaabbaaaabbbbabbaabaababaababaabbaabababbbbaabbabbaa 473 | baabbabbaaabaabbbbbbaabaaaaabaabaabaabab 474 | aaababbbbbaababbabbabbaa 475 | aabbaaabaabbaaabbaababab 476 | abbabaaaaababaaaaaaaaaaabaaabaaabbbbabaa 477 | aaabaabaabbbabaabaabbabbaababaaaabaababa 478 | abbabbabbababbbbbaaaaaab 479 | aabaaabbbbbaaaabbbabababbaaaabbbaaabbbab 480 | bababbaaababbabababbabaabababaababbabaaaaaabaaaabbaaaaaabaabaaab 481 | aababaaabaaaaabbabababaa 482 | aabbabaabbabbaaabbbaaaba 483 | aabbabbbabbabaababbaaaaaaabbbabbaaabbaabaaaabbbbaaaabbba 484 | abababbabbbbaaaababbbbab 485 | aaaabbbbbbbbaabbbaababbaaabbbbbaaababbabbbbaaaaaababaabbababbbaabaababba 486 | abaaabbababababbbabababa 487 | abaaabbaabababbbbaaaaaaabbbbabbb 488 | aabababbbbbabaaababbabbbababaabb 489 | abababbaabbbaabbaabbbbbabbbbbbbb 490 | aabaabbbbbaabbbabaaabbbbbbaaaaaabbbbbbbabababbaabaaaabaa 491 | babaaaabaaababbaaabababa 492 | bbaabbbaababbababbbaaaab 493 | bbbaaaababbbbbaabbbbbababbababbaabbaabababbabbbababbbbababbbabaaaabbabaaabaaaababbbbbaaaabaaabbb 494 | baabaabbbaabbabaaababbba 495 | bbbaabbbbbababbbbbbbaababbaabbaabbbbbaababbaabbabbbbaaabaabaabbabaabbbaa 496 | bbbbbbbababbbbbbaabaababaaaaabbbbbbabbbb 497 | aababbaabbbbaabbbbbaabbbaabaabaaaaaaabbbbabababa 498 | abbbabaaabaaabbabbaaaaba 499 | aaaaabbbaabbbbbbaaababbbbabaabbaababaabbbabaaaaabbaaabbb 500 | babbabbbbbabaaabaaaabbaa 501 | bbbbaabbaaaaabaabbabbaaabbabaaaa 502 | aaababbbaabaaabbbbbaabba 503 | aabbaabbababaaaaabbababbbababbaaabbbbaabbbbaaabbbaaabaab 504 | bbabbabaabbabaabababaaab 505 | bbaaababbbbbaabababbbbaa 506 | aaaababaabbaaabbabbbbbaa 507 | bbaabbbaabaabaabbbaaaaababbabaabbbabbabaaabbabbabbbbabaa 508 | babbababaabaaabababbababbbaaababbbabbbbbbabababa 509 | aababbaaaaabaabbbbaaabaaabbbbabb 510 | bbbaaabbabaabbbbaabbabbbbabbaabbbabaababbbbaaaaaaababaabaaaaaaabbababaaa 511 | abbaaabbbbabbaaaabaabbba 512 | aaaaabaaaaaabbabbbaabaaaabaaaaaa 513 | aaabbbbbbaabaabbabbbaaab 514 | abaabaabbabaabbabbababbb 515 | aabbbaaaabababbababbbabbbabbabababbbbaabbaaaaaaa 516 | baababaababbabbbbbbabbbbababbabaabaaaaba 517 | bbaabbaabbaaaaaaaaabbaba 518 | aaaaabbbbaabbababababbbbbaababbaaaabbaab 519 | abbaabbabaaabbbaaaaaaabbaababbbaaabbbbbbabaaaaabbaabaaaabaaaaaababaabaababbbbbbbbaabbabb 520 | baababbabbabbabaabbabaaababbbaaa 521 | baabbaabaababbabbbbbabbb 522 | aabbaaababbbabbbbaabbaabababbbbb 523 | aabbbabbaaabaabaabbbaaab 524 | abbbbbbbbabababbbbaaaaabaabaabbbbababbaa 525 | bbbbbaaabbabaaabaababbababbababababaabbbbabaaaaa 526 | abbabbabaabbbbbbaabbbbbbbabbabbbabbaaaaaabbbaabababbaaaa 527 | aaaababbaababbabaaaaabaaabbbbbbbbbbbbaba 528 | bbbbabbaabaaabbabbaaabbaaababbaabbabbabaababaababbaaabaa 529 | aaabbbbbbaabaabbbbaababa 530 | baabaaaaaaabbabbbabbbabbbabbaaabbaaaabab -------------------------------------------------------------------------------- /src/day19/rules.kt: -------------------------------------------------------------------------------- 1 | package day19 2 | 3 | import kotlin.io.path.Path 4 | import kotlin.io.path.readText 5 | 6 | 7 | data class Rule(val id: Int, val match: RuleMatch) { 8 | override fun toString(): String = "$id: $match" 9 | } 10 | sealed class RuleMatch 11 | data class SimpleMatch(val c: Char) : RuleMatch() { 12 | override fun toString(): String = "'$c'" 13 | } 14 | data class OrMatch(val anyOf: List) : RuleMatch() { 15 | override fun toString(): String = anyOf.joinToString(" | ") 16 | } 17 | data class RefMatch(val sequence: List) : RuleMatch() { 18 | override fun toString(): String = sequence.toString() 19 | } 20 | 21 | fun parseRule(s: String): Rule { 22 | val (ids, match) = s.split(": ") 23 | val id = ids.toInt() 24 | if (match.startsWith('"')) return Rule(id, SimpleMatch(match.removeSurrounding("\"").single())) 25 | val anyOf = match.split(" | ").map { RefMatch(it.split(" ").map { it.toInt() }) } 26 | return Rule(id, anyOf.singleOrNull() ?: OrMatch(anyOf)) 27 | } 28 | 29 | fun main() { 30 | val input = Path("src/day19/input.txt").readText().split("\n\n", "\r\n\r\n") 31 | 32 | val rules = input[0].lines().map(::parseRule).sortedBy { it.id } 33 | val ruleById = rules.associateBy { it.id }.toMutableMap() 34 | val ruleZero = ruleById[0]!! 35 | ruleById.values.forEach(::println) 36 | 37 | 38 | val singleOneList = listOf(1) 39 | fun RuleMatch.matchLengths(s: String, start: Int): Collection { 40 | return when(this) { 41 | is SimpleMatch -> if (s.length > start && s[start] == c) singleOneList else emptyList() 42 | is RefMatch -> { 43 | var next = setOf(0) 44 | for (id in sequence) { 45 | val r = ruleById[id]!! 46 | next = next.flatMapTo(mutableSetOf()) { pos -> 47 | r.match.matchLengths(s, start + pos).map { l -> pos + l } 48 | } 49 | } 50 | next 51 | } 52 | is OrMatch -> { 53 | val allMatches = anyOf.flatMap { it.matchLengths(s, start) } 54 | allMatches 55 | } 56 | } 57 | } 58 | 59 | fun RuleMatch.matchesEntire(s: String): Boolean = matchLengths(s, 0).any { it == s.length } 60 | 61 | 62 | val lines = input[1].lines() 63 | 64 | println(lines.count { ruleZero.match.matchesEntire(it) }) 65 | 66 | val correction = """ 67 | 8: 42 | 42 8 68 | 11: 42 31 | 42 11 31 69 | """.trimIndent().lines().map(::parseRule) 70 | 71 | correction.forEach(::println) 72 | correction.associateByTo(ruleById) { it.id } 73 | 74 | println(lines.count { ruleZero.match.matchesEntire(it) }) 75 | 76 | } -------------------------------------------------------------------------------- /src/day2/passwords.kt: -------------------------------------------------------------------------------- 1 | package day2 2 | 3 | import kotlin.io.path.Path 4 | import kotlin.io.path.readLines 5 | 6 | fun main() { 7 | val items = Path("src/day2/input.txt").readLines() 8 | val passwords = items.map(PasswordWithPolicy::parse) 9 | 10 | println(passwords.count { it.matches() }) 11 | println(passwords.count { it.matches2() }) 12 | } 13 | 14 | 15 | data class PasswordWithPolicy(val password: String, val letter: Char, val range: IntRange) { 16 | 17 | fun matches(): Boolean = 18 | password.count { it == letter } in range 19 | 20 | fun matches2(): Boolean = 21 | (password[range.first - 1] == letter) xor (password[range.last - 1] == letter) 22 | 23 | companion object { 24 | private val regex = Regex("(\\d+)-(\\d+) ([a-z]): ([a-z]+)") 25 | fun parse(policy: String): PasswordWithPolicy { 26 | return regex.matchEntire(policy)!!.destructured.let { (s, e, c, p) -> 27 | PasswordWithPolicy(p, c.single(), s.toInt()..e.toInt()) 28 | } 29 | } 30 | } 31 | } 32 | 33 | -------------------------------------------------------------------------------- /src/day20/tiles.kt: -------------------------------------------------------------------------------- 1 | package day20 2 | 3 | import common.positionXY.Pos 4 | import kotlin.io.path.Path 5 | import kotlin.io.path.readLines 6 | import kotlin.math.sqrt 7 | 8 | 9 | class Tile(val id: Int, val data: List, val sideSize: Int) 10 | 11 | class Matrix(val xx: Int, val yx: Int, val xy: Int, val yy: Int) { 12 | val sx = (1 - xx - yx) / 2 13 | val sy = (1 - xy - yy) / 2 14 | fun x(x: Int, y: Int, s: Int): Int = x * xx + y * yx + (s - 1) * sx 15 | fun y(x: Int, y: Int, s: Int): Int = x * xy + y * yy + (s - 1) * sy 16 | } 17 | 18 | val rotations = listOf( 19 | Matrix(1, 0, 0, 1), 20 | Matrix(0, 1, 1, 0), 21 | Matrix(-1, 0, 0, 1), 22 | Matrix(0, -1, 1, 0), 23 | Matrix(-1, 0, 0, -1), 24 | Matrix(0, -1, -1, 0), 25 | Matrix(1, 0, 0, -1), 26 | Matrix(0, 1, -1, 0), 27 | ) 28 | 29 | class TileRotation(val tile: Tile, val rotation: Matrix) { 30 | operator fun get(x: Int, y: Int): Char { 31 | val xr = rotation.x(x, y, tile.sideSize) 32 | val yr = rotation.y(x, y, tile.sideSize) 33 | return tile.data[yr][xr] 34 | } 35 | 36 | fun line(y: Int) = CharArray(tile.sideSize) { x -> get(x, y) } 37 | fun lines(): List = (0 until tile.sideSize).map { y -> line(y) } 38 | override fun toString(): String = (0 until tile.sideSize).joinToString("\n") { y -> line(y).concatToString() } 39 | } 40 | 41 | enum class Side { 42 | U, D, L, R; 43 | 44 | val matching: Side get() = when (this) { 45 | U -> D 46 | D -> U 47 | L -> R 48 | R -> L 49 | } 50 | } 51 | 52 | operator fun TileRotation.get(side: Side, t: Int): Char = when(side) { 53 | Side.U -> get(t, 0) 54 | Side.D -> get(t, tile.sideSize - 1) 55 | Side.L -> get(0, t) 56 | Side.R -> get(tile.sideSize - 1, t) 57 | } 58 | 59 | val sides = Side.values().toList() 60 | 61 | fun TileRotation.matchesWith(other: TileRotation, thisSide: Side): Boolean { 62 | val otherSide = thisSide.matching 63 | return (0 until tile.sideSize).all { i -> this[thisSide, i] == other[otherSide, i] } 64 | } 65 | 66 | fun Pos.adjacent(side: Side): Pos = when (side) { 67 | Side.U -> copy(y = y - 1) 68 | Side.D -> copy(y = y + 1) 69 | Side.L -> copy(x = x - 1) 70 | Side.R -> copy(x = x + 1) 71 | } 72 | 73 | object Monster { 74 | val lines = """ 75 | # 76 | # ## ## ### 77 | # # # # # # 78 | """.trimIndent().lines() 79 | val height = lines.size 80 | val width = lines.maxOf { it.length } 81 | val points = lines.flatMapIndexed { y, line -> 82 | line.mapIndexedNotNull { x, c -> if (c == '#') Pos(x, y) else null } 83 | } 84 | } 85 | 86 | fun TileRotation.monsterAt(x: Int, y: Int): Boolean = 87 | Monster.points.all { (mx, my) -> get(x + mx, y + my) == '#' } 88 | 89 | fun main() { 90 | val input = Path("src/day20/input.txt").readLines() 91 | val tileSize = 10 92 | 93 | val tiles = input.chunked(tileSize + 2).map { Tile(it[0].filter { it.isDigit() }.toInt(), it.slice(1..tileSize), tileSize) } 94 | println(tiles.size) 95 | 96 | val start = Pos(0, 0) to TileRotation(tiles.random(), rotations.random()) 97 | val map = mutableMapOf(start) 98 | val queue = ArrayDeque(listOf(start)) 99 | val remaining = tiles.toMutableSet().apply { remove(start.second.tile) } 100 | 101 | while (queue.isNotEmpty()) { 102 | val (pos, tile) = queue.removeFirst() 103 | for (side in sides) { 104 | val otherPos = pos.adjacent(side).takeUnless { it in map } ?: continue 105 | outer@for (otherTile in remaining) { 106 | for (r in rotations) { 107 | val other = TileRotation(otherTile, r) 108 | if (tile.matchesWith(other, side)) { 109 | map[otherPos] = other 110 | queue.addLast(otherPos to other) 111 | remaining.remove(otherTile) 112 | break@outer 113 | } 114 | } 115 | } 116 | } 117 | } 118 | val xs = map.keys.minOf { it.x }..map.keys.maxOf { it.x } 119 | val ys = map.keys.minOf { it.y }..map.keys.maxOf { it.y } 120 | 121 | val corners = 122 | listOf(xs.first, xs.last).map { x -> 123 | listOf(ys.first, ys.last).map { y -> map[Pos(x, y)]!! } 124 | }.flatten().map { it.tile.id } 125 | println(corners.fold(1L) { acc, id -> acc * id }) 126 | 127 | val tilesOnSide = sqrt(tiles.size.toDouble()).toInt() 128 | val resultData = buildList { 129 | for (y in 0 until tilesOnSide * tileSize) { 130 | val py = ys.first + y / tileSize 131 | val ty = y % tileSize 132 | if (ty == 0 || ty == (tileSize - 1)) continue 133 | val line = buildString { 134 | for (x in 0 until tilesOnSide * tileSize) { 135 | val px = xs.first + x / tileSize 136 | val tx = x % tileSize 137 | if (tx == 0 || tx == (tileSize - 1)) continue 138 | append(map[Pos(px, py)]!![tx, ty]) 139 | } 140 | } 141 | add(line) 142 | } 143 | } 144 | val result = Tile(0, sideSize = resultData.size, data = resultData) 145 | println(result.sideSize) 146 | 147 | 148 | for (r in rotations) { 149 | val rr = TileRotation(result, r) 150 | val monsters = buildList { 151 | for (y in 0..result.sideSize - Monster.height) { 152 | for (x in 0..result.sideSize - Monster.width) { 153 | if (rr.monsterAt(x, y)) add(Pos(x, y)) 154 | } 155 | } 156 | } 157 | if (monsters.isNotEmpty()) { 158 | val final = rr.lines() 159 | 160 | for ((x, y) in monsters) { 161 | for ((mx, my) in Monster.points) { 162 | final[y + my][x + mx] = 'O' 163 | } 164 | } 165 | 166 | final.forEach { println(it.concatToString()) } 167 | 168 | println(final.sumOf { it.count { c -> c == '#' }}) 169 | break 170 | } 171 | } 172 | } -------------------------------------------------------------------------------- /src/day21/allergens.kt: -------------------------------------------------------------------------------- 1 | package day21 2 | 3 | import kotlin.io.path.Path 4 | import kotlin.io.path.readLines 5 | 6 | typealias Ingredient = String 7 | typealias Allergen = String 8 | data class Food(val ingredients: List, val allergens: List) 9 | 10 | val foodRegex = Regex("""([\w\s]+)\(contains (.*)\)""") 11 | fun parseFood(s: String): Food = foodRegex.matchEntire(s)!!.destructured 12 | .let { (ingredientList, allergenList) -> 13 | Food(ingredientList.trim().split(" "), allergenList.trim().split(", ")) 14 | } 15 | 16 | fun main() { 17 | val input = Path("src/day21/input.txt").readLines() 18 | 19 | val foods = input.map(::parseFood) 20 | 21 | println("allergen to possible ingredients") 22 | val allergensToIngredients = foods 23 | .flatMap { it.allergens.map { a -> a to it.ingredients.toSet() } } 24 | .groupBy(keySelector = { it.first}, valueTransform = { it.second }) 25 | // .onEach(::println) 26 | .mapValues { it.value.reduce { acc, e -> acc intersect e }.toMutableSet() } 27 | .onEach(::println) 28 | 29 | val singles = allergensToIngredients.values.filter { it.size == 1 }.flatten().toMutableSet() 30 | val remaining = allergensToIngredients.values.filter { it.size > 1 }.toMutableList() 31 | while (remaining.isNotEmpty()) { 32 | remaining.removeAll { possible -> 33 | possible.removeAll(singles) 34 | if (possible.size == 1) singles.addAll(possible) 35 | possible.size == 1 36 | } 37 | } 38 | 39 | println("allergen to ingredient") 40 | allergensToIngredients.forEach(::println) 41 | 42 | val ingredientToAllergen = allergensToIngredients.entries.associate { it.value.single() to it.key } 43 | 44 | foods.sumOf { it.ingredients.count { i -> i !in ingredientToAllergen } } 45 | .let(::println) 46 | 47 | ingredientToAllergen.entries.sortedBy { it.value }.onEach(::println) 48 | .joinToString(",") { it.key }.let(::println) 49 | } -------------------------------------------------------------------------------- /src/day21/input.txt: -------------------------------------------------------------------------------- 1 | mxmxvkd kfcds sqjhc nhms (contains dairy, fish) 2 | trh fvjkl sbzzf mxmxvkd (contains dairy) 3 | sqjhc fvjkl (contains soy) 4 | sqjhc mxmxvkd sbzzf (contains fish) -------------------------------------------------------------------------------- /src/day22/cards.kt: -------------------------------------------------------------------------------- 1 | package day22 2 | 3 | import kotlin.io.path.Path 4 | import kotlin.io.path.readLines 5 | 6 | typealias Deck = List 7 | fun readDecks(name: String): Pair { 8 | val lines = Path(name).readLines() 9 | val empty = lines.indexOfFirst { it.isEmpty() } 10 | return lines.take(empty).drop(1).map { it.toInt() } to 11 | lines.drop(empty + 2).map { it.toInt() } 12 | } 13 | 14 | fun main() { 15 | val (d1, d2) = readDecks("src/day22/input.txt") 16 | println("Decks") 17 | println(d1) 18 | println(d2) 19 | 20 | game1(d1, d2).let { 21 | printScore("Original game", it) 22 | } 23 | 24 | // game2(listOf(43, 19), listOf(2, 29, 14)) 25 | game2(d1, d2).let { 26 | printScore("Recursive game", it) 27 | } 28 | } 29 | 30 | fun List.score() = asReversed().mapIndexed { index, card -> (index + 1) * card }.sum() 31 | 32 | fun printScore(name: String, result: Pair) { 33 | println(name) 34 | val (winPlayer, winDeck) = result 35 | println("Winner player $winPlayer: $winDeck") 36 | println("Score: ${winDeck.score()}") 37 | } 38 | 39 | 40 | fun game1(p1: Deck, p2: Deck): Pair { 41 | val deck1 = ArrayDeque(p1) 42 | val deck2 = ArrayDeque(p2) 43 | 44 | while (deck1.isNotEmpty() && deck2.isNotEmpty()) { 45 | val c1 = deck1.removeFirst() 46 | val c2 = deck2.removeFirst() 47 | 48 | if (c1 > c2) 49 | deck1.apply { add(c1); add(c2) } 50 | else 51 | deck2.apply { add(c2); add(c1) } 52 | } 53 | 54 | return if (deck1.isNotEmpty()) 55 | 1 to deck1 56 | else 57 | 2 to deck2 58 | } 59 | 60 | 61 | 62 | 63 | data class Snapshot(val s1: Long, val s2: Long) 64 | 65 | fun snapshot(d1: Deck, d2: Deck): Snapshot { 66 | fun Deck.toState(): Long = fold(1L) { acc, e -> 37 * acc + e } 67 | return Snapshot(d1.toState(), d2.toState()) 68 | } 69 | 70 | fun game2(p1: Deck, p2: Deck): Pair { 71 | val deck1 = ArrayDeque(p1) 72 | val deck2 = ArrayDeque(p2) 73 | 74 | val playedRounds = mutableSetOf() 75 | 76 | while (deck1.isNotEmpty() && deck2.isNotEmpty()) { 77 | if (!playedRounds.add(snapshot(deck1, deck2))) { 78 | return 1 to deck1 79 | } 80 | // println("Round ${playedRounds.size}:") 81 | // println(deck1) 82 | // println(deck2) 83 | val c1 = deck1.removeFirst() 84 | val c2 = deck2.removeFirst() 85 | 86 | val p1wins = if (c1 > deck1.size || c2 > deck2.size) { 87 | c1 > c2 88 | } else { 89 | game2(deck1.take(c1), deck2.take(c2)).first == 1 90 | } 91 | 92 | if (p1wins) 93 | deck1.apply { add(c1); add(c2) } 94 | else 95 | deck2.apply { add(c2); add(c1) } 96 | } 97 | 98 | return if (deck1.isNotEmpty()) 99 | 1 to deck1 100 | else 101 | 2 to deck2 102 | } 103 | 104 | -------------------------------------------------------------------------------- /src/day22/input.txt: -------------------------------------------------------------------------------- 1 | Player 1: 2 | 5 3 | 20 4 | 28 5 | 30 6 | 48 7 | 7 8 | 41 9 | 24 10 | 29 11 | 8 12 | 37 13 | 32 14 | 16 15 | 17 16 | 34 17 | 27 18 | 46 19 | 43 20 | 14 21 | 49 22 | 35 23 | 11 24 | 6 25 | 38 26 | 1 27 | 28 | Player 2: 29 | 22 30 | 18 31 | 50 32 | 31 33 | 12 34 | 13 35 | 33 36 | 39 37 | 45 38 | 21 39 | 19 40 | 26 41 | 44 42 | 10 43 | 42 44 | 3 45 | 4 46 | 15 47 | 36 48 | 2 49 | 40 50 | 47 51 | 9 52 | 23 53 | 25 -------------------------------------------------------------------------------- /src/day23/cups.kt: -------------------------------------------------------------------------------- 1 | package day23 2 | 3 | 4 | fun main() { 5 | val input = "716892543" 6 | val initial = input.map { it - '0' } 7 | val firstCup = initial.first() 8 | 9 | val nextMap1 = (initial.asSequence() + firstCup).zipWithNext().toMap().let(::IntLookup) 10 | doRounds(firstCup, nextMap1, 100) 11 | println(nextMap1.sequenceAfter(1).take(nextMap1.size - 1).joinToString("")) 12 | 13 | val nextMap2 = (initial.asSequence() + ((initial.size + 1)..1_000_000) + firstCup) 14 | .zipWithNext().toMap().let(::IntLookup) 15 | doRounds(firstCup, nextMap2, 10_000_000) 16 | val (n1, n2) = nextMap2.sequenceAfter(1).take(2).toList() 17 | println("$n1, $n2 = ${n1.toLong() * n2}") 18 | } 19 | 20 | fun doRounds(firstKey: Int, nextLookup: IntLookup, rounds: Int) { 21 | var current = firstKey 22 | repeat(rounds) { 23 | val c1 = nextLookup[current] 24 | val c2 = nextLookup[c1] 25 | val c3 = nextLookup[c2] 26 | val next = nextLookup[c3] 27 | 28 | var t = current - 1 29 | while (true) { 30 | if (t < nextLookup.min) t = nextLookup.max 31 | if (t != c1 && t != c2 && t != c3) break else t -= 1 32 | } 33 | val nextT = nextLookup[t] 34 | nextLookup[t] = c1 35 | nextLookup[c3] = nextT 36 | nextLookup[current] = next 37 | current = next 38 | } 39 | } 40 | 41 | class IntLookup(source: Map) { 42 | val size = source.size 43 | val min = source.keys.minOrNull()!! 44 | val max = source.keys.maxOrNull()!! 45 | private val array = IntArray(max - min + 1).also { arr -> source.forEach { (k, v) -> arr[k - min] = v } } 46 | operator fun get(key: Int) = array[key - min] 47 | operator fun set(key: Int, value: Int) { array[key - min] = value } 48 | } 49 | 50 | fun IntLookup.sequenceAfter(n: Int) = generateSequence(this[n]) { this[it] } 51 | //fun Map.sequenceAfter(n: Int) = generateSequence(this[n]) { this[it] } 52 | 53 | -------------------------------------------------------------------------------- /src/day24/hexgrid.kt: -------------------------------------------------------------------------------- 1 | package day24 2 | 3 | import kotlin.io.path.Path 4 | import kotlin.io.path.readLines 5 | 6 | 7 | data class CubePos(val x: Int, val y: Int, val z: Int) { 8 | init { require(x + y + z == 0) } 9 | operator fun plus(other: CubePos) = CubePos(this.x + other.x, this.y + other.y, this.z + other.z) 10 | } 11 | 12 | enum class Direction(val delta: CubePos) { 13 | w(CubePos(-1, +1, 0)), 14 | nw(CubePos(0, +1, -1)), 15 | ne(CubePos(+1, 0, -1)), 16 | 17 | e(CubePos(+1, -1, 0)), 18 | se(CubePos(0, -1, +1)), 19 | sw(CubePos(-1, 0, +1)), 20 | } 21 | val directions = Direction.values().toList() 22 | 23 | val directionOptionsRegex = directions.joinToString("|").toRegex() 24 | fun parseDirections(s: String): List = 25 | directionOptionsRegex.findAll(s).map { Direction.valueOf(it.value) }.toList().also { 26 | check(it.sumOf { it.name.length } == s.length) 27 | } 28 | 29 | 30 | fun oneCycle(field: Set, neighbors: (Tile) -> List): Set = buildSet { 31 | addAll(field) 32 | field.forEach { addAll(neighbors(it)) } 33 | removeAll { e -> 34 | val n = neighbors(e).count { it in field } 35 | when { 36 | e in field -> n == 0 || n > 2 // false -> turn to white 37 | else -> n != 2 38 | } 39 | } 40 | } 41 | 42 | fun main() { 43 | val input = Path("src/day24/input.txt").readLines() 44 | 45 | val tileDirections = input.map(::parseDirections) 46 | // tiles.forEach(::println) 47 | 48 | val blackTileSet = buildSet { 49 | tileDirections.forEach { directions -> 50 | val pos = directions.fold(CubePos(0, 0, 0)) { pos, d -> pos + d.delta } 51 | if (!add(pos)) remove(pos) 52 | } 53 | } 54 | 55 | println(blackTileSet.size) 56 | 57 | (1..100).fold(blackTileSet) { prevSet, _ -> 58 | oneCycle(prevSet) { tile -> directions.map { tile + it.delta } } 59 | }.let { println(it.size) } 60 | } -------------------------------------------------------------------------------- /src/day24/input.txt: -------------------------------------------------------------------------------- 1 | seesweseseeeeeeeeeenweeee 2 | wswneseseseswseswseseseseswsesesesesese 3 | senwnesenenesenwseseswnwnwwnewnenwnew 4 | neseeseseseseseseseseseenwseseeseswe 5 | neswnweweeeeeeweese 6 | nenenwnenwnenenenenenenenenenenesenwne 7 | sesesesesenesesesesenwseseseseseewee 8 | eeeeesesweeweseeeeneeeeenw 9 | neswwnesenenenenenwenenenenesenesenenwne 10 | wseseeseenwsesesesesesesesesesesesese 11 | newneeneeseenweenenee 12 | eeeneeeeneneneneneswneeneenewenw 13 | nwewwnwwwwnwwwwwswnwwnwwewnww 14 | wnwswswwsewnenwnwnweneswnwseenenwnwwnw 15 | enwnwseswnenenwnwnwnwnwnenwnwnenwnwnwnwnw 16 | swsesenewnwsenewseneswswswseseswswsesw 17 | seseswseseneeenwwseeseseswse 18 | sweeeeneneweeeeeeeneeseee 19 | newwwswwnwsewwsewsww 20 | wwswsweneswewseswswswswnwnesweswnesw 21 | neneneneeenewnwnewsweeneeseeneese 22 | swwwswswsewseseswseswenesewseseene 23 | nweeesewwwsweseee 24 | wwnwwnwnesenwsenwnwsenwwnwwnwnwswsenene 25 | esesenwseswnwwseneeseenwswswswswsesese 26 | wswswswswswnwswnweswnwswnwswswseswswese 27 | swswnwneswswswswswswsweswswswswnewswswsw 28 | seneseeswswnwswseswseseseseswswsenesew 29 | swseseseseseseseeswsesesesenwsesese 30 | seswswseseswswenenwswseswseseswnwsewnwse 31 | seswsesesesesesesewseneseneswseseseswsese 32 | sesenewnenenewneneneneenenenenenenwnene 33 | wnenwenwneswsewsesenwwewwswwswe 34 | swwseswswswswneseswseseswneswswsesesewse 35 | nesenenenwneneeswnewneneswnenenenenenene 36 | esesewseeneseneseweenwnwneseeswewe 37 | nwsewwnwnwnwnwnesesenww 38 | nwnwnwnenewnenwnwnwnwnwsenwwnwnwnwenwnw 39 | seenenewneeneneneneneneeewneneew 40 | wseswwswswswswswswswnwswswwwneswewww 41 | wsenwwnwseenwwwwwwwwwnwwwww 42 | eenweeeeeeweswsweeene 43 | newnwseseeeseeewenesewweseeee 44 | neeseseeeswseeneswweeeseeseeee 45 | seseeeseeseeeseeseeesesenwseesw 46 | nweswseseeenenesesweesewsesesenw 47 | seswnwnwneseneneswwnenenwewnesesesenwnw 48 | nwneeeneneneneenenewsweneeeeswne 49 | neswsenwwnwneswnwneswswneswenwnenwnw 50 | swnwnenwwnewswwnwnwswwnwewwwnwnw 51 | nenenwnenenenewneneneneseneneweenww 52 | seneneneneneeneswnenenweewnenene 53 | eeesenweweneeeseese 54 | eneneeesewnenewenewnewseseneee 55 | nenenewsenenenwwnenwneseneenenenwnesee 56 | wswsewwwwwwnwwneswwswwwewwwsw 57 | wswswswwswwwswwwewswswwseswnew 58 | seenwwseseseseesesenwsesesesesesesewne 59 | wswsenwwesewnwnwwnenesenwwseewnenww 60 | senwwsenwswseseswswnwswneswswswswswsenwe 61 | swneseseeseeeeesewnweeeeesee 62 | seeseeweeseseseeeseeseseeenee 63 | eseswneseseseseswwsesesenesesewse 64 | eeneeewneeeeeenweeeeseenese 65 | eeseswenwnwesewnwnwese 66 | seswswwswswswswswswswswswswenwseseswsw 67 | enwwnwewwnwswneswnwwnwnww 68 | nwwnwenwnwwnwwnwnweenwnwwsenwnwnwnw 69 | senwnesewwwnwwswsesesenwsenwwenwnwne 70 | eswswswswwneseswseswswswseeswnesesewsww 71 | wwwwwwwnwnwwwwwnesenwnwsenwwww 72 | nwnwwenewnwnenenwnwnenwsenw 73 | wwwwwnwwwwsewwsewnewwnwewww 74 | wwnwwwnwwwwwwweswwwwwww 75 | nwwwwwwnwwwswnwwwesewnwnwwew 76 | wseweswswswswneswswsw 77 | nwneswneenenenwwnweneneneneneeesesene 78 | nwwwnwnwnwsenenwwnwnwswnwwwnenwnwse 79 | ewwsenwwnwenwenwewwneswwsenwwsw 80 | esesenwswswseseswsenesesewswseseseswse 81 | nenwnwnenwnwneswnenwsweneseenenenenenwnw 82 | sewwewwwwwwwwswwwwnewwsw 83 | swswswswswswswswswswswswswswswneswww 84 | swseseswnwewwswseeswnesweswseswwswswsw 85 | wnwneseswenweneswswweneeseneenenw 86 | wswseseenwsesenwseseewnesesesesesese 87 | eseseewwnwsweneswnwswswwswsesewswesw 88 | neeneneeswneswswwenwwwseneneneene 89 | neneswnwsenwswnenwnenwnwnwswnw 90 | neeenweeeneeneeesweeneeeene 91 | nweeeeeeeeneeeneweenweeswsesw 92 | swwwnwswweswnwwwewnewwwseswwwsw 93 | seseseseseswsesesesesenese 94 | eswneswneewswnwswswswewnweeswwse 95 | seswseswswsenwneswnwseswswswseswnwnesesesw 96 | eeweeswneenweeeneneeeneswseene 97 | nenwnwswnwnwenwnwenenwwnwswnenwnenwnwnw 98 | enwseeneneeeeweswneneenewnee 99 | enewsewwwwneewwwswswwnwwew 100 | eesweenwnwnwseeesenwseswneseseseswe 101 | weseneseeseewnwwswnwneswswsenesewnw 102 | nwnwsenwnewwwnwsenwnwnwwnww 103 | nwnewnesweneneneneneswnenenwnenwenwenwnw 104 | eswswwwswswnwswswswswwswenewswsww 105 | neeneenenenwswnewwsweswswneneenene 106 | nwseswenwnwsenwenwwswesewsesweesw 107 | nwnweeswswnwnwswewnwnenwnwswenenew 108 | swseenweswnesenwswwnwnwwnwnenwswsenenw 109 | eeeeeneseesewesenwnweneeneenee 110 | seseseseenweseeseseeswseseeseseenese 111 | senwwwswswswswswwswswwswswenwswwswsw 112 | eeneeneneeeneneneeeesenewneeneew 113 | wnwnwwnwswsweeseswswswswswwwwswe 114 | sesesesenewseeseseseseseseesesesewse 115 | nenwnwenwnwneswnwnenwenww 116 | nwswswswsewwneswswwwswneenewswwwwsw 117 | eswenwsweeswswnwnwenwewewswnene 118 | neesweneseeeeeneeeseeeeswnwesw 119 | seseeneeweeweeeeseeeewee 120 | nwnwnwnwnwnwnwnwnwnwnenwsenwnwnwnwnw 121 | nenwnwwnwnwnenenwnenwnenenenwseswnenwnwnwse 122 | wwnesenwneneeneeseneewswnwneneeese 123 | senwnwnenenwneswnwnenweswweweneseswse 124 | nwnwnwwnwnwswnwswnwwnenwnwnwwenenwwnw 125 | eswnenenewnenenenesenenenwseewnenwnwsw 126 | wsenenwwwwnwnwwwnwwnwnwwnwnwww 127 | seswseswsenwswswseseswseneswsese 128 | swswswswswswswneswwswnwseseswswswswswsesw 129 | enwneswswswswnenenenenenenenwneenenene 130 | wsesewswwwwwwwnwnwwwswwweww 131 | enwwwsewwwsewwnwnwnwwwnenwww 132 | eeeeeneswsweeeeeeeeenwee 133 | nwwnewnwwswewnwnwnwnwsenwwnwsenwse 134 | nwnwsewwwnwwnwseenwswswenwenenwnwwnw 135 | seswswswswseswswseswswswneneswswswswswswsww 136 | wswnwseswewwwswwwswswswwwswwww 137 | wwnwwnwwwwsenwswenwe 138 | seseseseswseseswnesesw 139 | swswswswswseswneewnwswswswswsw 140 | seswneesewseneewswseswwnewsenesesewnw 141 | nwswwenwnwswneneesenewnwswnenw 142 | seeswswswswswswwswswswswwneenwswswe 143 | wswwseswnenwwseswneneeswsesweseene 144 | eseseeneewseseseewseseeseeseesese 145 | senwnwnwnwswswwneneenwnwnenwsenenwswnese 146 | wnewswnwesewwneswsewswwsewwswnw 147 | sewnwnwseseeewnwesenwwswnwwwsenwww 148 | swenenwswnwnenwseswnwnwnenwnwnenwnwnesew 149 | wswenewwwwnwnwenesweswweswseswsw 150 | eseseeeswwnesesesesesewnweenweseswne 151 | nwnwnwnwnwnwenwnwnwnwwnwnwnwnwwswew 152 | eenwweneeeeeneneeeesweeesee 153 | newsewwwwwwwwwwswwwnewwwew 154 | wsewnewwwwewswswnwwnwwwneww 155 | nenenwneseneenwsewneneswneewwnwnwnw 156 | nenenenenenenenenwswnwseneneewnwne 157 | newnenwnwneneenenenwnenw 158 | swseseseneseswswswswswnwswswswwseswswseese 159 | sewwwnewnwwwwenewwnwwwswwwnwse 160 | weswseseseseeseseseseswseseseesewwsw 161 | swesenenesweseeswneseeswnwseesesee 162 | wswwneneseeeneeeseseseneswsenwswwne 163 | wenewseswsenwnenenwnewnewsesenwnew 164 | swswsweswswswswswswswswswnwswswwswswe 165 | seenwseswswenwwsesenwseneswenw 166 | nwswswswswswseswswnwseneswsesweswwsesw 167 | nwseswseswsenwnesesesweenewnwswwswse 168 | swswswseswsewnweswsesesesee 169 | eeneenesenenwseeneneneneneneneswnenw 170 | swweswsewswnwswwswwswswswswswswswsw 171 | swswseswseswswswswswsene 172 | enewswwsesesewnweeneeswwswesene 173 | seeeeeseweseenweseseseseesenese 174 | swwswnwneswnesenwnenesenesene 175 | seeseneswwswewnwseeeeesenenwwnene 176 | nesesenwswswnwswnwnewnwwsenenewe 177 | neewneeseeeweseeswenwseseeeee 178 | nenesewneseneneneewwnenenenwwe 179 | swnenwnenwnwnwnwnenwnwnenwnwnenwswnwnwe 180 | wswneswseewseneswswenwseswnwswneswwsw 181 | neneeeeneeneneenweseneeeneneneew 182 | seneswwwwwsesenwwnewnenwenwnwew 183 | enwwnwnwnwwwnwwwwsenw 184 | wnewwwwnewwsewwwwsewwsweww 185 | nwwwnwsenwnwnwwwwnwwwnwewwnwww 186 | swswwswswseseswwswwswneswnwswswwwswe 187 | nwenenesweswneenesenwenw 188 | eenwenesweeneweneeweneseeswsee 189 | enwneneneeswnwnewneseeeeswnwewee 190 | neneewnenewwnenenesenenesenene 191 | nwnenwnwenwnwsenwnwnwnenwnewnenwseewnw 192 | ewwsewwswewwnwneeseneswwsweewne 193 | wwnwwnenwswnwwnwnwnwnwwnw 194 | nwnwswnwnwnweswenwnwswnwnwenwwnwnenw 195 | swwnewnwwnwswseswwsweewewwwswwsw 196 | seswswswsewswseseswswneswswswwseneswwne 197 | seseesesesenesesesweseseswesewnwenwe 198 | swenenwnwnenwneneneneswnenenenwnenwnw 199 | nesewnewsewnewenwswsenwneeneswnwswsee 200 | nenwsenwnenwseseswnenenwwnwnwnwswnenene 201 | seswwwwswwswnwwsw 202 | eeeesweeseseneseeeenenwsesesew 203 | nwseseseswseswseseseseseeseweseneseswne 204 | neneseswenewswenwswswneseswnwwswnwene 205 | nwnwnwwwewwnwnwnwnewnwwswnwwwsww 206 | swwwwswwswswsewneswwswswswswwww 207 | wwswnwwswswswnwswswswswswwwswwwese 208 | nwnwnwwnwswnwnwnwnwwnwnweenwnwnwnwnwnwnw 209 | nenwnenenenwnwnwnenenwswnwnwenwnwnwne 210 | seneneneneneneneneenenenweesweneenenwne 211 | senwenwenwsenwnwnwwnewnenwnwsenenenw 212 | esenweesesesenwsenesweneeesewswnw 213 | neneenewneeeneeneneneneneneneeswnee 214 | senwwwneseseseneesesewseseseseeesew 215 | nwwnenwnwnwwnwsewesewwwnwnwwsww 216 | seseseseseswsesenese 217 | neseenenwweswnwnewwsenenwnwwnenenw 218 | nwwwwwwwwwnwnwwwsesewnwwwnw 219 | nweeeeeeeneeswesewsesewneese 220 | nwnwenwwseeneeswswwnwnenenesenenwnwswne 221 | swsesenwesesenweeeeeseseseesweesese 222 | swswswwsenwswwsweswswswswwwswswswswsw 223 | swswnwseseseseswseeseseesenwneseseese 224 | nwnwwsewnwnwwnwnwnwnwwwwnw 225 | nwswswwswswsweswswswwswwswsewswwnw 226 | swnwwseewswnwwswswwsw 227 | nwwnweweseswsewneneswnwswsesenenenwsw 228 | nwneeswneneeeswwswnenweneneneneene 229 | nwnwnenwnenenewnwenesenwnwnenenwnwnew 230 | seseseseseswwseseseseneswsesesw 231 | nenenwneneewnenenwnenwswnwwsenwnwenew 232 | eneneneseneeneneswseenwnenewswswenenwnw 233 | newwswwswwseswenwwwnwnewsenwneew 234 | nwwwnwswnwnwwsenwnwnenwswnwenwnwnwenw 235 | neeneeneseseeneeeneewewewewe 236 | swsweseswseneswsenesenenwswene 237 | wswneeswseseneeesenweseeesesesesesee 238 | nenwnenwnwnwnwnwneeswnenwnwnwnwsw 239 | swswneswnwnweswnwswwswnweswsweswee 240 | nenenenwnenwnwnenenenwswnwnwnwnenenwsee 241 | wswseseneswwwswwswnwswswswswswswwswsw 242 | newnwsesesesewseeneseesesenesewswnw 243 | senwnwwwswnwnwnenwnwnwwnwnwnwnwnwwnenwnw 244 | nenwnenenenwnwnwnewenwnwsenwnwnenwnww 245 | nwnwwwwwwnwwsewnenwwwsewsewww 246 | nwnwwnwwwnwwswwnwwwenwnw 247 | swwnwswnwnwnwnenwewseswnwswwneneww 248 | sewseseseeeseewnwneeweesenesese 249 | swswwneswnwswswswswwswneswswsewswwwse 250 | neswswwseswswswseeswswneswwswneseswsw 251 | swseswseseeswsesesesesenewsewseswseswswse 252 | seeenweeeseeeeenwsesenwnwseee 253 | esesewseswswswswseswseswswnwnwseswsene 254 | wwwnwwwnwwwnwnwnwnwnenwnwsesenwnwwnw 255 | swswsewswseswneswswswseeseswswseswswsw 256 | newseeseeeseseeneeeeseeeewe 257 | neswneswwenwesweneenenesenenweeesw 258 | neeeneneneneeeeweneneneeeswnene 259 | eseseswseseseseseneseeneseswenwwsese 260 | neneneneneeneneenwneneneneeneneswswenw 261 | senwnewnweneeneswseneswwenenewnene 262 | neseeewneenesesewsenwswsenwswsenese 263 | nwswnenwnwnwwenwsesenwwsewnwenese 264 | swswwswneswwswswwswswswwenwswwwsw 265 | nwneneneneneeneneswneeswnenenenenenenenene 266 | neseswswswseseneswseseswswseswswswswsenwse 267 | neswnenenesweswswnenenwneneenwsenwnene 268 | swseseseswswwswswwweneswneesewwne 269 | enwnwnwnwnwnwnwwenwswnwwnwwnwenwnwnw 270 | wwwswwswwwwwswweswwswwwee 271 | seneeeneeneneneswneswnwenwnenwnwswswse 272 | nwnwnwnwnwnwwnwnwnwnenwnenwenwnwnwswnwnw 273 | wwseneneseneswnwneeneneswne 274 | nwwenewswnwsewswswewnwnwnenwwnwwwe 275 | sesesesenwseswsesenesesesesesesesesesese 276 | swenweseeeeesesenweseeseneseswsee 277 | swenwswseneswwseswenwneswswwswnwswe 278 | wswnwwwwwwwwwnwwewswwwwwwe 279 | eseseweneeseeeswseeeseeeseenese 280 | swneswnesweeewnweswnwswnenwswswswsww 281 | nwnwnwseswnwewnwnw 282 | neneswnweeeeneeeneneewneneneenene 283 | eseseweseswsenwswesesenwsesewesenewsw 284 | sesesesesewnenwwswsesesweswsesewee 285 | swsewswseeswnwswseswswswswswswswswswesw 286 | sewnwnwswnwwnwnwnwneswnwnenwnwnwewnwnw 287 | wnwswnenenenenwneneenene 288 | nwwneswswneenwnwenwnwnenwnwnenenenwnenw 289 | newswswwsweenwnesenwnwsenesweeswsw 290 | nwnwnwnwnwnwnwnwnwnwsenwnwnwnwsenwnwnwnw 291 | nwnwwnwseenwnwwnwnwnwnwwnwnwnwwww 292 | wwnwseeeneenweswswwenenesewsesenw 293 | swswsesesenwseeswswswsesenwswseseseseswsw 294 | wwswwwnesenewwwwswwwwnwneww 295 | seseseswnwswswswswseswswswseneswnwsesw 296 | weswwswwwewwenwswwwwwnwwnwww 297 | eeeeeneweeeneeeeewseewee 298 | seseseswneseseseneneneseseseswwsewsesw 299 | neneneneneneneneneeeneneneswneewseenw 300 | wnenwnwwswwnwnwewwwwnwnwswwwww 301 | swenwnwnwnenwnwnenwnenwnwnenwnwnwnwnwne 302 | eeenesweeeenweneeneweseeeswne 303 | ewnweeeswwseneneene 304 | neneswneneneneneneswnwenenenwnw 305 | sewwwwenwnenwwwwwsewwwwnwse 306 | wwwsesesewwnesenenwnewnwwsewwsewne 307 | swswwwnewwswwswwswnewwwwwswsww 308 | seseneweweswneneswseeeeswwenwnwne 309 | eseseseesesweswseseseseeseneeeenw 310 | neneneeeenewnenenenenwneswneneneneenene 311 | nwewewwwsenewswsewswsenenewswwsene 312 | neneneswnenwnwneneeeneneneeneswnenene 313 | enenenwnwnwnwnwswnenwnwnwnwnenenenenwnw 314 | wnewswwwswswswwswswswswswwww 315 | swswswswneswswsweswnwswswswswswneseswsw 316 | eeeeeeeeenweeeesw 317 | seseswseseswsesesesesewsesene 318 | wwwwnewswnwsenwwwwsewnewwwww 319 | newsenenenenesenwenwneneneneenewnenesw 320 | swswswswswswswswnweswswnesenwswswswswsesw 321 | newnenenenenenenwesenenewswswnesene 322 | wswnwnwnwnwseswenwseeenwnw 323 | eewseseseeseseseneseeeneewsewe 324 | nenenenenenenesenwenwenewnenenenwnenesw 325 | wsenwsewnwwwenweseswnwnenewnwswwnw 326 | seswenwswswswswswnwswswswswswswswswsesw 327 | nwwnwwnwwnwnwwwswnwnwwenw 328 | neenenenenenwenwwnenwnwnenewnenenene 329 | eeeeneeneenwnewseeeneeeseene 330 | esenwwnwsenwnwnwnwnwnwnenwnenwnwnwnwswnw 331 | eeeseeseeeseeseeseeesesewsesenew 332 | wweeswnewwnwsewnwwwwwwseewsw 333 | seswwwwewwnwewswwswenwwwnene 334 | eseeeseseseewseseeseeeesenesese 335 | eenwesenwweeneswwnewneeeesenee 336 | eeeneeneneswseneenenenenw 337 | seseseswswseswseswesenwweswneswseswse 338 | nwsewneenenwnenenenenenwnenenenewnenene 339 | nwnenwnwnwnwnenwnwnwswswswnwnwnwnwnwnwe 340 | neswnwnwnwenewwwnewwnwswswesenwwne 341 | nwsewnwwnwnwwsenenenenwnwswwnwswnwnww 342 | eeeeeeweeeseeseneeeenweene 343 | seswswwswwwwwwswneswswswwnwswwwsw 344 | nwnwnwnwwnwnwnwnwnenwnweswnwnwnwnwnwne 345 | swweswswswswswwswswswswswwswwnweswwsw 346 | nesweewnwswnenwnwnenenwnenwseeswnene 347 | neseseseeeeeeswsesewseeneeeesese 348 | swnwswseswneswswswswswswswswswwswseswsese 349 | swwwenwnwnwwnwsenwwnwnewnwwwwnwnww 350 | senwseseseesesesesesesesesese 351 | senwnwnwnesewnweenwwnenenwswswnwswnenwnw 352 | enenweenwnwweseesweeseseeesw 353 | swseswwswenwwswsweswswswsweswweswsw 354 | nenwnenenenewseswnesenwnwwneweeneese 355 | esesesesesewseneseseseseseseswsesesese 356 | wewnwnewsewwwwwswswwwwseenwew 357 | nweeenwswsenwnewwewwnwswnwwnwnww 358 | sewnwwnwwnwnesenewnenesenwnwseeenwne 359 | enenewseeeeeneeeenene 360 | eeeeeneeneeesenweeeeneeeesw 361 | neeswwseewwneewswswnenwwswwwww 362 | wswwswwwseswswwswswneww 363 | nwnwnwwnenenesesesenwnwwwnwsewnwnwwnw 364 | swneneenwswenwnwweswwwwnweesewse 365 | nwnwnwnenwnwnwnenwnwnwnwnenwnwwnwesenenw 366 | wswneswswwswswwneewwnwnwweseewne 367 | swnenwsenwnwnenwnesenwnwnwnwnwnwnwnwnwnw 368 | esweswsweeseeseswenwseenwenwnwnwwne 369 | neswseeeeswsesenw 370 | swnwswnwsesweswseswsweseswswswswswswsww 371 | neswneweneneenwenweeswswnwweee 372 | enwswnwenwnewswwnwnwnwnwesewnwnwesw 373 | swswseswswswseseseseseseseswswswseweswne 374 | eneesenweeeeeneeeenwneeswnenee 375 | neneneneneenenwnenwnenenewsenenenenewne 376 | neneseeswneneeneenenewneneenenenenw 377 | seeswseseswseseeeenwenwseseeesenwee 378 | nwnwswwnwneenwnwswsesenwnwseseeeswnw 379 | nwesewnenwewseeneneeeewneeswenee 380 | swseswseswswewenwswswneswswswnwnwseswse 381 | eenweesesweeeseeweeseeeseeee 382 | nenenenwnwnenenenewneneeswnenenenenenenw 383 | sweesesenweseeeseeseeee 384 | nwsenewenwnwnenenenenw 385 | eneeweseneeeeeeeeeesweseese 386 | nwnwnwwnwnenwnwwnwnwnwnwnwwsesewwnwnw 387 | neswswswswseswswswswweswwswswsw 388 | nwnenwewsenwnenwnwnwnwnwwnwnenwnwnwnwnwnw 389 | seneesewsenesesesesesesesesesewsewsese 390 | nenenweeneneenewwseeeenewseswnenene 391 | nesesenwseeseseewneseseseewswseee 392 | swwswswswswswwwwsweswswnwsww 393 | sesewseseseseseesesesesewseesesesesese 394 | swnwswwswwwsewseswwwneswwswwsww 395 | seswswnewswswswswswswseswseeseseseseswsw 396 | eeenwesesenwseseesesewweeseesee 397 | swswswswswswswwswneswswseseswewswswsw 398 | senwwnwnwnwnwnenwnwnwnwnwnwnwsenwnwwswenw 399 | nweesweeeneeneeeneneeeewnenene 400 | enwwwnwnwwnwnwwnwwnwnesenwsww 401 | swseseneeeweesenwseeenewesewnenew 402 | neesesesewseseesesese 403 | esesenwseseswseesesesesesesesese 404 | swswswswswneseseswswseseswswsenwswswsesww 405 | ewwsesesewesenwnenw 406 | wswwnwwnwwnenwnwnwsenwwwewnwnwnwnwnw 407 | neseseeseweseseseseseesewseseesee 408 | eeeneesenwesewnwsweweeeeenesw 409 | neneeneeneeneeeeeeneewesenesw 410 | eeneneeneneeneewneneseneneneenenwe 411 | wnwnenenwnwnwsenenwnwnwnwnwneseewnwnw 412 | sweswswswswswswwswnwswswswswsw 413 | swneswwswwwswwswwwswswwswsw 414 | wneewswneswswswseswwwnwwwwswswsenw 415 | wneseneeeeneeeeeeeewneesww 416 | swneseenesesweswseseneseseeenwsesese 417 | nenwnwnesenenwnenwnwsenenwnenenwnwnenenwnw 418 | eneneswneneneeeneene 419 | neenewnenwnwnenenenwneswnenwnenenwnwnenw 420 | wwwewwwwwwwsewwwnwwwwww 421 | eeeeeewsesweeeeeeeenenwesw 422 | wnwswwsewwswnesenesenewwwswwwesww 423 | nesenwwwswwwsew 424 | wnwnwneswneswnwnwnwnwnwnenwsenwnwnwesenw 425 | nwneseenwwnenwnenenewnw 426 | eseseeeesweeneeseeweeeseeese 427 | swswseswseseseseseseswsesenewswswsenesesw 428 | nwenenenenwneenenesweeeseseneneswnenww 429 | wwsenesenwnenenweneneswnenwsenwwswe 430 | nenenenesenenenenenenwwnenesweeneenenw 431 | neswsenewnenenenewneeneseneenewnwneesw 432 | swsweswswseswseswswswswseswsweswww 433 | wnewwewwseswwwwwwwsenenwwsew 434 | seswswnewswwwnewwweswwswwswswwsw 435 | wnesweenenenwnwesewsweweeeswnw 436 | wnwnwwswnwnenwwwnwnwwnwenwnwwnwnwnw 437 | neswswseswwswswnwwsewseswnewwswswswsw 438 | neesenwwseneswnwwese 439 | wnwnwnwswnwwswnewwnwnewnwnwswnwenww 440 | nwnenwswnwnenesweneneswnwneeswswnwnee 441 | sesesenwseseseseseseswseseesesesesesewse 442 | wwwwswewwwwnewwseswswswwswww 443 | nenenwneswnwnenwnwnenenenw 444 | eswwwnwnenwwwwwewswwwswnwwnew 445 | wnwswwsweswswnwnwswseweswswswsweswww 446 | swswswswswneswswswneswswswswswswswseswsww 447 | wnwnwnwwwnwnwsenwewnwsenewnwnewsw 448 | seesesesenwseswseswswsesenwseseswseswse 449 | eneswsewesenwwneswwswseswswswwswswsw 450 | seswnwenwsesewnwesesesesesweenenwe 451 | eswseeweeswwsenwesenweeewnwe 452 | seswnwnwewnwnwnwswnwenwnw 453 | swwnwwswwwswwswsewswwwwwweswne 454 | enwnwnwnewnwnwwnewwswwnwswsenewswsw 455 | nenwnenenwnwnwnenewenenwewenwwswse 456 | swewswwwswnewnwswnwseswwwswwwswsw 457 | eeeeeseeewswswswnenwnweeneneene 458 | nwswswswswswewseswswenwseswsweseswswne 459 | neeeswneneneneneeneneneswnenwneeene 460 | neenenenwnenenesweneseneeesewneseew 461 | nwenenenenenwnesenesewnenenenenenewne 462 | weseswwneesenewwsenwnwwsweswwsw 463 | nwnwswwnewnwnwnwwwsenwwwswwneww 464 | nwnwsenwnenenwnenwneenwnwswnewnwnenw 465 | nenwneseswnwswwswwwnweseesesewnwsene 466 | swswswswswswwsweswwswswwnwswswneswse 467 | seswsenwsesweseseseseswseseseswseswswse 468 | seswseseseseseseseseeseseswsenwswsesese 469 | wwnenwwnwnwwwnwwwwnwnwwwwwse 470 | seesesewsesesenwesese 471 | swnenwwnwswsesweswnwnenesewswewwse 472 | seseseswsewwwesesenwsesesweneswenw 473 | senwnwnwwnwnwwnwnwswesenwnwwnwwnwe 474 | wnwwwwwwwwnwwewwwwwwew 475 | neeeneeenesenweeeeneneneeee 476 | swwwseeeneenweeneeeenwseswnwswse 477 | wwnwwswswswewseswswwswwswwnwwe 478 | wswneeeeneewnwneneseseseeewwew 479 | seseeseeswswseesewsenwesesenwse 480 | swseneseseseseswswwesesenwswswseseswnese 481 | wwnewwnwwswwnwwwnw 482 | nwneswnwswswswswswseewswswswswswswesw 483 | seeneseneseseweswwwsesenwwneseesee 484 | wnwsenesesesesesesesenwseseseswsesese 485 | sewwwwewswwwwwsewwwnwnw 486 | wswswsewneeswswswswswswwswwswwwswsww 487 | eeenenwwneneneneneweweneewneswnee 488 | nwwnwsenwwwswwwwnwnwwnwnwnwnwnewnw 489 | swswswswseswswswneswswswseswswswswswswnwsw 490 | sewnenenenwnenenenenenenenenenenesenwnene 491 | swnweswnwnwsenwnenenwswnwswweeeswenw 492 | wnenenwneenwseswnwwswnwswwwswwnwne -------------------------------------------------------------------------------- /src/day25/handshake.kt: -------------------------------------------------------------------------------- 1 | package day25 2 | 3 | const val M = 20201227 4 | 5 | fun transforms(subject: Long) = generateSequence(1L) { it * subject % M } 6 | fun transform(subject: Long, loopSize: Int): Long = transforms(subject).elementAt(loopSize) 7 | 8 | fun main() { 9 | val (cardKey, doorKey) = listOf( 10 | 15733400L, 11 | 6408062L 12 | ) 13 | 14 | val remaining = mutableSetOf(cardKey, doorKey) 15 | val loopSizes = transforms(7).withIndex() 16 | .takeWhile { remaining.isNotEmpty() } 17 | .filter { remaining.remove(it.value) } 18 | .associate { it.value to it.index } 19 | 20 | println(loopSizes) 21 | println(transform(cardKey, loopSizes[doorKey]!!)) 22 | println(transform(doorKey, loopSizes[cardKey]!!)) 23 | } 24 | -------------------------------------------------------------------------------- /src/day3/input.txt: -------------------------------------------------------------------------------- 1 | .##......#.##..#..#..##....#... 2 | ...##.....#...###........###... 3 | #....##....#.....#.....#..##.## 4 | .......#.###.#......#..#..#..#. 5 | ##..........#....#.#...#....... 6 | ###.#.#.#......##...#.......... 7 | .#.##........#..............#.. 8 | ..#..........#...##..#.......## 9 | .........##...#...#....###.#... 10 | #.......#.....#.#.#...###.##.#. 11 | ...#...#...#......#........#.## 12 | ....#..........#.....#..#....## 13 | .#.#.##....#.#...#............. 14 | #....#..#.....#.#.............. 15 | ........#....#....#..#........# 16 | ..#.......#...#....##.#........ 17 | ......#.........##.......#.#... 18 | ............#.......#.......... 19 | .....#..#.#..#........##...#... 20 | ....#.....................###.. 21 | ..#.......#.........#..##....## 22 | ..#........#..#...#........#... 23 | ..............#....##..##....#. 24 | ....#..#.#.......#....#..#...## 25 | .#........##......#.#..#.#..... 26 | ............#.##...##...#...##. 27 | .......#........#.........##... 28 | ...#...........#.#...#..#...... 29 | #...#............#..####....... 30 | ..#..#..#..#.....#...#.#.#..... 31 | ....#.#..............#.....##.. 32 | #.....##........#......#....... 33 | .....#..#................##.#.. 34 | .###.#...................#..... 35 | ....#....#...#.##..........#... 36 | .#.....#....#.......#...#...... 37 | .....#...#.##.##............#.. 38 | ..........#..#....#...#.#..#... 39 | #...#..#..............###.#...# 40 | ......#....#.#....##....#...... 41 | ............#......#......##... 42 | .#....#...#........#.#.#..#.... 43 | ..#.....#.......#.....#.#...... 44 | #....#......#.......#......#... 45 | ....#..##.....#...#........#... 46 | .#..#......#..#................ 47 | .#...#...#....#.#...#.....#...# 48 | ......#..#...#...#..#.......##. 49 | ...#..#...#.#.......#.......#.. 50 | ..#...#.........#......#......# 51 | ......#...#..#..........#...... 52 | .#..#......#....#.#.#...#....#. 53 | .#.#....#.#.#..#..#..#........# 54 | ....###.#...##..#.#..#....#.... 55 | ...#.#.#................#...... 56 | .#.....#..#..........##..#....# 57 | ..........#..#......#.........# 58 | .....#....#...#.#..##....#.#.#. 59 | ........#.##......###.......... 60 | ##......#.#..#.....#..##.#..... 61 | .#.......#..#....##.....##..... 62 | .....##....#................... 63 | ##......#....##........#.....#. 64 | ..##...#...........##........#. 65 | ...#....#..##.#....#......##... 66 | #....#...##....#..........#.... 67 | ......##....#...............#.. 68 | ...#.#.#...#...#...#........... 69 | ....#..#...#.#....#.#......#... 70 | .......#...#...............#... 71 | .##..#....#...#....#.#........# 72 | .....#..##............#......#. 73 | ...##...#.....#..........#.#..# 74 | ..#..##.............#....#..... 75 | .....#.#.....#.........#......# 76 | ........#..........#.#.#...#..# 77 | #........#.#................... 78 | ......#......##..............#. 79 | ......#..#.#.....#...#.#...#... 80 | .#..##.....#...##.......#...... 81 | #.......#....#..##....#..#.#... 82 | #..#..#....#...........#.##.... 83 | ..##....#....##.....#...#...##. 84 | .#.......#.......#....#.......# 85 | .#..#..#...#...#............... 86 | .#..............#.....#........ 87 | ..........##...#....#.#......## 88 | ..........#..........#.......#. 89 | ..#..##....##...#.......#...... 90 | .#......#.#........##.#........ 91 | ...#......#..#....#...#....#... 92 | ...............#....#..#.##...# 93 | ....#.......................#.. 94 | #....##.#......#....#.......... 95 | .......#.#......#........#..##. 96 | ..#.....#...#...........##..#.. 97 | #........#.#....#............#. 98 | .........##..................#. 99 | ........#...#..#...#......#...# 100 | ...#.......#...####.#...#...... 101 | ....#..###......###..#......... 102 | .....#...........#......#...... 103 | .#.....#......#.....#.....##.## 104 | .#.#...##..........#........#.# 105 | ..#....#.....##...............# 106 | .....##.....#...##..#.......... 107 | .#......##.......#..##.##.#...# 108 | .#..#...#.##.....#.#........... 109 | .........#....##...#.....##.... 110 | #..........#.............#..#.# 111 | ...........#........#.#...#.... 112 | ........#..###...#...........#. 113 | #.........#...#....#..##.##.... 114 | ........#....##.......#.#....#. 115 | ..........#..............#..... 116 | ....##...#...##..........#..... 117 | ...#..##.#...###..#............ 118 | ...##..#####....#.............# 119 | .#..#.......##.......#........# 120 | ....##..........#.......#.#.... 121 | ......#.........####.......#... 122 | ...............#......#..#..... 123 | ...#...##...#.#.#.....##.#.#... 124 | ..#....#..#..............#....# 125 | #..............#............#.. 126 | .#.#..#....#.....#.#.#...#..... 127 | ......#......#..#..#.....#..... 128 | .#.#..#.##.#........#.......... 129 | ..##.#......#..#.......#....... 130 | .##...##....#..#.#.........#.## 131 | .........#........#.#..###....# 132 | .....#...............#......... 133 | ......##..........#.....#...... 134 | .#.....#.#.#..#.#.....#..#.#### 135 | .......###.##......#.....#.#..# 136 | ..#.....#....#.#.##......#....# 137 | .....##..#................#..## 138 | .#......#.....#..#.....#..##### 139 | .........#.#.......#..##...#... 140 | .#.#..#.......##.....#....#.... 141 | .....#...###.#...#......#....#. 142 | .#....#....#...#..#.#........#. 143 | ......##........##.#...#..#..#. 144 | .##.##.###..#.....#........###. 145 | .....#..#.#.......#..#.#....... 146 | ##.#.#..............#..##...... 147 | ....#.........#.......#.#...... 148 | .....#..#.....#...#.#....#.#... 149 | ...#..#.#.#..................#. 150 | ........##.#.###............... 151 | ..#...#.#.......#......#....... 152 | .......#.##....#...#....#...... 153 | ......#.#.............#........ 154 | ........#......#........##.##.. 155 | .....#...#......##............. 156 | ...#.#..#.....#.#...#.......... 157 | .#.#..#.....#............#..... 158 | .#.#..#.#.##.#...#.##..##...#.. 159 | .........##........#.##..#..... 160 | ##.#.#......###..#.##.#........ 161 | .##...#..#...#.#..#....##.....# 162 | #......#..........#.#...#.....# 163 | ..........#......#...#.......#. 164 | .............#..........#...... 165 | #.#....#.......##..#.....#.#... 166 | ##......#..#......#.#..#.#....# 167 | ..#.#..#.....#.#......#....#..# 168 | ...#......#......##.....#..#.#. 169 | ....#......#.....#....#.#.#..#. 170 | .....#..#..#.....#...........## 171 | ....#.....#...#........##.#.#.# 172 | ..#......#.......#........#.... 173 | #.......##..##......#...####..# 174 | #..........#......#.#..#..#.... 175 | .................##............ 176 | ...#..#..#.#.....#.##.#.....#.# 177 | ...#....###.................... 178 | ....#.......#..#.#............. 179 | #......#................#...... 180 | ..........#........#..#........ 181 | .....#......##..#......#..###.. 182 | ...#....#.......#.............. 183 | .#....#.#.#........#.....#...#. 184 | .......#.....##.#.....#....#... 185 | .........#.#.........##..#...#. 186 | ......#......#....#.....##.#.#. 187 | ####...#.........#.....#......# 188 | ...#.#..#..#.............#..... 189 | ......#.........#....#.#..##..# 190 | .........#.....#.#..##..##..#.. 191 | .#......##.............#....... 192 | ....#...#......#...#.....#.#.## 193 | ......#..##....#..#.....#...... 194 | ......#..............#....##... 195 | .........#.###..........#.##... 196 | #....#..........#..#.......#... 197 | ...........#...#.....#.......#. 198 | ..#..#........#................ 199 | ...###.........#............... 200 | .....#.##...#.................# 201 | ..#.#..#...###......#........#. 202 | #......#......#.#.............# 203 | .........#.#.....#..#........#. 204 | ........#..#......#......##.... 205 | .....#......#...#.....##...#.## 206 | .##...#..#....##..........###.. 207 | .......#............#........## 208 | .##.....#.......#...#.......... 209 | ..###..........#.............## 210 | #....#....#.#....#............# 211 | #...#......................#... 212 | ....#..#..#..#.......###....#.. 213 | #..###.#..#.....#.............# 214 | ..........#.##.....#.........## 215 | ...#.............#....#....##.. 216 | #........................#..#.. 217 | ........#...#.....#.....#..##.. 218 | #........#......#....#..#....#. 219 | .....#.#.#....#.#..#....#...... 220 | .....#....#.................... 221 | .........#..#..#....#......#... 222 | ..........#.#.#.......#........ 223 | .......#.#.....#..#.....##..... 224 | .....#....#.#.....#.......#..#. 225 | .#..###.......#......#..#..#... 226 | ..##.#.....#.........##.#...... 227 | .....#.......###.......##...... 228 | #...#.......##.#.#......#.....# 229 | .##........##.#...#...#........ 230 | ....#.......#....#..#.......#.. 231 | .#..#.......#..####..##........ 232 | ..#..#..#..#..#..#............. 233 | ...#......#...#...#.#......##.# 234 | ........#.#..#.#.#......#...#.. 235 | #.......#..##.......##........# 236 | ..##...#...............#.#....# 237 | .####........##..........#..#.. 238 | ..#........#...##...#........#. 239 | .#.#..........#...#...#........ 240 | ....###..........#....#........ 241 | .#.#.#.###.#.##..#.#........#.. 242 | ..........#....##.#..##........ 243 | .......#..#..##.......#........ 244 | ..#........#....#..####.#..#... 245 | ....#.......#..##..#..........# 246 | .....#...........#....#....#... 247 | .#.##..#......##.........#.#... 248 | ...#......##..##......#.....#.. 249 | #........#..........#.#...#.... 250 | .#.#........###........#..#.... 251 | ....#####.................##... 252 | .........##...#......#......... 253 | .......#....#....#.#....#...#.. 254 | ......#................#...#.#. 255 | ....#.....#.....#.#.....#.....# 256 | #.........#..#........#.....#.. 257 | ....#...........#.....#.#...... 258 | ##..#....................#.#... 259 | #.#.##....#.....##....#.......# 260 | ..#..#....###.......#..##...... 261 | ......##.....#.##...#....#..#.. 262 | ........#..#.#..#..#.#......... 263 | #...#.....##..........##....... 264 | ....#.....#...#.###.......#.... 265 | ..........#..#...#........##..# 266 | ##..#...#.#.####.#..#..#...#... 267 | ................#......#..#.... 268 | .......#...###...#........#.... 269 | ....#..##..#.#......#...#.#..## 270 | .##......#...........#.......## 271 | ....#.#...#..#.#.......##...... 272 | ....#..##..#.....#........##... 273 | ...#...#..#.#.#....#.........#. 274 | #....##.#....#..##............. 275 | .#......##......#.#.##.......#. 276 | .......#...#....#.##......#.... 277 | ..##..........#.....#.#......#. 278 | #..##.....#..........##..#.#... 279 | ....#.#.......#.#.....#.....#.. 280 | ##.....#..#.....##...#.....#..# 281 | ...#.#..#...#..............#... 282 | ...............#..#............ 283 | .#.......#......#........##.... 284 | ..#......#..##..####.....#...#. 285 | .#.##.#.#..#..##..##........... 286 | ...##.............#.....#..#... 287 | .##.....#..#.#......##........# 288 | ##....#.............#...#...... 289 | ......#.....###...........##... 290 | .#.#...#.............##..#..### 291 | ..#.##.##...#.....#...........# 292 | .....#.....##...#...#........#. 293 | ........#..##.......##.....#... 294 | .#........####.......#.#...#... 295 | ...#..........#......##........ 296 | .......#......#..##..#...#..... 297 | ..#...........#.#.#..#.#.#..... 298 | #..........#....#....###.#..... 299 | ....#.................#...##... 300 | #....#.###......#..#.....#...## 301 | .#.......##.....###.....#...#.. 302 | ....##............#...........# 303 | ...#.#.#.........#...#..#..#..# 304 | .....#..###.................#.. 305 | .#.....#.....#....###.#..#...#. 306 | ................#...#.......... 307 | ..#....#..##....#.##........#.. 308 | ....##....#...........#..#..... 309 | ...##......###.......#...#..... 310 | .......##............#......#.# 311 | #####.....#..#.###..#.#........ 312 | #.##.##..#.......#....#........ 313 | ....###..#.#.#......###.#...... 314 | ....#....#.....##.#..#....#...# 315 | ....#.....#.#...##.##.#.#....#. 316 | .........#.#.###.#.....#....... 317 | .#....#.......#..##...#....#... 318 | ...####...##.#.....#........... 319 | #.....#.....#..........##..#... 320 | ................#.#.#......#... 321 | .#...#.......#..#............#. 322 | .##.#.......#..#....#.....#.... 323 | .#...#..#.....#..............#. -------------------------------------------------------------------------------- /src/day3/slopes.kt: -------------------------------------------------------------------------------- 1 | package day3 2 | 3 | import kotlin.io.path.Path 4 | import kotlin.io.path.readLines 5 | 6 | fun main() { 7 | val lines = Path("src/day3/input.txt").readLines() 8 | 9 | fun countTreesOnSlope(right: Int, down: Int): Int = 10 | (lines.indices step down).map { r -> 11 | val c = r / down * right 12 | val line = lines[r] 13 | line[c % line.length] 14 | }.count { it == '#' } 15 | 16 | val slopes = listOf(1 to 1, 3 to 1, 5 to 1, 7 to 1, 1 to 2) 17 | 18 | slopes.map { (r, d) -> countTreesOnSlope(r, d).also { println("r $r, d $d: $it") } } 19 | .fold(1L, Long::times) 20 | .let(::println) 21 | 22 | } -------------------------------------------------------------------------------- /src/day4/passports.kt: -------------------------------------------------------------------------------- 1 | package day4 2 | 3 | import kotlin.io.path.Path 4 | import kotlin.io.path.readLines 5 | 6 | 7 | typealias Passport = MutableMap 8 | 9 | val eyeColors = setOf("amb", "blu", "brn", "gry", "grn", "hzl", "oth") 10 | 11 | fun isValid(key: String, value: String): Boolean = when (key) { 12 | "byr" -> value.toInt() in 1920..2002 13 | "iyr" -> value.toInt() in 2010..2020 14 | "eyr" -> value.toInt() in 2020..2030 15 | "hgt" -> when { 16 | value.endsWith("cm") -> value.dropLast(2).toInt() in 150..193 17 | value.endsWith("in") -> value.dropLast(2).toInt() in 59..76 18 | else -> false 19 | } 20 | "hcl" -> value.length == 7 && value.startsWith("#") && value.drop(1).all { it in '0'..'9' || it in 'a'..'f' } 21 | "ecl" -> value in eyeColors 22 | "pid" -> value.length == 9 && value.all { it.isDigit() } 23 | "cid" -> true 24 | else -> error("unknown field $key") 25 | } //.also { if (it == false) println("$key=$value invalid")} 26 | 27 | fun main() { 28 | val lines = Path("src/day4/input.txt").readLines() 29 | 30 | // TODO: 'chunked' by custom condition or 'split' for collections 31 | val passports = mutableListOf() 32 | var current: Passport = mutableMapOf() 33 | for (line in lines) { 34 | if (line.isEmpty() && current.isNotEmpty()) { passports.add(current); current = mutableMapOf(); continue } 35 | 36 | line.split(" ").associateTo(current) { it.split(":").let { (k, v) -> k to v }} 37 | } 38 | if (current.isNotEmpty()) passports.add(current) 39 | 40 | passports.forEach(::println) 41 | val required = listOf("byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid") 42 | println(passports.count { it.keys.containsAll(required) }) 43 | println(passports.count { it.keys.containsAll(required) && it.all { (k, v) -> isValid(k, v) }}) 44 | } -------------------------------------------------------------------------------- /src/day5/boarding.kt: -------------------------------------------------------------------------------- 1 | package day5 2 | 3 | import kotlin.io.path.Path 4 | import kotlin.io.path.readLines 5 | 6 | data class Seat(val row: Int, val seat: Int) { 7 | val id = row * 8 + seat 8 | override fun toString(): String = "Seat($row/$seat, id: $id)" 9 | } 10 | 11 | fun parseSeat(pass: String): Seat { 12 | require(pass.length == 10) 13 | val row = pass.take(7).replace('B', '1').replace('F', '0').toInt(2) 14 | val seat = pass.drop(7).replace('R', '1').replace('L', '0').toInt(2) 15 | return Seat(row, seat) 16 | } 17 | 18 | fun main() { 19 | val passes = Path("src/day5/input.txt").readLines().map { parseSeat(it) } 20 | 21 | println(passes.maxByOrNull { it.id }) 22 | 23 | 24 | val rows = passes.sortedBy { it.id }.groupBy { it.row } 25 | val notFullRows = rows.filter { (_, seats) -> 26 | seats.size < (seats.last().seat - seats.first().seat + 1) 27 | } 28 | notFullRows.forEach(::println) 29 | 30 | val emptySeats = notFullRows.flatMap { (row, seats) -> 31 | (seats.first().seat..seats.last().seat).map { Seat(row, it) } - seats 32 | } 33 | emptySeats.forEach(::println) 34 | } -------------------------------------------------------------------------------- /src/day5/input.txt: -------------------------------------------------------------------------------- 1 | BFBFFBBRLR 2 | FBFBFFBRLL 3 | BFBFBFFRLR 4 | BFFBFBFRLL 5 | FFBFFFBRLL 6 | BFBFFFFLRR 7 | BFBFBFBRRL 8 | BFBFFFBLRL 9 | BFFBBBBRLR 10 | BFFBFFFLRL 11 | BFBFBFBLRR 12 | FBFFBFBRLL 13 | BFFFFBBLRL 14 | FBFBFBBLLL 15 | FFFBFBBLRR 16 | FBFFFBFRLL 17 | FFFBBFBLLL 18 | BFFBBFFRRR 19 | BFFBBFBLRL 20 | BFFFBBBRLR 21 | BFFBFFBLRR 22 | FFBBFFFLRL 23 | BFBBBBBRLR 24 | BFBFBBBRRR 25 | FBFFBFBLRR 26 | FBBFBBBRLR 27 | FBFFFBBLLR 28 | BFFBBBBRRR 29 | BFBFBFFRLL 30 | FFFBFBFLLL 31 | BBFFFBBRLR 32 | BFBFFFFRLR 33 | BFBBBFBLRL 34 | FBBBBFFRLR 35 | FFBBBBFRRR 36 | FBFBFFFLRR 37 | FFFBFFBLRL 38 | BFFFFBBLRR 39 | FFBFFFBLLR 40 | FBFFFFFRLL 41 | BFFFFBFLRR 42 | BBFFFFFLLL 43 | FBFFBBBRLL 44 | FBFFFFBLLR 45 | BFFFFFBRRR 46 | BFBFFFFRRL 47 | FBBBBFBRRR 48 | FBFBFFFLLL 49 | FBFFFFBRRL 50 | FFBBFFBRRR 51 | FBFFBBFLLL 52 | FFBFBBBRLL 53 | BFBFFFFLRL 54 | FFBFFFFLRL 55 | BFBFFFBRLR 56 | FFFBFBFRRR 57 | BFBFBBFRLL 58 | FFBFFBBLRR 59 | FBBFBBBRRL 60 | FFBBFFBRLL 61 | FBFBBBBRRR 62 | BFBBFFBLLL 63 | BFBFBBBRLR 64 | FFBBFBBLLL 65 | BBFFBBBLRL 66 | FBFBBBBLRL 67 | FBFFFBFLLR 68 | FFFBFBBLRL 69 | FBBBFFBLLL 70 | FFBFBBFLLR 71 | FBFFFFBLRR 72 | FFBBFBBRLR 73 | BBFFFBBRRR 74 | BFBFFBFRRL 75 | FFBFBBFRRR 76 | BFFFFFFLLR 77 | BBFFFFFRRR 78 | BFBBBFFLRL 79 | FBBFFFBLLR 80 | FFBFBFFRLL 81 | FBFBFBFLRR 82 | BFBBBBFLLR 83 | FBBBBFBRRL 84 | FFBBBBFRLL 85 | FFBBBFBRLR 86 | BBFFFBBLLL 87 | BFFFBBFLLL 88 | FFBFBBFLLL 89 | FFBFFFFLLL 90 | FFBFBFBRLR 91 | BFBBBFFLLR 92 | FFFBFBFLRL 93 | BBFFBBFLLL 94 | FFBFBFBLRR 95 | FFBFFBFRLR 96 | FBFBFFBRRR 97 | FFBFBFFLRR 98 | BFBFBBBLLR 99 | FFFBBFFLRR 100 | BFFBFBFLRL 101 | BFBBFFFLLR 102 | BBFFBBFLLR 103 | BFFFBBFLRL 104 | BFBBFBBRRR 105 | BFFBBBFLRL 106 | FBBBFBFRLL 107 | BFFBFFFLLR 108 | BFBFFBFLLL 109 | BFFBBBFLRR 110 | BFBBFFBRLL 111 | FBBFFFBRRR 112 | BFBBFBFRRL 113 | FFFBBFFLLR 114 | FBBFFBBLLL 115 | FFBBFBFRRR 116 | BBFFFFFLLR 117 | FFBFBFBRLL 118 | FFFBBBFRLR 119 | BFFBBFBLRR 120 | FBFBBBFLRR 121 | FBBBBBBLRR 122 | BBFFBFFRRL 123 | FBFBBBFRRR 124 | FFBFFFBLLL 125 | FBBFBFBLRL 126 | BFBBFBBLLR 127 | BFBBBBFLLL 128 | BFBBBBBLLR 129 | FBBBFFFRRR 130 | BFFBBFBRLR 131 | BFBBFBFLRL 132 | BFBBFFFRLL 133 | FBBFBFFLRL 134 | FBFFFFBLLL 135 | BFBBBBBLRR 136 | FBBBFBFLRL 137 | BFBFBBFLRL 138 | FFBBFFFLLR 139 | FFBBBBBLRR 140 | FBBBBBFLLR 141 | FBBBFBFRRR 142 | FBBFBFFLLL 143 | BBFFFBBLRR 144 | FFFBFFBLLR 145 | BBFFFBBRRL 146 | FBBBFBFLLL 147 | BFFFBBFRRR 148 | FFFBFFFRRL 149 | FFFBBBBRRR 150 | FBBBFBBRRL 151 | BFFBBBBLRL 152 | FFBBBFBRLL 153 | BFFFFFBLRR 154 | FFBFFBFRRL 155 | FBBBBFFLLR 156 | FBBFBFFRRL 157 | FBFBBBFRRL 158 | FFBFFBBRRL 159 | FBFFFFBRLL 160 | FFBFBFFLLR 161 | BFBBBFFRLR 162 | BFBBFFBRRL 163 | FFBBFFBLLR 164 | BFFBBBFRLR 165 | FFBBFBBLRR 166 | FBFBBBBLLR 167 | FFBFBFFRRR 168 | BFBFBFBRRR 169 | FFFBFFBRRL 170 | BFFFBBFRLL 171 | BFBBFBFRLL 172 | FBBFFBFRRL 173 | FBBFFFBRRL 174 | BFFFBFBRRR 175 | BFFFFFBLLL 176 | FBBFFBBRRL 177 | BFFFBBFRLR 178 | FBFFBBFRLR 179 | FFFBBBBLRL 180 | BFFBFFBRRL 181 | FBFBBBBRRL 182 | FBBFBFFLRR 183 | BFBBBBBLRL 184 | BFFBFBBRRL 185 | BBFFBFFRRR 186 | FBBBFFBRLL 187 | FBBFFBBLRL 188 | FBFBBFBRRL 189 | BBFFBBFRRL 190 | BFBFFFFLLL 191 | BFFFFFBRRL 192 | FFBFFFBRLR 193 | BFFFBFFRLR 194 | FBFBFFFRLR 195 | FFBBFBFLLR 196 | FBBBFBBLLL 197 | FFBBFBBRRL 198 | BFFBBFBLLR 199 | FFBBBBFLRL 200 | BFFBBBFRRR 201 | BFFFFBBLLL 202 | FFBBBFFLRR 203 | FBFFFBBLRL 204 | FBBFBBFRLL 205 | BFBBFBFLLR 206 | FBFFBBFLRL 207 | FFBBBBBLLL 208 | FFBFFBFLLR 209 | FBBBFFFRLL 210 | BFFBBFFRLL 211 | FFBBBBFRLR 212 | FBBFFBFRLR 213 | BFBBBBFRLL 214 | BFFFBFBRLR 215 | BFBFBBFLLR 216 | FBFFFFFRRL 217 | BFBBBFFLLL 218 | BFFBFBBLRL 219 | FBBFFFBLRR 220 | BFFFFFBRLR 221 | FBBBBBBLLR 222 | FBFFBFBLLL 223 | FBFBFBFRLR 224 | FBFFBBBLLL 225 | BFFBBBFLLR 226 | FBBFBBFRLR 227 | FFFBBBFRLL 228 | FFBFBBFRLL 229 | BBFFFFBLLR 230 | FBFFBFFLRR 231 | BFFBBFFLLL 232 | BBFFFBBRLL 233 | FFFBFBBLLL 234 | BFFFFFFRRL 235 | BFBFBBBRLL 236 | FBFFBBBRRR 237 | BFFFBBFLRR 238 | FBBFBBFLLL 239 | FBBFBFFRLR 240 | FBFFFBFRLR 241 | BBFFBFBLRL 242 | FFBBBBBRLL 243 | FBFBFFFLLR 244 | BFFFFFFRLR 245 | FFBBFFBLRR 246 | FFFBBFFRRR 247 | FBBBFFFLLR 248 | FBFBBBBRLL 249 | BBFFFFFLRR 250 | FFBFFBBRLR 251 | FFBBFFFLRR 252 | BFFBFBFLRR 253 | BFFBFBBRLL 254 | FBFBFFBRLR 255 | BFFBFBBLLL 256 | BFBBFFFLRL 257 | FBBBFBBRLR 258 | FFFBBBFLRL 259 | FFBFFBBRRR 260 | FBFBBBBRLR 261 | FFFBBFFRLR 262 | BFBFFFBLLR 263 | BFBFBBFLLL 264 | FBFFBBFRRR 265 | FBBFBBFLLR 266 | FBBBBFFRRL 267 | BFFBBBBLLL 268 | FFBBBBBRLR 269 | BFFFBFFLRR 270 | BFFFBBFLLR 271 | FBFBBFFLLL 272 | BBFFFBFRLL 273 | BFBFFBFLLR 274 | FFBFFBFLRR 275 | BFBBBBFLRL 276 | FBFBBFFLRL 277 | FFBBFBFLLL 278 | FBFBBFFLLR 279 | FBFFFBFLRR 280 | FBBBBBFRLL 281 | FBFBBFBRRR 282 | FFBBFBBRLL 283 | BBFFFFBLRR 284 | BFFBBFFLLR 285 | FBBBBFBLLL 286 | BFBFBFBRLL 287 | FFFBFBBLLR 288 | FBFFBBBRLR 289 | BBFFFFBRRL 290 | FFBBBBFLLL 291 | FBFBFBBLRL 292 | FBFBBFFRRL 293 | FBBFBBBLLR 294 | BFFFFFBLRL 295 | FFBFBBBRRL 296 | FFBFBBBLLL 297 | FBBBBFBLLR 298 | FBFBFFFRRL 299 | BFBBBBBRRR 300 | FBBBFFBRRR 301 | BFBFFBBLLR 302 | FBFFBBFLRR 303 | FFBFFFFLRR 304 | FBFFFFFRLR 305 | FBBBBBBRRR 306 | BFFFBFFLLR 307 | FFBBBFBLLL 308 | BFFFBFFRRL 309 | FFFBFFBRRR 310 | BFFFFFBLLR 311 | BFBFBFFLLR 312 | FBBBBBBRLL 313 | FFBFFFFRRR 314 | FBBFFBFRLL 315 | FBBFFFBLRL 316 | BFFFFBFLRL 317 | FBFBBBFRLL 318 | BBFFBBFLRR 319 | FFFBBFFRLL 320 | FBBFFBFLLR 321 | BFFFFFFRRR 322 | FFBFBFBLRL 323 | BFFBFBFRRL 324 | BBFFFFBLLL 325 | FFBBBFBRRL 326 | FBFBBFBRLL 327 | BFBBFBBRRL 328 | BFBFFBBRRL 329 | FFFBBFBLLR 330 | FFBFBBBRRR 331 | FBBFFBFRRR 332 | BFFFFFBRLL 333 | FFFBBBBLLR 334 | BFBBFBBLLL 335 | FFBBFBFLRR 336 | BFBBFFBRLR 337 | FBBBFFBRLR 338 | BFFFBFFLLL 339 | BFBBFBFLLL 340 | FBBFBBBLLL 341 | BFBFBBFRRL 342 | BFFFBBBLRL 343 | BFBFBFFLRR 344 | FBBFBFBRLR 345 | FBFBFFBLRR 346 | BBFFFBFRRR 347 | BFBFFBFRLL 348 | BFBBBFBLRR 349 | FBBBFFBRRL 350 | FBFFFBBRRL 351 | FBBBBFBLRR 352 | BFFBBBFRRL 353 | BBFFBFBRLR 354 | BBFFBBFRRR 355 | BFBFFFBLLL 356 | BFBBFFBLRR 357 | FBFBBFBLLR 358 | FFFBBFFLLL 359 | FFBBFBBRRR 360 | BFBBBBFRLR 361 | FBBBFFFLRL 362 | FFFBBFFLRL 363 | BFBBBFFRRL 364 | BBFFBFBLLR 365 | BFFBFBFRLR 366 | BFBBFFFLLL 367 | BFFFBFBLLL 368 | FBFFBFFRLR 369 | BFFFBFBLRR 370 | FFBBFFFLLL 371 | BFBBBFBRRL 372 | FBBBFFFLRR 373 | FBFFBFFLLL 374 | BFFBBBBLRR 375 | FBBFBBBLRL 376 | BBFFFBBLLR 377 | FBFBBBFRLR 378 | FFFBFBFRRL 379 | FBBFBFBLLR 380 | FBFBFBFRRR 381 | BFFFBBBLLR 382 | BFFFBBBLLL 383 | FBBFBFFRLL 384 | FFFBFBFLRR 385 | BFBBFBBRLL 386 | BFBBBFBLLR 387 | BFFBFFBLLR 388 | BFFFFBBRLR 389 | BFFFBFBRRL 390 | BBFFFBFRLR 391 | BFFBFFBLRL 392 | FBBBFBBLLR 393 | BFFBFFBLLL 394 | BBFFBBFRLR 395 | FFBFBBFLRL 396 | FBBBBBFRRL 397 | BFFBBFFRRL 398 | BFFFFBFLLR 399 | FBFBBBFLRL 400 | BFFFBFBLLR 401 | FBFBBFBLLL 402 | FFBBFBFRRL 403 | FFBBBBBRRR 404 | FBFFFBFLLL 405 | BFBFBFBRLR 406 | FBFFBBBLRL 407 | FBBFFBFLRL 408 | FFBBBFBLLR 409 | FBFFBFFRRR 410 | BFBBFBFRRR 411 | BFFBFBFLLL 412 | BFFBFFBRRR 413 | BBFFBBFRLL 414 | FBBFFFFLLR 415 | FBBFFBFLRR 416 | BFFFBBBRLL 417 | FBBBFFBLRR 418 | FFFBFBFRLR 419 | FFBFBFFRRL 420 | FFBBFFBRLR 421 | FBBBBFBLRL 422 | FBFFBFFLRL 423 | BFFBFFFRRR 424 | BFFFFBFLLL 425 | FFBFBBBLLR 426 | FFBBBFFLRL 427 | BFBFFFBRRL 428 | FBBBBFFRRR 429 | BFFFBBBLRR 430 | BFBBBFBRRR 431 | FBBBBFBRLR 432 | FBFBBFBRLR 433 | FFBFFBBLRL 434 | FBBBFFBLRL 435 | BFBFFFBLRR 436 | FBBBFBBLRR 437 | BFFFFBBRRL 438 | BBFFFBBLRL 439 | FFFBFFBRLR 440 | FBFFBFFRRL 441 | FFFBFFBLLL 442 | FBBFBBBRLL 443 | FBBBFBBLRL 444 | BFBFFBBLRR 445 | FFBBBBBRRL 446 | BFFBBFBRLL 447 | BBFFBFFLRL 448 | FBFFFBFLRL 449 | BFBFBFFRRR 450 | FBBBBFFLRL 451 | FBFFFBBRLR 452 | BFBBBBFLRR 453 | BFFFFBBRRR 454 | BFBBFBFRLR 455 | BFFBFBBRRR 456 | BFFFBFFRLL 457 | FFFBBFBRLR 458 | BBFFFFBRRR 459 | FBBBBBBLRL 460 | FFFBBBFRRL 461 | FFBBFFFRRL 462 | BBFFFFFRRL 463 | FBBBFFFRLR 464 | FBBFBFBLLL 465 | FFFBFBBRRR 466 | FBBBBBBRLR 467 | FBFBFBBRLR 468 | FFBBBFBLRR 469 | FFBBFFBLLL 470 | FFFBFBBRRL 471 | FFBFBBBLRR 472 | FFBFBBBLRL 473 | FFBBFBFRLR 474 | FFBFBFBLLL 475 | FFFBBBFLLR 476 | FFFBBBBRRL 477 | FFBBFBBLLR 478 | FBBFBFBRLL 479 | FFBFBFFLLL 480 | FFBBBBFLRR 481 | FBFBFBFLLL 482 | FBFFFBFRRR 483 | FBBBBBFLRL 484 | FBFBFBBRLL 485 | FFBFFFBRRL 486 | FBBFBFBLRR 487 | FFBFFFBLRR 488 | FFBFFFFRRL 489 | BFBBFBBLRL 490 | FBBBBFFRLL 491 | BFBBFBBRLR 492 | BFFBFFFRLR 493 | FBBFFFBRLR 494 | FBFFFFFRRR 495 | FBFFFFFLRL 496 | BFFFFBFRRR 497 | BFFFFFFLRR 498 | BFFFBFFRRR 499 | FFBBFFBRRL 500 | FBFBBBBLLL 501 | FFBFFBFRLL 502 | FFBBBFFRRR 503 | FFBBBBBLRL 504 | FBBBBBFLRR 505 | FFFBFBFLLR 506 | BFFFFBBRLL 507 | FBFFBFBLRL 508 | FBFBFFFLRL 509 | FBFFBBFRLL 510 | FBFFBFBRLR 511 | FBBBFBFRLR 512 | BBFFFFBLRL 513 | FFBFFBFLRL 514 | BFFFBBFRRL 515 | BFBFFFFLLR 516 | BFFBBBFLLL 517 | BBFFFBFRRL 518 | FFBBFFFRRR 519 | BFFFFBFRLL 520 | FFBFBFFLRL 521 | FBFBFFBLLL 522 | BFFFFBFRRL 523 | FFFBFBBRLL 524 | FBFFBBBLRR 525 | BFBBBBBRLL 526 | BFBBFFFRRL 527 | BFBFFFBRRR 528 | FBBBBBBLLL 529 | BFFFFBFRLR 530 | BFBBFFBRRR 531 | FBBBFBBRRR 532 | FFBFFBBRLL 533 | FBFBFBBLRR 534 | FFFBBBBLLL 535 | FBFBBBFLLL 536 | BFFBFFBRLL 537 | BFBFBBFLRR 538 | FFFBFBBRLR 539 | BBFFBFFRLR 540 | FBFBFBFLLR 541 | BFBBBBFRRR 542 | FBFBFBFRLL 543 | BFBFFBBRLL 544 | FFBFFFBLRL 545 | FBBBFFFLLL 546 | BFFBBFFLRR 547 | FBBFFBBLLR 548 | FFFBBBFLLL 549 | FBBFBFFRRR 550 | FBBFFBBRRR 551 | FFBFBFBRRL 552 | FBBFFFBRLL 553 | FBFBFFBRRL 554 | BFBFBBFRRR 555 | BBFFBBBLLL 556 | FFBFFBBLLR 557 | BFBFBFBLLR 558 | FFBBFFFRLL 559 | FBBBFBFRRL 560 | FFBBBFFLLR 561 | FFFBFFBLRR 562 | FBBFFFBLLL 563 | BBFFFFFRLL 564 | BFFFBFFLRL 565 | FBFFBBFRRL 566 | FFBFBBFRLR 567 | BBFFFFBRLL 568 | BFBBFBFLRR 569 | BFBFBFBLLL 570 | FFBBBFBLRL 571 | FBBFBBBRRR 572 | FBBFFFFRLL 573 | BFBBBBBRRL 574 | FBBFBBFRRL 575 | FBFBBBFLLR 576 | BFBFBFBLRL 577 | BBFFBFFLLL 578 | BFFBFFBRLR 579 | BFBFFBFLRL 580 | BFBFBBFRLR 581 | FBBFFBBLRR 582 | BFBFFBBRRR 583 | BFFFBBBRRR 584 | FBBFFFFRRR 585 | FBBFFFFLRL 586 | BFBFFBFLRR 587 | FBBBBFFLRR 588 | FFFBFFFRRR 589 | BFBFBBBLRL 590 | FBFFFFFLRR 591 | BFBBBFFLRR 592 | FBFFBBFLLR 593 | BBFFFBFLRR 594 | BFFBFBFLLR 595 | BBFFBFFLLR 596 | BFBBFFFRLR 597 | BBFFFBFLLL 598 | FFBFFFFRLR 599 | BFFBFBBRLR 600 | FBBFBBBLRR 601 | FBFBFFFRRR 602 | FBFBBFFRRR 603 | BFBFBBBLRR 604 | FBBFFFFRLR 605 | BBFFBFBRLL 606 | FFFBBBBRLR 607 | FFBFBFBLLR 608 | FBFBBFBLRL 609 | FFBFBFBRRR 610 | BFBFBFFLRL 611 | BFBFBBBLLL 612 | FBBBBFFLLL 613 | FFBBFFBLRL 614 | BFBBFBBLRR 615 | FFFBBBBRLL 616 | BFFBFFFLLL 617 | FFBFFFFLLR 618 | BBFFFBFLRL 619 | FBBBBBFLLL 620 | FBBFBFBRRR 621 | BFFBFBBLLR 622 | FBFFBFFRLL 623 | FFFBBFBRRL 624 | FBFFFBBLRR 625 | FFFBFBFRLL 626 | FBFBBBBLRR 627 | FBFBFFBLRL 628 | FBBFBBFLRL 629 | BBFFBBBLLR 630 | FFBBBBBLLR 631 | BFFFFFFRLL 632 | FFBBFBBLRL 633 | BFFBFBBLRR 634 | BFFFFFFLRL 635 | FBFFBFBRRR 636 | BFBBBFFRRR 637 | FFBFBBBRLR 638 | FFBFFFBRRR 639 | FBFBFBFRRL 640 | FBFBFBBRRL 641 | BFFFFFFLLL 642 | FFBFBBFRRL 643 | BBFFFBFLLR 644 | FBFFBBBLLR 645 | FBFBFBFLRL 646 | BBFFBFBRRL 647 | FBFFFFBRRR 648 | BFBFFFBRLL 649 | BFBBFFBLLR 650 | BFFFBFBRLL 651 | FFBBBBFLLR 652 | BFBBBFBLLL 653 | FBBFBBFRRR 654 | BFFBBBBLLR 655 | FFBBBFBRRR 656 | FBBFFBBRLR 657 | FBFFFFFLLR 658 | FBFFFFBRLR 659 | FBBFFFFLRR 660 | FFBBFBFRLL 661 | BFBBBBBLLL 662 | BFBBBFBRLL 663 | FFBBFBFLRL 664 | FBBBBBBRRL 665 | BBFFBFBLLL 666 | BFFBBFFRLR 667 | FFFBBBFLRR 668 | BBFFFFBRLR 669 | BBFFBFBRRR 670 | BFBFFBFRRR 671 | BFBFFFFRRR 672 | FFBFBBFLRR 673 | BBFFBFFRLL 674 | BFBFFFFRLL 675 | BFBBBFBRLR 676 | FBFFFBBLLL 677 | FBFFFBBRRR 678 | BFBFFBBLLL 679 | FFBBBFFLLL 680 | FFBFFBBLLL 681 | FFFBBFBRRR 682 | FBFBFFBLLR 683 | FFBBBFFRRL 684 | FBBFFFFLLL 685 | BBFFFFFLRL 686 | BFBBBBFRRL 687 | FFBBBFFRLL 688 | FBBBBBFRRR 689 | FBFFBFFLLR 690 | BBFFBBFLRL 691 | FFFBBBFRRR 692 | BFFFBFBLRL 693 | BFBFBFFLLL 694 | FBFBFBBRRR 695 | FBBBBBFRLR 696 | BFFBBBBRRL 697 | FBFFBFBRRL 698 | BFFBBFBRRL 699 | BFBBFFBLRL 700 | FBBBFFFRRL 701 | BBFFFFFRLR 702 | FFBFFBFLLL 703 | FBBFBBFLRR 704 | FBBBFBFLLR 705 | BFFFFBBLLR 706 | FBBFFBBRLL 707 | FFFBBFBRLL 708 | FFFBBBBLRR 709 | FBBBBFBRLL 710 | FBFFFBBRLL 711 | FFBBBBFRRL 712 | FBFFFFFLLL 713 | FBBFFFFRRL 714 | BFFFBBBRRL 715 | FBFBFFFRLL 716 | FBBFBFBRRL 717 | FBBFFBFLLL 718 | FBBBFBFLRR 719 | FFBBBFFRLR 720 | FFFBFFBRLL 721 | FFFBBFFRRL 722 | FBFFBFBLLR 723 | FBFBBFFRLL 724 | FBFBBFFLRR 725 | BFBBFFFRRR 726 | FBBBFFBLLR 727 | FBFFFFBLRL 728 | FBBFBFFLLR 729 | FFBFFBFRRR 730 | FBFFBBBRRL 731 | BFBFFBBLRL 732 | BFFBBFBRRR 733 | FFFBBFBLRL 734 | BFBFBBBRRL 735 | FFFBBFBLRR 736 | BFFBBFFLRL 737 | BFBBFFFLRR 738 | FBFBFBBLLR 739 | BFFBFFFRRL 740 | FFBBFFFRLR 741 | BFFBBBBRLL 742 | BBFFBFFLRR 743 | BBFFBFBLRR 744 | FFBFFFFRLL 745 | FFBFBFFRLR 746 | BFFBBFBLLL 747 | FBBBFBBRLL 748 | FBFFFBFRRL 749 | FBFBBFFRLR 750 | FBFBBFBLRR 751 | BFFBFBFRRR 752 | BFBBBFFRLL 753 | BFBFFBFRLR 754 | BFFBFFFLRR 755 | BFFBBBFRLL 756 | BFFBFFFRLL -------------------------------------------------------------------------------- /src/day6/customs.kt: -------------------------------------------------------------------------------- 1 | package day6 2 | 3 | import kotlin.io.path.Path 4 | import kotlin.io.path.readText 5 | 6 | fun main() { 7 | val input = Path("src/day6/input.txt").readText() 8 | val groups = input.split("\n\n", "\r\n\r\n") 9 | 10 | val groupSets = groups.map { 11 | it.lines().flatMap { s -> s.asIterable() }.toSet() 12 | } 13 | 14 | println(groupSets.sumOf {it.size}) 15 | 16 | val groupSets2 = groups.map { 17 | it.lines().map { s -> s.toSet() }.reduce { acc, s -> acc intersect s } 18 | } 19 | 20 | println(groupSets2.sumOf {it.size}) 21 | 22 | } -------------------------------------------------------------------------------- /src/day7/bags.kt: -------------------------------------------------------------------------------- 1 | package day7 2 | 3 | import kotlin.io.path.Path 4 | import kotlin.io.path.readLines 5 | 6 | typealias Color = String 7 | 8 | data class Rule(val bagColor: Color, val otherBags: List>) { 9 | companion object { 10 | private val ruleRegex = Regex("""(\w+ \w+) bags contain (.*)\.""") 11 | private val itemRegex = Regex("""(\d+) (\w+ \w+) bags?""") 12 | fun parse(s: String): Rule { 13 | val (color, contents) = ruleRegex.matchEntire(s)!!.destructured 14 | if (contents == "no other bags") return Rule(color, emptyList()) 15 | val items = contents 16 | .split(", ") 17 | .map { itemRegex.matchEntire(it)!!.destructured.let { (n, color) -> n.toInt() to color } } 18 | return Rule(color, items) 19 | } 20 | } 21 | } 22 | 23 | fun main() { 24 | val input = Path("src/day7/input.txt").readLines() 25 | 26 | val rules: Map = input.map(Rule::parse).associateBy { it.bagColor } 27 | 28 | fun Rule.canContain(otherColor: Color): Boolean = 29 | otherBags.any { (_, c) -> c == otherColor || rules[c]!!.canContain(otherColor) } 30 | 31 | fun Rule.sumAllContents(): Int = 32 | otherBags.sumOf { (n, c) -> n * (1 + rules[c]!!.sumAllContents()) } 33 | 34 | rules.values.count { it.canContain("shiny gold") }.let(::println) 35 | 36 | rules["shiny gold"]!!.sumAllContents().let(::println) 37 | } -------------------------------------------------------------------------------- /src/day8/bootloop.kt: -------------------------------------------------------------------------------- 1 | package day8 2 | 3 | import kotlin.io.path.Path 4 | import kotlin.io.path.readLines 5 | 6 | data class Instr(val name: String, val arg: Int) 7 | 8 | // TODO: List.replaceAt 9 | fun List.replaceAt(index: Int, value: T): List = 10 | buildList { 11 | addAll(this@replaceAt) 12 | set(index, value) 13 | } 14 | // mapIndexed { i, t -> if (i == index) value else t } 15 | 16 | fun main() { 17 | val input = Path("src/day8/input.txt").readLines() 18 | 19 | val instructions = input.map { it.split(" ").let { (n, arg) -> Instr(n, arg.toInt()) }} 20 | // instructions.forEach(::println) 21 | 22 | val r1 = instructions.execute() 23 | check(r1 is ExecutionResult.Loops) 24 | println(r1.valueBeforeLoop) 25 | 26 | outer@ 27 | for (j in instructions.indices.reversed()) { 28 | val inj = instructions[j] 29 | val inj2: Instr = when (inj.name) { 30 | "jmp" -> inj.copy(name = "nop") 31 | "nop" -> inj.copy(name = "jmp") 32 | else -> continue@outer 33 | } 34 | val result = instructions.replaceAt(j, inj2).execute() 35 | if (result is ExecutionResult.Terminates) { 36 | println("Fixed instruction at $j from $inj to $inj2") 37 | println(result.value) 38 | break 39 | } 40 | } 41 | } 42 | 43 | sealed class ExecutionResult { 44 | data class Terminates(val value: Int) : ExecutionResult() 45 | data class Loops(val valueBeforeLoop: Int) : ExecutionResult() 46 | } 47 | 48 | fun List.execute(): ExecutionResult { 49 | var ip = 0 50 | var acc = 0 51 | val executed = mutableSetOf() 52 | while (ip < this.size) { 53 | if (!executed.add(ip)) return ExecutionResult.Loops(acc) 54 | val i = this[ip] 55 | // println(i) 56 | var jmp = 1 57 | when(i.name) { 58 | "nop" -> { } 59 | "acc" -> { acc += i.arg } 60 | "jmp" -> { jmp = i.arg } 61 | } 62 | ip += jmp 63 | } 64 | return ExecutionResult.Terminates(acc) 65 | } -------------------------------------------------------------------------------- /src/day8/input.txt: -------------------------------------------------------------------------------- 1 | jmp +1 2 | acc -15 3 | acc +14 4 | acc +18 5 | jmp +443 6 | jmp +286 7 | acc +27 8 | jmp +522 9 | jmp +1 10 | acc -19 11 | acc +22 12 | acc +37 13 | jmp +111 14 | acc +28 15 | acc +43 16 | acc +18 17 | nop +597 18 | jmp +479 19 | jmp +604 20 | jmp +499 21 | acc +0 22 | acc +22 23 | acc +13 24 | jmp +566 25 | acc -12 26 | acc +0 27 | nop +153 28 | jmp +173 29 | jmp +192 30 | jmp +292 31 | acc +36 32 | acc +7 33 | jmp +440 34 | acc -17 35 | acc +40 36 | acc +24 37 | acc -7 38 | jmp +519 39 | nop +16 40 | acc +15 41 | acc +42 42 | jmp +445 43 | jmp +350 44 | acc +42 45 | acc +12 46 | acc +2 47 | jmp +133 48 | acc +12 49 | acc +3 50 | acc +27 51 | jmp +186 52 | acc +25 53 | acc +46 54 | jmp +285 55 | acc +32 56 | acc -11 57 | acc -6 58 | jmp +565 59 | nop +215 60 | acc +1 61 | acc +35 62 | jmp +1 63 | jmp +502 64 | acc +27 65 | acc +19 66 | acc -8 67 | acc -8 68 | jmp +531 69 | jmp -21 70 | nop +292 71 | acc +8 72 | acc -13 73 | jmp +26 74 | acc +1 75 | acc +45 76 | nop -42 77 | jmp +323 78 | jmp +39 79 | jmp +336 80 | acc +19 81 | jmp -51 82 | acc +45 83 | acc +26 84 | jmp +278 85 | jmp +6 86 | acc +40 87 | nop +271 88 | acc -10 89 | nop -4 90 | jmp +272 91 | nop -61 92 | acc +4 93 | acc -14 94 | acc +27 95 | jmp -70 96 | acc -9 97 | acc +29 98 | jmp +416 99 | acc +25 100 | acc +45 101 | jmp +19 102 | jmp +39 103 | acc -19 104 | acc +7 105 | jmp +248 106 | acc +11 107 | acc +36 108 | jmp +515 109 | acc +45 110 | acc +49 111 | jmp +329 112 | acc +30 113 | acc +31 114 | acc +28 115 | acc +26 116 | jmp +8 117 | jmp +283 118 | acc +32 119 | jmp +127 120 | acc +4 121 | acc +20 122 | jmp +92 123 | jmp +50 124 | jmp +133 125 | acc +5 126 | acc +8 127 | jmp +313 128 | acc +38 129 | acc +34 130 | jmp +395 131 | acc +14 132 | acc +29 133 | jmp +392 134 | nop +246 135 | jmp +374 136 | nop +429 137 | nop +388 138 | acc +3 139 | acc +0 140 | jmp +432 141 | acc -1 142 | acc +35 143 | acc +35 144 | jmp +148 145 | acc +8 146 | acc +11 147 | acc +12 148 | acc -10 149 | jmp +434 150 | acc -19 151 | jmp +330 152 | nop +329 153 | acc +30 154 | jmp +239 155 | acc -6 156 | jmp -136 157 | jmp +418 158 | nop +385 159 | jmp +1 160 | acc +34 161 | acc +9 162 | jmp +410 163 | nop -13 164 | acc +31 165 | acc +15 166 | acc +37 167 | jmp -142 168 | jmp +109 169 | acc -16 170 | nop +405 171 | nop +343 172 | jmp +8 173 | acc +44 174 | acc -15 175 | acc +7 176 | acc +9 177 | jmp +185 178 | acc +6 179 | jmp +35 180 | nop -25 181 | jmp +93 182 | acc +22 183 | acc -17 184 | acc +15 185 | acc +39 186 | jmp +41 187 | nop -123 188 | acc +15 189 | acc +6 190 | jmp -35 191 | acc +48 192 | jmp +422 193 | acc -7 194 | nop +67 195 | nop +66 196 | acc +48 197 | jmp -29 198 | acc -11 199 | acc +16 200 | jmp +92 201 | acc +45 202 | jmp +92 203 | jmp +212 204 | acc -3 205 | acc -18 206 | nop -186 207 | nop +7 208 | jmp -28 209 | nop +292 210 | acc +7 211 | nop -120 212 | acc +46 213 | jmp +48 214 | acc -3 215 | acc -16 216 | acc +50 217 | jmp -44 218 | acc -2 219 | acc -11 220 | jmp +236 221 | jmp +344 222 | acc +33 223 | acc +44 224 | acc +39 225 | nop -45 226 | jmp -53 227 | acc -11 228 | nop +380 229 | acc +35 230 | jmp +113 231 | nop +203 232 | acc +40 233 | jmp +167 234 | acc +44 235 | jmp +394 236 | jmp +229 237 | jmp -167 238 | jmp -204 239 | acc +21 240 | acc +49 241 | jmp +25 242 | acc -19 243 | acc -17 244 | acc +44 245 | jmp -11 246 | acc +40 247 | acc +12 248 | jmp +253 249 | acc +21 250 | jmp +349 251 | jmp +285 252 | acc +0 253 | nop +261 254 | acc +15 255 | acc +38 256 | jmp +10 257 | acc +27 258 | jmp +1 259 | jmp +373 260 | jmp -151 261 | acc +6 262 | jmp -48 263 | acc +14 264 | acc -8 265 | jmp -61 266 | acc +8 267 | acc +20 268 | jmp +1 269 | jmp +1 270 | jmp +208 271 | acc -18 272 | acc +32 273 | jmp +94 274 | jmp +262 275 | acc +0 276 | jmp -156 277 | nop +188 278 | nop +312 279 | acc +21 280 | acc +6 281 | jmp -123 282 | acc +47 283 | jmp +316 284 | acc +25 285 | nop +290 286 | jmp +62 287 | acc -7 288 | acc +36 289 | nop +212 290 | acc +14 291 | jmp +332 292 | jmp +291 293 | jmp +226 294 | acc +30 295 | jmp -161 296 | acc +39 297 | acc +38 298 | jmp +203 299 | nop +63 300 | nop -6 301 | acc -15 302 | nop -56 303 | jmp +72 304 | acc +1 305 | acc +34 306 | acc +22 307 | acc +19 308 | jmp -135 309 | acc +27 310 | jmp -303 311 | acc +1 312 | acc +48 313 | acc -19 314 | jmp +142 315 | acc +50 316 | jmp +298 317 | acc +43 318 | acc +0 319 | acc +50 320 | acc +12 321 | jmp +137 322 | acc +41 323 | nop +252 324 | jmp -310 325 | acc +13 326 | acc +34 327 | acc -15 328 | acc +43 329 | jmp +236 330 | acc +5 331 | acc -8 332 | acc +25 333 | acc +45 334 | jmp +153 335 | acc -12 336 | acc +31 337 | acc -1 338 | jmp +120 339 | jmp +236 340 | acc +38 341 | nop -238 342 | jmp -328 343 | jmp +81 344 | acc +48 345 | acc +15 346 | acc -9 347 | jmp -73 348 | nop -49 349 | jmp -271 350 | acc -17 351 | acc -17 352 | jmp +106 353 | nop +212 354 | jmp -290 355 | acc +36 356 | nop +109 357 | jmp +186 358 | jmp -310 359 | acc +4 360 | acc +16 361 | jmp +117 362 | jmp +1 363 | acc +10 364 | jmp +20 365 | acc +12 366 | jmp -311 367 | acc +12 368 | acc +30 369 | nop +182 370 | jmp -315 371 | acc +25 372 | acc +12 373 | acc +30 374 | jmp +50 375 | acc -19 376 | jmp -333 377 | acc +30 378 | nop +87 379 | jmp -199 380 | acc +8 381 | jmp +112 382 | acc -8 383 | jmp -313 384 | acc +7 385 | acc +32 386 | jmp +1 387 | jmp +230 388 | acc +25 389 | acc +45 390 | acc +20 391 | acc +0 392 | jmp -307 393 | acc +30 394 | nop -253 395 | acc +7 396 | acc +39 397 | jmp -113 398 | acc -12 399 | jmp +209 400 | acc +42 401 | acc +17 402 | acc -19 403 | acc +24 404 | jmp -170 405 | acc +30 406 | acc +9 407 | acc -1 408 | jmp -328 409 | acc +19 410 | acc +45 411 | jmp +132 412 | nop -244 413 | nop +35 414 | jmp +34 415 | acc -10 416 | acc +26 417 | acc +35 418 | nop -238 419 | jmp +54 420 | acc +15 421 | nop -378 422 | acc +42 423 | jmp -43 424 | acc -9 425 | acc -5 426 | acc -11 427 | nop -307 428 | jmp -129 429 | nop -202 430 | acc -9 431 | nop -376 432 | acc +11 433 | jmp -75 434 | jmp +14 435 | acc -1 436 | acc +32 437 | acc -14 438 | acc +16 439 | jmp +39 440 | acc +42 441 | acc +32 442 | jmp -133 443 | acc +1 444 | acc +17 445 | nop +85 446 | acc +35 447 | jmp +83 448 | acc +27 449 | acc +0 450 | acc -12 451 | jmp -93 452 | acc +48 453 | acc +35 454 | nop +154 455 | jmp -287 456 | jmp -347 457 | jmp -348 458 | acc +18 459 | jmp -374 460 | acc -15 461 | jmp +36 462 | jmp -123 463 | acc -11 464 | jmp +55 465 | acc +19 466 | acc +23 467 | jmp -339 468 | nop +5 469 | acc +44 470 | acc +2 471 | jmp +1 472 | jmp -417 473 | acc +23 474 | jmp -253 475 | acc -9 476 | acc -3 477 | jmp -138 478 | jmp -227 479 | acc +12 480 | jmp -437 481 | acc +47 482 | acc +19 483 | acc -6 484 | jmp -245 485 | acc +2 486 | jmp -328 487 | acc -14 488 | acc +25 489 | acc +4 490 | acc -2 491 | jmp -411 492 | jmp -351 493 | jmp -459 494 | acc +3 495 | acc +48 496 | jmp -134 497 | nop +54 498 | acc -14 499 | jmp -298 500 | jmp -401 501 | acc -14 502 | acc +25 503 | nop -55 504 | acc -10 505 | jmp -312 506 | acc -7 507 | acc +45 508 | jmp -74 509 | acc +30 510 | jmp -462 511 | acc +5 512 | acc -8 513 | jmp -355 514 | acc +9 515 | acc +44 516 | acc +44 517 | jmp -150 518 | jmp -484 519 | acc +14 520 | acc +19 521 | acc -6 522 | jmp -474 523 | acc -18 524 | jmp -166 525 | jmp -264 526 | acc -15 527 | acc +17 528 | acc +29 529 | jmp -149 530 | nop -273 531 | acc +31 532 | acc +0 533 | acc -2 534 | jmp -410 535 | jmp -411 536 | acc +47 537 | acc -6 538 | nop -287 539 | jmp -436 540 | acc +4 541 | nop +88 542 | jmp -158 543 | acc +32 544 | jmp +1 545 | acc -15 546 | jmp -319 547 | acc -6 548 | acc -18 549 | acc +49 550 | jmp -256 551 | acc -18 552 | acc +31 553 | acc +27 554 | acc +27 555 | jmp -351 556 | jmp +58 557 | acc +12 558 | jmp +1 559 | acc +32 560 | nop -151 561 | jmp -411 562 | acc +19 563 | acc +7 564 | jmp -287 565 | acc +30 566 | jmp -496 567 | acc -11 568 | acc +5 569 | acc +42 570 | acc +25 571 | jmp -249 572 | acc -1 573 | jmp -243 574 | jmp -190 575 | acc +32 576 | acc +32 577 | acc +14 578 | jmp +12 579 | acc +5 580 | acc +30 581 | acc +34 582 | jmp -46 583 | acc -13 584 | acc +5 585 | acc +45 586 | jmp -271 587 | acc +29 588 | acc +37 589 | jmp -323 590 | nop -18 591 | acc -2 592 | acc +21 593 | acc -12 594 | jmp -453 595 | acc -14 596 | acc +19 597 | nop -173 598 | jmp -411 599 | acc +24 600 | acc -7 601 | nop -136 602 | acc +6 603 | jmp -357 604 | acc -1 605 | acc -1 606 | acc +32 607 | jmp -264 608 | acc +26 609 | jmp -175 610 | acc +10 611 | acc +35 612 | nop -361 613 | jmp -493 614 | acc +14 615 | jmp -206 616 | jmp -138 617 | acc -1 618 | jmp -156 619 | acc +3 620 | acc +11 621 | acc -2 622 | jmp -213 623 | acc +35 624 | acc -13 625 | acc +47 626 | acc +45 627 | jmp -376 628 | jmp -543 629 | jmp -479 630 | acc +29 631 | jmp -532 632 | acc +28 633 | acc +47 634 | acc -11 635 | acc -14 636 | jmp +1 -------------------------------------------------------------------------------- /src/day9/input.txt: -------------------------------------------------------------------------------- 1 | 14 2 | 9 3 | 43 4 | 18 5 | 13 6 | 24 7 | 3 8 | 38 9 | 33 10 | 8 11 | 41 12 | 4 13 | 32 14 | 15 15 | 31 16 | 44 17 | 17 18 | 34 19 | 21 20 | 10 21 | 50 22 | 37 23 | 2 24 | 23 25 | 6 26 | 47 27 | 5 28 | 9 29 | 11 30 | 16 31 | 12 32 | 18 33 | 7 34 | 13 35 | 26 36 | 14 37 | 19 38 | 8 39 | 20 40 | 15 41 | 29 42 | 58 43 | 17 44 | 22 45 | 21 46 | 24 47 | 25 48 | 10 49 | 27 50 | 31 51 | 33 52 | 23 53 | 28 54 | 30 55 | 34 56 | 32 57 | 35 58 | 38 59 | 49 60 | 18 61 | 26 62 | 36 63 | 37 64 | 47 65 | 39 66 | 56 67 | 40 68 | 42 69 | 43 70 | 41 71 | 44 72 | 45 73 | 46 74 | 48 75 | 50 76 | 51 77 | 53 78 | 79 79 | 73 80 | 69 81 | 117 82 | 54 83 | 55 84 | 90 85 | 57 86 | 62 87 | 75 88 | 114 89 | 85 90 | 94 91 | 110 92 | 81 93 | 98 94 | 153 95 | 86 96 | 89 97 | 204 98 | 96 99 | 101 100 | 103 101 | 104 102 | 152 103 | 169 104 | 124 105 | 135 106 | 109 107 | 143 108 | 171 109 | 119 110 | 132 111 | 137 112 | 207 113 | 166 114 | 167 115 | 184 116 | 185 117 | 170 118 | 175 119 | 182 120 | 187 121 | 190 122 | 197 123 | 233 124 | 204 125 | 212 126 | 244 127 | 299 128 | 228 129 | 339 130 | 241 131 | 246 132 | 269 133 | 415 134 | 319 135 | 298 136 | 349 137 | 337 138 | 333 139 | 444 140 | 357 141 | 345 142 | 362 143 | 365 144 | 562 145 | 377 146 | 387 147 | 401 148 | 416 149 | 541 150 | 469 151 | 472 152 | 474 153 | 647 154 | 591 155 | 487 156 | 515 157 | 567 158 | 617 159 | 686 160 | 1158 161 | 793 162 | 670 163 | 678 164 | 702 165 | 864 166 | 710 167 | 856 168 | 781 169 | 817 170 | 764 171 | 1251 172 | 1214 173 | 885 174 | 941 175 | 943 176 | 946 177 | 961 178 | 1002 179 | 1082 180 | 1456 181 | 1269 182 | 1184 183 | 2104 184 | 1364 185 | 1348 186 | 2032 187 | 1372 188 | 1742 189 | 1412 190 | 1474 191 | 1792 192 | 1545 193 | 1649 194 | 2305 195 | 2358 196 | 1826 197 | 2725 198 | 1828 199 | 3282 200 | 2043 201 | 1907 202 | 1963 203 | 2910 204 | 2266 205 | 2814 206 | 2453 207 | 2532 208 | 2712 209 | 2957 210 | 2720 211 | 2784 212 | 3903 213 | 3019 214 | 3123 215 | 4131 216 | 4006 217 | 3789 218 | 3871 219 | 3654 220 | 4811 221 | 3735 222 | 3791 223 | 5866 224 | 4309 225 | 4416 226 | 4439 227 | 4229 228 | 4719 229 | 5576 230 | 5237 231 | 8578 232 | 5244 233 | 6447 234 | 5504 235 | 8510 236 | 7445 237 | 9570 238 | 7920 239 | 6777 240 | 8725 241 | 7389 242 | 12460 243 | 7606 244 | 13305 245 | 15899 246 | 9992 247 | 14957 248 | 8748 249 | 12843 250 | 8855 251 | 14092 252 | 8948 253 | 9956 254 | 10741 255 | 10481 256 | 10748 257 | 11951 258 | 25705 259 | 12281 260 | 26647 261 | 14697 262 | 14166 263 | 25855 264 | 19473 265 | 16244 266 | 24048 267 | 16354 268 | 16461 269 | 36446 270 | 22914 271 | 17603 272 | 20704 273 | 28195 274 | 17803 275 | 18811 276 | 29429 277 | 18904 278 | 20437 279 | 41380 280 | 24914 281 | 22699 282 | 46409 283 | 26447 284 | 26978 285 | 57624 286 | 33639 287 | 33847 288 | 32598 289 | 41141 290 | 39160 291 | 33957 292 | 70570 293 | 34064 294 | 35406 295 | 36414 296 | 80323 297 | 50894 298 | 36614 299 | 36707 300 | 48333 301 | 63592 302 | 39341 303 | 43136 304 | 66445 305 | 59313 306 | 49146 307 | 92952 308 | 99043 309 | 99227 310 | 73028 311 | 66237 312 | 69012 313 | 66555 314 | 70771 315 | 68021 316 | 107362 317 | 69470 318 | 70478 319 | 71820 320 | 73121 321 | 91469 322 | 76048 323 | 73321 324 | 107478 325 | 108353 326 | 122905 327 | 142591 328 | 92282 329 | 108459 330 | 115383 331 | 125194 332 | 142791 333 | 137491 334 | 135567 335 | 132792 336 | 199928 337 | 134576 338 | 163289 339 | 138499 340 | 334504 341 | 205037 342 | 197014 343 | 142298 344 | 144941 345 | 267785 346 | 149369 347 | 271642 348 | 165603 349 | 237223 350 | 200635 351 | 207665 352 | 227849 353 | 200741 354 | 352606 355 | 259770 356 | 257986 357 | 431074 358 | 310544 359 | 267368 360 | 283440 361 | 291667 362 | 273075 363 | 304102 364 | 402068 365 | 287239 366 | 294310 367 | 307901 368 | 314972 369 | 345682 370 | 350004 371 | 350110 372 | 437245 373 | 612376 374 | 401376 375 | 408300 376 | 435514 377 | 636046 378 | 695539 379 | 675143 380 | 547009 381 | 525354 382 | 540443 383 | 684816 384 | 550808 385 | 1076162 386 | 560314 387 | 567385 388 | 933654 389 | 581549 390 | 595140 391 | 602211 392 | 664976 393 | 968614 394 | 695686 395 | 700114 396 | 751486 397 | 809676 398 | 1044346 399 | 926730 400 | 1318871 401 | 960868 402 | 1065797 403 | 1091251 404 | 1225951 405 | 1646557 406 | 2157048 407 | 1121992 408 | 1153019 409 | 1519422 410 | 1127699 411 | 1155454 412 | 1277235 413 | 1176689 414 | 1183760 415 | 1197351 416 | 1267187 417 | 1360662 418 | 1626844 419 | 1395800 420 | 1712354 421 | 2213243 422 | 1736406 423 | 1887598 424 | 1992527 425 | 2088567 426 | 2026665 427 | 2187789 428 | 2218950 429 | 2277446 430 | 2329708 431 | 2249691 432 | 2280718 433 | 2283153 434 | 2304388 435 | 2311459 436 | 3516878 437 | 2453924 438 | 2544422 439 | 5605445 440 | 2464538 441 | 3353189 442 | 3949649 443 | 3132206 444 | 3108154 445 | 5319995 446 | 5686055 447 | 3914263 448 | 3880125 449 | 5220773 450 | 4115232 451 | 4214454 452 | 4437480 453 | 4468641 454 | 4554079 455 | 4563871 456 | 4530409 457 | 5807113 458 | 4587541 459 | 4615847 460 | 4998346 461 | 6378801 462 | 10826218 463 | 5008960 464 | 5596744 465 | 7018617 466 | 6485395 467 | 6240360 468 | 6988279 469 | 7022417 470 | 9022720 471 | 8530110 472 | 7794388 473 | 7995357 474 | 8329686 475 | 8552712 476 | 8906121 477 | 13145957 478 | 8999050 479 | 12016963 480 | 12615361 481 | 9528755 482 | 15015505 483 | 14537715 484 | 10007306 485 | 13258977 486 | 10605704 487 | 12027577 488 | 13504012 489 | 11837104 490 | 15518389 491 | 13228639 492 | 14782667 493 | 27928624 494 | 14816805 495 | 15789745 496 | 16525467 497 | 16325043 498 | 16548069 499 | 21016013 500 | 21844410 501 | 17905171 502 | 23751661 503 | 20134459 504 | 26930747 505 | 19536061 506 | 20613010 507 | 22034883 508 | 22442808 509 | 31843432 510 | 25096081 511 | 29553682 512 | 36661215 513 | 25065743 514 | 26619771 515 | 29018384 516 | 36817550 517 | 38968275 518 | 30606550 519 | 41591210 520 | 32114788 521 | 25918798 522 | 36084130 523 | 34453240 524 | 37441232 525 | 38039630 526 | 47100626 527 | 63748297 528 | 57537297 529 | 40149071 530 | 43055818 531 | 42647893 532 | 44477691 533 | 47508551 534 | 54114465 535 | 61883293 536 | 50984541 537 | 56525348 538 | 51685514 539 | 52538569 540 | 54937182 541 | 58033586 542 | 69574825 543 | 93966580 544 | 60372038 545 | 103019931 546 | 62002928 547 | 70537370 548 | 95576927 549 | 75480862 550 | 117862762 551 | 82796964 552 | 178500793 553 | 112987469 554 | 123689290 555 | 85703711 556 | 107880589 557 | 174870762 558 | 103523110 559 | 124512007 560 | 102670055 561 | 120036514 562 | 125474552 563 | 161053517 564 | 107475751 565 | 112970768 566 | 169478679 567 | 122374966 568 | 130909408 569 | 211178263 570 | 132540298 571 | 137483790 572 | 183361451 573 | 278938378 574 | 198674479 575 | 215640823 576 | 293167969 577 | 416857259 578 | 218244009 579 | 188373766 580 | 193179462 581 | 249986559 582 | 206193165 583 | 220446519 584 | 227182062 585 | 210145806 586 | 294953231 587 | 229850717 588 | 235345734 589 | 244959541 590 | 243880176 591 | 382035930 592 | 319283174 593 | 367886032 594 | 270024088 595 | 315901749 596 | 320845241 597 | 371735217 598 | 468230568 599 | 592181736 600 | 381553228 601 | 544939790 602 | 418224483 603 | 394566931 604 | 436043882 605 | 399372627 606 | 416338971 607 | 426639684 608 | 439996523 609 | 474810258 610 | 611886647 611 | 465196451 612 | 473730893 613 | 480305275 614 | 743754981 615 | 710468680 616 | 1175665131 617 | 585925837 618 | 590869329 619 | 636746990 620 | 796207024 621 | 760841764 622 | 891955376 623 | 776120159 624 | 780925855 625 | 793939558 626 | 810905902 627 | 826012311 628 | 1026913211 629 | 835416509 630 | 815711598 631 | 842978655 632 | 906944959 633 | 905192974 634 | 938927344 635 | 1077083098 636 | 945501726 637 | 954036168 638 | 1066231112 639 | 1845872303 640 | 1176795166 641 | 1970734724 642 | 1222672827 643 | 1387076353 644 | 1761213324 645 | 1536961923 646 | 1726427581 647 | 2016010442 648 | 1574865413 649 | 1591831757 650 | 1739441284 651 | 1720904572 652 | 1754638942 653 | 2768626923 654 | 3420737716 655 | 1844120318 656 | 1748171629 657 | 1812137933 658 | 1850694700 659 | 1884429070 660 | 1899537894 661 | 2011732838 662 | 2020267280 663 | 3595132693 664 | 3860130760 665 | 3199214286 666 | 2609749180 667 | 3862427538 668 | 3141715295 669 | 3111827336 670 | 5215224728 671 | 3425560113 672 | 3166697170 673 | 3295769985 674 | 3312736329 675 | 3460345856 676 | 3469076201 677 | 3502810571 678 | 3560309562 679 | 3592291947 680 | 3598866329 681 | 7027362661 682 | 5049908986 683 | 4494178250 684 | 3896161908 685 | 4509287074 686 | 4032000118 687 | 5523077851 688 | 7020655418 689 | 6963156427 690 | 5721576516 691 | 5751464475 692 | 6424563665 693 | 6253542631 694 | 6278524506 695 | 8718035299 696 | 6635773371 697 | 9753576634 698 | 10572986837 699 | 6905028276 700 | 6929422057 701 | 7488453855 702 | 7095102518 703 | 7152601509 704 | 7191158276 705 | 14803485620 706 | 14583556373 707 | 7928162026 708 | 10859318335 709 | 13788374880 710 | 8541287192 711 | 9555077969 712 | 11244654367 713 | 12005007106 714 | 14417875912 715 | 11473040991 716 | 12029988981 717 | 13060337036 718 | 12532067137 719 | 12914297877 720 | 13540801647 721 | 13730875889 722 | 13834450333 723 | 14000130794 724 | 14024524575 725 | 14082023566 726 | 20883477398 727 | 26072868784 728 | 14343759785 729 | 15119320302 730 | 19933169132 731 | 22959163104 732 | 16469449218 733 | 29488247101 734 | 20799732336 735 | 18096365161 736 | 21028118960 737 | 23274643348 738 | 55561115885 739 | 24533378027 740 | 26894787369 741 | 24562056118 742 | 27540932441 743 | 25446365014 744 | 69561246679 745 | 27271677536 746 | 27565326222 747 | 27834581127 748 | 48424409839 749 | 28106548141 750 | 28425783351 751 | 42629743188 752 | 44991152530 753 | 35143492121 754 | 50169430717 755 | 40732901468 756 | 34565814379 757 | 37497568178 758 | 38896097497 759 | 39124484121 760 | 51456843487 761 | 44302762308 762 | 51700426699 763 | 49095434145 764 | 77710363158 765 | 50008421132 766 | 51833733654 767 | 54837003758 768 | 56532331492 769 | 55106258663 770 | 55378225677 771 | 55399907349 772 | 63569275472 773 | 62672362520 774 | 80134644651 775 | 93398196453 776 | 73690298500 777 | 76622052299 778 | 69709306500 779 | 72063382557 780 | 73461911876 781 | 106856750836 782 | 76393665675 783 | 115746536420 784 | 90958217775 785 | 119204694012 786 | 105627765637 787 | 99103855277 788 | 148235200211 789 | 135512870328 790 | 104845424890 791 | 110778133026 792 | 109943262421 793 | 195803642665 794 | 110484484340 795 | 118969182821 796 | 216800013257 797 | 209588339617 798 | 132381669020 799 | 141772689057 800 | 195591235120 801 | 267867025222 802 | 187809918977 803 | 303556455397 804 | 145525294433 805 | 149855577551 806 | 167351883450 807 | 181239090565 808 | 201442702115 809 | 190062073052 810 | 224832459649 811 | 204731620914 812 | 260741871878 813 | 215623557916 814 | 214788687311 815 | 306288127005 816 | 274154358077 817 | 355161802427 818 | 400322856034 819 | 252257173397 820 | 313620759585 821 | 277906963453 822 | 282237246571 823 | 356561376368 824 | 506416953919 825 | 295380871984 826 | 442319246449 827 | 312877177883 828 | 317207461001 829 | 326764384998 830 | 604671348451 831 | 348590974015 832 | 385970711479 833 | 391504775167 834 | 569950489738 835 | 419520308225 836 | 883571249323 837 | 430412245227 838 | 467045860708 839 | 488943045388 840 | 526411531474 841 | 708712236168 842 | 530164136850 843 | 640385144583 844 | 577618118555 845 | 591527723038 846 | 612588332985 847 | 595114424454 848 | 769083631447 849 | 747619706228 850 | 608258049867 851 | 908735184039 852 | 630084638884 853 | 643971845999 854 | 712735096477 855 | 897458105935 856 | 734561685494 857 | 777475486646 858 | 1027778358092 859 | 1197655281556 860 | 849932553452 861 | 919355290615 862 | 1021939968265 863 | 955988906096 864 | 1019107182238 865 | 1260973216968 866 | 1107782255405 867 | 1284356990582 868 | 1169145841593 869 | 1480017192336 870 | 1221612361922 871 | 1203372474321 872 | 1225199063338 873 | 1238342688751 874 | 1356706942476 875 | 1252229895866 876 | 1274056484883 877 | 1562667649929 878 | 2066603947528 879 | 2216762463794 880 | 1753668867732 881 | 1627408040098 882 | 1696830777261 883 | 1769287844067 884 | 2922814709325 885 | 2144554353953 886 | 1938462472853 887 | 3878803615421 888 | 2063771161501 889 | 2126889437643 890 | 2276928096998 891 | 2311154729726 892 | 2372518315914 893 | 4619645486586 894 | 2428571537659 895 | 2424984836243 896 | 2441715163072 897 | 4310980788767 898 | 3379119333509 899 | 2919374592405 900 | 2526286380749 901 | 2836724134812 902 | 4046215941065 903 | 6798178207826 904 | 3324238817359 905 | 3381076907830 906 | 6374751950268 907 | 3466118621328 908 | 3707750316920 909 | 6630565026245 910 | 4065351910496 911 | 8189784404188 912 | 4190660599144 913 | 4340699258499 914 | 8803323487927 915 | 4588082826724 916 | 4683673045640 917 | 4797503152157 918 | 7048217024245 919 | 9967591616650 920 | 5361089755477 921 | 4968001543821 922 | 5907363288579 923 | 6984726502901 924 | 5363010515561 925 | 15174510907089 926 | 8406051168995 927 | 6705315725189 928 | 6790357438687 929 | 8178580059987 930 | 8391423362560 931 | 7656779220472 932 | 8988163751301 933 | 10821225625389 934 | 9024372304139 935 | 8531359857643 936 | 8778743425868 937 | 8874333644784 938 | 8928782085223 939 | 9271755872364 940 | 11782229655058 941 | 9765504695978 942 | 10158592907634 943 | 12347737018462 944 | 10331012059382 945 | 16184236140950 946 | 14237344160345 947 | 11270373804140 948 | 14351174266862 949 | 14447136659159 950 | 13495673163876 951 | 15096739087749 952 | 14883895785176 953 | 17415795666699 954 | 28531973159412 955 | 17519523608944 956 | 16585561305695 957 | 17405693502427 958 | 17803115730007 959 | 17555732161782 960 | 32439627946958 961 | 17653077070652 962 | 20144707448924 963 | 20542129676504 964 | 32652471249531 965 | 24649400481154 966 | 19924097603612 967 | 20489604967016 968 | 21601385863522 969 | 23826685223258 970 | 24766046968016 971 | 48476085704412 972 | 25621548071002 973 | 27846847430738 974 | 31966660268103 975 | 28379568949052 976 | 29980634872925 977 | 34001356972394 978 | 33991254808122 979 | 44910754416940 980 | 61838102238860 981 | 37127690982199 982 | 34961425664209 983 | 41525483467134 984 | 35208809232434 985 | 48336452397754 986 | 37577174674264 987 | 40068805052536 988 | 53568046131625 989 | 40413702570628 990 | 47222933934524 991 | 68448374001588 992 | 42090990830538 993 | 45428071086780 994 | 54746681840941 995 | 50387595039018 996 | 53468395501740 997 | 54001117020054 998 | 56226416379790 999 | 58360203821977 1000 | 62380925921446 -------------------------------------------------------------------------------- /src/day9/sums.kt: -------------------------------------------------------------------------------- 1 | package day9 2 | 3 | import kotlin.io.path.Path 4 | import kotlin.io.path.readLines 5 | 6 | fun List.findPairOfSum(sum: Long): Pair? { 7 | val residuals = mutableMapOf() // lazy fill 8 | return asSequence() 9 | .onEach { a -> residuals[sum - a] = a } 10 | .mapNotNull { a -> residuals[a]?.takeIf { it != a }?.let { b -> a to b } }.firstOrNull() 11 | } 12 | 13 | fun main() { 14 | val numbers = Path("src/day9/input.txt").readLines().map { it.toLong() } 15 | val preambleLength = 25 16 | var outlier: Long = 0 17 | for (i in preambleLength until numbers.size) { 18 | val n = numbers[i] 19 | val prev = numbers.subList(i - preambleLength, i) 20 | if (prev.findPairOfSum(n) == null) { outlier = n; break } 21 | } 22 | println(outlier) 23 | 24 | val prefixSum = numbers.scan(0L) { acc, e -> acc + e } 25 | for (start in numbers.indices) { 26 | for (end in start + 2..numbers.size) { 27 | val sum = prefixSum[end] - prefixSum[start] 28 | if (sum == outlier) { 29 | val range = numbers.subList(start, end) 30 | println(range) 31 | println(range.minOrNull()!! + range.maxOrNull()!!) 32 | } 33 | } 34 | } 35 | } --------------------------------------------------------------------------------