코드 2020 코트린에서의 출현: 3일
13066 단어 adventofcodekotlin
우리가 어떻게 이 문제를 해결했는지 봅시다.
메쉬
나는 격자
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줄을 이동한다.이 숫자들은 각각 horizontalStep
와 verticalStep
변수로 표시된다.그리고 나서 우리는 그물의 마지막 줄에 도달할 때까지 교체했다.매 단계에서, 우리는 격자 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) {
// ...
우리가 한 것은 verticalStep
와 horizontalStep
변수를 주체에서 끌어내어 매개 변수 목록에 넣는 것이다.현재의 차이점은 우리의
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일째에 뭘 가져왔는지 보여줘!
Reference
이 문제에 관하여(코드 2020 코트린에서의 출현: 3일), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/heylucas/advent-of-code-2020-in-kotlin-day-03-2bf1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)