package day17

import java.io.File

fun main() {
    val jetPattern = File("src/day17/input.txt").readLines().first()

    val rockShapes = listOf(
        listOf(Pair(0,0), Pair(1,0), Pair(2,0), Pair(3,0)),
        listOf(Pair(0,1), Pair(1,0), Pair(1,1), Pair(1,2), Pair(2,1)),
        listOf(Pair(0,0), Pair(1,0), Pair(2,0), Pair(2,1), Pair(2,2)),
        listOf(Pair(0,0), Pair(0,1), Pair(0,2), Pair(0,3)),
        listOf(Pair(0,0), Pair(0,1), Pair(1,0), Pair(1,1))
    )

    var jetPatternIndex = 0
    val stoppedRocks = mutableSetOf<Pair<Long, Long>>()

    val heights = mutableListOf<Long>()
    val cycleHeights = mutableListOf<Long>()
    val cycleRocks = mutableListOf<Long>()

    for (rock in 0 .. 1_000_000_000_000) {
        val rockShapeIndex = (rock % rockShapes.size).toInt()
        val rockShape = rockShapes[rockShapeIndex]
        var coord = Pair(2L, 3 + (stoppedRocks.maxOfOrNull { it.second + 1 } ?: 0))
        while (true) {
            val jet = jetPattern[jetPatternIndex]
            jetPatternIndex = (jetPatternIndex + 1) % jetPattern.length
            val acrossCoord = if (jet == '>') {
                Pair(coord.first + 1L, coord.second)
            } else {
                Pair(coord.first - 1L, coord.second)
            }
            if (allowed(rockCoords(acrossCoord, rockShape), stoppedRocks)) {
                coord = acrossCoord
            }
            val downCoord = Pair(coord.first, coord.second - 1)
            if (allowed(rockCoords(downCoord, rockShape), stoppedRocks)) {
                coord = downCoord
            } else {
                stoppedRocks.addAll(rockCoords(coord, rockShape))
                break
            }
        }
        val height = stoppedRocks.maxOf { it.second } + 1
        heights.add(height)
        if (rock == 2022L - 1) println(height)
        if (jetPatternIndex == 0) {
            cycleHeights.add(height)
            cycleRocks.add(rock)
        }
        if (cycleHeights.size > 3 && (cycleHeights[cycleHeights.size - 1] - cycleHeights[cycleHeights.size - 2]) ==
            (cycleHeights[cycleHeights.size - 2] - cycleHeights[cycleHeights.size - 3])) break
    }

    val cycleHeightDiff = cycleHeights[cycleHeights.size - 1] - cycleHeights[cycleHeights.size - 2]
    val cycleRockDiff = cycleRocks[cycleRocks.size - 1] - cycleRocks[cycleRocks.size - 2]
    val cycleStarts = cycleRocks[0] + 1

    val remainder = (1_000_000_000_000 - cycleStarts) % cycleRockDiff
    val remainderHeight = heights[(cycleStarts + remainder - 1).toInt()]

    println(remainderHeight + (((1_000_000_000_000 - cycleStarts) / cycleRockDiff) * cycleHeightDiff))
}

fun allowed(rockCoords: List<Pair<Long, Long>>, stoppedRocks: Set<Pair<Long, Long>>): Boolean {
    rockCoords.forEach {
        if (it.second < 0) return false
        if (it.first < 0) return false
        if (it.first > 6) return false
        if (it in stoppedRocks) return false
    }
    return true
}

fun rockCoords(coord: Pair<Long, Long>, rockShape: List<Pair<Int, Int>>): List<Pair<Long, Long>> =
    rockShape.map { Pair(coord.first + it.first, coord.second + it.second) }

