From 343414cd0483f05d625065448923307eb8a149ac Mon Sep 17 00:00:00 2001
From: chrisly42 <chrisly@platon42.de>
Date: Sun, 22 Dec 2024 18:42:55 +0100
Subject: [PATCH] Refresher on Coroutines for maximum parallel brute force for
 Day 22.

---
 src/aoc2024/Day22.kt | 37 ++++++++++++++++++-------------------
 1 file changed, 18 insertions(+), 19 deletions(-)

diff --git a/src/aoc2024/Day22.kt b/src/aoc2024/Day22.kt
index b1266e4..190d8d7 100644
--- a/src/aoc2024/Day22.kt
+++ b/src/aoc2024/Day22.kt
@@ -1,5 +1,9 @@
 package aoc2024
 
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.async
+import kotlinx.coroutines.awaitAll
+import kotlinx.coroutines.runBlocking
 import println
 import readInput
 
@@ -50,7 +54,6 @@ fun main() {
             val deltaString = StringBuffer(2024)
             var v = i
             var lastd = v % 10
-            normalString.append(lastd)
             for (p in 1..2000) {
                 v = next(v)
                 val d = v % 10
@@ -64,26 +67,22 @@ fun main() {
         }
 
         // it's not my fault that brute force is still working
-        val tokenBuffer = StringBuffer(5)
-        tokenBuffer.append("    ")
-        val maxIdx = deltaStrings[0].length - 3
-        var maxBananas = 0
-        for (code in 0 until 19 * 19 * 19 * 19) {
-            tokenBuffer.setCharAt(0, 'a' + (code / (19 * 19 * 19)))
-            tokenBuffer.setCharAt(1, 'a' + ((code / (19 * 19)) % 19))
-            tokenBuffer.setCharAt(2, 'a' + ((code / 19) % 19))
-            tokenBuffer.setCharAt(3, 'a' + ((code % 19)))
-            var bananas = 0
-            val token = tokenBuffer.toString()
-            for (i in deltaStrings.indices) {
-                val idx = deltaStrings[i].indexOf(token)
-                if (idx in 0..maxIdx) {
-                    bananas += normalStrings[i][idx + 4].digitToInt()
+        return runBlocking {
+            (0..(19 * 19 * 19 * 19)).map {
+                async(Dispatchers.Default) {
+                    val tokenBuffer = StringBuffer(4)
+                    tokenBuffer.append('a' + (it / (19 * 19 * 19)))
+                    tokenBuffer.append('a' + ((it / (19 * 19)) % 19))
+                    tokenBuffer.append('a' + ((it / 19) % 19))
+                    tokenBuffer.append('a' + ((it % 19)))
+                    val token = tokenBuffer.toString()
+                    deltaStrings.indices.sumOf {
+                        val idx = deltaStrings[it].indexOf(token)
+                        if (idx >= 0) normalStrings[it][idx + 3].digitToInt() else 0
+                    }
                 }
-            }
-            maxBananas = maxBananas.coerceAtLeast(bananas)
+            }.awaitAll().max()
         }
-        return maxBananas
     }
 
     // test if implementation meets criteria from the description, like: