package day15

import java.io.File
import java.util.*

fun main() {
    val lines = File("src/main/kotlin/day15/input.txt").readLines()
    val mapSize = lines.size
    val riskLevelGrid: Array<IntArray> = Array(mapSize) { i -> lines[i].map { it.digitToInt() }.toIntArray() }
    val minimumRiskLevelGrid: Array<IntArray> = findMinimumRiskLevels(mapSize, riskLevelGrid)
    println(minimumRiskLevelGrid[mapSize - 1][mapSize - 1])
    val riskLevelFullGrid: Array<IntArray> = Array(mapSize * 5) { y ->
        IntArray(mapSize * 5) { x ->
            (riskLevelGrid[y % mapSize][x % mapSize] + x / mapSize + y / mapSize - 1) % 9 + 1
        }
    }
    val minimumRiskLevelFullGrid: Array<IntArray> = findMinimumRiskLevels(mapSize * 5, riskLevelFullGrid)
    println(minimumRiskLevelFullGrid[mapSize * 5 - 1][mapSize * 5 - 1])
}

private fun findMinimumRiskLevels(
    mapSize: Int,
    riskLevelGrid: Array<IntArray>
): Array<IntArray> {
    val minimumRiskLevelGrid: Array<IntArray> = Array(mapSize) { IntArray(mapSize) { Int.MAX_VALUE } }
    val parents: MutableMap<Point, Point> = mutableMapOf()

    val unvisited: MutableSet<Point> =
        (0 until mapSize).flatMap { y -> (0 until mapSize).map { x -> Point(x, y) } }.toMutableSet()
    minimumRiskLevelGrid[0][0] = 0

    val visiting: PriorityQueue<Pair<Point, Int>> = PriorityQueue { o1, o2 -> o1.second - o2.second }
    visiting.add(Point(0, 0) to 0)

    while (visiting.isNotEmpty()) {
        val (nextCandidate, parentRiskLevel) = visiting.poll()
        for (adjacent in nextCandidate.adjacents(mapSize)) {
            if (adjacent in unvisited) {
                val adjacentRiskLevel = riskLevelGrid[adjacent.y][adjacent.x]
                val adjacentMinimumRiskLevel = minimumRiskLevelGrid[adjacent.y][adjacent.x]
                if (adjacentRiskLevel + parentRiskLevel < adjacentMinimumRiskLevel) {
                    minimumRiskLevelGrid[adjacent.y][adjacent.x] = adjacentRiskLevel + parentRiskLevel
                    parents[adjacent] = nextCandidate
                    visiting.offer(adjacent to adjacentRiskLevel + parentRiskLevel)
                }
            }
        }
        unvisited.remove(nextCandidate)
    }
    return minimumRiskLevelGrid
}

data class Point(val x: Int, val y: Int)

fun Point.adjacents(size: Int): Set<Point> {
    val points = mutableSetOf<Point>()
    if (this.x > 0) points.add(Point(this.x - 1, this.y))
    if (this.x < size) points.add(Point(this.x + 1, this.y))
    if (this.y > 0) points.add(Point(this.x, this.y - 1))
    if (this.y < size) points.add(Point(this.x, this.y + 1))
    return points
}

Compiled from "solution.kt"
public final class day15.SolutionKt {
  public static final void main();
    Code:
       0: new           #8                  // class java/io/File
       3: dup
       4: ldc           #10                 // String src/main/kotlin/day15/input.txt
       6: invokespecial #14                 // Method java/io/File."<init>":(Ljava/lang/String;)V
       9: aconst_null
      10: iconst_1
      11: aconst_null
      12: invokestatic  #20                 // Method kotlin/io/FilesKt.readLines$default:(Ljava/io/File;Ljava/nio/charset/Charset;ILjava/lang/Object;)Ljava/util/List;
      15: astore_0
      16: aload_0
      17: invokeinterface #26,  1           // InterfaceMethod java/util/List.size:()I
      22: istore_1
      23: iconst_0
      24: istore_3
      25: iload_1
      26: anewarray     #28                 // class "[I"
      29: astore        4
      31: iload_3
      32: iload_1
      33: if_icmpge     176
      36: iload_3
      37: istore        5
      39: aload         4
      41: iload         5
      43: aload_0
      44: iload         5
      46: invokeinterface #32,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      51: checkcast     #34                 // class java/lang/CharSequence
      54: astore        6
      56: istore        16
      58: astore        15
      60: iconst_0
      61: istore        7
      63: aload         6
      65: astore        8
      67: new           #36                 // class java/util/ArrayList
      70: dup
      71: aload         6
      73: invokeinterface #39,  1           // InterfaceMethod java/lang/CharSequence.length:()I
      78: invokespecial #42                 // Method java/util/ArrayList."<init>":(I)V
      81: checkcast     #44                 // class java/util/Collection
      84: astore        9
      86: iconst_0
      87: istore        10
      89: iconst_0
      90: istore        11
      92: iload         11
      94: aload         8
      96: invokeinterface #39,  1           // InterfaceMethod java/lang/CharSequence.length:()I
     101: if_icmpge     149
     104: aload         8
     106: iload         11
     108: invokeinterface #48,  2           // InterfaceMethod java/lang/CharSequence.charAt:(I)C
     113: istore        12
     115: aload         9
     117: iload         12
     119: istore        13
     121: astore        17
     123: iconst_0
     124: istore        14
     126: iload         13
     128: invokestatic  #54                 // Method kotlin/text/CharsKt.digitToInt:(C)I
     131: invokestatic  #60                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     134: aload         17
     136: swap
     137: invokeinterface #64,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     142: pop
     143: iinc          11, 1
     146: goto          92
     149: aload         9
     151: checkcast     #22                 // class java/util/List
     154: nop
     155: astore        17
     157: aload         15
     159: iload         16
     161: aload         17
     163: checkcast     #44                 // class java/util/Collection
     166: invokestatic  #70                 // Method kotlin/collections/CollectionsKt.toIntArray:(Ljava/util/Collection;)[I
     169: aastore
     170: iinc          3, 1
     173: goto          31
     176: aload         4
     178: astore_2
     179: iload_1
     180: aload_2
     181: invokestatic  #74                 // Method findMinimumRiskLevels:(I[[I)[[I
     184: astore_3
     185: aload_3
     186: iload_1
     187: iconst_1
     188: isub
     189: aaload
     190: iload_1
     191: iconst_1
     192: isub
     193: iaload
     194: istore        4
     196: getstatic     #80                 // Field java/lang/System.out:Ljava/io/PrintStream;
     199: iload         4
     201: invokevirtual #85                 // Method java/io/PrintStream.println:(I)V
     204: iconst_0
     205: istore        5
     207: iload_1
     208: iconst_5
     209: imul
     210: istore        6
     212: iload         6
     214: anewarray     #28                 // class "[I"
     217: astore        7
     219: iload         5
     221: iload         6
     223: if_icmpge     315
     226: iload         5
     228: istore        8
     230: aload         7
     232: iload         8
     234: iconst_0
     235: istore        9
     237: iload_1
     238: iconst_5
     239: imul
     240: istore        10
     242: iload         10
     244: newarray       int
     246: astore        11
     248: istore        16
     250: astore        15
     252: iload         9
     254: iload         10
     256: if_icmpge     302
     259: iload         9
     261: istore        12
     263: aload         11
     265: iload         12
     267: aload_2
     268: iload         8
     270: iload_1
     271: irem
     272: aaload
     273: iload         12
     275: iload_1
     276: irem
     277: iaload
     278: iload         12
     280: iload_1
     281: idiv
     282: iadd
     283: iload         8
     285: iload_1
     286: idiv
     287: iadd
     288: iconst_1
     289: isub
     290: bipush        9
     292: irem
     293: iconst_1
     294: iadd
     295: iastore
     296: iinc          9, 1
     299: goto          252
     302: aload         15
     304: iload         16
     306: aload         11
     308: aastore
     309: iinc          5, 1
     312: goto          219
     315: aload         7
     317: astore        4
     319: iload_1
     320: iconst_5
     321: imul
     322: aload         4
     324: invokestatic  #74                 // Method findMinimumRiskLevels:(I[[I)[[I
     327: astore        5
     329: aload         5
     331: iload_1
     332: iconst_5
     333: imul
     334: iconst_1
     335: isub
     336: aaload
     337: iload_1
     338: iconst_5
     339: imul
     340: iconst_1
     341: isub
     342: iaload
     343: istore        6
     345: getstatic     #80                 // Field java/lang/System.out:Ljava/io/PrintStream;
     348: iload         6
     350: invokevirtual #85                 // Method java/io/PrintStream.println:(I)V
     353: return

  private static final int[][] findMinimumRiskLevels(int, int[][]);
    Code:
       0: iconst_0
       1: istore_3
       2: iload_0
       3: anewarray     #28                 // class "[I"
       6: astore        4
       8: iload_3
       9: iload_0
      10: if_icmpge     68
      13: iload_3
      14: istore        5
      16: aload         4
      18: iload         5
      20: iconst_0
      21: istore        6
      23: iload_0
      24: newarray       int
      26: astore        7
      28: istore        25
      30: astore        24
      32: iload         6
      34: iload_0
      35: if_icmpge     55
      38: iload         6
      40: istore        8
      42: aload         7
      44: iload         8
      46: ldc           #107                // int 2147483647
      48: iastore
      49: iinc          6, 1
      52: goto          32
      55: aload         24
      57: iload         25
      59: aload         7
      61: aastore
      62: iinc          3, 1
      65: goto          8
      68: aload         4
      70: astore_2
      71: new           #109                // class java/util/LinkedHashMap
      74: dup
      75: invokespecial #111                // Method java/util/LinkedHashMap."<init>":()V
      78: checkcast     #113                // class java/util/Map
      81: astore_3
      82: iconst_0
      83: iload_0
      84: invokestatic  #119                // Method kotlin/ranges/RangesKt.until:(II)Lkotlin/ranges/IntRange;
      87: checkcast     #121                // class java/lang/Iterable
      90: astore        5
      92: iconst_0
      93: istore        6
      95: aload         5
      97: astore        7
      99: new           #36                 // class java/util/ArrayList
     102: dup
     103: invokespecial #122                // Method java/util/ArrayList."<init>":()V
     106: checkcast     #44                 // class java/util/Collection
     109: astore        8
     111: iconst_0
     112: istore        9
     114: aload         7
     116: invokeinterface #126,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     121: astore        10
     123: aload         10
     125: invokeinterface #132,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     130: ifeq          275
     133: aload         10
     135: checkcast     #134                // class kotlin/collections/IntIterator
     138: invokevirtual #137                // Method kotlin/collections/IntIterator.nextInt:()I
     141: istore        11
     143: iload         11
     145: istore        12
     147: iconst_0
     148: istore        13
     150: iconst_0
     151: iload_0
     152: invokestatic  #119                // Method kotlin/ranges/RangesKt.until:(II)Lkotlin/ranges/IntRange;
     155: checkcast     #121                // class java/lang/Iterable
     158: astore        14
     160: iconst_0
     161: istore        15
     163: aload         14
     165: astore        16
     167: new           #36                 // class java/util/ArrayList
     170: dup
     171: aload         14
     173: bipush        10
     175: invokestatic  #141                // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     178: invokespecial #42                 // Method java/util/ArrayList."<init>":(I)V
     181: checkcast     #44                 // class java/util/Collection
     184: astore        17
     186: iconst_0
     187: istore        18
     189: aload         16
     191: invokeinterface #126,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     196: astore        19
     198: aload         19
     200: invokeinterface #132,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     205: ifeq          252
     208: aload         19
     210: checkcast     #134                // class kotlin/collections/IntIterator
     213: invokevirtual #137                // Method kotlin/collections/IntIterator.nextInt:()I
     216: istore        20
     218: aload         17
     220: iload         20
     222: istore        21
     224: astore        22
     226: iconst_0
     227: istore        23
     229: new           #143                // class day15/Point
     232: dup
     233: iload         21
     235: iload         12
     237: invokespecial #146                // Method day15/Point."<init>":(II)V
     240: aload         22
     242: swap
     243: invokeinterface #64,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     248: pop
     249: goto          198
     252: aload         17
     254: checkcast     #22                 // class java/util/List
     257: nop
     258: checkcast     #121                // class java/lang/Iterable
     261: nop
     262: astore        12
     264: aload         8
     266: aload         12
     268: invokestatic  #150                // Method kotlin/collections/CollectionsKt.addAll:(Ljava/util/Collection;Ljava/lang/Iterable;)Z
     271: pop
     272: goto          123
     275: aload         8
     277: checkcast     #22                 // class java/util/List
     280: nop
     281: checkcast     #121                // class java/lang/Iterable
     284: invokestatic  #154                // Method kotlin/collections/CollectionsKt.toMutableSet:(Ljava/lang/Iterable;)Ljava/util/Set;
     287: astore        4
     289: aload_2
     290: iconst_0
     291: aaload
     292: iconst_0
     293: iconst_0
     294: iastore
     295: new           #156                // class java/util/PriorityQueue
     298: dup
     299: invokedynamic #176,  0            // InvokeDynamic #0:invoke:()Lkotlin/jvm/functions/Function2;
     304: invokedynamic #187,  0            // InvokeDynamic #1:compare:(Lkotlin/jvm/functions/Function2;)Ljava/util/Comparator;
     309: invokespecial #190                // Method java/util/PriorityQueue."<init>":(Ljava/util/Comparator;)V
     312: astore        5
     314: aload         5
     316: new           #143                // class day15/Point
     319: dup
     320: iconst_0
     321: iconst_0
     322: invokespecial #146                // Method day15/Point."<init>":(II)V
     325: iconst_0
     326: invokestatic  #60                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     329: invokestatic  #196                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     332: invokevirtual #197                // Method java/util/PriorityQueue.add:(Ljava/lang/Object;)Z
     335: pop
     336: aload         5
     338: checkcast     #44                 // class java/util/Collection
     341: invokeinterface #200,  1          // InterfaceMethod java/util/Collection.isEmpty:()Z
     346: ifne          353
     349: iconst_1
     350: goto          354
     353: iconst_0
     354: ifeq          541
     357: aload         5
     359: invokevirtual #204                // Method java/util/PriorityQueue.poll:()Ljava/lang/Object;
     362: checkcast     #206                // class kotlin/Pair
     365: astore        6
     367: aload         6
     369: invokevirtual #209                // Method kotlin/Pair.component1:()Ljava/lang/Object;
     372: checkcast     #143                // class day15/Point
     375: astore        7
     377: aload         6
     379: invokevirtual #212                // Method kotlin/Pair.component2:()Ljava/lang/Object;
     382: checkcast     #214                // class java/lang/Number
     385: invokevirtual #217                // Method java/lang/Number.intValue:()I
     388: istore        8
     390: aload         7
     392: iload_0
     393: invokestatic  #221                // Method adjacents:(Lday15/Point;I)Ljava/util/Set;
     396: invokeinterface #224,  1          // InterfaceMethod java/util/Set.iterator:()Ljava/util/Iterator;
     401: astore        9
     403: aload         9
     405: invokeinterface #132,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     410: ifeq          528
     413: aload         9
     415: invokeinterface #227,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     420: checkcast     #143                // class day15/Point
     423: astore        10
     425: aload         4
     427: aload         10
     429: invokeinterface #230,  2          // InterfaceMethod java/util/Set.contains:(Ljava/lang/Object;)Z
     434: ifeq          403
     437: aload_1
     438: aload         10
     440: invokevirtual #233                // Method day15/Point.getY:()I
     443: aaload
     444: aload         10
     446: invokevirtual #236                // Method day15/Point.getX:()I
     449: iaload
     450: istore        11
     452: aload_2
     453: aload         10
     455: invokevirtual #233                // Method day15/Point.getY:()I
     458: aaload
     459: aload         10
     461: invokevirtual #236                // Method day15/Point.getX:()I
     464: iaload
     465: istore        12
     467: iload         11
     469: iload         8
     471: iadd
     472: iload         12
     474: if_icmpge     403
     477: aload_2
     478: aload         10
     480: invokevirtual #233                // Method day15/Point.getY:()I
     483: aaload
     484: aload         10
     486: invokevirtual #236                // Method day15/Point.getX:()I
     489: iload         11
     491: iload         8
     493: iadd
     494: iastore
     495: aload_3
     496: aload         10
     498: aload         7
     500: invokeinterface #239,  3          // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
     505: pop
     506: aload         5
     508: aload         10
     510: iload         11
     512: iload         8
     514: iadd
     515: invokestatic  #60                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     518: invokestatic  #196                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     521: invokevirtual #242                // Method java/util/PriorityQueue.offer:(Ljava/lang/Object;)Z
     524: pop
     525: goto          403
     528: aload         4
     530: aload         7
     532: invokeinterface #245,  2          // InterfaceMethod java/util/Set.remove:(Ljava/lang/Object;)Z
     537: pop
     538: goto          336
     541: aload_2
     542: areturn

