package day08

import java.nio.file.Files
import java.nio.file.Paths

fun main() {
  fun part1(lines: Input): Int {
    return lines.sumOf { entry ->
      val (_, reading) = entry.split("|")
      reading.split(" ")
        .filter { it.isNotBlank() }
        .count { it.length in setOf(2, 3, 4, 7) }
    }
  }

  fun part2(lines: Input): Int {
    fun String.normalize() = String(this.toCharArray().sortedArray())
    fun decode(digits: List<String>): Array<String> {
      val map = arrayOfNulls<String>(10)
      map[1] = digits.find { it.length == 2 }
      map[7] = digits.find { it.length == 3 }
      map[4] = digits.find { it.length == 4 }
      map[8] = digits.find { it.length == 7 }

      val zeroSixOrNine = digits.filter { it.length == 6 }
      check(zeroSixOrNine.size == 3)
      map[6] = zeroSixOrNine.find { !it.toSet().containsAll(map[1]!!.toSet()) }
      map[9] = zeroSixOrNine.find { it.toSet().containsAll(map[4]!!.toSet()) }
      map[0] = zeroSixOrNine.find { it != map[6] && it != map[9] }

      val twoThreeOrFive = digits.filter { it.length == 5 }
      check(twoThreeOrFive.size == 3)
      map[3] = twoThreeOrFive.find { it.toSet().containsAll(map[1]!!.toSet()) }
      map[5] = twoThreeOrFive.find { map[6]!!.toSet().containsAll(it.toSet()) }
      map[2] = twoThreeOrFive.find { it != map[3] && it != map[5] }

      return map.requireNoNulls()
    }
    return lines.sumOf { entry ->
      val (digits, number) = entry.split("|")
      val map = decode(digits.split(" ").filter { it.isNotBlank() }.map { it.normalize() })
      number.split(" ")
        .filter { it.isNotBlank() }
        .map { it.normalize() }
        .map { map.indexOf(it) }
        .fold(0) { acc, i -> acc * 10 + i } as Int
    }
  }

  check(part1(readInput("test-input.txt")) == 26)
  check(part2(readInput("test-input.txt")) == 61229)

  println(part1(readInput("input.txt")))
  println(part2(readInput("input.txt")))
}

private fun readInput(s: String): Input {
  return Files.newBufferedReader(Paths.get("src/day08/$s")).readLines()
}

private typealias Input = List<String>

Compiled from "Solution.kt"
public final class day08.SolutionKt {
  public static final void main();
    Code:
       0: ldc           #8                  // String test-input.txt
       2: invokestatic  #12                 // Method readInput:(Ljava/lang/String;)Ljava/util/List;
       5: invokestatic  #16                 // Method main$part1:(Ljava/util/List;)I
       8: bipush        26
      10: if_icmpne     17
      13: iconst_1
      14: goto          18
      17: iconst_0
      18: ifne          31
      21: new           #18                 // class java/lang/IllegalStateException
      24: dup
      25: ldc           #20                 // String Check failed.
      27: invokespecial #24                 // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
      30: athrow
      31: ldc           #8                  // String test-input.txt
      33: invokestatic  #12                 // Method readInput:(Ljava/lang/String;)Ljava/util/List;
      36: invokestatic  #27                 // Method main$part2:(Ljava/util/List;)I
      39: ldc           #28                 // int 61229
      41: if_icmpne     48
      44: iconst_1
      45: goto          49
      48: iconst_0
      49: ifne          62
      52: new           #18                 // class java/lang/IllegalStateException
      55: dup
      56: ldc           #20                 // String Check failed.
      58: invokespecial #24                 // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
      61: athrow
      62: ldc           #30                 // String input.txt
      64: invokestatic  #12                 // Method readInput:(Ljava/lang/String;)Ljava/util/List;
      67: invokestatic  #16                 // Method main$part1:(Ljava/util/List;)I
      70: istore_0
      71: getstatic     #36                 // Field java/lang/System.out:Ljava/io/PrintStream;
      74: iload_0
      75: invokevirtual #42                 // Method java/io/PrintStream.println:(I)V
      78: ldc           #30                 // String input.txt
      80: invokestatic  #12                 // Method readInput:(Ljava/lang/String;)Ljava/util/List;
      83: invokestatic  #27                 // Method main$part2:(Ljava/util/List;)I
      86: istore_0
      87: getstatic     #36                 // Field java/lang/System.out:Ljava/io/PrintStream;
      90: iload_0
      91: invokevirtual #42                 // Method java/io/PrintStream.println:(I)V
      94: return

  private static final java.util.List<java.lang.String> readInput(java.lang.String);
    Code:
       0: new           #45                 // class java/lang/StringBuilder
       3: dup
       4: invokespecial #47                 // Method java/lang/StringBuilder."<init>":()V
       7: ldc           #49                 // String src/day08/
       9: invokevirtual #53                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      12: aload_0
      13: invokevirtual #53                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      16: invokevirtual #57                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      19: iconst_0
      20: anewarray     #59                 // class java/lang/String
      23: invokestatic  #65                 // Method java/nio/file/Paths.get:(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;
      26: invokestatic  #71                 // Method java/nio/file/Files.newBufferedReader:(Ljava/nio/file/Path;)Ljava/io/BufferedReader;
      29: dup
      30: ldc           #73                 // String newBufferedReader(...)
      32: invokestatic  #79                 // Method kotlin/jvm/internal/Intrinsics.checkNotNullExpressionValue:(Ljava/lang/Object;Ljava/lang/String;)V
      35: checkcast     #81                 // class java/io/Reader
      38: invokestatic  #87                 // Method kotlin/io/TextStreamsKt.readLines:(Ljava/io/Reader;)Ljava/util/List;
      41: areturn

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

