package day9

import java.io.File
import kotlin.math.abs
import kotlin.math.max
import kotlin.math.min
import kotlin.math.sign

fun main() {
    val input = File("src/day9/input.txt").readLines()
        .map { line -> line.split(" ") }
        .map { parts -> Pair(parts[0], parts[1].toInt()) }
        .toList()
    println(solve(input, 2))
    println(solve(input, 10))
}

fun solve(input: List<Pair<String, Int>>, knots: Int): Int {
    val rope = MutableList(knots) { Pair(0, 0) }
    val visited = mutableSetOf<Pair<Int, Int>>()
    visited.add(rope.last())
    val deltas = mapOf("U" to Pair(0, 1), "D" to Pair(0, -1), "L" to Pair(-1, 0), "R" to Pair(1, 0))
    input.forEach { pair ->
        for (i in 1..pair.second) {
            val delta = deltas[pair.first]!!
            rope[0] = Pair(rope[0].first + delta.first, rope[0].second + delta.second)
            for (j in 1 until knots) {
                if (abs(rope[j - 1].second - rope[j].second) == 2 || abs(rope[j - 1].first - rope[j].first) == 2) {
                    rope[j] =
                        Pair(
                            rope[j].first + sign(rope[j - 1].first - rope[j].first),
                            rope[j].second + sign(rope[j - 1].second - rope[j].second)
                        )
                }
            }
            visited.add(rope.last())
        }
    }
    return visited.size
}

fun sign(input: Int): Int {
    return sign(input.toDouble()).toInt()
}

fun outputRope(rope: MutableList<Pair<Int, Int>>) {
    for (j in max(0, rope.maxOf { it.second }) downTo min(0, rope.minOf { it.second })) {
        for (i in min(0, rope.minOf { it.first })..max(0, rope.maxOf { it.first })) {
            var output = "."
            if (i == 0 && j == 0) {
                output = "s"
            }
            for (k in rope.indices) {
                if (i == rope[k].first && j == rope[k].second) {
                    output = when (k) {
                        0 -> "H"
                        rope.size - 1 -> "T"
                        else -> k.toString()
                    }
                    break
                }
            }
            print(output)
        }
        println()
    }
    println()
}

Compiled from "Day9.kt"
public final class day9.Day9Kt {
  public static final void main();
    Code:
       0: new           #8                  // class java/io/File
       3: dup
       4: ldc           #10                 // String src/day9/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        11
      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         11
     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: astore_3
     140: new           #24                 // class java/util/ArrayList
     143: dup
     144: aload_1
     145: bipush        10
     147: invokestatic  #30                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     150: invokespecial #33                 // Method java/util/ArrayList."<init>":(I)V
     153: checkcast     #35                 // class java/util/Collection
     156: astore        4
     158: iconst_0
     159: istore        5
     161: aload_3
     162: invokeinterface #39,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     167: astore        6
     169: aload         6
     171: invokeinterface #45,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     176: ifeq          246
     179: aload         6
     181: invokeinterface #49,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     186: astore        7
     188: aload         4
     190: aload         7
     192: checkcast     #67                 // class java/util/List
     195: astore        8
     197: astore        11
     199: iconst_0
     200: istore        9
     202: new           #69                 // class kotlin/Pair
     205: dup
     206: aload         8
     208: iconst_0
     209: invokeinterface #73,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     214: aload         8
     216: iconst_1
     217: invokeinterface #73,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     222: checkcast     #51                 // class java/lang/String
     225: invokestatic  #79                 // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
     228: invokestatic  #83                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     231: invokespecial #86                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     234: aload         11
     236: swap
     237: invokeinterface #65,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     242: pop
     243: goto          169
     246: aload         4
     248: checkcast     #67                 // class java/util/List
     251: nop
     252: checkcast     #22                 // class java/lang/Iterable
     255: invokestatic  #90                 // Method kotlin/collections/CollectionsKt.toList:(Ljava/lang/Iterable;)Ljava/util/List;
     258: astore_0
     259: aload_0
     260: iconst_2
     261: invokestatic  #94                 // Method solve:(Ljava/util/List;I)I
     264: istore_1
     265: getstatic     #100                // Field java/lang/System.out:Ljava/io/PrintStream;
     268: iload_1
     269: invokevirtual #105                // Method java/io/PrintStream.println:(I)V
     272: aload_0
     273: bipush        10
     275: invokestatic  #94                 // Method solve:(Ljava/util/List;I)I
     278: istore_1
     279: getstatic     #100                // Field java/lang/System.out:Ljava/io/PrintStream;
     282: iload_1
     283: invokevirtual #105                // Method java/io/PrintStream.println:(I)V
     286: return