  public static final java.util.Set<day15.Point> adjacents(day15.Point, int);
    Code:
       0: aload_0
       1: ldc_w         #272                // String <this>
       4: invokestatic  #278                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       7: new           #280                // class java/util/LinkedHashSet
      10: dup
      11: invokespecial #281                // Method java/util/LinkedHashSet."<init>":()V
      14: checkcast     #223                // class java/util/Set
      17: astore_2
      18: aload_0
      19: invokevirtual #236                // Method day15/Point.getX:()I
      22: ifle          49
      25: aload_2
      26: new           #143                // class day15/Point
      29: dup
      30: aload_0
      31: invokevirtual #236                // Method day15/Point.getX:()I
      34: iconst_1
      35: isub
      36: aload_0
      37: invokevirtual #233                // Method day15/Point.getY:()I
      40: invokespecial #146                // Method day15/Point."<init>":(II)V
      43: invokeinterface #282,  2          // InterfaceMethod java/util/Set.add:(Ljava/lang/Object;)Z
      48: pop
      49: aload_0
      50: invokevirtual #236                // Method day15/Point.getX:()I
      53: iload_1
      54: if_icmpge     81
      57: aload_2
      58: new           #143                // class day15/Point
      61: dup
      62: aload_0
      63: invokevirtual #236                // Method day15/Point.getX:()I
      66: iconst_1
      67: iadd
      68: aload_0
      69: invokevirtual #233                // Method day15/Point.getY:()I
      72: invokespecial #146                // Method day15/Point."<init>":(II)V
      75: invokeinterface #282,  2          // InterfaceMethod java/util/Set.add:(Ljava/lang/Object;)Z
      80: pop
      81: aload_0
      82: invokevirtual #233                // Method day15/Point.getY:()I
      85: ifle          112
      88: aload_2
      89: new           #143                // class day15/Point
      92: dup
      93: aload_0
      94: invokevirtual #236                // Method day15/Point.getX:()I
      97: aload_0
      98: invokevirtual #233                // Method day15/Point.getY:()I
     101: iconst_1
     102: isub
     103: invokespecial #146                // Method day15/Point."<init>":(II)V
     106: invokeinterface #282,  2          // InterfaceMethod java/util/Set.add:(Ljava/lang/Object;)Z
     111: pop
     112: aload_0
     113: invokevirtual #233                // Method day15/Point.getY:()I
     116: iload_1
     117: if_icmpge     144
     120: aload_2
     121: new           #143                // class day15/Point
     124: dup
     125: aload_0
     126: invokevirtual #236                // Method day15/Point.getX:()I
     129: aload_0
     130: invokevirtual #233                // Method day15/Point.getY:()I
     133: iconst_1
     134: iadd
     135: invokespecial #146                // Method day15/Point."<init>":(II)V
     138: invokeinterface #282,  2          // InterfaceMethod java/util/Set.add:(Ljava/lang/Object;)Z
     143: pop
     144: aload_2
     145: areturn

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #287                // Method main:()V
       3: return

  private static final int findMinimumRiskLevels$lambda$3(kotlin.Pair, kotlin.Pair);
    Code:
       0: aload_0
       1: invokevirtual #292                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
       4: checkcast     #214                // class java/lang/Number
       7: invokevirtual #217                // Method java/lang/Number.intValue:()I
      10: aload_1
      11: invokevirtual #292                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
      14: checkcast     #214                // class java/lang/Number
      17: invokevirtual #217                // Method java/lang/Number.intValue:()I
      20: isub
      21: ireturn

  private static final int findMinimumRiskLevels$lambda$4(kotlin.jvm.functions.Function2, java.lang.Object, java.lang.Object);
    Code:
       0: aload_0
       1: aload_1
       2: aload_2
       3: invokeinterface #299,  3          // InterfaceMethod kotlin/jvm/functions/Function2.invoke:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
       8: checkcast     #214                // class java/lang/Number
      11: invokevirtual #217                // Method java/lang/Number.intValue:()I
      14: ireturn
}


package day14

import java.io.File
import java.util.*

fun main() {
    var template: List<Char> = LinkedList()
    var pairInsertionsRules: Map<Pair<Char, Char>, Char> = emptyMap()
    File("src/main/kotlin/day14/input.txt").useLines { linesSequence ->
        val linesIterator = linesSequence.iterator()
        template = List(1) { linesIterator.next() }.first().toCollection(LinkedList<Char>())
        linesIterator.next()
        pairInsertionsRules = linesIterator.asSequence().map {
            (it.substringBefore(" -> ").first() to it.substringBefore(" -> ").last()) to it.substringAfter(" -> ")
                .first()
        }.toMap()
    }
    val edgeCharacters = arrayOf(template.first(), template.last()).groupBy { it }.mapValues { it.value.count() }

    val initialPairCount: Map<Pair<Char, Char>, Long> =
        template.windowed(2).map { it[0] to it[1] }.groupBy { it }.mapValues { it.value.size.toLong() }

    val pairCountAfter10Steps = (0..9).fold(initialPairCount) { acc, _ ->
        acc.react(pairInsertionsRules)
    }
    val characterCountAfter10Steps = pairCountAfter10Steps.frequencies(edgeCharacters)
    println(characterCountAfter10Steps.maxMinDiff())

    val pairCountAfter40Steps = (0..29).fold(pairCountAfter10Steps) { acc, _ ->
        acc.react(pairInsertionsRules)
    }
    val characterCountAfter40Steps = pairCountAfter40Steps.frequencies(edgeCharacters)
    println(characterCountAfter40Steps.maxMinDiff())

}

fun Map<Pair<Char, Char>, Long>.react(pairInsertionsRules: Map<Pair<Char, Char>, Char>): Map<Pair<Char, Char>, Long> =
    buildMap {
        this@react.forEach { entry ->
            val originalPair = entry.key
            val newChar = pairInsertionsRules.getValue(originalPair)
            val pairOne = originalPair.first to newChar
            val pairTwo = newChar to originalPair.second
            val originalPairCount = entry.value
            merge(pairOne, originalPairCount) { a, b -> a + b }
            merge(pairTwo, originalPairCount) { a, b -> a + b }
        }
    }

fun Map<Pair<Char, Char>, Long>.frequencies(edgeCharacters: Map<Char, Int>): Map<Char, Long> =
    this.flatMap { listOf(it.key.first to it.value, it.key.second to it.value) }
        .groupBy({ it.first }, { it.second })
        .mapValues { it.value.sum() + (edgeCharacters[it.key] ?: 0) }

fun Map<Char, Long>.maxMinDiff() = this.maxOf { it.value } / 2 - this.minOf { it.value } / 2