  private static final int main$part1(java.util.List<java.lang.String>);
    Code:
       0: aload_0
       1: checkcast     #97                 // class java/lang/Iterable
       4: astore_1
       5: iconst_0
       6: istore_2
       7: aload_1
       8: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      13: astore_3
      14: aload_3
      15: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
      20: ifeq          377
      23: aload_3
      24: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      29: astore        4
      31: iload_2
      32: aload         4
      34: checkcast     #59                 // class java/lang/String
      37: astore        5
      39: istore        17
      41: iconst_0
      42: istore        6
      44: aload         5
      46: checkcast     #113                // class java/lang/CharSequence
      49: iconst_1
      50: anewarray     #59                 // class java/lang/String
      53: astore        7
      55: aload         7
      57: iconst_0
      58: ldc           #115                // String |
      60: aastore
      61: aload         7
      63: iconst_0
      64: iconst_0
      65: bipush        6
      67: aconst_null
      68: invokestatic  #121                // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
      71: iconst_1
      72: invokeinterface #126,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      77: checkcast     #59                 // class java/lang/String
      80: astore        7
      82: aload         7
      84: checkcast     #113                // class java/lang/CharSequence
      87: iconst_1
      88: anewarray     #59                 // class java/lang/String
      91: astore        8
      93: aload         8
      95: iconst_0
      96: ldc           #128                // String
      98: aastore
      99: aload         8
     101: iconst_0
     102: iconst_0
     103: bipush        6
     105: aconst_null
     106: invokestatic  #121                // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
     109: checkcast     #97                 // class java/lang/Iterable
     112: astore        8
     114: nop
     115: iconst_0
     116: istore        9
     118: aload         8
     120: astore        10
     122: new           #130                // class java/util/ArrayList
     125: dup
     126: invokespecial #131                // Method java/util/ArrayList."<init>":()V
     129: checkcast     #133                // class java/util/Collection
     132: astore        11
     134: iconst_0
     135: istore        12
     137: aload         10
     139: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     144: astore        13
     146: aload         13
     148: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     153: ifeq          208
     156: aload         13
     158: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     163: astore        14
     165: aload         14
     167: checkcast     #59                 // class java/lang/String
     170: astore        15
     172: iconst_0
     173: istore        16
     175: aload         15
     177: checkcast     #113                // class java/lang/CharSequence
     180: invokestatic  #137                // Method kotlin/text/StringsKt.isBlank:(Ljava/lang/CharSequence;)Z
     183: ifne          190
     186: iconst_1
     187: goto          191
     190: iconst_0
     191: nop
     192: ifeq          146
     195: aload         11
     197: aload         14
     199: invokeinterface #141,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     204: pop
     205: goto          146
     208: aload         11
     210: checkcast     #123                // class java/util/List
     213: nop
     214: checkcast     #97                 // class java/lang/Iterable
     217: astore        8
     219: nop
     220: iconst_0
     221: istore        9
     223: aload         8
     225: instanceof    #133                // class java/util/Collection
     228: ifeq          248
     231: aload         8
     233: checkcast     #133                // class java/util/Collection
     236: invokeinterface #144,  1          // InterfaceMethod java/util/Collection.isEmpty:()Z
     241: ifeq          248
     244: iconst_0
     245: goto          365
     248: iconst_0
     249: istore        10
     251: aload         8
     253: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     258: astore        11
     260: aload         11
     262: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     267: ifeq          363
     270: aload         11
     272: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     277: astore        12
     279: aload         12
     281: checkcast     #59                 // class java/lang/String
     284: astore        13
     286: iconst_0
     287: istore        14
     289: iconst_4
     290: anewarray     #146                // class java/lang/Integer
     293: astore        15
     295: aload         15
     297: iconst_0
     298: iconst_2
     299: invokestatic  #150                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     302: aastore
     303: aload         15
     305: iconst_1
     306: iconst_3
     307: invokestatic  #150                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     310: aastore
     311: aload         15
     313: iconst_2
     314: iconst_4
     315: invokestatic  #150                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     318: aastore
     319: aload         15
     321: iconst_3
     322: bipush        7
     324: invokestatic  #150                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     327: aastore
     328: aload         15
     330: invokestatic  #156                // Method kotlin/collections/SetsKt.setOf:([Ljava/lang/Object;)Ljava/util/Set;
     333: aload         13
     335: invokevirtual #160                // Method java/lang/String.length:()I
     338: invokestatic  #150                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     341: invokeinterface #165,  2          // InterfaceMethod java/util/Set.contains:(Ljava/lang/Object;)Z
     346: ifeq          260
     349: iinc          10, 1
     352: iload         10
     354: ifge          260
     357: invokestatic  #170                // Method kotlin/collections/CollectionsKt.throwCountOverflow:()V
     360: goto          260
     363: iload         10
     365: nop
     366: istore        18
     368: iload         17
     370: iload         18
     372: iadd
     373: istore_2
     374: goto          14
     377: iload_2
     378: ireturn

  private static final java.lang.String main$part2$normalize(java.lang.String);
    Code:
       0: new           #59                 // class java/lang/String
       3: dup
       4: aload_0
       5: invokevirtual #198                // Method java/lang/String.toCharArray:()[C
       8: dup
       9: ldc           #200                // String toCharArray(...)
      11: invokestatic  #79                 // Method kotlin/jvm/internal/Intrinsics.checkNotNullExpressionValue:(Ljava/lang/Object;Ljava/lang/String;)V
      14: invokestatic  #206                // Method kotlin/collections/ArraysKt.sortedArray:([C)[C
      17: invokespecial #209                // Method java/lang/String."<init>":([C)V
      20: areturn

