This commit is contained in:
		
							parent
							
								
									f16258eae7
								
							
						
					
					
						commit
						0f2b85f2ad
					
				
							
								
								
									
										112
									
								
								day10.kts
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								day10.kts
									
									
									
									
									
								
							@ -2,72 +2,72 @@
 | 
			
		||||
import java.util.Scanner
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    class TrailHead(private val x: Int, private val y: Int, private val map: Map) {
 | 
			
		||||
        private val peaks = mutableMapOf<Pair<Int, Int>, Int>()
 | 
			
		||||
        fun getScore(): Int {
 | 
			
		||||
            if (this.peaks.isEmpty()) {
 | 
			
		||||
                for (peak in this.walkToPeak(this.x, this.y)) {
 | 
			
		||||
                    this.peaks[peak] = (this.peaks[peak] ?: 0) + 1
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return this.peaks.keys.size
 | 
			
		||||
        }
 | 
			
		||||
        fun getGetRating(): Int {
 | 
			
		||||
            this.getScore()
 | 
			
		||||
            return this.peaks.values.sum()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private fun walkToPeak(x: Int, y: Int, previous: Int = -1): List<Pair<Int, Int>> {
 | 
			
		||||
            if (x < 0 || x >= map.getLength() || y < 0 || y >= map.getHeight() || map.get(x, y) != (previous + 1)) {
 | 
			
		||||
                return listOf()
 | 
			
		||||
            } else if (map.get(x, y) == 9) {
 | 
			
		||||
                return listOf(Pair(x, y))
 | 
			
		||||
            } else {
 | 
			
		||||
                val current = map.get(x, y)
 | 
			
		||||
                return walkToPeak(x + 1, y, current) + walkToPeak(x - 1, y, current) + walkToPeak(x, y + 1, current) + walkToPeak(x, y - 1, current)
 | 
			
		||||
class TrailHead(private val x: Int, private val y: Int, private val map: Map) {
 | 
			
		||||
    private val peaks = mutableMapOf<Pair<Int, Int>, Int>()
 | 
			
		||||
    fun getScore(): Int {
 | 
			
		||||
        if (this.peaks.isEmpty()) {
 | 
			
		||||
            for (peak in this.walkToPeak(this.x, this.y)) {
 | 
			
		||||
                this.peaks[peak] = (this.peaks[peak] ?: 0) + 1
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return this.peaks.keys.size
 | 
			
		||||
    }
 | 
			
		||||
    fun getGetRating(): Int {
 | 
			
		||||
        this.getScore()
 | 
			
		||||
        return this.peaks.values.sum()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class Map(private val grid: List<List<Int>>) {
 | 
			
		||||
        private val trailHeads = mutableListOf<TrailHead>()
 | 
			
		||||
    private fun walkToPeak(x: Int, y: Int, previous: Int = -1): List<Pair<Int, Int>> {
 | 
			
		||||
        if (x < 0 || x >= map.getLength() || y < 0 || y >= map.getHeight() || map.get(x, y) != (previous + 1)) {
 | 
			
		||||
            return listOf()
 | 
			
		||||
        } else if (map.get(x, y) == 9) {
 | 
			
		||||
            return listOf(Pair(x, y))
 | 
			
		||||
        } else {
 | 
			
		||||
            val current = map.get(x, y)
 | 
			
		||||
            return walkToPeak(x + 1, y, current) + walkToPeak(x - 1, y, current) + walkToPeak(x, y + 1, current) + walkToPeak(x, y - 1, current)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        init {
 | 
			
		||||
            grid.forEachIndexed { y, row ->
 | 
			
		||||
                row.forEachIndexed { x, height ->
 | 
			
		||||
                    if (height == 0) {
 | 
			
		||||
                        trailHeads.add(TrailHead(x, y, this))
 | 
			
		||||
                    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class Map(private val grid: List<List<Int>>) {
 | 
			
		||||
    private val trailHeads = mutableListOf<TrailHead>()
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
        grid.forEachIndexed { y, row ->
 | 
			
		||||
            row.forEachIndexed { x, height ->
 | 
			
		||||
                if (height == 0) {
 | 
			
		||||
                    trailHeads.add(TrailHead(x, y, this))
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fun addTrailHead(trailHead: TrailHead) {
 | 
			
		||||
            trailHeads.add(trailHead)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fun get(x: Int, y: Int): Int {
 | 
			
		||||
            return grid[y][x]
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fun getHeight(): Int {
 | 
			
		||||
            return grid.size
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fun getLength(): Int {
 | 
			
		||||
            return if (grid.isNotEmpty()) grid[0].size else 0
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fun getScore(): Int {
 | 
			
		||||
            return trailHeads.fold(0) { acc, trailHead -> acc + trailHead.getScore() }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fun getGetRating(): Int {
 | 
			
		||||
            return trailHeads.fold(0) { acc, trailHead -> acc + trailHead.getGetRating() }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun addTrailHead(trailHead: TrailHead) {
 | 
			
		||||
        trailHeads.add(trailHead)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun get(x: Int, y: Int): Int {
 | 
			
		||||
        return grid[y][x]
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun getHeight(): Int {
 | 
			
		||||
        return grid.size
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun getLength(): Int {
 | 
			
		||||
        return if (grid.isNotEmpty()) grid[0].size else 0
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun getScore(): Int {
 | 
			
		||||
        return trailHeads.fold(0) { acc, trailHead -> acc + trailHead.getScore() }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun getGetRating(): Int {
 | 
			
		||||
        return trailHeads.fold(0) { acc, trailHead -> acc + trailHead.getGetRating() }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
val scanner = Scanner(System.`in`)
 | 
			
		||||
val mapInput = mutableListOf<List<Int>>()
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user