Compiled from "solution.kt"
public final class day14.SolutionKt {
  public static final void main();
    Code:
       0: new           #10                 // class kotlin/jvm/internal/Ref$ObjectRef
       3: dup
       4: invokespecial #13                 // Method kotlin/jvm/internal/Ref$ObjectRef."<init>":()V
       7: astore_0
       8: aload_0
       9: new           #15                 // class java/util/LinkedList
      12: dup
      13: invokespecial #16                 // Method java/util/LinkedList."<init>":()V
      16: putfield      #20                 // Field kotlin/jvm/internal/Ref$ObjectRef.element:Ljava/lang/Object;
      19: aconst_null
      20: astore_1
      21: invokestatic  #26                 // Method kotlin/collections/MapsKt.emptyMap:()Ljava/util/Map;
      24: astore_1
      25: new           #28                 // class java/io/File
      28: dup
      29: ldc           #30                 // String src/main/kotlin/day14/input.txt
      31: invokespecial #33                 // Method java/io/File."<init>":(Ljava/lang/String;)V
      34: astore_2
      35: getstatic     #39                 // Field kotlin/text/Charsets.UTF_8:Ljava/nio/charset/Charset;
      38: astore_3
      39: iconst_0
      40: istore        4
      42: aload_2
      43: astore        5
      45: sipush        8192
      48: istore        6
      50: aload         5
      52: astore        7
      54: new           #41                 // class java/io/InputStreamReader
      57: dup
      58: new           #43                 // class java/io/FileInputStream
      61: dup
      62: aload         7
      64: invokespecial #46                 // Method java/io/FileInputStream."<init>":(Ljava/io/File;)V
      67: checkcast     #48                 // class java/io/InputStream
      70: aload_3
      71: invokespecial #51                 // Method java/io/InputStreamReader."<init>":(Ljava/io/InputStream;Ljava/nio/charset/Charset;)V
      74: checkcast     #53                 // class java/io/Reader
      77: astore        7
      79: aload         7
      81: instanceof    #55                 // class java/io/BufferedReader
      84: ifeq          95
      87: aload         7
      89: checkcast     #55                 // class java/io/BufferedReader
      92: goto          106
      95: new           #55                 // class java/io/BufferedReader
      98: dup
      99: aload         7
     101: iload         6
     103: invokespecial #58                 // Method java/io/BufferedReader."<init>":(Ljava/io/Reader;I)V
     106: checkcast     #60                 // class java/io/Closeable
     109: astore        5
     111: aconst_null
     112: astore        6
     114: nop
     115: aload         5
     117: checkcast     #55                 // class java/io/BufferedReader
     120: astore        7
     122: iconst_0
     123: istore        8
     125: aload         7
     127: invokestatic  #66                 // Method kotlin/io/TextStreamsKt.lineSequence:(Ljava/io/BufferedReader;)Lkotlin/sequences/Sequence;
     130: astore        9
     132: iconst_0
     133: istore        10
     135: aload         9
     137: invokeinterface #72,  1           // InterfaceMethod kotlin/sequences/Sequence.iterator:()Ljava/util/Iterator;
     142: astore        11
     144: aload_0
     145: iconst_1
     146: istore        12
     148: astore        13
     150: new           #74                 // class java/util/ArrayList
     153: dup
     154: iload         12
     156: invokespecial #77                 // Method java/util/ArrayList."<init>":(I)V
     159: astore        14
     161: iconst_0
     162: istore        15
     164: iload         15
     166: iload         12
     168: if_icmpge     209
     171: iload         15
     173: istore        16
     175: aload         14
     177: iload         16
     179: istore        17
     181: astore        18
     183: iconst_0
     184: istore        19
     186: aload         11
     188: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     193: checkcast     #85                 // class java/lang/String
     196: aload         18
     198: swap
     199: invokevirtual #89                 // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
     202: pop
     203: iinc          15, 1
     206: goto          164
     209: aload         14
     211: checkcast     #91                 // class java/util/List
     214: aload         13
     216: swap
     217: invokestatic  #97                 // Method kotlin/collections/CollectionsKt.first:(Ljava/util/List;)Ljava/lang/Object;
     220: checkcast     #99                 // class java/lang/CharSequence
     223: new           #15                 // class java/util/LinkedList
     226: dup
     227: invokespecial #16                 // Method java/util/LinkedList."<init>":()V
     230: checkcast     #101                // class java/util/Collection
     233: invokestatic  #107                // Method kotlin/text/StringsKt.toCollection:(Ljava/lang/CharSequence;Ljava/util/Collection;)Ljava/util/Collection;
     236: putfield      #20                 // Field kotlin/jvm/internal/Ref$ObjectRef.element:Ljava/lang/Object;
     239: aload         11
     241: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     246: pop
     247: aload         11
     249: invokestatic  #113                // Method kotlin/sequences/SequencesKt.asSequence:(Ljava/util/Iterator;)Lkotlin/sequences/Sequence;
     252: invokedynamic #132,  0            // InvokeDynamic #0:invoke:()Lkotlin/jvm/functions/Function1;
     257: invokestatic  #136                // Method kotlin/sequences/SequencesKt.map:(Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence;
     260: invokestatic  #140                // Method kotlin/collections/MapsKt.toMap:(Lkotlin/sequences/Sequence;)Ljava/util/Map;
     263: astore_1
     264: nop
     265: getstatic     #146                // Field kotlin/Unit.INSTANCE:Lkotlin/Unit;
     268: astore        7
     270: aload         5
     272: aload         6
     274: invokestatic  #152                // Method kotlin/io/CloseableKt.closeFinally:(Ljava/io/Closeable;Ljava/lang/Throwable;)V
     277: goto          301
     280: astore        8
     282: aload         8
     284: astore        6
     286: aload         8
     288: athrow
     289: astore        8
     291: aload         5
     293: aload         6
     295: invokestatic  #152                // Method kotlin/io/CloseableKt.closeFinally:(Ljava/io/Closeable;Ljava/lang/Throwable;)V
     298: aload         8
     300: athrow
     301: nop
     302: iconst_2
     303: anewarray     #154                // class java/lang/Character
     306: astore_3
     307: aload_3
     308: iconst_0
     309: aload_0
     310: getfield      #20                 // Field kotlin/jvm/internal/Ref$ObjectRef.element:Ljava/lang/Object;
     313: checkcast     #91                 // class java/util/List
     316: invokestatic  #97                 // Method kotlin/collections/CollectionsKt.first:(Ljava/util/List;)Ljava/lang/Object;
     319: aastore
     320: aload_3
     321: iconst_1
     322: aload_0
     323: getfield      #20                 // Field kotlin/jvm/internal/Ref$ObjectRef.element:Ljava/lang/Object;
     326: checkcast     #91                 // class java/util/List
     329: invokestatic  #157                // Method kotlin/collections/CollectionsKt.last:(Ljava/util/List;)Ljava/lang/Object;
     332: aastore
     333: aload_3
     334: astore_3
     335: iconst_0
     336: istore        4
     338: aload_3
     339: astore        5
     341: new           #159                // class java/util/LinkedHashMap
     344: dup
     345: invokespecial #160                // Method java/util/LinkedHashMap."<init>":()V
     348: checkcast     #162                // class java/util/Map
     351: astore        6
     353: iconst_0
     354: istore        7
     356: iconst_0
     357: istore        8
     359: aload         5
     361: arraylength
     362: istore        9
     364: iload         8
     366: iload         9
     368: if_icmpge     474
     371: aload         5
     373: iload         8
     375: aaload
     376: astore        10
     378: aload         10
     380: invokevirtual #166                // Method java/lang/Character.charValue:()C
     383: istore        11
     385: iconst_0
     386: istore        12
     388: iload         11
     390: invokestatic  #170                // Method java/lang/Character.valueOf:(C)Ljava/lang/Character;
     393: astore        13
     395: aload         6
     397: astore        14
     399: iconst_0
     400: istore        15
     402: aload         14
     404: aload         13
     406: invokeinterface #173,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     411: astore        16
     413: aload         16
     415: ifnonnull     450
     418: iconst_0
     419: istore        17
     421: new           #74                 // class java/util/ArrayList
     424: dup
     425: invokespecial #174                // Method java/util/ArrayList."<init>":()V
     428: checkcast     #91                 // class java/util/List
     431: astore        17
     433: aload         14
     435: aload         13
     437: aload         17
     439: invokeinterface #178,  3          // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
     444: pop
     445: aload         17
     447: goto          452
     450: aload         16
     452: nop
     453: checkcast     #91                 // class java/util/List
     456: astore        11
     458: aload         11
     460: aload         10
     462: invokeinterface #179,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
     467: pop
     468: iinc          8, 1
     471: goto          364
     474: aload         6
     476: nop
     477: astore_3
     478: nop
     479: iconst_0
     480: istore        4
     482: aload_3
     483: astore        5
     485: new           #159                // class java/util/LinkedHashMap
     488: dup
     489: aload_3
     490: invokeinterface #183,  1          // InterfaceMethod java/util/Map.size:()I
     495: invokestatic  #187                // Method kotlin/collections/MapsKt.mapCapacity:(I)I
     498: invokespecial #188                // Method java/util/LinkedHashMap."<init>":(I)V
     501: checkcast     #162                // class java/util/Map
     504: astore        6
     506: iconst_0
     507: istore        7
     509: aload         5
     511: invokeinterface #192,  1          // InterfaceMethod java/util/Map.entrySet:()Ljava/util/Set;
     516: checkcast     #194                // class java/lang/Iterable
     519: astore        8
     521: iconst_0
     522: istore        9
     524: aload         8
     526: invokeinterface #195,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     531: astore        10
     533: aload         10
     535: invokeinterface #199,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     540: ifeq          626
     543: aload         10
     545: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     550: astore        11
     552: aload         6
     554: aload         11
     556: checkcast     #201                // class java/util/Map$Entry
     559: astore        12
     561: astore        13
     563: iconst_0
     564: istore        14
     566: aload         12
     568: invokeinterface #204,  1          // InterfaceMethod java/util/Map$Entry.getKey:()Ljava/lang/Object;
     573: aload         13
     575: swap
     576: aload         11
     578: checkcast     #201                // class java/util/Map$Entry
     581: astore        15
     583: astore        21
     585: astore        20
     587: iconst_0
     588: istore        16
     590: aload         15
     592: invokeinterface #207,  1          // InterfaceMethod java/util/Map$Entry.getValue:()Ljava/lang/Object;
     597: checkcast     #101                // class java/util/Collection
     600: invokeinterface #208,  1          // InterfaceMethod java/util/Collection.size:()I
     605: nop
     606: invokestatic  #213                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     609: astore        22
     611: aload         20
     613: aload         21
     615: aload         22
     617: invokeinterface #178,  3          // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
     622: pop
     623: goto          533
     626: aload         6
     628: nop
     629: nop
     630: astore_2
     631: aload_0
     632: getfield      #20                 // Field kotlin/jvm/internal/Ref$ObjectRef.element:Ljava/lang/Object;
     635: checkcast     #194                // class java/lang/Iterable
     638: iconst_2
     639: iconst_0
     640: iconst_0
     641: bipush        6
     643: aconst_null
     644: invokestatic  #217                // Method kotlin/collections/CollectionsKt.windowed$default:(Ljava/lang/Iterable;IIZILjava/lang/Object;)Ljava/util/List;
     647: checkcast     #194                // class java/lang/Iterable
     650: astore        4
     652: iconst_0
     653: istore        5
     655: aload         4
     657: astore        6
     659: new           #74                 // class java/util/ArrayList
     662: dup
     663: aload         4
     665: bipush        10
     667: invokestatic  #221                // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     670: invokespecial #77                 // Method java/util/ArrayList."<init>":(I)V
     673: checkcast     #101                // class java/util/Collection
     676: astore        7
     678: iconst_0
     679: istore        8
     681: aload         6
     683: invokeinterface #195,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     688: astore        9
     690: aload         9
     692: invokeinterface #199,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     697: ifeq          754
     700: aload         9
     702: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     707: astore        10
     709: aload         7
     711: aload         10
     713: checkcast     #91                 // class java/util/List
     716: astore        11
     718: astore        20
     720: iconst_0
     721: istore        12
     723: aload         11
     725: iconst_0
     726: invokeinterface #224,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     731: aload         11
     733: iconst_1
     734: invokeinterface #224,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     739: invokestatic  #230                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     742: aload         20
     744: swap
     745: invokeinterface #231,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     750: pop
     751: goto          690
     754: aload         7
     756: checkcast     #91                 // class java/util/List
     759: nop
     760: checkcast     #194                // class java/lang/Iterable
     763: astore        4
     765: nop
     766: iconst_0
     767: istore        5
     769: aload         4
     771: astore        6
     773: new           #159                // class java/util/LinkedHashMap
     776: dup
     777: invokespecial #160                // Method java/util/LinkedHashMap."<init>":()V
     780: checkcast     #162                // class java/util/Map
     783: astore        7
     785: iconst_0
     786: istore        8
     788: aload         6
     790: invokeinterface #195,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     795: astore        9
     797: aload         9
     799: invokeinterface #199,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     804: ifeq          906
     807: aload         9
     809: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     814: astore        10
     816: aload         10
     818: checkcast     #233                // class kotlin/Pair
     821: astore        11
     823: iconst_0
     824: istore        12
     826: aload         11
     828: astore        13
     830: aload         7
     832: astore        14
     834: iconst_0
     835: istore        15
     837: aload         14
     839: aload         13
     841: invokeinterface #173,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     846: astore        16
     848: aload         16
     850: ifnonnull     885
     853: iconst_0
     854: istore        17
     856: new           #74                 // class java/util/ArrayList
     859: dup
     860: invokespecial #174                // Method java/util/ArrayList."<init>":()V
     863: checkcast     #91                 // class java/util/List
     866: astore        17
     868: aload         14
     870: aload         13
     872: aload         17
     874: invokeinterface #178,  3          // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
     879: pop
     880: aload         17
     882: goto          887
     885: aload         16
     887: nop
     888: checkcast     #91                 // class java/util/List
     891: astore        11
     893: aload         11
     895: aload         10
     897: invokeinterface #179,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
     902: pop
     903: goto          797
     906: aload         7
     908: nop
     909: astore        4
     911: nop
     912: iconst_0
     913: istore        5
     915: aload         4
     917: astore        6
     919: new           #159                // class java/util/LinkedHashMap
     922: dup
     923: aload         4
     925: invokeinterface #183,  1          // InterfaceMethod java/util/Map.size:()I
     930: invokestatic  #187                // Method kotlin/collections/MapsKt.mapCapacity:(I)I
     933: invokespecial #188                // Method java/util/LinkedHashMap."<init>":(I)V
     936: checkcast     #162                // class java/util/Map
     939: astore        7
     941: iconst_0
     942: istore        8
     944: aload         6
     946: invokeinterface #192,  1          // InterfaceMethod java/util/Map.entrySet:()Ljava/util/Set;
     951: checkcast     #194                // class java/lang/Iterable
     954: astore        9
     956: iconst_0
     957: istore        10
     959: aload         9
     961: invokeinterface #195,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     966: astore        11
     968: aload         11
     970: invokeinterface #199,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     975: ifeq          1061
     978: aload         11
     980: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     985: astore        12
     987: aload         7
     989: aload         12
     991: checkcast     #201                // class java/util/Map$Entry
     994: astore        13
     996: astore        14
     998: iconst_0
     999: istore        15
    1001: aload         13
    1003: invokeinterface #204,  1          // InterfaceMethod java/util/Map$Entry.getKey:()Ljava/lang/Object;
    1008: aload         14
    1010: swap
    1011: aload         12
    1013: checkcast     #201                // class java/util/Map$Entry
    1016: astore        16
    1018: astore        21
    1020: astore        20
    1022: iconst_0
    1023: istore        17
    1025: aload         16
    1027: invokeinterface #207,  1          // InterfaceMethod java/util/Map$Entry.getValue:()Ljava/lang/Object;
    1032: checkcast     #91                 // class java/util/List
    1035: invokeinterface #234,  1          // InterfaceMethod java/util/List.size:()I
    1040: i2l
    1041: invokestatic  #239                // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
    1044: astore        22
    1046: aload         20
    1048: aload         21
    1050: aload         22
    1052: invokeinterface #178,  3          // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    1057: pop
    1058: goto          968
    1061: aload         7
    1063: nop
    1064: nop
    1065: astore_3
    1066: new           #241                // class kotlin/ranges/IntRange
    1069: dup
    1070: iconst_0
    1071: bipush        9
    1073: invokespecial #244                // Method kotlin/ranges/IntRange."<init>":(II)V
    1076: checkcast     #194                // class java/lang/Iterable
    1079: astore        5
    1081: iconst_0
    1082: istore        6
    1084: aload_3
    1085: astore        7
    1087: aload         5
    1089: invokeinterface #195,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
    1094: astore        8
    1096: aload         8
    1098: invokeinterface #199,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
    1103: ifeq          1134
    1106: aload         8
    1108: checkcast     #246                // class kotlin/collections/IntIterator
    1111: invokevirtual #249                // Method kotlin/collections/IntIterator.nextInt:()I
    1114: istore        9
    1116: aload         7
    1118: astore        11
    1120: iconst_0
    1121: istore        12
    1123: aload         11
    1125: aload_1
    1126: invokestatic  #253                // Method react:(Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map;
    1129: astore        7
    1131: goto          1096
    1134: aload         7
    1136: astore        4
    1138: aload         4
    1140: aload_2
    1141: invokestatic  #256                // Method frequencies:(Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map;
    1144: astore        5
    1146: aload         5
    1148: invokestatic  #260                // Method maxMinDiff:(Ljava/util/Map;)J
    1151: lstore        6
    1153: getstatic     #266                // Field java/lang/System.out:Ljava/io/PrintStream;
    1156: lload         6
    1158: invokevirtual #272                // Method java/io/PrintStream.println:(J)V
    1161: new           #241                // class kotlin/ranges/IntRange
    1164: dup
    1165: iconst_0
    1166: bipush        29
    1168: invokespecial #244                // Method kotlin/ranges/IntRange."<init>":(II)V
    1171: checkcast     #194                // class java/lang/Iterable
    1174: astore        7
    1176: iconst_0
    1177: istore        8
    1179: aload         4
    1181: astore        9
    1183: aload         7
    1185: invokeinterface #195,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
    1190: astore        10
    1192: aload         10
    1194: invokeinterface #199,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
    1199: ifeq          1230
    1202: aload         10
    1204: checkcast     #246                // class kotlin/collections/IntIterator
    1207: invokevirtual #249                // Method kotlin/collections/IntIterator.nextInt:()I
    1210: istore        11
    1212: aload         9
    1214: astore        13
    1216: iconst_0
    1217: istore        14
    1219: aload         13
    1221: aload_1
    1222: invokestatic  #253                // Method react:(Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map;
    1225: astore        9
    1227: goto          1192
    1230: aload         9
    1232: astore        6
    1234: aload         6
    1236: aload_2
    1237: invokestatic  #256                // Method frequencies:(Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map;
    1240: astore        7
    1242: aload         7
    1244: invokestatic  #260                // Method maxMinDiff:(Ljava/util/Map;)J
    1247: lstore        8
    1249: getstatic     #266                // Field java/lang/System.out:Ljava/io/PrintStream;
    1252: lload         8
    1254: invokevirtual #272                // Method java/io/PrintStream.println:(J)V
    1257: return
    Exception table:
       from    to  target type
         114   270   280   Class java/lang/Throwable
         114   270   289   any
         280   289   289   any
         289   291   289   any