  private static final java.lang.String[] main$part2$decode(java.util.List<java.lang.String>);
    Code:
       0: bipush        10
       2: anewarray     #59                 // class java/lang/String
       5: astore_1
       6: aload_1
       7: iconst_1
       8: aload_0
       9: checkcast     #97                 // class java/lang/Iterable
      12: astore_2
      13: istore        14
      15: astore        13
      17: aload_2
      18: astore_3
      19: aload_3
      20: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      25: astore        4
      27: aload         4
      29: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
      34: ifeq          78
      37: aload         4
      39: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      44: astore        5
      46: aload         5
      48: checkcast     #59                 // class java/lang/String
      51: astore        6
      53: iconst_0
      54: istore        7
      56: aload         6
      58: invokevirtual #160                // Method java/lang/String.length:()I
      61: iconst_2
      62: if_icmpne     69
      65: iconst_1
      66: goto          70
      69: iconst_0
      70: ifeq          27
      73: aload         5
      75: goto          79
      78: aconst_null
      79: astore        15
      81: aload         13
      83: iload         14
      85: aload         15
      87: aastore
      88: aload_1
      89: bipush        7
      91: aload_0
      92: checkcast     #97                 // class java/lang/Iterable
      95: astore_2
      96: istore        14
      98: astore        13
     100: aload_2
     101: astore_3
     102: aload_3
     103: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     108: astore        4
     110: aload         4
     112: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     117: ifeq          161
     120: aload         4
     122: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     127: astore        5
     129: aload         5
     131: checkcast     #59                 // class java/lang/String
     134: astore        6
     136: iconst_0
     137: istore        7
     139: aload         6
     141: invokevirtual #160                // Method java/lang/String.length:()I
     144: iconst_3
     145: if_icmpne     152
     148: iconst_1
     149: goto          153
     152: iconst_0
     153: ifeq          110
     156: aload         5
     158: goto          162
     161: aconst_null
     162: astore        15
     164: aload         13
     166: iload         14
     168: aload         15
     170: aastore
     171: aload_1
     172: iconst_4
     173: aload_0
     174: checkcast     #97                 // class java/lang/Iterable
     177: astore_2
     178: istore        14
     180: astore        13
     182: aload_2
     183: astore_3
     184: aload_3
     185: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     190: astore        4
     192: aload         4
     194: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     199: ifeq          243
     202: aload         4
     204: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     209: astore        5
     211: aload         5
     213: checkcast     #59                 // class java/lang/String
     216: astore        6
     218: iconst_0
     219: istore        7
     221: aload         6
     223: invokevirtual #160                // Method java/lang/String.length:()I
     226: iconst_4
     227: if_icmpne     234
     230: iconst_1
     231: goto          235
     234: iconst_0
     235: ifeq          192
     238: aload         5
     240: goto          244
     243: aconst_null
     244: astore        15
     246: aload         13
     248: iload         14
     250: aload         15
     252: aastore
     253: aload_1
     254: bipush        8
     256: aload_0
     257: checkcast     #97                 // class java/lang/Iterable
     260: astore_2
     261: istore        14
     263: astore        13
     265: aload_2
     266: astore_3
     267: aload_3
     268: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     273: astore        4
     275: aload         4
     277: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     282: ifeq          327
     285: aload         4
     287: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     292: astore        5
     294: aload         5
     296: checkcast     #59                 // class java/lang/String
     299: astore        6
     301: iconst_0
     302: istore        7
     304: aload         6
     306: invokevirtual #160                // Method java/lang/String.length:()I
     309: bipush        7
     311: if_icmpne     318
     314: iconst_1
     315: goto          319
     318: iconst_0
     319: ifeq          275
     322: aload         5
     324: goto          328
     327: aconst_null
     328: astore        15
     330: aload         13
     332: iload         14
     334: aload         15
     336: aastore
     337: aload_0
     338: checkcast     #97                 // class java/lang/Iterable
     341: astore_3
     342: iconst_0
     343: istore        4
     345: aload_3
     346: astore        5
     348: new           #130                // class java/util/ArrayList
     351: dup
     352: invokespecial #131                // Method java/util/ArrayList."<init>":()V
     355: checkcast     #133                // class java/util/Collection
     358: astore        6
     360: iconst_0
     361: istore        7
     363: aload         5
     365: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     370: astore        8
     372: aload         8
     374: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     379: ifeq          432
     382: aload         8
     384: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     389: astore        9
     391: aload         9
     393: checkcast     #59                 // class java/lang/String
     396: astore        10
     398: iconst_0
     399: istore        11
     401: aload         10
     403: invokevirtual #160                // Method java/lang/String.length:()I
     406: bipush        6
     408: if_icmpne     415
     411: iconst_1
     412: goto          416
     415: iconst_0
     416: ifeq          372
     419: aload         6
     421: aload         9
     423: invokeinterface #141,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     428: pop
     429: goto          372
     432: aload         6
     434: checkcast     #123                // class java/util/List
     437: nop
     438: astore_2
     439: aload_2
     440: invokeinterface #216,  1          // InterfaceMethod java/util/List.size:()I
     445: iconst_3
     446: if_icmpne     453
     449: iconst_1
     450: goto          454
     453: iconst_0
     454: ifne          467
     457: new           #18                 // class java/lang/IllegalStateException
     460: dup
     461: ldc           #20                 // String Check failed.
     463: invokespecial #24                 // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
     466: athrow
     467: aload_1
     468: bipush        6
     470: aload_2
     471: checkcast     #97                 // class java/lang/Iterable
     474: astore_3
     475: istore        14
     477: astore        13
     479: aload_3
     480: astore        4
     482: aload         4
     484: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     489: astore        5
     491: aload         5
     493: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     498: ifeq          565
     501: aload         5
     503: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     508: astore        6
     510: aload         6
     512: checkcast     #59                 // class java/lang/String
     515: astore        7
     517: iconst_0
     518: istore        8
     520: aload         7
     522: checkcast     #113                // class java/lang/CharSequence
     525: invokestatic  #220                // Method kotlin/text/StringsKt.toSet:(Ljava/lang/CharSequence;)Ljava/util/Set;
     528: aload_1
     529: iconst_1
     530: aaload
     531: dup
     532: invokestatic  #224                // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     535: checkcast     #113                // class java/lang/CharSequence
     538: invokestatic  #220                // Method kotlin/text/StringsKt.toSet:(Ljava/lang/CharSequence;)Ljava/util/Set;
     541: checkcast     #133                // class java/util/Collection
     544: invokeinterface #228,  2          // InterfaceMethod java/util/Set.containsAll:(Ljava/util/Collection;)Z
     549: ifne          556
     552: iconst_1
     553: goto          557
     556: iconst_0
     557: ifeq          491
     560: aload         6
     562: goto          566
     565: aconst_null
     566: astore        15
     568: aload         13
     570: iload         14
     572: aload         15
     574: aastore
     575: aload_1
     576: bipush        9
     578: aload_2
     579: checkcast     #97                 // class java/lang/Iterable
     582: astore_3
     583: istore        14
     585: astore        13
     587: aload_3
     588: astore        4
     590: aload         4
     592: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     597: astore        5
     599: aload         5
     601: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     606: ifeq          665
     609: aload         5
     611: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     616: astore        6
     618: aload         6
     620: checkcast     #59                 // class java/lang/String
     623: astore        7
     625: iconst_0
     626: istore        8
     628: aload         7
     630: checkcast     #113                // class java/lang/CharSequence
     633: invokestatic  #220                // Method kotlin/text/StringsKt.toSet:(Ljava/lang/CharSequence;)Ljava/util/Set;
     636: aload_1
     637: iconst_4
     638: aaload
     639: dup
     640: invokestatic  #224                // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     643: checkcast     #113                // class java/lang/CharSequence
     646: invokestatic  #220                // Method kotlin/text/StringsKt.toSet:(Ljava/lang/CharSequence;)Ljava/util/Set;
     649: checkcast     #133                // class java/util/Collection
     652: invokeinterface #228,  2          // InterfaceMethod java/util/Set.containsAll:(Ljava/util/Collection;)Z
     657: ifeq          599
     660: aload         6
     662: goto          666
     665: aconst_null
     666: astore        15
     668: aload         13
     670: iload         14
     672: aload         15
     674: aastore
     675: aload_1
     676: iconst_0
     677: aload_2
     678: checkcast     #97                 // class java/lang/Iterable
     681: astore_3
     682: istore        14
     684: astore        13
     686: aload_3
     687: astore        4
     689: aload         4
     691: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     696: astore        5
     698: aload         5
     700: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     705: ifeq          764
     708: aload         5
     710: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     715: astore        6
     717: aload         6
     719: checkcast     #59                 // class java/lang/String
     722: astore        7
     724: iconst_0
     725: istore        8
     727: aload         7
     729: aload_1
     730: bipush        6
     732: aaload
     733: invokestatic  #232                // Method kotlin/jvm/internal/Intrinsics.areEqual:(Ljava/lang/Object;Ljava/lang/Object;)Z
     736: ifne          755
     739: aload         7
     741: aload_1
     742: bipush        9
     744: aaload
     745: invokestatic  #232                // Method kotlin/jvm/internal/Intrinsics.areEqual:(Ljava/lang/Object;Ljava/lang/Object;)Z
     748: ifne          755
     751: iconst_1
     752: goto          756
     755: iconst_0
     756: ifeq          698
     759: aload         6
     761: goto          765
     764: aconst_null
     765: astore        15
     767: aload         13
     769: iload         14
     771: aload         15
     773: aastore
     774: aload_0
     775: checkcast     #97                 // class java/lang/Iterable
     778: astore        4
     780: iconst_0
     781: istore        5
     783: aload         4
     785: astore        6
     787: new           #130                // class java/util/ArrayList
     790: dup
     791: invokespecial #131                // Method java/util/ArrayList."<init>":()V
     794: checkcast     #133                // class java/util/Collection
     797: astore        7
     799: iconst_0
     800: istore        8
     802: aload         6
     804: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     809: astore        9
     811: aload         9
     813: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     818: ifeq          870
     821: aload         9
     823: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     828: astore        10
     830: aload         10
     832: checkcast     #59                 // class java/lang/String
     835: astore        11
     837: iconst_0
     838: istore        12
     840: aload         11
     842: invokevirtual #160                // Method java/lang/String.length:()I
     845: iconst_5
     846: if_icmpne     853
     849: iconst_1
     850: goto          854
     853: iconst_0
     854: ifeq          811
     857: aload         7
     859: aload         10
     861: invokeinterface #141,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     866: pop
     867: goto          811
     870: aload         7
     872: checkcast     #123                // class java/util/List
     875: nop
     876: astore_3
     877: aload_3
     878: invokeinterface #216,  1          // InterfaceMethod java/util/List.size:()I
     883: iconst_3
     884: if_icmpne     891
     887: iconst_1
     888: goto          892
     891: iconst_0
     892: ifne          905
     895: new           #18                 // class java/lang/IllegalStateException
     898: dup
     899: ldc           #20                 // String Check failed.
     901: invokespecial #24                 // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
     904: athrow
     905: aload_1
     906: iconst_3
     907: aload_3
     908: checkcast     #97                 // class java/lang/Iterable
     911: astore        4
     913: istore        14
     915: astore        13
     917: aload         4
     919: astore        5
     921: aload         5
     923: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     928: astore        6
     930: aload         6
     932: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     937: ifeq          996
     940: aload         6
     942: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     947: astore        7
     949: aload         7
     951: checkcast     #59                 // class java/lang/String
     954: astore        8
     956: iconst_0
     957: istore        9
     959: aload         8
     961: checkcast     #113                // class java/lang/CharSequence
     964: invokestatic  #220                // Method kotlin/text/StringsKt.toSet:(Ljava/lang/CharSequence;)Ljava/util/Set;
     967: aload_1
     968: iconst_1
     969: aaload
     970: dup
     971: invokestatic  #224                // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     974: checkcast     #113                // class java/lang/CharSequence
     977: invokestatic  #220                // Method kotlin/text/StringsKt.toSet:(Ljava/lang/CharSequence;)Ljava/util/Set;
     980: checkcast     #133                // class java/util/Collection
     983: invokeinterface #228,  2          // InterfaceMethod java/util/Set.containsAll:(Ljava/util/Collection;)Z
     988: ifeq          930
     991: aload         7
     993: goto          997
     996: aconst_null
     997: astore        15
     999: aload         13
    1001: iload         14
    1003: aload         15
    1005: aastore
    1006: aload_1
    1007: iconst_5
    1008: aload_3
    1009: checkcast     #97                 // class java/lang/Iterable
    1012: astore        4
    1014: istore        14
    1016: astore        13
    1018: aload         4
    1020: astore        5
    1022: aload         5
    1024: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
    1029: astore        6
    1031: aload         6
    1033: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
    1038: ifeq          1098
    1041: aload         6
    1043: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
    1048: astore        7
    1050: aload         7
    1052: checkcast     #59                 // class java/lang/String
    1055: astore        8
    1057: iconst_0
    1058: istore        9
    1060: aload_1
    1061: bipush        6
    1063: aaload
    1064: dup
    1065: invokestatic  #224                // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
    1068: checkcast     #113                // class java/lang/CharSequence
    1071: invokestatic  #220                // Method kotlin/text/StringsKt.toSet:(Ljava/lang/CharSequence;)Ljava/util/Set;
    1074: aload         8
    1076: checkcast     #113                // class java/lang/CharSequence
    1079: invokestatic  #220                // Method kotlin/text/StringsKt.toSet:(Ljava/lang/CharSequence;)Ljava/util/Set;
    1082: checkcast     #133                // class java/util/Collection
    1085: invokeinterface #228,  2          // InterfaceMethod java/util/Set.containsAll:(Ljava/util/Collection;)Z
    1090: ifeq          1031
    1093: aload         7
    1095: goto          1099
    1098: aconst_null
    1099: astore        15
    1101: aload         13
    1103: iload         14
    1105: aload         15
    1107: aastore
    1108: aload_1
    1109: iconst_2
    1110: aload_3
    1111: checkcast     #97                 // class java/lang/Iterable
    1114: astore        4
    1116: istore        14
    1118: astore        13
    1120: aload         4
    1122: astore        5
    1124: aload         5
    1126: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
    1131: astore        6
    1133: aload         6
    1135: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
    1140: ifeq          1197
    1143: aload         6
    1145: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
    1150: astore        7
    1152: aload         7
    1154: checkcast     #59                 // class java/lang/String
    1157: astore        8
    1159: iconst_0
    1160: istore        9
    1162: aload         8
    1164: aload_1
    1165: iconst_3
    1166: aaload
    1167: invokestatic  #232                // Method kotlin/jvm/internal/Intrinsics.areEqual:(Ljava/lang/Object;Ljava/lang/Object;)Z
    1170: ifne          1188
    1173: aload         8
    1175: aload_1
    1176: iconst_5
    1177: aaload
    1178: invokestatic  #232                // Method kotlin/jvm/internal/Intrinsics.areEqual:(Ljava/lang/Object;Ljava/lang/Object;)Z
    1181: ifne          1188
    1184: iconst_1
    1185: goto          1189
    1188: iconst_0
    1189: ifeq          1133
    1192: aload         7
    1194: goto          1198
    1197: aconst_null
    1198: astore        15
    1200: aload         13
    1202: iload         14
    1204: aload         15
    1206: aastore
    1207: aload_1
    1208: invokestatic  #236                // Method kotlin/collections/ArraysKt.requireNoNulls:([Ljava/lang/Object;)[Ljava/lang/Object;
    1211: checkcast     #237                // class "[Ljava/lang/String;"
    1214: areturn