  public static final int solve(java.util.List<kotlin.Pair<java.lang.String, java.lang.Integer>>, int);
    Code:
       0: aload_0
       1: ldc           #125                // String input
       3: invokestatic  #131                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: new           #24                 // class java/util/ArrayList
       9: dup
      10: iload_1
      11: invokespecial #33                 // Method java/util/ArrayList."<init>":(I)V
      14: astore_3
      15: iconst_0
      16: istore        4
      18: iload         4
      20: iload_1
      21: if_icmpge     66
      24: iload         4
      26: istore        5
      28: aload_3
      29: iload         5
      31: istore        6
      33: astore        15
      35: iconst_0
      36: istore        7
      38: new           #69                 // class kotlin/Pair
      41: dup
      42: iconst_0
      43: invokestatic  #83                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      46: iconst_0
      47: invokestatic  #83                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      50: invokespecial #86                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
      53: aload         15
      55: swap
      56: invokevirtual #132                // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
      59: pop
      60: iinc          4, 1
      63: goto          18
      66: aload_3
      67: checkcast     #67                 // class java/util/List
      70: astore_2
      71: new           #134                // class java/util/LinkedHashSet
      74: dup
      75: invokespecial #136                // Method java/util/LinkedHashSet."<init>":()V
      78: checkcast     #138                // class java/util/Set
      81: astore_3
      82: aload_3
      83: aload_2
      84: invokestatic  #142                // Method kotlin/collections/CollectionsKt.last:(Ljava/util/List;)Ljava/lang/Object;
      87: invokeinterface #143,  2          // InterfaceMethod java/util/Set.add:(Ljava/lang/Object;)Z
      92: pop
      93: iconst_4
      94: anewarray     #69                 // class kotlin/Pair
      97: astore        5
      99: aload         5
     101: iconst_0
     102: ldc           #145                // String U
     104: new           #69                 // class kotlin/Pair
     107: dup
     108: iconst_0
     109: invokestatic  #83                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     112: iconst_1
     113: invokestatic  #83                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     116: invokespecial #86                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     119: invokestatic  #151                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     122: aastore
     123: aload         5
     125: iconst_1
     126: ldc           #153                // String D
     128: new           #69                 // class kotlin/Pair
     131: dup
     132: iconst_0
     133: invokestatic  #83                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     136: iconst_m1
     137: invokestatic  #83                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     140: invokespecial #86                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     143: invokestatic  #151                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     146: aastore
     147: aload         5
     149: iconst_2
     150: ldc           #155                // String L
     152: new           #69                 // class kotlin/Pair
     155: dup
     156: iconst_m1
     157: invokestatic  #83                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     160: iconst_0
     161: invokestatic  #83                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     164: invokespecial #86                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     167: invokestatic  #151                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     170: aastore
     171: aload         5
     173: iconst_3
     174: ldc           #157                // String R
     176: new           #69                 // class kotlin/Pair
     179: dup
     180: iconst_1
     181: invokestatic  #83                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     184: iconst_0
     185: invokestatic  #83                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     188: invokespecial #86                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     191: invokestatic  #151                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     194: aastore
     195: aload         5
     197: invokestatic  #163                // Method kotlin/collections/MapsKt.mapOf:([Lkotlin/Pair;)Ljava/util/Map;
     200: astore        4
     202: aload_0
     203: checkcast     #22                 // class java/lang/Iterable
     206: astore        5
     208: iconst_0
     209: istore        6
     211: aload         5
     213: invokeinterface #39,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     218: astore        7
     220: aload         7
     222: invokeinterface #45,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     227: ifeq          676
     230: aload         7
     232: invokeinterface #49,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     237: astore        8
     239: aload         8
     241: checkcast     #69                 // class kotlin/Pair
     244: astore        9
     246: iconst_0
     247: istore        10
     249: iconst_1
     250: istore        11
     252: aload         9
     254: invokevirtual #166                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     257: checkcast     #168                // class java/lang/Number
     260: invokevirtual #172                // Method java/lang/Number.intValue:()I
     263: istore        12
     265: iload         11
     267: iload         12
     269: if_icmpgt     671
     272: aload         4
     274: aload         9
     276: invokevirtual #175                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     279: invokeinterface #180,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     284: dup
     285: invokestatic  #184                // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     288: checkcast     #69                 // class kotlin/Pair
     291: astore        13
     293: aload_2
     294: iconst_0
     295: new           #69                 // class kotlin/Pair
     298: dup
     299: aload_2
     300: iconst_0
     301: invokeinterface #73,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     306: checkcast     #69                 // class kotlin/Pair
     309: invokevirtual #175                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     312: checkcast     #168                // class java/lang/Number
     315: invokevirtual #172                // Method java/lang/Number.intValue:()I
     318: aload         13
     320: invokevirtual #175                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     323: checkcast     #168                // class java/lang/Number
     326: invokevirtual #172                // Method java/lang/Number.intValue:()I
     329: iadd
     330: invokestatic  #83                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     333: aload_2
     334: iconst_0
     335: invokeinterface #73,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     340: checkcast     #69                 // class kotlin/Pair
     343: invokevirtual #166                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     346: checkcast     #168                // class java/lang/Number
     349: invokevirtual #172                // Method java/lang/Number.intValue:()I
     352: aload         13
     354: invokevirtual #166                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     357: checkcast     #168                // class java/lang/Number
     360: invokevirtual #172                // Method java/lang/Number.intValue:()I
     363: iadd
     364: invokestatic  #83                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     367: invokespecial #86                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     370: invokeinterface #188,  3          // InterfaceMethod java/util/List.set:(ILjava/lang/Object;)Ljava/lang/Object;
     375: pop
     376: iconst_1
     377: istore        14
     379: iload         14
     381: iload_1
     382: if_icmpge     647
     385: aload_2
     386: iload         14
     388: iconst_1
     389: isub
     390: invokeinterface #73,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     395: checkcast     #69                 // class kotlin/Pair
     398: invokevirtual #166                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     401: checkcast     #168                // class java/lang/Number
     404: invokevirtual #172                // Method java/lang/Number.intValue:()I
     407: aload_2
     408: iload         14
     410: invokeinterface #73,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     415: checkcast     #69                 // class kotlin/Pair
     418: invokevirtual #166                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     421: checkcast     #168                // class java/lang/Number
     424: invokevirtual #172                // Method java/lang/Number.intValue:()I
     427: isub
     428: invokestatic  #194                // Method java/lang/Math.abs:(I)I
     431: iconst_2
     432: if_icmpeq     485
     435: aload_2
     436: iload         14
     438: iconst_1
     439: isub
     440: invokeinterface #73,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     445: checkcast     #69                 // class kotlin/Pair
     448: invokevirtual #175                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     451: checkcast     #168                // class java/lang/Number
     454: invokevirtual #172                // Method java/lang/Number.intValue:()I
     457: aload_2
     458: iload         14
     460: invokeinterface #73,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     465: checkcast     #69                 // class kotlin/Pair
     468: invokevirtual #175                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     471: checkcast     #168                // class java/lang/Number
     474: invokevirtual #172                // Method java/lang/Number.intValue:()I
     477: isub
     478: invokestatic  #194                // Method java/lang/Math.abs:(I)I
     481: iconst_2
     482: if_icmpne     641
     485: aload_2
     486: iload         14
     488: new           #69                 // class kotlin/Pair
     491: dup
     492: aload_2
     493: iload         14
     495: invokeinterface #73,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     500: checkcast     #69                 // class kotlin/Pair
     503: invokevirtual #175                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     506: checkcast     #168                // class java/lang/Number
     509: invokevirtual #172                // Method java/lang/Number.intValue:()I
     512: aload_2
     513: iload         14
     515: iconst_1
     516: isub
     517: invokeinterface #73,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     522: checkcast     #69                 // class kotlin/Pair
     525: invokevirtual #175                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     528: checkcast     #168                // class java/lang/Number
     531: invokevirtual #172                // Method java/lang/Number.intValue:()I
     534: aload_2
     535: iload         14
     537: invokeinterface #73,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     542: checkcast     #69                 // class kotlin/Pair
     545: invokevirtual #175                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     548: checkcast     #168                // class java/lang/Number
     551: invokevirtual #172                // Method java/lang/Number.intValue:()I
     554: isub
     555: invokestatic  #197                // Method sign:(I)I
     558: iadd
     559: invokestatic  #83                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     562: aload_2
     563: iload         14
     565: invokeinterface #73,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     570: checkcast     #69                 // class kotlin/Pair
     573: invokevirtual #166                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     576: checkcast     #168                // class java/lang/Number
     579: invokevirtual #172                // Method java/lang/Number.intValue:()I
     582: aload_2
     583: iload         14
     585: iconst_1
     586: isub
     587: invokeinterface #73,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     592: checkcast     #69                 // class kotlin/Pair
     595: invokevirtual #166                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     598: checkcast     #168                // class java/lang/Number
     601: invokevirtual #172                // Method java/lang/Number.intValue:()I
     604: aload_2
     605: iload         14
     607: invokeinterface #73,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     612: checkcast     #69                 // class kotlin/Pair
     615: invokevirtual #166                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     618: checkcast     #168                // class java/lang/Number
     621: invokevirtual #172                // Method java/lang/Number.intValue:()I
     624: isub
     625: invokestatic  #197                // Method sign:(I)I
     628: iadd
     629: invokestatic  #83                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     632: invokespecial #86                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     635: invokeinterface #188,  3          // InterfaceMethod java/util/List.set:(ILjava/lang/Object;)Ljava/lang/Object;
     640: pop
     641: iinc          14, 1
     644: goto          379
     647: aload_3
     648: aload_2
     649: invokestatic  #142                // Method kotlin/collections/CollectionsKt.last:(Ljava/util/List;)Ljava/lang/Object;
     652: invokeinterface #143,  2          // InterfaceMethod java/util/Set.add:(Ljava/lang/Object;)Z
     657: pop
     658: iload         11
     660: iload         12
     662: if_icmpeq     671
     665: iinc          11, 1
     668: goto          272
     671: nop
     672: nop
     673: goto          220
     676: nop
     677: aload_3
     678: invokeinterface #200,  1          // InterfaceMethod java/util/Set.size:()I
     683: ireturn