  public static final java.util.Map<kotlin.Pair<java.lang.Character, java.lang.Character>, java.lang.Long> react(java.util.Map<kotlin.Pair<java.lang.Character, java.lang.Character>, java.lang.Long>, java.util.Map<kotlin.Pair<java.lang.Character, java.lang.Character>, java.lang.Character>);
    Code:
       0: aload_0
       1: ldc_w         #352                // String <this>
       4: invokestatic  #358                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       7: aload_1
       8: ldc_w         #359                // String pairInsertionsRules
      11: invokestatic  #358                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      14: invokestatic  #362                // Method kotlin/collections/MapsKt.createMapBuilder:()Ljava/util/Map;
      17: astore_2
      18: aload_2
      19: astore_3
      20: iconst_0
      21: istore        4
      23: aload_0
      24: astore        5
      26: iconst_0
      27: istore        6
      29: aload         5
      31: invokeinterface #192,  1          // InterfaceMethod java/util/Map.entrySet:()Ljava/util/Set;
      36: invokeinterface #365,  1          // InterfaceMethod java/util/Set.iterator:()Ljava/util/Iterator;
      41: astore        7
      43: aload         7
      45: invokeinterface #199,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
      50: ifeq          196
      53: aload         7
      55: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      60: checkcast     #201                // class java/util/Map$Entry
      63: astore        8
      65: aload         8
      67: astore        9
      69: iconst_0
      70: istore        10
      72: aload         9
      74: invokeinterface #204,  1          // InterfaceMethod java/util/Map$Entry.getKey:()Ljava/lang/Object;
      79: checkcast     #233                // class kotlin/Pair
      82: astore        11
      84: aload_1
      85: aload         11
      87: invokestatic  #368                // Method kotlin/collections/MapsKt.getValue:(Ljava/util/Map;Ljava/lang/Object;)Ljava/lang/Object;
      90: checkcast     #154                // class java/lang/Character
      93: invokevirtual #166                // Method java/lang/Character.charValue:()C
      96: istore        12
      98: aload         11
     100: invokevirtual #371                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     103: iload         12
     105: invokestatic  #170                // Method java/lang/Character.valueOf:(C)Ljava/lang/Character;
     108: invokestatic  #230                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     111: astore        13
     113: iload         12
     115: invokestatic  #170                // Method java/lang/Character.valueOf:(C)Ljava/lang/Character;
     118: aload         11
     120: invokevirtual #374                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     123: invokestatic  #230                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     126: astore        14
     128: aload         9
     130: invokeinterface #207,  1          // InterfaceMethod java/util/Map$Entry.getValue:()Ljava/lang/Object;
     135: checkcast     #376                // class java/lang/Number
     138: invokevirtual #380                // Method java/lang/Number.longValue:()J
     141: lstore        15
     143: aload_3
     144: aload         13
     146: lload         15
     148: invokestatic  #239                // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     151: invokedynamic #390,  0            // InvokeDynamic #1:invoke:()Lkotlin/jvm/functions/Function2;
     156: invokedynamic #401,  0            // InvokeDynamic #2:apply:(Lkotlin/jvm/functions/Function2;)Ljava/util/function/BiFunction;
     161: invokeinterface #405,  4          // InterfaceMethod java/util/Map.merge:(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;
     166: pop
     167: aload_3
     168: aload         14
     170: lload         15
     172: invokestatic  #239                // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     175: invokedynamic #410,  0            // InvokeDynamic #3:invoke:()Lkotlin/jvm/functions/Function2;
     180: invokedynamic #415,  0            // InvokeDynamic #4:apply:(Lkotlin/jvm/functions/Function2;)Ljava/util/function/BiFunction;
     185: invokeinterface #405,  4          // InterfaceMethod java/util/Map.merge:(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;
     190: pop
     191: nop
     192: nop
     193: goto          43
     196: nop
     197: nop
     198: aload_2
     199: invokestatic  #419                // Method kotlin/collections/MapsKt.build:(Ljava/util/Map;)Ljava/util/Map;
     202: areturn