  private static final int main$part2(java.util.List<java.lang.String>);
    Code:
       0: aload_0
       1: checkcast     #97                 // class java/lang/Iterable
       4: astore_1
       5: iconst_0
       6: istore_2
       7: aload_1
       8: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      13: astore_3
      14: aload_3
      15: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
      20: ifeq          759
      23: aload_3
      24: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      29: astore        4
      31: iload_2
      32: aload         4
      34: checkcast     #59                 // class java/lang/String
      37: astore        5
      39: istore        22
      41: iconst_0
      42: istore        6
      44: aload         5
      46: checkcast     #113                // class java/lang/CharSequence
      49: iconst_1
      50: anewarray     #59                 // class java/lang/String
      53: astore        7
      55: aload         7
      57: iconst_0
      58: ldc           #115                // String |
      60: aastore
      61: aload         7
      63: iconst_0
      64: iconst_0
      65: bipush        6
      67: aconst_null
      68: invokestatic  #121                // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
      71: astore        8
      73: aload         8
      75: iconst_0
      76: invokeinterface #126,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      81: checkcast     #59                 // class java/lang/String
      84: astore        7
      86: aload         8
      88: iconst_1
      89: invokeinterface #126,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      94: checkcast     #59                 // class java/lang/String
      97: astore        9
      99: aload         7
     101: checkcast     #113                // class java/lang/CharSequence
     104: iconst_1
     105: anewarray     #59                 // class java/lang/String
     108: astore        10
     110: aload         10
     112: iconst_0
     113: ldc           #128                // String
     115: aastore
     116: aload         10
     118: iconst_0
     119: iconst_0
     120: bipush        6
     122: aconst_null
     123: invokestatic  #121                // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
     126: checkcast     #97                 // class java/lang/Iterable
     129: astore        10
     131: iconst_0
     132: istore        11
     134: aload         10
     136: astore        12
     138: new           #130                // class java/util/ArrayList
     141: dup
     142: invokespecial #131                // Method java/util/ArrayList."<init>":()V
     145: checkcast     #133                // class java/util/Collection
     148: astore        13
     150: iconst_0
     151: istore        14
     153: aload         12
     155: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     160: astore        15
     162: aload         15
     164: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     169: ifeq          224
     172: aload         15
     174: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     179: astore        16
     181: aload         16
     183: checkcast     #59                 // class java/lang/String
     186: astore        17
     188: iconst_0
     189: istore        18
     191: aload         17
     193: checkcast     #113                // class java/lang/CharSequence
     196: invokestatic  #137                // Method kotlin/text/StringsKt.isBlank:(Ljava/lang/CharSequence;)Z
     199: ifne          206
     202: iconst_1
     203: goto          207
     206: iconst_0
     207: nop
     208: ifeq          162
     211: aload         13
     213: aload         16
     215: invokeinterface #141,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     220: pop
     221: goto          162
     224: aload         13
     226: checkcast     #123                // class java/util/List
     229: nop
     230: checkcast     #97                 // class java/lang/Iterable
     233: astore        10
     235: nop
     236: iconst_0
     237: istore        11
     239: aload         10
     241: astore        12
     243: new           #130                // class java/util/ArrayList
     246: dup
     247: aload         10
     249: bipush        10
     251: invokestatic  #257                // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     254: invokespecial #259                // Method java/util/ArrayList."<init>":(I)V
     257: checkcast     #133                // class java/util/Collection
     260: astore        13
     262: iconst_0
     263: istore        14
     265: aload         12
     267: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     272: astore        15
     274: aload         15
     276: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     281: ifeq          324
     284: aload         15
     286: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     291: astore        16
     293: aload         13
     295: aload         16
     297: checkcast     #59                 // class java/lang/String
     300: astore        17
     302: astore        19
     304: iconst_0
     305: istore        18
     307: aload         17
     309: invokestatic  #261                // Method main$part2$normalize:(Ljava/lang/String;)Ljava/lang/String;
     312: aload         19
     314: swap
     315: invokeinterface #141,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     320: pop
     321: goto          274
     324: aload         13
     326: checkcast     #123                // class java/util/List
     329: nop
     330: invokestatic  #263                // Method main$part2$decode:(Ljava/util/List;)[Ljava/lang/String;
     333: astore        20
     335: aload         9
     337: checkcast     #113                // class java/lang/CharSequence
     340: iconst_1
     341: anewarray     #59                 // class java/lang/String
     344: astore        11
     346: aload         11
     348: iconst_0
     349: ldc           #128                // String
     351: aastore
     352: aload         11
     354: iconst_0
     355: iconst_0
     356: bipush        6
     358: aconst_null
     359: invokestatic  #121                // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
     362: checkcast     #97                 // class java/lang/Iterable
     365: astore        11
     367: nop
     368: iconst_0
     369: istore        12
     371: aload         11
     373: astore        13
     375: new           #130                // class java/util/ArrayList
     378: dup
     379: invokespecial #131                // Method java/util/ArrayList."<init>":()V
     382: checkcast     #133                // class java/util/Collection
     385: astore        14
     387: iconst_0
     388: istore        15
     390: aload         13
     392: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     397: astore        16
     399: aload         16
     401: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     406: ifeq          461
     409: aload         16
     411: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     416: astore        17
     418: aload         17
     420: checkcast     #59                 // class java/lang/String
     423: astore        18
     425: iconst_0
     426: istore        21
     428: aload         18
     430: checkcast     #113                // class java/lang/CharSequence
     433: invokestatic  #137                // Method kotlin/text/StringsKt.isBlank:(Ljava/lang/CharSequence;)Z
     436: ifne          443
     439: iconst_1
     440: goto          444
     443: iconst_0
     444: nop
     445: ifeq          399
     448: aload         14
     450: aload         17
     452: invokeinterface #141,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     457: pop
     458: goto          399
     461: aload         14
     463: checkcast     #123                // class java/util/List
     466: nop
     467: checkcast     #97                 // class java/lang/Iterable
     470: astore        11
     472: nop
     473: iconst_0
     474: istore        12
     476: aload         11
     478: astore        13
     480: new           #130                // class java/util/ArrayList
     483: dup
     484: aload         11
     486: bipush        10
     488: invokestatic  #257                // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     491: invokespecial #259                // Method java/util/ArrayList."<init>":(I)V
     494: checkcast     #133                // class java/util/Collection
     497: astore        14
     499: iconst_0
     500: istore        15
     502: aload         13
     504: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     509: astore        16
     511: aload         16
     513: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     518: ifeq          561
     521: aload         16
     523: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     528: astore        17
     530: aload         14
     532: aload         17
     534: checkcast     #59                 // class java/lang/String
     537: astore        18
     539: astore        19
     541: iconst_0
     542: istore        21
     544: aload         18
     546: invokestatic  #261                // Method main$part2$normalize:(Ljava/lang/String;)Ljava/lang/String;
     549: aload         19
     551: swap
     552: invokeinterface #141,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     557: pop
     558: goto          511
     561: aload         14
     563: checkcast     #123                // class java/util/List
     566: nop
     567: checkcast     #97                 // class java/lang/Iterable
     570: astore        11
     572: nop
     573: iconst_0
     574: istore        12
     576: aload         11
     578: astore        13
     580: new           #130                // class java/util/ArrayList
     583: dup
     584: aload         11
     586: bipush        10
     588: invokestatic  #257                // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     591: invokespecial #259                // Method java/util/ArrayList."<init>":(I)V
     594: checkcast     #133                // class java/util/Collection
     597: astore        14
     599: iconst_0
     600: istore        15
     602: aload         13
     604: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     609: astore        16
     611: aload         16
     613: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     618: ifeq          666
     621: aload         16
     623: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     628: astore        17
     630: aload         14
     632: aload         17
     634: checkcast     #59                 // class java/lang/String
     637: astore        18
     639: astore        19
     641: iconst_0
     642: istore        21
     644: aload         20
     646: aload         18
     648: invokestatic  #267                // Method kotlin/collections/ArraysKt.indexOf:([Ljava/lang/Object;Ljava/lang/Object;)I
     651: invokestatic  #150                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     654: aload         19
     656: swap
     657: invokeinterface #141,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     662: pop
     663: goto          611
     666: aload         14
     668: checkcast     #123                // class java/util/List
     671: nop
     672: checkcast     #97                 // class java/lang/Iterable
     675: astore        11
     677: iconst_0
     678: istore        12
     680: iconst_0
     681: istore        13
     683: iload         12
     685: istore        14
     687: aload         11
     689: invokeinterface #101,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     694: astore        15
     696: aload         15
     698: invokeinterface #107,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     703: ifeq          745
     706: aload         15
     708: invokeinterface #111,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     713: astore        16
     715: iload         14
     717: aload         16
     719: checkcast     #269                // class java/lang/Number
     722: invokevirtual #272                // Method java/lang/Number.intValue:()I
     725: istore        17
     727: istore        18
     729: iconst_0
     730: istore        21
     732: iload         18
     734: bipush        10
     736: imul
     737: iload         17
     739: iadd
     740: istore        14
     742: goto          696
     745: iload         14
     747: nop
     748: istore        23
     750: iload         22
     752: iload         23
     754: iadd
     755: istore_2
     756: goto          14
     759: iload_2
     760: ireturn
}