Compiled from "Day17.kt"
public final class day17.Day17Kt {
  public static final void main();
    Code:
       0: new           #8                  // class java/io/File
       3: dup
       4: ldc           #10                 // String src/day17/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: invokestatic  #26                 // Method kotlin/collections/CollectionsKt.first:(Ljava/util/List;)Ljava/lang/Object;
      18: checkcast     #28                 // class java/lang/String
      21: astore_0
      22: iconst_5
      23: anewarray     #30                 // class java/util/List
      26: astore_2
      27: aload_2
      28: iconst_0
      29: iconst_4
      30: anewarray     #32                 // class kotlin/Pair
      33: astore_3
      34: aload_3
      35: iconst_0
      36: new           #32                 // class kotlin/Pair
      39: dup
      40: iconst_0
      41: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      44: iconst_0
      45: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      48: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
      51: aastore
      52: aload_3
      53: iconst_1
      54: new           #32                 // class kotlin/Pair
      57: dup
      58: iconst_1
      59: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      62: iconst_0
      63: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      66: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
      69: aastore
      70: aload_3
      71: iconst_2
      72: new           #32                 // class kotlin/Pair
      75: dup
      76: iconst_2
      77: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      80: iconst_0
      81: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      84: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
      87: aastore
      88: aload_3
      89: iconst_3
      90: new           #32                 // class kotlin/Pair
      93: dup
      94: iconst_3
      95: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      98: iconst_0
      99: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     102: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     105: aastore
     106: aload_3
     107: invokestatic  #45                 // Method kotlin/collections/CollectionsKt.listOf:([Ljava/lang/Object;)Ljava/util/List;
     110: aastore
     111: aload_2
     112: iconst_1
     113: iconst_5
     114: anewarray     #32                 // class kotlin/Pair
     117: astore_3
     118: aload_3
     119: iconst_0
     120: new           #32                 // class kotlin/Pair
     123: dup
     124: iconst_0
     125: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     128: iconst_1
     129: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     132: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     135: aastore
     136: aload_3
     137: iconst_1
     138: new           #32                 // class kotlin/Pair
     141: dup
     142: iconst_1
     143: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     146: iconst_0
     147: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     150: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     153: aastore
     154: aload_3
     155: iconst_2
     156: new           #32                 // class kotlin/Pair
     159: dup
     160: iconst_1
     161: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     164: iconst_1
     165: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     168: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     171: aastore
     172: aload_3
     173: iconst_3
     174: new           #32                 // class kotlin/Pair
     177: dup
     178: iconst_1
     179: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     182: iconst_2
     183: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     186: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     189: aastore
     190: aload_3
     191: iconst_4
     192: new           #32                 // class kotlin/Pair
     195: dup
     196: iconst_2
     197: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     200: iconst_1
     201: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     204: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     207: aastore
     208: aload_3
     209: invokestatic  #45                 // Method kotlin/collections/CollectionsKt.listOf:([Ljava/lang/Object;)Ljava/util/List;
     212: aastore
     213: aload_2
     214: iconst_2
     215: iconst_5
     216: anewarray     #32                 // class kotlin/Pair
     219: astore_3
     220: aload_3
     221: iconst_0
     222: new           #32                 // class kotlin/Pair
     225: dup
     226: iconst_0
     227: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     230: iconst_0
     231: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     234: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     237: aastore
     238: aload_3
     239: iconst_1
     240: new           #32                 // class kotlin/Pair
     243: dup
     244: iconst_1
     245: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     248: iconst_0
     249: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     252: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     255: aastore
     256: aload_3
     257: iconst_2
     258: new           #32                 // class kotlin/Pair
     261: dup
     262: iconst_2
     263: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     266: iconst_0
     267: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     270: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     273: aastore
     274: aload_3
     275: iconst_3
     276: new           #32                 // class kotlin/Pair
     279: dup
     280: iconst_2
     281: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     284: iconst_1
     285: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     288: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     291: aastore
     292: aload_3
     293: iconst_4
     294: new           #32                 // class kotlin/Pair
     297: dup
     298: iconst_2
     299: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     302: iconst_2
     303: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     306: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     309: aastore
     310: aload_3
     311: invokestatic  #45                 // Method kotlin/collections/CollectionsKt.listOf:([Ljava/lang/Object;)Ljava/util/List;
     314: aastore
     315: aload_2
     316: iconst_3
     317: iconst_4
     318: anewarray     #32                 // class kotlin/Pair
     321: astore_3
     322: aload_3
     323: iconst_0
     324: new           #32                 // class kotlin/Pair
     327: dup
     328: iconst_0
     329: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     332: iconst_0
     333: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     336: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     339: aastore
     340: aload_3
     341: iconst_1
     342: new           #32                 // class kotlin/Pair
     345: dup
     346: iconst_0
     347: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     350: iconst_1
     351: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     354: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     357: aastore
     358: aload_3
     359: iconst_2
     360: new           #32                 // class kotlin/Pair
     363: dup
     364: iconst_0
     365: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     368: iconst_2
     369: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     372: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     375: aastore
     376: aload_3
     377: iconst_3
     378: new           #32                 // class kotlin/Pair
     381: dup
     382: iconst_0
     383: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     386: iconst_3
     387: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     390: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     393: aastore
     394: aload_3
     395: invokestatic  #45                 // Method kotlin/collections/CollectionsKt.listOf:([Ljava/lang/Object;)Ljava/util/List;
     398: aastore
     399: aload_2
     400: iconst_4
     401: iconst_4
     402: anewarray     #32                 // class kotlin/Pair
     405: astore_3
     406: aload_3
     407: iconst_0
     408: new           #32                 // class kotlin/Pair
     411: dup
     412: iconst_0
     413: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     416: iconst_0
     417: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     420: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     423: aastore
     424: aload_3
     425: iconst_1
     426: new           #32                 // class kotlin/Pair
     429: dup
     430: iconst_0
     431: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     434: iconst_1
     435: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     438: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     441: aastore
     442: aload_3
     443: iconst_2
     444: new           #32                 // class kotlin/Pair
     447: dup
     448: iconst_1
     449: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     452: iconst_0
     453: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     456: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     459: aastore
     460: aload_3
     461: iconst_3
     462: new           #32                 // class kotlin/Pair
     465: dup
     466: iconst_1
     467: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     470: iconst_1
     471: invokestatic  #38                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     474: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     477: aastore
     478: aload_3
     479: invokestatic  #45                 // Method kotlin/collections/CollectionsKt.listOf:([Ljava/lang/Object;)Ljava/util/List;
     482: aastore
     483: aload_2
     484: invokestatic  #45                 // Method kotlin/collections/CollectionsKt.listOf:([Ljava/lang/Object;)Ljava/util/List;
     487: astore_1
     488: iconst_0
     489: istore_2
     490: new           #47                 // class java/util/LinkedHashSet
     493: dup
     494: invokespecial #49                 // Method java/util/LinkedHashSet."<init>":()V
     497: checkcast     #51                 // class java/util/Set
     500: astore_3
     501: new           #53                 // class java/util/ArrayList
     504: dup
     505: invokespecial #54                 // Method java/util/ArrayList."<init>":()V
     508: checkcast     #30                 // class java/util/List
     511: astore        4
     513: new           #53                 // class java/util/ArrayList
     516: dup
     517: invokespecial #54                 // Method java/util/ArrayList."<init>":()V
     520: checkcast     #30                 // class java/util/List
     523: astore        5
     525: new           #53                 // class java/util/ArrayList
     528: dup
     529: invokespecial #54                 // Method java/util/ArrayList."<init>":()V
     532: checkcast     #30                 // class java/util/List
     535: astore        6
     537: lconst_0
     538: lstore        7
     540: lload         7
     542: ldc2_w        #55                 // long 1000000000001l
     545: lcmp
     546: ifge          1230
     549: lload         7
     551: aload_1
     552: invokeinterface #60,  1           // InterfaceMethod java/util/List.size:()I
     557: i2l
     558: lrem
     559: l2i
     560: istore        9
     562: aload_1
     563: iload         9
     565: invokeinterface #64,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     570: checkcast     #30                 // class java/util/List
     573: astore        10
     575: ldc2_w        #65                 // long 2l
     578: invokestatic  #71                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     581: iconst_3
     582: i2l
     583: aload_3
     584: checkcast     #73                 // class java/lang/Iterable
     587: astore        13
     589: lstore        22
     591: astore        21
     593: aload         13
     595: invokeinterface #77,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     600: astore        14
     602: aload         14
     604: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     609: ifne          616
     612: aconst_null
     613: goto          719
     616: aload         14
     618: invokeinterface #87,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     623: checkcast     #32                 // class kotlin/Pair
     626: astore        15
     628: iconst_0
     629: istore        16
     631: aload         15
     633: invokevirtual #90                 // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     636: checkcast     #92                 // class java/lang/Number
     639: invokevirtual #96                 // Method java/lang/Number.longValue:()J
     642: lconst_1
     643: ladd
     644: invokestatic  #71                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     647: checkcast     #98                 // class java/lang/Comparable
     650: astore        15
     652: aload         14
     654: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     659: ifeq          717
     662: aload         14
     664: invokeinterface #87,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     669: checkcast     #32                 // class kotlin/Pair
     672: astore        16
     674: iconst_0
     675: istore        18
     677: aload         16
     679: invokevirtual #90                 // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     682: checkcast     #92                 // class java/lang/Number
     685: invokevirtual #96                 // Method java/lang/Number.longValue:()J
     688: lconst_1
     689: ladd
     690: invokestatic  #71                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     693: checkcast     #98                 // class java/lang/Comparable
     696: astore        16
     698: aload         15
     700: aload         16
     702: invokeinterface #102,  2          // InterfaceMethod java/lang/Comparable.compareTo:(Ljava/lang/Object;)I
     707: ifge          652
     710: aload         16
     712: astore        15
     714: goto          652
     717: aload         15
     719: astore        24
     721: aload         21
     723: lload         22
     725: aload         24
     727: checkcast     #68                 // class java/lang/Long
     730: dup
     731: ifnull        740
     734: invokevirtual #103                // Method java/lang/Long.longValue:()J
     737: goto          742
     740: pop
     741: lconst_0
     742: ladd
     743: invokestatic  #71                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     746: astore        25
     748: astore        26
     750: new           #32                 // class kotlin/Pair
     753: dup
     754: aload         26
     756: aload         25
     758: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     761: astore        11
     763: nop
     764: aload_0
     765: iload_2
     766: invokevirtual #107                // Method java/lang/String.charAt:(I)C
     769: istore        12
     771: iload_2
     772: iconst_1
     773: iadd
     774: aload_0
     775: invokevirtual #110                // Method java/lang/String.length:()I
     778: irem
     779: istore_2
     780: iload         12
     782: bipush        62
     784: if_icmpne     818
     787: new           #32                 // class kotlin/Pair
     790: dup
     791: aload         11
     793: invokevirtual #113                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     796: checkcast     #92                 // class java/lang/Number
     799: invokevirtual #96                 // Method java/lang/Number.longValue:()J
     802: lconst_1
     803: ladd
     804: invokestatic  #71                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     807: aload         11
     809: invokevirtual #90                 // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     812: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     815: goto          846
     818: new           #32                 // class kotlin/Pair
     821: dup
     822: aload         11
     824: invokevirtual #113                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     827: checkcast     #92                 // class java/lang/Number
     830: invokevirtual #96                 // Method java/lang/Number.longValue:()J
     833: lconst_1
     834: lsub
     835: invokestatic  #71                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     838: aload         11
     840: invokevirtual #90                 // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     843: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     846: astore        13
     848: aload         13
     850: aload         10
     852: invokestatic  #117                // Method rockCoords:(Lkotlin/Pair;Ljava/util/List;)Ljava/util/List;
     855: aload_3
     856: invokestatic  #121                // Method allowed:(Ljava/util/List;Ljava/util/Set;)Z
     859: ifeq          866
     862: aload         13
     864: astore        11
     866: new           #32                 // class kotlin/Pair
     869: dup
     870: aload         11
     872: invokevirtual #113                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     875: aload         11
     877: invokevirtual #90                 // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     880: checkcast     #92                 // class java/lang/Number
     883: invokevirtual #96                 // Method java/lang/Number.longValue:()J
     886: lconst_1
     887: lsub
     888: invokestatic  #71                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     891: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     894: astore        14
     896: aload         14
     898: aload         10
     900: invokestatic  #117                // Method rockCoords:(Lkotlin/Pair;Ljava/util/List;)Ljava/util/List;
     903: aload_3
     904: invokestatic  #121                // Method allowed:(Ljava/util/List;Ljava/util/Set;)Z
     907: ifeq          917
     910: aload         14
     912: astore        11
     914: goto          763
     917: aload_3
     918: aload         11
     920: aload         10
     922: invokestatic  #117                // Method rockCoords:(Lkotlin/Pair;Ljava/util/List;)Ljava/util/List;
     925: checkcast     #123                // class java/util/Collection
     928: invokeinterface #127,  2          // InterfaceMethod java/util/Set.addAll:(Ljava/util/Collection;)Z
     933: pop
     934: goto          937
     937: aload_3
     938: checkcast     #73                 // class java/lang/Iterable
     941: invokeinterface #77,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     946: astore        15
     948: aload         15
     950: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     955: ifne          966
     958: new           #129                // class java/util/NoSuchElementException
     961: dup
     962: invokespecial #130                // Method java/util/NoSuchElementException."<init>":()V
     965: athrow
     966: aload         15
     968: invokeinterface #87,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     973: checkcast     #32                 // class kotlin/Pair
     976: astore        16
     978: iconst_0
     979: istore        18
     981: aload         16
     983: invokevirtual #90                 // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     986: checkcast     #92                 // class java/lang/Number
     989: invokevirtual #96                 // Method java/lang/Number.longValue:()J
     992: lstore        16
     994: aload         15
     996: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
    1001: ifeq          1047
    1004: aload         15
    1006: invokeinterface #87,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
    1011: checkcast     #32                 // class kotlin/Pair
    1014: astore        18
    1016: iconst_0
    1017: istore        20
    1019: aload         18
    1021: invokevirtual #90                 // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
    1024: checkcast     #92                 // class java/lang/Number
    1027: invokevirtual #96                 // Method java/lang/Number.longValue:()J
    1030: lstore        18
    1032: lload         16
    1034: lload         18
    1036: lcmp
    1037: ifge          994
    1040: lload         18
    1042: lstore        16
    1044: goto          994
    1047: lload         16
    1049: lconst_1
    1050: ladd
    1051: lstore        12
    1053: aload         4
    1055: lload         12
    1057: invokestatic  #71                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
    1060: invokeinterface #134,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
    1065: pop
    1066: lload         7
    1068: ldc2_w        #135                // long 2021l
    1071: lcmp
    1072: ifne          1083
    1075: getstatic     #142                // Field java/lang/System.out:Ljava/io/PrintStream;
    1078: lload         12
    1080: invokevirtual #148                // Method java/io/PrintStream.println:(J)V
    1083: iload_2
    1084: ifne          1113
    1087: aload         5
    1089: lload         12
    1091: invokestatic  #71                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
    1094: invokeinterface #134,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
    1099: pop
    1100: aload         6
    1102: lload         7
    1104: invokestatic  #71                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
    1107: invokeinterface #134,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
    1112: pop
    1113: aload         5
    1115: invokeinterface #60,  1           // InterfaceMethod java/util/List.size:()I
    1120: iconst_3
    1121: if_icmple     1221
    1124: aload         5
    1126: aload         5
    1128: invokeinterface #60,  1           // InterfaceMethod java/util/List.size:()I
    1133: iconst_1
    1134: isub
    1135: invokeinterface #64,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
    1140: checkcast     #92                 // class java/lang/Number
    1143: invokevirtual #96                 // Method java/lang/Number.longValue:()J
    1146: aload         5
    1148: aload         5
    1150: invokeinterface #60,  1           // InterfaceMethod java/util/List.size:()I
    1155: iconst_2
    1156: isub
    1157: invokeinterface #64,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
    1162: checkcast     #92                 // class java/lang/Number
    1165: invokevirtual #96                 // Method java/lang/Number.longValue:()J
    1168: lsub
    1169: aload         5
    1171: aload         5
    1173: invokeinterface #60,  1           // InterfaceMethod java/util/List.size:()I
    1178: iconst_2
    1179: isub
    1180: invokeinterface #64,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
    1185: checkcast     #92                 // class java/lang/Number
    1188: invokevirtual #96                 // Method java/lang/Number.longValue:()J
    1191: aload         5
    1193: aload         5
    1195: invokeinterface #60,  1           // InterfaceMethod java/util/List.size:()I
    1200: iconst_3
    1201: isub
    1202: invokeinterface #64,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
    1207: checkcast     #92                 // class java/lang/Number
    1210: invokevirtual #96                 // Method java/lang/Number.longValue:()J
    1213: lsub
    1214: lcmp
    1215: ifne          1221
    1218: goto          1230
    1221: lload         7
    1223: lconst_1
    1224: ladd
    1225: lstore        7
    1227: goto          540
    1230: aload         5
    1232: aload         5
    1234: invokeinterface #60,  1           // InterfaceMethod java/util/List.size:()I
    1239: iconst_1
    1240: isub
    1241: invokeinterface #64,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
    1246: checkcast     #92                 // class java/lang/Number
    1249: invokevirtual #96                 // Method java/lang/Number.longValue:()J
    1252: aload         5
    1254: aload         5
    1256: invokeinterface #60,  1           // InterfaceMethod java/util/List.size:()I
    1261: iconst_2
    1262: isub
    1263: invokeinterface #64,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
    1268: checkcast     #92                 // class java/lang/Number
    1271: invokevirtual #96                 // Method java/lang/Number.longValue:()J
    1274: lsub
    1275: lstore        7
    1277: aload         6
    1279: aload         6
    1281: invokeinterface #60,  1           // InterfaceMethod java/util/List.size:()I
    1286: iconst_1
    1287: isub
    1288: invokeinterface #64,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
    1293: checkcast     #92                 // class java/lang/Number
    1296: invokevirtual #96                 // Method java/lang/Number.longValue:()J
    1299: aload         6
    1301: aload         6
    1303: invokeinterface #60,  1           // InterfaceMethod java/util/List.size:()I
    1308: iconst_2
    1309: isub
    1310: invokeinterface #64,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
    1315: checkcast     #92                 // class java/lang/Number
    1318: invokevirtual #96                 // Method java/lang/Number.longValue:()J
    1321: lsub
    1322: lstore        9
    1324: aload         6
    1326: iconst_0
    1327: invokeinterface #64,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
    1332: checkcast     #92                 // class java/lang/Number
    1335: invokevirtual #96                 // Method java/lang/Number.longValue:()J
    1338: lconst_1
    1339: ladd
    1340: lstore        11
    1342: ldc2_w        #149                // long 1000000000000l
    1345: lload         11
    1347: lsub
    1348: lload         9
    1350: lrem
    1351: lstore        13
    1353: aload         4
    1355: lload         11
    1357: lload         13
    1359: ladd
    1360: lconst_1
    1361: lsub
    1362: l2i
    1363: invokeinterface #64,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
    1368: checkcast     #92                 // class java/lang/Number
    1371: invokevirtual #96                 // Method java/lang/Number.longValue:()J
    1374: lstore        15
    1376: lload         15
    1378: ldc2_w        #149                // long 1000000000000l
    1381: lload         11
    1383: lsub
    1384: lload         9
    1386: ldiv
    1387: lload         7
    1389: lmul
    1390: ladd
    1391: lstore        18
    1393: getstatic     #142                // Field java/lang/System.out:Ljava/io/PrintStream;
    1396: lload         18
    1398: invokevirtual #148                // Method java/io/PrintStream.println:(J)V
    1401: return