  public static final java.util.Map<java.lang.Character, java.lang.Long> frequencies(java.util.Map<kotlin.Pair<java.lang.Character, java.lang.Character>, java.lang.Long>, java.util.Map<java.lang.Character, java.lang.Integer>);
    Code:
       0: aload_0
       1: ldc_w         #352                // String <this>
       4: invokestatic  #358                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       7: aload_1
       8: ldc_w         #434                // String edgeCharacters
      11: invokestatic  #358                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      14: aload_0
      15: astore_2
      16: iconst_0
      17: istore_3
      18: aload_2
      19: astore        4
      21: new           #74                 // class java/util/ArrayList
      24: dup
      25: invokespecial #174                // Method java/util/ArrayList."<init>":()V
      28: checkcast     #101                // class java/util/Collection
      31: astore        5
      33: iconst_0
      34: istore        6
      36: aload         4
      38: invokeinterface #192,  1          // InterfaceMethod java/util/Map.entrySet:()Ljava/util/Set;
      43: invokeinterface #365,  1          // InterfaceMethod java/util/Set.iterator:()Ljava/util/Iterator;
      48: astore        7
      50: aload         7
      52: invokeinterface #199,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
      57: ifeq          160
      60: aload         7
      62: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      67: checkcast     #201                // class java/util/Map$Entry
      70: astore        8
      72: aload         8
      74: astore        9
      76: iconst_0
      77: istore        10
      79: iconst_2
      80: anewarray     #233                // class kotlin/Pair
      83: astore        11
      85: aload         11
      87: iconst_0
      88: aload         9
      90: invokeinterface #204,  1          // InterfaceMethod java/util/Map$Entry.getKey:()Ljava/lang/Object;
      95: checkcast     #233                // class kotlin/Pair
      98: invokevirtual #371                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     101: aload         9
     103: invokeinterface #207,  1          // InterfaceMethod java/util/Map$Entry.getValue:()Ljava/lang/Object;
     108: invokestatic  #230                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     111: aastore
     112: aload         11
     114: iconst_1
     115: aload         9
     117: invokeinterface #204,  1          // InterfaceMethod java/util/Map$Entry.getKey:()Ljava/lang/Object;
     122: checkcast     #233                // class kotlin/Pair
     125: invokevirtual #374                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     128: aload         9
     130: invokeinterface #207,  1          // InterfaceMethod java/util/Map$Entry.getValue:()Ljava/lang/Object;
     135: invokestatic  #230                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     138: aastore
     139: aload         11
     141: invokestatic  #438                // Method kotlin/collections/CollectionsKt.listOf:([Ljava/lang/Object;)Ljava/util/List;
     144: checkcast     #194                // class java/lang/Iterable
     147: astore        9
     149: aload         5
     151: aload         9
     153: invokestatic  #442                // Method kotlin/collections/CollectionsKt.addAll:(Ljava/util/Collection;Ljava/lang/Iterable;)Z
     156: pop
     157: goto          50
     160: aload         5
     162: checkcast     #91                 // class java/util/List
     165: nop
     166: checkcast     #194                // class java/lang/Iterable
     169: astore_2
     170: nop
     171: iconst_0
     172: istore_3
     173: aload_2
     174: astore        4
     176: new           #159                // class java/util/LinkedHashMap
     179: dup
     180: invokespecial #160                // Method java/util/LinkedHashMap."<init>":()V
     183: checkcast     #162                // class java/util/Map
     186: astore        5
     188: iconst_0
     189: istore        6
     191: aload         4
     193: invokeinterface #195,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     198: astore        7
     200: aload         7
     202: invokeinterface #199,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     207: ifeq          348
     210: aload         7
     212: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     217: astore        8
     219: aload         8
     221: checkcast     #233                // class kotlin/Pair
     224: astore        9
     226: iconst_0
     227: istore        10
     229: aload         9
     231: invokevirtual #371                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     234: checkcast     #154                // class java/lang/Character
     237: invokevirtual #166                // Method java/lang/Character.charValue:()C
     240: invokestatic  #170                // Method java/lang/Character.valueOf:(C)Ljava/lang/Character;
     243: astore        11
     245: aload         5
     247: astore        12
     249: iconst_0
     250: istore        13
     252: aload         12
     254: aload         11
     256: invokeinterface #173,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     261: astore        14
     263: aload         14
     265: ifnonnull     300
     268: iconst_0
     269: istore        15
     271: new           #74                 // class java/util/ArrayList
     274: dup
     275: invokespecial #174                // Method java/util/ArrayList."<init>":()V
     278: checkcast     #91                 // class java/util/List
     281: astore        15
     283: aload         12
     285: aload         11
     287: aload         15
     289: invokeinterface #178,  3          // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
     294: pop
     295: aload         15
     297: goto          302
     300: aload         14
     302: nop
     303: checkcast     #91                 // class java/util/List
     306: astore        9
     308: aload         9
     310: aload         8
     312: checkcast     #233                // class kotlin/Pair
     315: astore        10
     317: astore        17
     319: iconst_0
     320: istore        16
     322: aload         10
     324: invokevirtual #374                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     327: checkcast     #376                // class java/lang/Number
     330: invokevirtual #380                // Method java/lang/Number.longValue:()J
     333: invokestatic  #239                // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     336: aload         17
     338: swap
     339: invokeinterface #179,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
     344: pop
     345: goto          200
     348: aload         5
     350: nop
     351: astore_2
     352: nop
     353: iconst_0
     354: istore_3
     355: aload_2
     356: astore        4
     358: new           #159                // class java/util/LinkedHashMap
     361: dup
     362: aload_2
     363: invokeinterface #183,  1          // InterfaceMethod java/util/Map.size:()I
     368: invokestatic  #187                // Method kotlin/collections/MapsKt.mapCapacity:(I)I
     371: invokespecial #188                // Method java/util/LinkedHashMap."<init>":(I)V
     374: checkcast     #162                // class java/util/Map
     377: astore        5
     379: iconst_0
     380: istore        6
     382: aload         4
     384: invokeinterface #192,  1          // InterfaceMethod java/util/Map.entrySet:()Ljava/util/Set;
     389: checkcast     #194                // class java/lang/Iterable
     392: astore        7
     394: iconst_0
     395: istore        8
     397: aload         7
     399: invokeinterface #195,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     404: astore        9
     406: aload         9
     408: invokeinterface #199,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     413: ifeq          526
     416: aload         9
     418: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     423: astore        10
     425: aload         5
     427: aload         10
     429: checkcast     #201                // class java/util/Map$Entry
     432: astore        11
     434: astore        12
     436: iconst_0
     437: istore        13
     439: aload         11
     441: invokeinterface #204,  1          // InterfaceMethod java/util/Map$Entry.getKey:()Ljava/lang/Object;
     446: aload         12
     448: swap
     449: aload         10
     451: checkcast     #201                // class java/util/Map$Entry
     454: astore        14
     456: astore        18
     458: astore        17
     460: iconst_0
     461: istore        15
     463: aload         14
     465: invokeinterface #207,  1          // InterfaceMethod java/util/Map$Entry.getValue:()Ljava/lang/Object;
     470: checkcast     #194                // class java/lang/Iterable
     473: invokestatic  #446                // Method kotlin/collections/CollectionsKt.sumOfLong:(Ljava/lang/Iterable;)J
     476: aload_1
     477: aload         14
     479: invokeinterface #204,  1          // InterfaceMethod java/util/Map$Entry.getKey:()Ljava/lang/Object;
     484: invokeinterface #173,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     489: checkcast     #210                // class java/lang/Integer
     492: dup
     493: ifnull        502
     496: invokevirtual #449                // Method java/lang/Integer.intValue:()I
     499: goto          504
     502: pop
     503: iconst_0
     504: i2l
     505: ladd
     506: invokestatic  #239                // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     509: astore        19
     511: aload         17
     513: aload         18
     515: aload         19
     517: invokeinterface #178,  3          // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
     522: pop
     523: goto          406
     526: aload         5
     528: nop
     529: nop
     530: areturn