package day06
import java.nio.file.Files
import java.nio.file.Paths

fun main() {
  val mem = Array(2) {
    Array(9) {
      LongArray(257) { -1 }
    }
  }
  fun model(daysLeft: Int, day: Int, part: Int): Long {
    require(daysLeft in 0..8)
    require(part in 0..1)
    val lastDay = if (part == 0) 80 else 256
    require(day in 0..lastDay)

    mem[part][daysLeft][day].let {
      if (it != -1L) return it
    }

    val res = if (day >= lastDay) 1 else if (daysLeft == 0) {
      model(6, day + 1, part) + model(8, day + 1, part)
    } else {
      model(daysLeft - 1, day + 1, part)
    }

    return res.also {
      mem[part][daysLeft][day] = res
    }
  }

  fun part1(input: Input): Long {
    return input.sumOf { model(it, 0, 0) }
  }

  fun part2(input: Input): Long {
    return input.sumOf { model(it, 0, 1) }
  }

  check(part1(readInput("test-input.txt")) == 5934L)
  println(part1(readInput("input.txt")))

  part2(readInput("test-input.txt")).let {
    check(it == 26984457539L) { it }
  }
  println(part2(readInput("input.txt")))

}

private fun readInput(s: String): Input {
  return Files.newBufferedReader(Paths.get("src/day06/$s")).readLines().first().split(",").map { it.toInt() }
}