  public static final int sign(int);
    Code:
       0: iload_0
       1: i2d
       2: invokestatic  #221                // Method java/lang/Math.signum:(D)D
       5: d2i
       6: ireturn

  public static final void outputRope(java.util.List<kotlin.Pair<java.lang.Integer, java.lang.Integer>>);
    Code:
       0: aload_0
       1: ldc           #225                // String rope
       3: invokestatic  #131                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: iconst_0
       7: istore_2
       8: aload_0
       9: checkcast     #22                 // class java/lang/Iterable
      12: invokeinterface #39,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      17: astore        4
      19: aload         4
      21: invokeinterface #45,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      26: ifne          37
      29: new           #227                // class java/util/NoSuchElementException
      32: dup
      33: invokespecial #228                // Method java/util/NoSuchElementException."<init>":()V
      36: athrow
      37: aload         4
      39: invokeinterface #49,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      44: checkcast     #69                 // class kotlin/Pair
      47: astore        5
      49: iconst_0
      50: istore        6
      52: aload         5
      54: invokevirtual #166                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
      57: checkcast     #168                // class java/lang/Number
      60: invokevirtual #172                // Method java/lang/Number.intValue:()I
      63: istore        5
      65: aload         4
      67: invokeinterface #45,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      72: ifeq          117
      75: aload         4
      77: invokeinterface #49,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      82: checkcast     #69                 // class kotlin/Pair
      85: astore        6
      87: iconst_0
      88: istore        7
      90: aload         6
      92: invokevirtual #166                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
      95: checkcast     #168                // class java/lang/Number
      98: invokevirtual #172                // Method java/lang/Number.intValue:()I
     101: istore        6
     103: iload         5
     105: iload         6
     107: if_icmpge     65
     110: iload         6
     112: istore        5
     114: goto          65
     117: iload         5
     119: istore_3
     120: iload_2
     121: iload_3
     122: invokestatic  #232                // Method java/lang/Math.max:(II)I
     125: istore_1
     126: iconst_0
     127: istore_3
     128: aload_0
     129: checkcast     #22                 // class java/lang/Iterable
     132: invokeinterface #39,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     137: astore        5
     139: aload         5
     141: invokeinterface #45,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     146: ifne          157
     149: new           #227                // class java/util/NoSuchElementException
     152: dup
     153: invokespecial #228                // Method java/util/NoSuchElementException."<init>":()V
     156: athrow
     157: aload         5
     159: invokeinterface #49,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     164: checkcast     #69                 // class kotlin/Pair
     167: astore        6
     169: iconst_0
     170: istore        7
     172: aload         6
     174: invokevirtual #166                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     177: checkcast     #168                // class java/lang/Number
     180: invokevirtual #172                // Method java/lang/Number.intValue:()I
     183: istore        6
     185: aload         5
     187: invokeinterface #45,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     192: ifeq          237
     195: aload         5
     197: invokeinterface #49,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     202: checkcast     #69                 // class kotlin/Pair
     205: astore        7
     207: iconst_0
     208: istore        8
     210: aload         7
     212: invokevirtual #166                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     215: checkcast     #168                // class java/lang/Number
     218: invokevirtual #172                // Method java/lang/Number.intValue:()I
     221: istore        7
     223: iload         6
     225: iload         7
     227: if_icmple     185
     230: iload         7
     232: istore        6
     234: goto          185
     237: iload         6
     239: istore        4
     241: iload_3
     242: iload         4
     244: invokestatic  #235                // Method java/lang/Math.min:(II)I
     247: istore_2
     248: iload_2
     249: iload_1
     250: if_icmpgt     678
     253: iconst_0
     254: istore        4
     256: aload_0
     257: checkcast     #22                 // class java/lang/Iterable
     260: invokeinterface #39,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     265: astore        6
     267: aload         6
     269: invokeinterface #45,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     274: ifne          285
     277: new           #227                // class java/util/NoSuchElementException
     280: dup
     281: invokespecial #228                // Method java/util/NoSuchElementException."<init>":()V
     284: athrow
     285: aload         6
     287: invokeinterface #49,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     292: checkcast     #69                 // class kotlin/Pair
     295: astore        7
     297: iconst_0
     298: istore        8
     300: aload         7
     302: invokevirtual #175                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     305: checkcast     #168                // class java/lang/Number
     308: invokevirtual #172                // Method java/lang/Number.intValue:()I
     311: istore        7
     313: aload         6
     315: invokeinterface #45,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     320: ifeq          365
     323: aload         6
     325: invokeinterface #49,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     330: checkcast     #69                 // class kotlin/Pair
     333: astore        8
     335: iconst_0
     336: istore        9
     338: aload         8
     340: invokevirtual #175                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     343: checkcast     #168                // class java/lang/Number
     346: invokevirtual #172                // Method java/lang/Number.intValue:()I
     349: istore        8
     351: iload         7
     353: iload         8
     355: if_icmple     313
     358: iload         8
     360: istore        7
     362: goto          313
     365: iload         7
     367: istore        5
     369: iload         4
     371: iload         5
     373: invokestatic  #235                // Method java/lang/Math.min:(II)I
     376: istore_3
     377: iconst_0
     378: istore        5
     380: aload_0
     381: checkcast     #22                 // class java/lang/Iterable
     384: invokeinterface #39,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     389: astore        7
     391: aload         7
     393: invokeinterface #45,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     398: ifne          409
     401: new           #227                // class java/util/NoSuchElementException
     404: dup
     405: invokespecial #228                // Method java/util/NoSuchElementException."<init>":()V
     408: athrow
     409: aload         7
     411: invokeinterface #49,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     416: checkcast     #69                 // class kotlin/Pair
     419: astore        8
     421: iconst_0
     422: istore        9
     424: aload         8
     426: invokevirtual #175                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     429: checkcast     #168                // class java/lang/Number
     432: invokevirtual #172                // Method java/lang/Number.intValue:()I
     435: istore        8
     437: aload         7
     439: invokeinterface #45,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     444: ifeq          489
     447: aload         7
     449: invokeinterface #49,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     454: checkcast     #69                 // class kotlin/Pair
     457: astore        9
     459: iconst_0
     460: istore        10
     462: aload         9
     464: invokevirtual #175                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     467: checkcast     #168                // class java/lang/Number
     470: invokevirtual #172                // Method java/lang/Number.intValue:()I
     473: istore        9
     475: iload         8
     477: iload         9
     479: if_icmpge     437
     482: iload         9
     484: istore        8
     486: goto          437
     489: iload         8
     491: istore        6
     493: iload         5
     495: iload         6
     497: invokestatic  #232                // Method java/lang/Math.max:(II)I
     500: istore        4
     502: iload_3
     503: iload         4
     505: if_icmpgt     661
     508: ldc           #237                // String .
     510: astore        5
     512: iload_3
     513: ifne          524
     516: iload_1
     517: ifne          524
     520: ldc           #239                // String s
     522: astore        5
     524: iconst_0
     525: istore        6
     527: aload_0
     528: checkcast     #35                 // class java/util/Collection
     531: invokeinterface #240,  1          // InterfaceMethod java/util/Collection.size:()I
     536: istore        7
     538: iload         6
     540: iload         7
     542: if_icmpge     641
     545: iload_3
     546: aload_0
     547: iload         6
     549: invokeinterface #73,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     554: checkcast     #69                 // class kotlin/Pair
     557: invokevirtual #175                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     560: checkcast     #168                // class java/lang/Number
     563: invokevirtual #172                // Method java/lang/Number.intValue:()I
     566: if_icmpne     635
     569: iload_1
     570: aload_0
     571: iload         6
     573: invokeinterface #73,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     578: checkcast     #69                 // class kotlin/Pair
     581: invokevirtual #166                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     584: checkcast     #168                // class java/lang/Number
     587: invokevirtual #172                // Method java/lang/Number.intValue:()I
     590: if_icmpne     635
     593: iload         6
     595: istore        8
     597: iload         8
     599: ifne          607
     602: ldc           #242                // String H
     604: goto          630
     607: iload         8
     609: aload_0
     610: invokeinterface #243,  1          // InterfaceMethod java/util/List.size:()I
     615: iconst_1
     616: isub
     617: if_icmpne     625
     620: ldc           #245                // String T
     622: goto          630
     625: iload         6
     627: invokestatic  #248                // Method java/lang/String.valueOf:(I)Ljava/lang/String;
     630: astore        5
     632: goto          641
     635: iinc          6, 1
     638: goto          538
     641: getstatic     #100                // Field java/lang/System.out:Ljava/io/PrintStream;
     644: aload         5
     646: invokevirtual #251                // Method java/io/PrintStream.print:(Ljava/lang/Object;)V
     649: iload_3
     650: iload         4
     652: if_icmpeq     661
     655: iinc          3, 1
     658: goto          508
     661: getstatic     #100                // Field java/lang/System.out:Ljava/io/PrintStream;
     664: invokevirtual #253                // Method java/io/PrintStream.println:()V
     667: iload_1
     668: iload_2
     669: if_icmpeq     678
     672: iinc          1, -1
     675: goto          253
     678: getstatic     #100                // Field java/lang/System.out:Ljava/io/PrintStream;
     681: invokevirtual #253                // Method java/io/PrintStream.println:()V
     684: return

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


package day8

import java.io.File

fun main() {
    val lines = File("src/day8/input.txt").readLines()
    val trees = mutableMapOf<Pair<Int, Int>, Int>()
    for (j in lines.indices) {
        for (i in 0 until lines[j].length) {
            trees[Pair(i, j)] = lines[j][i].toString().toInt()
        }
    }

    val visible = mutableSetOf<Pair<Int, Int>>()
    for (j in lines.indices) {
        visible.addAll(visible(trees, Pair(0, j), Pair(1, 0)))
        visible.addAll(visible(trees, Pair(lines[j].length - 1, j), Pair(-1, 0)))
    }
    for (i in 0 until lines[0].length) {
        visible.addAll(visible(trees, Pair(i, 0), Pair(0, 1)))
        visible.addAll(visible(trees, Pair(i, lines.size - 1), Pair(0, -1)))
    }

    println(visible.size)

    println(trees.keys.maxOfOrNull { scenicScore(trees, it) })
}

fun scenicScore(trees: Map<Pair<Int, Int>, Int>, tree: Pair<Int, Int>): Int {
    val deltas = listOf(Pair(0, 1), Pair(1, 0), Pair(-1, 0), Pair(0, -1))
    var total = 1
    for (delta in deltas) {
        var coord = tree
        var score = 0
        while (true) {
            coord = Pair(coord.first + delta.first, coord.second + delta.second)
            if (coord in trees.keys) {
                if (trees[coord]!! < trees[tree]!!) {
                    score++
                } else {
                    score++
                    break
                }
            } else {
                break
            }
        }
        total *= score
    }
    return total
}

fun visible(trees: Map<Pair<Int, Int>, Int>, start: Pair<Int, Int>, delta: Pair<Int, Int>) : Set<Pair<Int, Int>> {
    val visible = mutableSetOf<Pair<Int, Int>>()
    visible.add(start)
    var height = trees[start]!!
    var coord = start
    while (true) {
        coord = Pair(coord.first + delta.first, coord.second + delta.second)
        if (coord !in trees.keys) {
            break
        }
        if (trees[coord]!! > height) {
            height = trees[coord]!!
            visible.add(coord)
        }
    }
    return visible
}

Compiled from "Day8.kt"
public final class day8.Day8Kt {
  public static final void main();
    Code:
       0: new           #8                  // class java/io/File
       3: dup
       4: ldc           #10                 // String src/day8/input.txt
       6: invokespecial #14                 // Method java/io/File."<init>":(Ljava/lang/String;)V
       9: aconst_null
      10: iconst_1
      11: aconst_null
      12: invokestatic  #20                 // Method kotlin/io/FilesKt.readLines$default:(Ljava/io/File;Ljava/nio/charset/Charset;ILjava/lang/Object;)Ljava/util/List;
      15: astore_0
      16: new           #22                 // class java/util/LinkedHashMap
      19: dup
      20: invokespecial #24                 // Method java/util/LinkedHashMap."<init>":()V
      23: checkcast     #26                 // class java/util/Map
      26: astore_1
      27: iconst_0
      28: istore_2
      29: aload_0
      30: checkcast     #28                 // class java/util/Collection
      33: invokeinterface #32,  1           // InterfaceMethod java/util/Collection.size:()I
      38: istore_3
      39: iload_2
      40: iload_3
      41: if_icmpge     129
      44: iconst_0
      45: istore        4
      47: aload_0
      48: iload_2
      49: invokeinterface #38,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      54: checkcast     #40                 // class java/lang/String
      57: invokevirtual #43                 // Method java/lang/String.length:()I
      60: istore        5
      62: iload         4
      64: iload         5
      66: if_icmpge     123
      69: nop
      70: aload_1
      71: new           #45                 // class kotlin/Pair
      74: dup
      75: iload         4
      77: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      80: iload_2
      81: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      84: invokespecial #54                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
      87: aload_0
      88: iload_2
      89: invokeinterface #38,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      94: checkcast     #40                 // class java/lang/String
      97: iload         4
      99: invokevirtual #58                 // Method java/lang/String.charAt:(I)C
     102: invokestatic  #61                 // Method java/lang/String.valueOf:(C)Ljava/lang/String;
     105: invokestatic  #65                 // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
     108: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     111: invokeinterface #69,  3           // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
     116: pop
     117: iinc          4, 1
     120: goto          62
     123: iinc          2, 1
     126: goto          39
     129: new           #71                 // class java/util/LinkedHashSet
     132: dup
     133: invokespecial #72                 // Method java/util/LinkedHashSet."<init>":()V
     136: checkcast     #74                 // class java/util/Set
     139: astore_2
     140: iconst_0
     141: istore_3
     142: aload_0
     143: checkcast     #28                 // class java/util/Collection
     146: invokeinterface #32,  1           // InterfaceMethod java/util/Collection.size:()I
     151: istore        4
     153: iload_3
     154: iload         4
     156: if_icmpge     267
     159: aload_2
     160: aload_1
     161: new           #45                 // class kotlin/Pair
     164: dup
     165: iconst_0
     166: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     169: iload_3
     170: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     173: invokespecial #54                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     176: new           #45                 // class kotlin/Pair
     179: dup
     180: iconst_1
     181: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     184: iconst_0
     185: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     188: invokespecial #54                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     191: invokestatic  #78                 // Method visible:(Ljava/util/Map;Lkotlin/Pair;Lkotlin/Pair;)Ljava/util/Set;
     194: checkcast     #28                 // class java/util/Collection
     197: invokeinterface #82,  2           // InterfaceMethod java/util/Set.addAll:(Ljava/util/Collection;)Z
     202: pop
     203: aload_2
     204: aload_1
     205: new           #45                 // class kotlin/Pair
     208: dup
     209: aload_0
     210: iload_3
     211: invokeinterface #38,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     216: checkcast     #40                 // class java/lang/String
     219: invokevirtual #43                 // Method java/lang/String.length:()I
     222: iconst_1
     223: isub
     224: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     227: iload_3
     228: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     231: invokespecial #54                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     234: new           #45                 // class kotlin/Pair
     237: dup
     238: iconst_m1
     239: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     242: iconst_0
     243: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     246: invokespecial #54                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     249: invokestatic  #78                 // Method visible:(Ljava/util/Map;Lkotlin/Pair;Lkotlin/Pair;)Ljava/util/Set;
     252: checkcast     #28                 // class java/util/Collection
     255: invokeinterface #82,  2           // InterfaceMethod java/util/Set.addAll:(Ljava/util/Collection;)Z
     260: pop
     261: iinc          3, 1
     264: goto          153
     267: iconst_0
     268: istore_3
     269: aload_0
     270: iconst_0
     271: invokeinterface #38,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     276: checkcast     #40                 // class java/lang/String
     279: invokevirtual #43                 // Method java/lang/String.length:()I
     282: istore        4
     284: iload_3
     285: iload         4
     287: if_icmpge     391
     290: aload_2
     291: aload_1
     292: new           #45                 // class kotlin/Pair
     295: dup
     296: iload_3
     297: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     300: iconst_0
     301: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     304: invokespecial #54                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     307: new           #45                 // class kotlin/Pair
     310: dup
     311: iconst_0
     312: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     315: iconst_1
     316: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     319: invokespecial #54                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     322: invokestatic  #78                 // Method visible:(Ljava/util/Map;Lkotlin/Pair;Lkotlin/Pair;)Ljava/util/Set;
     325: checkcast     #28                 // class java/util/Collection
     328: invokeinterface #82,  2           // InterfaceMethod java/util/Set.addAll:(Ljava/util/Collection;)Z
     333: pop
     334: aload_2
     335: aload_1
     336: new           #45                 // class kotlin/Pair
     339: dup
     340: iload_3
     341: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     344: aload_0
     345: invokeinterface #83,  1           // InterfaceMethod java/util/List.size:()I
     350: iconst_1
     351: isub
     352: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     355: invokespecial #54                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     358: new           #45                 // class kotlin/Pair
     361: dup
     362: iconst_0
     363: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     366: iconst_m1
     367: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     370: invokespecial #54                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     373: invokestatic  #78                 // Method visible:(Ljava/util/Map;Lkotlin/Pair;Lkotlin/Pair;)Ljava/util/Set;
     376: checkcast     #28                 // class java/util/Collection
     379: invokeinterface #82,  2           // InterfaceMethod java/util/Set.addAll:(Ljava/util/Collection;)Z
     384: pop
     385: iinc          3, 1
     388: goto          284
     391: aload_2
     392: invokeinterface #84,  1           // InterfaceMethod java/util/Set.size:()I
     397: istore_3
     398: getstatic     #90                 // Field java/lang/System.out:Ljava/io/PrintStream;
     401: iload_3
     402: invokevirtual #96                 // Method java/io/PrintStream.println:(I)V
     405: aload_1
     406: invokeinterface #100,  1          // InterfaceMethod java/util/Map.keySet:()Ljava/util/Set;
     411: checkcast     #102                // class java/lang/Iterable
     414: invokeinterface #106,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     419: astore        4
     421: aload         4
     423: invokeinterface #112,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     428: ifne          435
     431: aconst_null
     432: goto          524
     435: aload         4
     437: invokeinterface #116,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     442: checkcast     #45                 // class kotlin/Pair
     445: astore        5
     447: iconst_0
     448: istore        6
     450: aload_1
     451: aload         5
     453: invokestatic  #120                // Method scenicScore:(Ljava/util/Map;Lkotlin/Pair;)I
     456: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     459: checkcast     #122                // class java/lang/Comparable
     462: astore        5
     464: aload         4
     466: invokeinterface #112,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     471: ifeq          522
     474: aload         4
     476: invokeinterface #116,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     481: checkcast     #45                 // class kotlin/Pair
     484: astore        6
     486: iconst_0
     487: istore        7
     489: aload_1
     490: aload         6
     492: invokestatic  #120                // Method scenicScore:(Ljava/util/Map;Lkotlin/Pair;)I
     495: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     498: checkcast     #122                // class java/lang/Comparable
     501: astore        6
     503: aload         5
     505: aload         6
     507: invokeinterface #126,  2          // InterfaceMethod java/lang/Comparable.compareTo:(Ljava/lang/Object;)I
     512: ifge          464
     515: aload         6
     517: astore        5
     519: goto          464
     522: aload         5
     524: astore_3
     525: getstatic     #90                 // Field java/lang/System.out:Ljava/io/PrintStream;
     528: aload_3
     529: invokevirtual #129                // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
     532: return