  public static final long maxMinDiff(java.util.Map<java.lang.Character, java.lang.Long>);
    Code:
       0: aload_0
       1: ldc_w         #352                // String <this>
       4: invokestatic  #358                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       7: aload_0
       8: invokeinterface #192,  1          // InterfaceMethod java/util/Map.entrySet:()Ljava/util/Set;
      13: checkcast     #194                // class java/lang/Iterable
      16: invokeinterface #195,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      21: astore_2
      22: aload_2
      23: invokeinterface #199,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
      28: ifne          39
      31: new           #462                // class java/util/NoSuchElementException
      34: dup
      35: invokespecial #463                // Method java/util/NoSuchElementException."<init>":()V
      38: athrow
      39: aload_2
      40: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      45: checkcast     #201                // class java/util/Map$Entry
      48: astore_3
      49: iconst_0
      50: istore        5
      52: aload_3
      53: invokeinterface #207,  1          // InterfaceMethod java/util/Map$Entry.getValue:()Ljava/lang/Object;
      58: checkcast     #376                // class java/lang/Number
      61: invokevirtual #380                // Method java/lang/Number.longValue:()J
      64: lstore_3
      65: aload_2
      66: invokeinterface #199,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
      71: ifeq          116
      74: aload_2
      75: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      80: checkcast     #201                // class java/util/Map$Entry
      83: astore        5
      85: iconst_0
      86: istore        7
      88: aload         5
      90: invokeinterface #207,  1          // InterfaceMethod java/util/Map$Entry.getValue:()Ljava/lang/Object;
      95: checkcast     #376                // class java/lang/Number
      98: invokevirtual #380                // Method java/lang/Number.longValue:()J
     101: lstore        5
     103: lload_3
     104: lload         5
     106: lcmp
     107: ifge          65
     110: lload         5
     112: lstore_3
     113: goto          65
     116: lload_3
     117: iconst_2
     118: i2l
     119: ldiv
     120: aload_0
     121: astore_1
     122: lstore        8
     124: aload_1
     125: invokeinterface #192,  1          // InterfaceMethod java/util/Map.entrySet:()Ljava/util/Set;
     130: checkcast     #194                // class java/lang/Iterable
     133: invokeinterface #195,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     138: astore_2
     139: aload_2
     140: invokeinterface #199,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     145: ifne          156
     148: new           #462                // class java/util/NoSuchElementException
     151: dup
     152: invokespecial #463                // Method java/util/NoSuchElementException."<init>":()V
     155: athrow
     156: aload_2
     157: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     162: checkcast     #201                // class java/util/Map$Entry
     165: astore_3
     166: iconst_0
     167: istore        5
     169: aload_3
     170: invokeinterface #207,  1          // InterfaceMethod java/util/Map$Entry.getValue:()Ljava/lang/Object;
     175: checkcast     #376                // class java/lang/Number
     178: invokevirtual #380                // Method java/lang/Number.longValue:()J
     181: lstore_3
     182: aload_2
     183: invokeinterface #199,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     188: ifeq          233
     191: aload_2
     192: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     197: checkcast     #201                // class java/util/Map$Entry
     200: astore        5
     202: iconst_0
     203: istore        7
     205: aload         5
     207: invokeinterface #207,  1          // InterfaceMethod java/util/Map$Entry.getValue:()Ljava/lang/Object;
     212: checkcast     #376                // class java/lang/Number
     215: invokevirtual #380                // Method java/lang/Number.longValue:()J
     218: lstore        5
     220: lload_3
     221: lload         5
     223: lcmp
     224: ifle          182
     227: lload         5
     229: lstore_3
     230: goto          182
     233: lload_3
     234: lstore        10
     236: lload         8
     238: lload         10
     240: iconst_2
     241: i2l
     242: ldiv
     243: lsub
     244: lreturn

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #469                // Method main:()V
       3: return