  public static final boolean allowed(java.util.List<kotlin.Pair<java.lang.Long, java.lang.Long>>, java.util.Set<kotlin.Pair<java.lang.Long, java.lang.Long>>);
    Code:
       0: aload_0
       1: ldc           #183                // String rockCoords
       3: invokestatic  #189                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: aload_1
       7: ldc           #190                // String stoppedRocks
       9: invokestatic  #189                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      12: aload_0
      13: checkcast     #73                 // class java/lang/Iterable
      16: astore_2
      17: iconst_0
      18: istore_3
      19: aload_2
      20: invokeinterface #77,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      25: astore        4
      27: aload         4
      29: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      34: ifeq          130
      37: aload         4
      39: invokeinterface #87,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      44: astore        5
      46: aload         5
      48: checkcast     #32                 // class kotlin/Pair
      51: astore        6
      53: iconst_0
      54: istore        7
      56: aload         6
      58: invokevirtual #90                 // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
      61: checkcast     #92                 // class java/lang/Number
      64: invokevirtual #96                 // Method java/lang/Number.longValue:()J
      67: lconst_0
      68: lcmp
      69: ifge          74
      72: iconst_0
      73: ireturn
      74: aload         6
      76: invokevirtual #113                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
      79: checkcast     #92                 // class java/lang/Number
      82: invokevirtual #96                 // Method java/lang/Number.longValue:()J
      85: lconst_0
      86: lcmp
      87: ifge          92
      90: iconst_0
      91: ireturn
      92: aload         6
      94: invokevirtual #113                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
      97: checkcast     #92                 // class java/lang/Number
     100: invokevirtual #96                 // Method java/lang/Number.longValue:()J
     103: ldc2_w        #191                // long 6l
     106: lcmp
     107: ifle          112
     110: iconst_0
     111: ireturn
     112: aload_1
     113: aload         6
     115: invokeinterface #195,  2          // InterfaceMethod java/util/Set.contains:(Ljava/lang/Object;)Z
     120: ifeq          125
     123: iconst_0
     124: ireturn
     125: nop
     126: nop
     127: goto          27
     130: nop
     131: iconst_1
     132: ireturn