  public static final int scenicScore(java.util.Map<kotlin.Pair<java.lang.Integer, java.lang.Integer>, java.lang.Integer>, kotlin.Pair<java.lang.Integer, java.lang.Integer>);
    Code:
       0: aload_0
       1: ldc           #143                // String trees
       3: invokestatic  #149                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: aload_1
       7: ldc           #151                // String tree
       9: invokestatic  #149                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      12: iconst_4
      13: anewarray     #45                 // class kotlin/Pair
      16: astore_3
      17: aload_3
      18: iconst_0
      19: new           #45                 // class kotlin/Pair
      22: dup
      23: iconst_0
      24: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      27: iconst_1
      28: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      31: invokespecial #54                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
      34: aastore
      35: aload_3
      36: iconst_1
      37: new           #45                 // class kotlin/Pair
      40: dup
      41: iconst_1
      42: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      45: iconst_0
      46: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      49: invokespecial #54                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
      52: aastore
      53: aload_3
      54: iconst_2
      55: new           #45                 // class kotlin/Pair
      58: dup
      59: iconst_m1
      60: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      63: iconst_0
      64: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      67: invokespecial #54                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
      70: aastore
      71: aload_3
      72: iconst_3
      73: new           #45                 // class kotlin/Pair
      76: dup
      77: iconst_0
      78: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      81: iconst_m1
      82: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      85: invokespecial #54                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
      88: aastore
      89: aload_3
      90: invokestatic  #157                // Method kotlin/collections/CollectionsKt.listOf:([Ljava/lang/Object;)Ljava/util/List;
      93: astore_2
      94: iconst_1
      95: istore_3
      96: aload_2
      97: invokeinterface #158,  1          // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
     102: astore        4
     104: aload         4
     106: invokeinterface #112,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     111: ifeq          271
     114: aload         4
     116: invokeinterface #116,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     121: checkcast     #45                 // class kotlin/Pair
     124: astore        5
     126: aload_1
     127: astore        6
     129: iconst_0
     130: istore        7
     132: nop
     133: new           #45                 // class kotlin/Pair
     136: dup
     137: aload         6
     139: invokevirtual #161                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     142: checkcast     #163                // class java/lang/Number
     145: invokevirtual #166                // Method java/lang/Number.intValue:()I
     148: aload         5
     150: invokevirtual #161                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     153: checkcast     #163                // class java/lang/Number
     156: invokevirtual #166                // Method java/lang/Number.intValue:()I
     159: iadd
     160: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     163: aload         6
     165: invokevirtual #169                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     168: checkcast     #163                // class java/lang/Number
     171: invokevirtual #166                // Method java/lang/Number.intValue:()I
     174: aload         5
     176: invokevirtual #169                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     179: checkcast     #163                // class java/lang/Number
     182: invokevirtual #166                // Method java/lang/Number.intValue:()I
     185: iadd
     186: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     189: invokespecial #54                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     192: astore        6
     194: aload_0
     195: invokeinterface #100,  1          // InterfaceMethod java/util/Map.keySet:()Ljava/util/Set;
     200: aload         6
     202: invokeinterface #173,  2          // InterfaceMethod java/util/Set.contains:(Ljava/lang/Object;)Z
     207: ifeq          260
     210: aload_0
     211: aload         6
     213: invokeinterface #176,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     218: dup
     219: invokestatic  #179                // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     222: checkcast     #163                // class java/lang/Number
     225: invokevirtual #166                // Method java/lang/Number.intValue:()I
     228: aload_0
     229: aload_1
     230: invokeinterface #176,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     235: dup
     236: invokestatic  #179                // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     239: checkcast     #163                // class java/lang/Number
     242: invokevirtual #166                // Method java/lang/Number.intValue:()I
     245: if_icmpge     254
     248: iinc          7, 1
     251: goto          132
     254: iinc          7, 1
     257: goto          263
     260: goto          263
     263: iload_3
     264: iload         7
     266: imul
     267: istore_3
     268: goto          104
     271: iload_3
     272: ireturn