private typealias Input = List<Int>

Compiled from "Solution.kt"
public final class day06.SolutionKt {
  public static final void main();
    Code:
       0: iconst_0
       1: istore_1
       2: iconst_2
       3: anewarray     #8                  // class "[[J"
       6: astore_3
       7: iload_1
       8: iconst_2
       9: if_icmpge     113
      12: iload_1
      13: istore        4
      15: aload_3
      16: iload         4
      18: iconst_0
      19: istore        5
      21: bipush        9
      23: anewarray     #10                 // class "[J"
      26: astore        6
      28: istore        12
      30: astore        11
      32: iload         5
      34: bipush        9
      36: if_icmpge     100
      39: iload         5
      41: istore        7
      43: aload         6
      45: iload         7
      47: iconst_0
      48: istore        8
      50: sipush        257
      53: newarray       long
      55: astore        9
      57: istore        14
      59: astore        13
      61: iload         8
      63: sipush        257
      66: if_icmpge     87
      69: iload         8
      71: istore        10
      73: aload         9
      75: iload         10
      77: ldc2_w        #11                 // long -1l
      80: lastore
      81: iinc          8, 1
      84: goto          61
      87: aload         13
      89: iload         14
      91: aload         9
      93: aastore
      94: iinc          5, 1
      97: goto          32
     100: aload         11
     102: iload         12
     104: aload         6
     106: aastore
     107: iinc          1, 1
     110: goto          7
     113: aload_3
     114: astore_0
     115: aload_0
     116: ldc           #14                 // String test-input.txt
     118: invokestatic  #18                 // Method readInput:(Ljava/lang/String;)Ljava/util/List;
     121: invokestatic  #22                 // Method main$part1:([[[JLjava/util/List;)J
     124: ldc2_w        #23                 // long 5934l
     127: lcmp
     128: ifne          135
     131: iconst_1
     132: goto          136
     135: iconst_0
     136: ifne          149
     139: new           #26                 // class java/lang/IllegalStateException
     142: dup
     143: ldc           #28                 // String Check failed.
     145: invokespecial #32                 // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
     148: athrow
     149: aload_0
     150: ldc           #34                 // String input.txt
     152: invokestatic  #18                 // Method readInput:(Ljava/lang/String;)Ljava/util/List;
     155: invokestatic  #22                 // Method main$part1:([[[JLjava/util/List;)J
     158: lstore_1
     159: getstatic     #40                 // Field java/lang/System.out:Ljava/io/PrintStream;
     162: lload_1
     163: invokevirtual #46                 // Method java/io/PrintStream.println:(J)V
     166: aload_0
     167: ldc           #14                 // String test-input.txt
     169: invokestatic  #18                 // Method readInput:(Ljava/lang/String;)Ljava/util/List;
     172: invokestatic  #49                 // Method main$part2:([[[JLjava/util/List;)J
     175: lstore_3
     176: iconst_0
     177: istore        5
     179: lload_3
     180: ldc2_w        #50                 // long 26984457539l
     183: lcmp
     184: ifne          191
     187: iconst_1
     188: goto          192
     191: iconst_0
     192: ifne          217
     195: iconst_0
     196: istore        6
     198: lload_3
     199: invokestatic  #57                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     202: astore        6
     204: new           #26                 // class java/lang/IllegalStateException
     207: dup
     208: aload         6
     210: invokevirtual #61                 // Method java/lang/Object.toString:()Ljava/lang/String;
     213: invokespecial #32                 // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
     216: athrow
     217: nop
     218: nop
     219: aload_0
     220: ldc           #34                 // String input.txt
     222: invokestatic  #18                 // Method readInput:(Ljava/lang/String;)Ljava/util/List;
     225: invokestatic  #49                 // Method main$part2:([[[JLjava/util/List;)J
     228: lstore_1
     229: getstatic     #40                 // Field java/lang/System.out:Ljava/io/PrintStream;
     232: lload_1
     233: invokevirtual #46                 // Method java/io/PrintStream.println:(J)V
     236: return