  public static final java.util.List<kotlin.Pair<java.lang.Long, java.lang.Long>> rockCoords(kotlin.Pair<java.lang.Long, java.lang.Long>, java.util.List<kotlin.Pair<java.lang.Integer, java.lang.Integer>>);
    Code:
       0: aload_0
       1: ldc           #203                // String coord
       3: invokestatic  #189                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: aload_1
       7: ldc           #204                // String rockShape
       9: invokestatic  #189                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      12: aload_1
      13: checkcast     #73                 // class java/lang/Iterable
      16: astore_2
      17: iconst_0
      18: istore_3
      19: aload_2
      20: astore        4
      22: new           #53                 // class java/util/ArrayList
      25: dup
      26: aload_2
      27: bipush        10
      29: invokestatic  #208                // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
      32: invokespecial #211                // Method java/util/ArrayList."<init>":(I)V
      35: checkcast     #123                // class java/util/Collection
      38: astore        5
      40: iconst_0
      41: istore        6
      43: aload         4
      45: invokeinterface #77,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      50: astore        7
      52: aload         7
      54: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      59: ifeq          154
      62: aload         7
      64: invokeinterface #87,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      69: astore        8
      71: aload         5
      73: aload         8
      75: checkcast     #32                 // class kotlin/Pair
      78: astore        9
      80: astore        11
      82: iconst_0
      83: istore        10
      85: new           #32                 // class kotlin/Pair
      88: dup
      89: aload_0
      90: invokevirtual #113                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
      93: checkcast     #92                 // class java/lang/Number
      96: invokevirtual #96                 // Method java/lang/Number.longValue:()J
      99: aload         9
     101: invokevirtual #113                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     104: checkcast     #92                 // class java/lang/Number
     107: invokevirtual #96                 // Method java/lang/Number.longValue:()J
     110: ladd
     111: invokestatic  #71                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     114: aload_0
     115: invokevirtual #90                 // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     118: checkcast     #92                 // class java/lang/Number
     121: invokevirtual #96                 // Method java/lang/Number.longValue:()J
     124: aload         9
     126: invokevirtual #90                 // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     129: checkcast     #92                 // class java/lang/Number
     132: invokevirtual #96                 // Method java/lang/Number.longValue:()J
     135: ladd
     136: invokestatic  #71                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     139: invokespecial #41                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     142: aload         11
     144: swap
     145: invokeinterface #212,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     150: pop
     151: goto          52
     154: aload         5
     156: checkcast     #30                 // class java/util/List
     159: nop
     160: areturn

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


package day21

import java.io.File
import kotlin.math.roundToLong

fun main() {
    val input = File("src/day21/input.txt").readLines()
        .map { it.split(": ") }
        .associate { it[0] to it[1] }
    println(part1(input, "root"))

    input["root"]!!.split(" ").let {
        val lhs = part2(input, it[0])
        val rhs = part2(input, it[2])
        println(((rhs.second - lhs.second) / (lhs.first - rhs.first)).roundToLong())
    }
}

fun part1(input: Map<String, String>, monkey: String): Long {
    val output = input[monkey]!!
    if (output.contains(" ")) {
        output.split(" ").let { parts ->
            val a = part1(input, parts[0])
            val b = part1(input, parts[2])
            return when (parts[1]) {
                "+" -> a + b
                "-" -> a - b
                "*" -> a * b
                "/" -> a / b
                else -> throw IllegalStateException("Unknown operation ${parts[1]}")
            }
        }
    }
    return output.toLong()
}

fun part2(input: Map<String, String>, monkey: String): Pair<Double, Double> {
    val result: Pair<Double, Double>
    if (monkey == "humn") {
        result = Pair(1.0, 0.0)
    } else {
        val output = input[monkey]!!
        if (output.contains(" ")) {
            output.split(" ").let { parts ->
                val a = part2(input, parts[0])
                val b = part2(input, parts[2])
                result = when (parts[1]) {
                    "+" -> Pair(a.first + b.first, a.second + b.second)
                    "-" -> Pair(a.first - b.first, a.second - b.second)
                    "*" -> if (a.first == 0.0) Pair(
                        a.second * b.first,
                        a.second * b.second
                    ) else if (b.first == 0.0) Pair(
                        b.second * a.first,
                        b.second * a.second
                    ) else throw IllegalStateException("Multiplication by humn")

                    "/" -> if (b.first == 0.0) Pair(
                        a.first / b.second,
                        a.second / b.second
                    ) else throw IllegalStateException("Division by humn")

                    else -> throw IllegalStateException("Unknown operation ${parts[1]}")
                }
            }
        } else {
            result = Pair(0.0, output.toDouble())
        }
    }
    return result
}

Compiled from "Day21.kt"
public final class day21.Day21Kt {
  public static final void main();
    Code:
       0: new           #8                  // class java/io/File
       3: dup
       4: ldc           #10                 // String src/day21/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: checkcast     #22                 // class java/lang/Iterable
      18: astore_1
      19: nop
      20: iconst_0
      21: istore_2
      22: aload_1
      23: astore_3
      24: new           #24                 // class java/util/ArrayList
      27: dup
      28: aload_1
      29: bipush        10
      31: invokestatic  #30                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
      34: invokespecial #33                 // Method java/util/ArrayList."<init>":(I)V
      37: checkcast     #35                 // class java/util/Collection
      40: astore        4
      42: iconst_0
      43: istore        5
      45: aload_3
      46: invokeinterface #39,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      51: astore        6
      53: aload         6
      55: invokeinterface #45,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      60: ifeq          125
      63: aload         6
      65: invokeinterface #49,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      70: astore        7
      72: aload         4
      74: aload         7
      76: checkcast     #51                 // class java/lang/String
      79: astore        8
      81: astore        12
      83: iconst_0
      84: istore        9
      86: aload         8
      88: checkcast     #53                 // class java/lang/CharSequence
      91: iconst_1
      92: anewarray     #51                 // class java/lang/String
      95: astore        10
      97: aload         10
      99: iconst_0
     100: ldc           #55                 // String :
     102: aastore
     103: aload         10
     105: iconst_0
     106: iconst_0
     107: bipush        6
     109: aconst_null
     110: invokestatic  #61                 // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
     113: aload         12
     115: swap
     116: invokeinterface #65,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     121: pop
     122: goto          53
     125: aload         4
     127: checkcast     #67                 // class java/util/List
     130: nop
     131: checkcast     #22                 // class java/lang/Iterable
     134: astore_1
     135: nop
     136: iconst_0
     137: istore_2
     138: aload_1
     139: bipush        10
     141: invokestatic  #30                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     144: invokestatic  #73                 // Method kotlin/collections/MapsKt.mapCapacity:(I)I
     147: bipush        16
     149: invokestatic  #79                 // Method kotlin/ranges/RangesKt.coerceAtLeast:(II)I
     152: istore_3
     153: aload_1
     154: astore        4
     156: new           #81                 // class java/util/LinkedHashMap
     159: dup
     160: iload_3
     161: invokespecial #82                 // Method java/util/LinkedHashMap."<init>":(I)V
     164: checkcast     #84                 // class java/util/Map
     167: astore        5
     169: iconst_0
     170: istore        6
     172: aload         4
     174: invokeinterface #39,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     179: astore        7
     181: aload         7
     183: invokeinterface #45,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     188: ifeq          256
     191: aload         7
     193: invokeinterface #49,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     198: astore        8
     200: aload         5
     202: astore        9
     204: aload         8
     206: checkcast     #67                 // class java/util/List
     209: astore        10
     211: iconst_0
     212: istore        11
     214: aload         10
     216: iconst_0
     217: invokeinterface #88,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     222: aload         10
     224: iconst_1
     225: invokeinterface #88,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     230: invokestatic  #94                 // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     233: astore        10
     235: aload         9
     237: aload         10
     239: invokevirtual #99                 // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     242: aload         10
     244: invokevirtual #102                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     247: invokeinterface #106,  3          // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
     252: pop
     253: goto          181
     256: aload         5
     258: nop
     259: astore_0
     260: aload_0
     261: ldc           #108                // String root
     263: invokestatic  #112                // Method part1:(Ljava/util/Map;Ljava/lang/String;)J
     266: lstore_1
     267: getstatic     #118                // Field java/lang/System.out:Ljava/io/PrintStream;
     270: lload_1
     271: invokevirtual #124                // Method java/io/PrintStream.println:(J)V
     274: aload_0
     275: ldc           #108                // String root
     277: invokeinterface #127,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     282: dup
     283: invokestatic  #133                // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     286: checkcast     #53                 // class java/lang/CharSequence
     289: iconst_1
     290: anewarray     #51                 // class java/lang/String
     293: astore_1
     294: aload_1
     295: iconst_0
     296: ldc           #135                // String
     298: aastore
     299: aload_1
     300: iconst_0
     301: iconst_0
     302: bipush        6
     304: aconst_null
     305: invokestatic  #61                 // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
     308: astore_2
     309: iconst_0
     310: istore_3
     311: aload_0
     312: aload_2
     313: iconst_0
     314: invokeinterface #88,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     319: checkcast     #51                 // class java/lang/String
     322: invokestatic  #139                // Method part2:(Ljava/util/Map;Ljava/lang/String;)Lkotlin/Pair;
     325: astore        4
     327: aload_0
     328: aload_2
     329: iconst_2
     330: invokeinterface #88,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     335: checkcast     #51                 // class java/lang/String
     338: invokestatic  #139                // Method part2:(Ljava/util/Map;Ljava/lang/String;)Lkotlin/Pair;
     341: astore        5
     343: aload         5
     345: invokevirtual #102                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     348: checkcast     #141                // class java/lang/Number
     351: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     354: aload         4
     356: invokevirtual #102                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     359: checkcast     #141                // class java/lang/Number
     362: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     365: dsub
     366: aload         4
     368: invokevirtual #99                 // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     371: checkcast     #141                // class java/lang/Number
     374: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     377: aload         5
     379: invokevirtual #99                 // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     382: checkcast     #141                // class java/lang/Number
     385: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     388: dsub
     389: ddiv
     390: invokestatic  #151                // Method kotlin/math/MathKt.roundToLong:(D)J
     393: lstore        6
     395: getstatic     #118                // Field java/lang/System.out:Ljava/io/PrintStream;
     398: lload         6
     400: invokevirtual #124                // Method java/io/PrintStream.println:(J)V
     403: nop
     404: nop
     405: return