  private static final kotlin.Pair main$lambda$2$lambda$1(java.lang.String);
    Code:
       0: aload_0
       1: ldc_w         #472                // String it
       4: invokestatic  #358                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       7: aload_0
       8: ldc_w         #474                // String  ->
      11: aconst_null
      12: iconst_2
      13: aconst_null
      14: invokestatic  #478                // Method kotlin/text/StringsKt.substringBefore$default:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String;
      17: checkcast     #99                 // class java/lang/CharSequence
      20: invokestatic  #481                // Method kotlin/text/StringsKt.first:(Ljava/lang/CharSequence;)C
      23: invokestatic  #170                // Method java/lang/Character.valueOf:(C)Ljava/lang/Character;
      26: aload_0
      27: ldc_w         #474                // String  ->
      30: aconst_null
      31: iconst_2
      32: aconst_null
      33: invokestatic  #478                // Method kotlin/text/StringsKt.substringBefore$default:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String;
      36: checkcast     #99                 // class java/lang/CharSequence
      39: invokestatic  #483                // Method kotlin/text/StringsKt.last:(Ljava/lang/CharSequence;)C
      42: invokestatic  #170                // Method java/lang/Character.valueOf:(C)Ljava/lang/Character;
      45: invokestatic  #230                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
      48: aload_0
      49: ldc_w         #474                // String  ->
      52: aconst_null
      53: iconst_2
      54: aconst_null
      55: invokestatic  #486                // Method kotlin/text/StringsKt.substringAfter$default:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String;
      58: checkcast     #99                 // class java/lang/CharSequence
      61: invokestatic  #481                // Method kotlin/text/StringsKt.first:(Ljava/lang/CharSequence;)C
      64: invokestatic  #170                // Method java/lang/Character.valueOf:(C)Ljava/lang/Character;
      67: invokestatic  #230                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
      70: areturn

  private static final java.lang.Long react$lambda$15$lambda$14$lambda$10(java.lang.Long, java.lang.Long);
    Code:
       0: aload_0
       1: ldc_w         #489                // String a
       4: invokestatic  #358                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       7: aload_1
       8: ldc_w         #491                // String b
      11: invokestatic  #358                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      14: aload_0
      15: invokevirtual #492                // Method java/lang/Long.longValue:()J
      18: aload_1
      19: invokevirtual #492                // Method java/lang/Long.longValue:()J
      22: ladd
      23: invokestatic  #239                // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
      26: areturn

  private static final java.lang.Long react$lambda$15$lambda$14$lambda$11(kotlin.jvm.functions.Function2, java.lang.Object, java.lang.Object);
    Code:
       0: aload_0
       1: aload_1
       2: aload_2
       3: invokeinterface #497,  3          // InterfaceMethod kotlin/jvm/functions/Function2.invoke:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
       8: checkcast     #236                // class java/lang/Long
      11: areturn

  private static final java.lang.Long react$lambda$15$lambda$14$lambda$12(java.lang.Long, java.lang.Long);
    Code:
       0: aload_0
       1: ldc_w         #489                // String a
       4: invokestatic  #358                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       7: aload_1
       8: ldc_w         #491                // String b
      11: invokestatic  #358                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      14: aload_0
      15: invokevirtual #492                // Method java/lang/Long.longValue:()J
      18: aload_1
      19: invokevirtual #492                // Method java/lang/Long.longValue:()J
      22: ladd
      23: invokestatic  #239                // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
      26: areturn

  private static final java.lang.Long react$lambda$15$lambda$14$lambda$13(kotlin.jvm.functions.Function2, java.lang.Object, java.lang.Object);
    Code:
       0: aload_0
       1: aload_1
       2: aload_2
       3: invokeinterface #497,  3          // InterfaceMethod kotlin/jvm/functions/Function2.invoke:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
       8: checkcast     #236                // class java/lang/Long
      11: areturn
}