  private static final java.util.List<java.lang.Integer> readInput(java.lang.String);
    Code:
       0: new           #72                 // class java/lang/StringBuilder
       3: dup
       4: invokespecial #74                 // Method java/lang/StringBuilder."<init>":()V
       7: ldc           #76                 // String src/day06/
       9: invokevirtual #80                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      12: aload_0
      13: invokevirtual #80                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      16: invokevirtual #81                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      19: iconst_0
      20: anewarray     #83                 // class java/lang/String
      23: invokestatic  #89                 // Method java/nio/file/Paths.get:(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;
      26: invokestatic  #95                 // Method java/nio/file/Files.newBufferedReader:(Ljava/nio/file/Path;)Ljava/io/BufferedReader;
      29: dup
      30: ldc           #97                 // String newBufferedReader(...)
      32: invokestatic  #103                // Method kotlin/jvm/internal/Intrinsics.checkNotNullExpressionValue:(Ljava/lang/Object;Ljava/lang/String;)V
      35: checkcast     #105                // class java/io/Reader
      38: invokestatic  #111                // Method kotlin/io/TextStreamsKt.readLines:(Ljava/io/Reader;)Ljava/util/List;
      41: invokestatic  #117                // Method kotlin/collections/CollectionsKt.first:(Ljava/util/List;)Ljava/lang/Object;
      44: checkcast     #119                // class java/lang/CharSequence
      47: iconst_1
      48: anewarray     #83                 // class java/lang/String
      51: astore_1
      52: aload_1
      53: iconst_0
      54: ldc           #121                // String ,
      56: aastore
      57: aload_1
      58: iconst_0
      59: iconst_0
      60: bipush        6
      62: aconst_null
      63: invokestatic  #127                // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
      66: checkcast     #129                // class java/lang/Iterable
      69: astore_1
      70: iconst_0
      71: istore_2
      72: aload_1
      73: astore_3
      74: new           #131                // class java/util/ArrayList
      77: dup
      78: aload_1
      79: bipush        10
      81: invokestatic  #135                // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
      84: invokespecial #138                // Method java/util/ArrayList."<init>":(I)V
      87: checkcast     #140                // class java/util/Collection
      90: astore        4
      92: iconst_0
      93: istore        5
      95: aload_3
      96: invokeinterface #144,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     101: astore        6
     103: aload         6
     105: invokeinterface #150,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     110: ifeq          157
     113: aload         6
     115: invokeinterface #154,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     120: astore        7
     122: aload         4
     124: aload         7
     126: checkcast     #83                 // class java/lang/String
     129: astore        8
     131: astore        10
     133: iconst_0
     134: istore        9
     136: aload         8
     138: invokestatic  #160                // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
     141: nop
     142: invokestatic  #163                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     145: aload         10
     147: swap
     148: invokeinterface #167,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     153: pop
     154: goto          103
     157: aload         4
     159: checkcast     #169                // class java/util/List
     162: nop
     163: areturn

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