  public static final java.util.Set<kotlin.Pair<java.lang.Integer, java.lang.Integer>> visible(java.util.Map<kotlin.Pair<java.lang.Integer, java.lang.Integer>, java.lang.Integer>, kotlin.Pair<java.lang.Integer, java.lang.Integer>, kotlin.Pair<java.lang.Integer, java.lang.Integer>);
    Code:
       0: aload_0
       1: ldc           #143                // String trees
       3: invokestatic  #149                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: aload_1
       7: ldc           #187                // String start
       9: invokestatic  #149                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      12: aload_2
      13: ldc           #188                // String delta
      15: invokestatic  #149                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      18: new           #71                 // class java/util/LinkedHashSet
      21: dup
      22: invokespecial #72                 // Method java/util/LinkedHashSet."<init>":()V
      25: checkcast     #74                 // class java/util/Set
      28: astore_3
      29: aload_3
      30: aload_1
      31: invokeinterface #191,  2          // InterfaceMethod java/util/Set.add:(Ljava/lang/Object;)Z
      36: pop
      37: aload_0
      38: aload_1
      39: invokeinterface #176,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
      44: dup
      45: invokestatic  #179                // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
      48: checkcast     #163                // class java/lang/Number
      51: invokevirtual #166                // Method java/lang/Number.intValue:()I
      54: istore        4
      56: aload_1
      57: astore        5
      59: nop
      60: new           #45                 // class kotlin/Pair
      63: dup
      64: aload         5
      66: invokevirtual #161                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
      69: checkcast     #163                // class java/lang/Number
      72: invokevirtual #166                // Method java/lang/Number.intValue:()I
      75: aload_2
      76: invokevirtual #161                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
      79: checkcast     #163                // class java/lang/Number
      82: invokevirtual #166                // Method java/lang/Number.intValue:()I
      85: iadd
      86: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      89: aload         5
      91: invokevirtual #169                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
      94: checkcast     #163                // class java/lang/Number
      97: invokevirtual #166                // Method java/lang/Number.intValue:()I
     100: aload_2
     101: invokevirtual #169                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     104: checkcast     #163                // class java/lang/Number
     107: invokevirtual #166                // Method java/lang/Number.intValue:()I
     110: iadd
     111: invokestatic  #51                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     114: invokespecial #54                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     117: astore        5
     119: aload_0
     120: invokeinterface #100,  1          // InterfaceMethod java/util/Map.keySet:()Ljava/util/Set;
     125: aload         5
     127: invokeinterface #173,  2          // InterfaceMethod java/util/Set.contains:(Ljava/lang/Object;)Z
     132: ifne          138
     135: goto          193
     138: aload_0
     139: aload         5
     141: invokeinterface #176,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     146: dup
     147: invokestatic  #179                // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     150: checkcast     #163                // class java/lang/Number
     153: invokevirtual #166                // Method java/lang/Number.intValue:()I
     156: iload         4
     158: if_icmple     59
     161: aload_0
     162: aload         5
     164: invokeinterface #176,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     169: dup
     170: invokestatic  #179                // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     173: checkcast     #163                // class java/lang/Number
     176: invokevirtual #166                // Method java/lang/Number.intValue:()I
     179: istore        4
     181: aload_3
     182: aload         5
     184: invokeinterface #191,  2          // InterfaceMethod java/util/Set.add:(Ljava/lang/Object;)Z
     189: pop
     190: goto          59
     193: aload_3
     194: areturn

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