  public static final long part1(java.util.Map<java.lang.String, java.lang.String>, java.lang.String);
    Code:
       0: aload_0
       1: ldc           #181                // String input
       3: invokestatic  #185                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: aload_1
       7: ldc           #187                // String monkey
       9: invokestatic  #185                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      12: aload_0
      13: aload_1
      14: invokeinterface #127,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
      19: dup
      20: invokestatic  #133                // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
      23: checkcast     #51                 // class java/lang/String
      26: astore_2
      27: aload_2
      28: checkcast     #53                 // class java/lang/CharSequence
      31: ldc           #135                // String
      33: checkcast     #53                 // class java/lang/CharSequence
      36: iconst_0
      37: iconst_2
      38: aconst_null
      39: invokestatic  #191                // Method kotlin/text/StringsKt.contains$default:(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z
      42: ifeq          286
      45: aload_2
      46: checkcast     #53                 // class java/lang/CharSequence
      49: iconst_1
      50: anewarray     #51                 // class java/lang/String
      53: astore_3
      54: aload_3
      55: iconst_0
      56: ldc           #135                // String
      58: aastore
      59: aload_3
      60: iconst_0
      61: iconst_0
      62: bipush        6
      64: aconst_null
      65: invokestatic  #61                 // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
      68: astore        4
      70: iconst_0
      71: istore        5
      73: aload_0
      74: aload         4
      76: iconst_0
      77: invokeinterface #88,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      82: checkcast     #51                 // class java/lang/String
      85: invokestatic  #112                // Method part1:(Ljava/util/Map;Ljava/lang/String;)J
      88: lstore        6
      90: aload_0
      91: aload         4
      93: iconst_2
      94: invokeinterface #88,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      99: checkcast     #51                 // class java/lang/String
     102: invokestatic  #112                // Method part1:(Ljava/util/Map;Ljava/lang/String;)J
     105: lstore        8
     107: aload         4
     109: iconst_1
     110: invokeinterface #88,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     115: checkcast     #51                 // class java/lang/String
     118: astore        10
     120: aload         10
     122: invokevirtual #195                // Method java/lang/String.hashCode:()I
     125: tableswitch   { // 42 to 47
                    42: 164
                    43: 177
                    44: 248
                    45: 190
                    46: 248
                    47: 203
               default: 248
          }
     164: aload         10
     166: ldc           #197                // String *
     168: invokevirtual #200                // Method java/lang/String.equals:(Ljava/lang/Object;)Z
     171: ifne          232
     174: goto          248
     177: aload         10
     179: ldc           #202                // String +
     181: invokevirtual #200                // Method java/lang/String.equals:(Ljava/lang/Object;)Z
     184: ifne          216
     187: goto          248
     190: aload         10
     192: ldc           #204                // String -
     194: invokevirtual #200                // Method java/lang/String.equals:(Ljava/lang/Object;)Z
     197: ifne          224
     200: goto          248
     203: aload         10
     205: ldc           #206                // String /
     207: invokevirtual #200                // Method java/lang/String.equals:(Ljava/lang/Object;)Z
     210: ifne          240
     213: goto          248
     216: lload         6
     218: lload         8
     220: ladd
     221: goto          285
     224: lload         6
     226: lload         8
     228: lsub
     229: goto          285
     232: lload         6
     234: lload         8
     236: lmul
     237: goto          285
     240: lload         6
     242: lload         8
     244: ldiv
     245: goto          285
     248: new           #208                // class java/lang/IllegalStateException
     251: dup
     252: new           #210                // class java/lang/StringBuilder
     255: dup
     256: invokespecial #212                // Method java/lang/StringBuilder."<init>":()V
     259: ldc           #214                // String Unknown operation
     261: invokevirtual #218                // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
     264: aload         4
     266: iconst_1
     267: invokeinterface #88,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     272: checkcast     #51                 // class java/lang/String
     275: invokevirtual #218                // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
     278: invokevirtual #222                // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
     281: invokespecial #223                // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
     284: athrow
     285: lreturn
     286: aload_2
     287: invokestatic  #229                // Method java/lang/Long.parseLong:(Ljava/lang/String;)J
     290: lreturn

