코드 2020 코트린에서의 출현: 3일

13066 단어 adventofcodekotlin
오늘의 수수께끼는 이틀 전보다 좀 복잡하다.The puzzle 썰매를 지휘하기 위해 코드를 작성해 달라고 합니다.우리는 우리가 반드시 통과해야 할 구역을 대표하는 격자를 얻었다.우리는 왼쪽 상단의 위치(좌표(0,0)부터 시작해서 마지막 줄에 도달해야 한다. 길을 따라 우리가 몇 그루의 나무를 보았는지 세어 보자.문제에서 우리가 이사하는 것을 허락하는 방식을 규정하였다.
우리가 어떻게 이 문제를 해결했는지 봅시다.

메쉬
나는 격자 data class 를 표시하기로 선택했다. 너비, 높이, 칸 세 필드를 포함한다.칸은 단지 하나의 수조로 칸의 모든 좌표를 대표한다.만약 이 세포가true라면, 그것은 거기에 나무 한 그루가 있다는 것을 의미한다.
data class Grid(val width: Int, val height: Int, val cells: Array<Array<Boolean>>) {}

격자선 로드
나는 처음에 수반적인 방법으로 이루어졌다. 마치 내가 있는 것처럼.일단 내가 그것을 일하게 한다면, 확장법을 사용하면 Kotlin과 더 닮았다는 평론Reddit을 보았다.코드를 수정했습니다. 격자를 불러오는 방법으로 File 클래스를 확장했습니다.
한편, 나는 코드가 이런 방식으로 읽기에 매우 좋다고 생각한다.다른 한편, 이런 상황에서 나는 확장 방법을 그리 좋아하지 않는다.File클래스에 특정한 응용 프로그램에 끼워 넣는 기능은 잘못된 것 같습니다.
그 모양은 다음과 같습니다.
fun File.toGridOrNull(): Grid? {
    val cells =
    readLines().map { line -> line.map { it == '#' }.toTypedArray() }.toTypedArray()

    if (cells.size > 0 && cells[0].size > 0) {
    val height = cells.size
    val width = cells[0].size

    return Grid(width, height, cells)
    }

    return null
}
여기는 마법이 없어요.파일의 모든 줄을 읽고 맵을 적용해서 줄마다 Boolean s로 변환합니다. 보고 있는 문자가 # 과 같으면, 칸을 트리로 표시합니다.

답을 얻다
현재 우리는 격자를 메모리에 불러왔습니다. 실제 결과를 찾아야 합니다.
나는 우선 몇 가지 방법으로 Grid 종류를 확장했다.
    // Inside the Grid class    
    fun isTree(row: Int, column: Int) = cells[row][column]

    fun countTrees() : Int {
    var currentRow = 0
    var currentColumn = 0

    val verticalStep = 1
    val horizontalStep = 3

    var trees = 0

    while (currentRow < height - 1) {
        currentRow += verticalStep
        currentColumn = (currentColumn + horizontalStep) % width // this ensures we wrap around

        if (isTree(currentRow, currentColumn)) {
        trees++
        }
    }

    return trees
    }
isTree는 보조적인 방법일 뿐이기 때문에 우리는 하나의 칸이 나무인지 확인할 수 있다.countTrees는 좀 복잡하다. 문제의 첫 번째 부분에서 우리는 항상 오른쪽으로 3열을 이동하고 아래로 1줄을 이동한다.이 숫자들은 각각 horizontalStepverticalStep 변수로 표시된다.그리고 나서 우리는 그물의 마지막 줄에 도달할 때까지 교체했다.매 단계에서, 우리는 격자 currentColumn 를 사용한다. 왜냐하면 격자는 둘러싸여 있기 때문이다.우리가 하나만 찾으면 나무 카운터가 부딪혀 넘어질 것이다.
현재 우리의 main 함수는 매우 간단해 보인다.
fun main() {
    println(File("input.txt").toGridOrNull()?.countTrees())
}

제2부분
두 번째 부분은 첫 번째 부분과 매우 비슷하지만, 현재 우리는 서로 다른 패턴으로 이동하는 나무의 수량을 계산해야 한다.일단 우리가 모든 모델의 계수가 생기면, 우리는 모든 모델을 곱한다. 이것이 바로 답이다.
Grid 클래스의 경우
    // Inside the Grid classs
    fun countTrees(verticalStep: Int, horizontalStep: Int) : Int {
        var currentRow = 0
        var currentColumn = 0
        var trees = 0

        while (currentRow < height - 1) {
            // ...
우리가 한 것은 verticalStephorizontalStep 변수를 주체에서 끌어내어 매개 변수 목록에 넣는 것이다.
현재의 차이점은 우리의 main 함수가 훨씬 복잡하다는 것이다.
fun main() {
    val grid = File("input.txt").toGridOrNull()

    if (grid != null) {
    val steps = listOf(
        Pair(1, 1),
        Pair(1, 3),
        Pair(1, 5),
        Pair(1, 7),
        Pair(2, 1),
    )

    val treeCounts = steps.map { (verticalStep, horizontalStep) -> grid.countTrees(verticalStep, horizontalStep) }
    val totalTrees = treeCounts.map { it.toBigInteger() }.reduce() { acc, n -> acc * n}

    println(totalTrees)
    }
}
여기서 일어나는 일들을 풀어봅시다.
  • 로드 그리드
  • 격자가 성공적으로 불러왔으면, 우리가 검사해야 할 모든 이동 모드를 포함하는 목록을 만드십시오. (문제에서 지정)
  • 모든 모드에 대해 격자에서 찾은 트리의 수량을 만들고 계산하여 목록에 결과를 넣습니다.
  • 모든 트리 수를 곱합니다.
  • 인쇄 결과.
  • 코드는 이해하기 쉬우니 위의 몇 가지는 무슨 일이 일어났는지 이해하는데 도움이 될 것이다.주의해야 할 점은 toBigInteger()에 대한 호출이다. 만약 우리가 숫자를 곱하기만 한다면 결과는 넘칠 것이다. (우리는 마이너스를 얻는다.)KotlinInt 유형은 32비트 길이에 불과합니다.이러한 상황을 피하기 위해서 우리는 모든 트리 계수를 Int 대상으로 전환할 것이다.

    사상
    오늘의 퍼즐은 매우 재미있다. 특히 그것이 나로 하여금 더 많은 것을 놀 수 있게 하기 때문이다.위에서 언급한 바와 같이 나는 이런 상황에서 확장하는 방법을 좋아하는지 확실하지 않지만 이것은 좋은 연습이다.
    또 다른 일은 정수가 넘치는 문제다.프로그램이 디버그 모드에서 컴파일될 때 Kotlin이 Rust처럼 이런 오류를 감지할 수 있는지 알고 싶습니다.그것은 매우 편리할 것이다.
    4일째에 뭘 가져왔는지 보여줘!

    좋은 웹페이지 즐겨찾기