  private static final long main$model(long[][][], int, int, int);
    Code:
       0: iconst_0
       1: iload_1
       2: if_icmpgt     19
       5: iload_1
       6: bipush        9
       8: if_icmpge     15
      11: iconst_1
      12: goto          20
      15: iconst_0
      16: goto          20
      19: iconst_0
      20: ifne          40
      23: ldc           #190                // String Failed requirement.
      25: astore        5
      27: new           #192                // class java/lang/IllegalArgumentException
      30: dup
      31: aload         5
      33: invokevirtual #61                 // Method java/lang/Object.toString:()Ljava/lang/String;
      36: invokespecial #193                // Method java/lang/IllegalArgumentException."<init>":(Ljava/lang/String;)V
      39: athrow
      40: iconst_0
      41: iload_3
      42: if_icmpgt     58
      45: iload_3
      46: iconst_2
      47: if_icmpge     54
      50: iconst_1
      51: goto          59
      54: iconst_0
      55: goto          59
      58: iconst_0
      59: ifne          79
      62: ldc           #190                // String Failed requirement.
      64: astore        5
      66: new           #192                // class java/lang/IllegalArgumentException
      69: dup
      70: aload         5
      72: invokevirtual #61                 // Method java/lang/Object.toString:()Ljava/lang/String;
      75: invokespecial #193                // Method java/lang/IllegalArgumentException."<init>":(Ljava/lang/String;)V
      78: athrow
      79: iload_3
      80: ifne          88
      83: bipush        80
      85: goto          91
      88: sipush        256
      91: istore        4
      93: iconst_0
      94: iload_2
      95: if_icmpgt     112
      98: iload_2
      99: iload         4
     101: if_icmpgt     108
     104: iconst_1
     105: goto          113
     108: iconst_0
     109: goto          113
     112: iconst_0
     113: ifne          133
     116: ldc           #190                // String Failed requirement.
     118: astore        7
     120: new           #192                // class java/lang/IllegalArgumentException
     123: dup
     124: aload         7
     126: invokevirtual #61                 // Method java/lang/Object.toString:()Ljava/lang/String;
     129: invokespecial #193                // Method java/lang/IllegalArgumentException."<init>":(Ljava/lang/String;)V
     132: athrow
     133: aload_0
     134: iload_3
     135: aaload
     136: iload_1
     137: aaload
     138: iload_2
     139: laload
     140: lstore        7
     142: iconst_0
     143: istore        10
     145: lload         7
     147: ldc2_w        #11                 // long -1l
     150: lcmp
     151: ifeq          157
     154: lload         7
     156: lreturn
     157: nop
     158: nop
     159: iload_2
     160: iload         4
     162: if_icmplt     169
     165: lconst_1
     166: goto          208
     169: iload_1
     170: ifne          197
     173: aload_0
     174: bipush        6
     176: iload_2
     177: iconst_1
     178: iadd
     179: iload_3
     180: invokestatic  #195                // Method main$model:([[[JIII)J
     183: aload_0
     184: bipush        8
     186: iload_2
     187: iconst_1
     188: iadd
     189: iload_3
     190: invokestatic  #195                // Method main$model:([[[JIII)J
     193: ladd
     194: goto          208
     197: aload_0
     198: iload_1
     199: iconst_1
     200: isub
     201: iload_2
     202: iconst_1
     203: iadd
     204: iload_3
     205: invokestatic  #195                // Method main$model:([[[JIII)J
     208: lstore        5
     210: lload         5
     212: lstore        8
     214: lload         8
     216: lstore        10
     218: iconst_0
     219: istore        12
     221: aload_0
     222: iload_3
     223: aaload
     224: iload_1
     225: aaload
     226: iload_2
     227: lload         5
     229: lastore
     230: nop
     231: lload         8
     233: lreturn

  private static final long main$part1(long[][][], java.util.List<java.lang.Integer>);
    Code:
       0: aload_1
       1: checkcast     #129                // class java/lang/Iterable
       4: astore_2
       5: lconst_0
       6: lstore_3
       7: aload_2
       8: invokeinterface #144,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      13: astore        5
      15: aload         5
      17: invokeinterface #150,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
      22: ifeq          69
      25: aload         5
      27: invokeinterface #154,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      32: astore        6
      34: lload_3
      35: aload         6
      37: checkcast     #205                // class java/lang/Number
      40: invokevirtual #209                // Method java/lang/Number.intValue:()I
      43: istore        7
      45: lstore        9
      47: iconst_0
      48: istore        8
      50: aload_0
      51: iload         7
      53: iconst_0
      54: iconst_0
      55: invokestatic  #195                // Method main$model:([[[JIII)J
      58: lstore        11
      60: lload         9
      62: lload         11
      64: ladd
      65: lstore_3
      66: goto          15
      69: lload_3
      70: lreturn

  private static final long main$part2(long[][][], java.util.List<java.lang.Integer>);
    Code:
       0: aload_1
       1: checkcast     #129                // class java/lang/Iterable
       4: astore_2
       5: lconst_0
       6: lstore_3
       7: aload_2
       8: invokeinterface #144,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      13: astore        5
      15: aload         5
      17: invokeinterface #150,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
      22: ifeq          69
      25: aload         5
      27: invokeinterface #154,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      32: astore        6
      34: lload_3
      35: aload         6
      37: checkcast     #205                // class java/lang/Number
      40: invokevirtual #209                // Method java/lang/Number.intValue:()I
      43: istore        7
      45: lstore        9
      47: iconst_0
      48: istore        8
      50: aload_0
      51: iload         7
      53: iconst_0
      54: iconst_1
      55: invokestatic  #195                // Method main$model:([[[JIII)J
      58: lstore        11
      60: lload         9
      62: lload         11
      64: ladd
      65: lstore_3
      66: goto          15
      69: lload_3
      70: lreturn
}