  public static final kotlin.Pair<java.lang.Double, java.lang.Double> part2(java.util.Map<java.lang.String, java.lang.String>, java.lang.String);
    Code:
       0: aload_0
       1: ldc           #181                // String input
       3: invokestatic  #185                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: aload_1
       7: ldc           #187                // String monkey
       9: invokestatic  #185                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      12: aconst_null
      13: astore_2
      14: aload_1
      15: ldc           #240                // String humn
      17: invokestatic  #244                // Method kotlin/jvm/internal/Intrinsics.areEqual:(Ljava/lang/Object;Ljava/lang/Object;)Z
      20: ifeq          42
      23: new           #96                 // class kotlin/Pair
      26: dup
      27: dconst_1
      28: invokestatic  #250                // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
      31: dconst_0
      32: invokestatic  #250                // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
      35: invokespecial #253                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
      38: astore_2
      39: goto          712
      42: aload_0
      43: aload_1
      44: invokeinterface #127,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
      49: dup
      50: invokestatic  #133                // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
      53: checkcast     #51                 // class java/lang/String
      56: astore_3
      57: aload_3
      58: checkcast     #53                 // class java/lang/CharSequence
      61: ldc           #135                // String
      63: checkcast     #53                 // class java/lang/CharSequence
      66: iconst_0
      67: iconst_2
      68: aconst_null
      69: invokestatic  #191                // Method kotlin/text/StringsKt.contains$default:(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z
      72: ifeq          693
      75: aload_3
      76: checkcast     #53                 // class java/lang/CharSequence
      79: iconst_1
      80: anewarray     #51                 // class java/lang/String
      83: astore        4
      85: aload         4
      87: iconst_0
      88: ldc           #135                // String
      90: aastore
      91: aload         4
      93: iconst_0
      94: iconst_0
      95: bipush        6
      97: aconst_null
      98: invokestatic  #61                 // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
     101: astore        5
     103: iconst_0
     104: istore        6
     106: aload_0
     107: aload         5
     109: iconst_0
     110: invokeinterface #88,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     115: checkcast     #51                 // class java/lang/String
     118: invokestatic  #139                // Method part2:(Ljava/util/Map;Ljava/lang/String;)Lkotlin/Pair;
     121: astore        7
     123: aload_0
     124: aload         5
     126: iconst_2
     127: invokeinterface #88,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     132: checkcast     #51                 // class java/lang/String
     135: invokestatic  #139                // Method part2:(Ljava/util/Map;Ljava/lang/String;)Lkotlin/Pair;
     138: astore        8
     140: aload         5
     142: iconst_1
     143: invokeinterface #88,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     148: checkcast     #51                 // class java/lang/String
     151: astore        9
     153: aload         9
     155: invokevirtual #195                // Method java/lang/String.hashCode:()I
     158: tableswitch   { // 42 to 47
                    42: 196
                    43: 209
                    44: 651
                    45: 222
                    46: 651
                    47: 235
               default: 651
          }
     196: aload         9
     198: ldc           #197                // String *
     200: invokevirtual #200                // Method java/lang/String.equals:(Ljava/lang/Object;)Z
     203: ifne          372
     206: goto          651
     209: aload         9
     211: ldc           #202                // String +
     213: invokevirtual #200                // Method java/lang/String.equals:(Ljava/lang/Object;)Z
     216: ifne          248
     219: goto          651
     222: aload         9
     224: ldc           #204                // String -
     226: invokevirtual #200                // Method java/lang/String.equals:(Ljava/lang/Object;)Z
     229: ifne          310
     232: goto          651
     235: aload         9
     237: ldc           #206                // String /
     239: invokevirtual #200                // Method java/lang/String.equals:(Ljava/lang/Object;)Z
     242: ifne          554
     245: goto          651
     248: new           #96                 // class kotlin/Pair
     251: dup
     252: aload         7
     254: invokevirtual #99                 // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     257: checkcast     #141                // class java/lang/Number
     260: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     263: aload         8
     265: invokevirtual #99                 // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     268: checkcast     #141                // class java/lang/Number
     271: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     274: dadd
     275: invokestatic  #250                // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
     278: aload         7
     280: invokevirtual #102                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     283: checkcast     #141                // class java/lang/Number
     286: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     289: aload         8
     291: invokevirtual #102                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     294: checkcast     #141                // class java/lang/Number
     297: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     300: dadd
     301: invokestatic  #250                // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
     304: invokespecial #253                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     307: goto          688
     310: new           #96                 // class kotlin/Pair
     313: dup
     314: aload         7
     316: invokevirtual #99                 // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     319: checkcast     #141                // class java/lang/Number
     322: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     325: aload         8
     327: invokevirtual #99                 // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     330: checkcast     #141                // class java/lang/Number
     333: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     336: dsub
     337: invokestatic  #250                // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
     340: aload         7
     342: invokevirtual #102                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     345: checkcast     #141                // class java/lang/Number
     348: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     351: aload         8
     353: invokevirtual #102                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     356: checkcast     #141                // class java/lang/Number
     359: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     362: dsub
     363: invokestatic  #250                // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
     366: invokespecial #253                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     369: goto          688
     372: aload         7
     374: invokevirtual #99                 // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     377: checkcast     #141                // class java/lang/Number
     380: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     383: dconst_0
     384: dcmpg
     385: ifne          392
     388: iconst_1
     389: goto          393
     392: iconst_0
     393: ifeq          458
     396: new           #96                 // class kotlin/Pair
     399: dup
     400: aload         7
     402: invokevirtual #102                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     405: checkcast     #141                // class java/lang/Number
     408: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     411: aload         8
     413: invokevirtual #99                 // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     416: checkcast     #141                // class java/lang/Number
     419: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     422: dmul
     423: invokestatic  #250                // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
     426: aload         7
     428: invokevirtual #102                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     431: checkcast     #141                // class java/lang/Number
     434: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     437: aload         8
     439: invokevirtual #102                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     442: checkcast     #141                // class java/lang/Number
     445: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     448: dmul
     449: invokestatic  #250                // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
     452: invokespecial #253                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     455: goto          688
     458: aload         8
     460: invokevirtual #99                 // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     463: checkcast     #141                // class java/lang/Number
     466: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     469: dconst_0
     470: dcmpg
     471: ifne          478
     474: iconst_1
     475: goto          479
     478: iconst_0
     479: ifeq          544
     482: new           #96                 // class kotlin/Pair
     485: dup
     486: aload         8
     488: invokevirtual #102                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     491: checkcast     #141                // class java/lang/Number
     494: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     497: aload         7
     499: invokevirtual #99                 // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     502: checkcast     #141                // class java/lang/Number
     505: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     508: dmul
     509: invokestatic  #250                // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
     512: aload         8
     514: invokevirtual #102                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     517: checkcast     #141                // class java/lang/Number
     520: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     523: aload         7
     525: invokevirtual #102                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     528: checkcast     #141                // class java/lang/Number
     531: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     534: dmul
     535: invokestatic  #250                // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
     538: invokespecial #253                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     541: goto          688
     544: new           #208                // class java/lang/IllegalStateException
     547: dup
     548: ldc           #255                // String Multiplication by humn
     550: invokespecial #223                // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
     553: athrow
     554: aload         8
     556: invokevirtual #99                 // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     559: checkcast     #141                // class java/lang/Number
     562: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     565: dconst_0
     566: dcmpg
     567: ifne          574
     570: iconst_1
     571: goto          575
     574: iconst_0
     575: ifeq          640
     578: new           #96                 // class kotlin/Pair
     581: dup
     582: aload         7
     584: invokevirtual #99                 // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     587: checkcast     #141                // class java/lang/Number
     590: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     593: aload         8
     595: invokevirtual #102                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     598: checkcast     #141                // class java/lang/Number
     601: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     604: ddiv
     605: invokestatic  #250                // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
     608: aload         7
     610: invokevirtual #102                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     613: checkcast     #141                // class java/lang/Number
     616: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     619: aload         8
     621: invokevirtual #102                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     624: checkcast     #141                // class java/lang/Number
     627: invokevirtual #145                // Method java/lang/Number.doubleValue:()D
     630: ddiv
     631: invokestatic  #250                // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
     634: invokespecial #253                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     637: goto          688
     640: new           #208                // class java/lang/IllegalStateException
     643: dup
     644: ldc_w         #257                // String Division by humn
     647: invokespecial #223                // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
     650: athrow
     651: new           #208                // class java/lang/IllegalStateException
     654: dup
     655: new           #210                // class java/lang/StringBuilder
     658: dup
     659: invokespecial #212                // Method java/lang/StringBuilder."<init>":()V
     662: ldc           #214                // String Unknown operation
     664: invokevirtual #218                // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
     667: aload         5
     669: iconst_1
     670: invokeinterface #88,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     675: checkcast     #51                 // class java/lang/String
     678: invokevirtual #218                // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
     681: invokevirtual #222                // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
     684: invokespecial #223                // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
     687: athrow
     688: astore_2
     689: nop
     690: goto          712
     693: new           #96                 // class kotlin/Pair
     696: dup
     697: dconst_0
     698: invokestatic  #250                // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
     701: aload_3
     702: invokestatic  #261                // Method java/lang/Double.parseDouble:(Ljava/lang/String;)D
     705: invokestatic  #250                // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
     708: invokespecial #253                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     711: astore_2
     712: aload_2
     713: areturn

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