Day 1 using Kotlin - Advent of Code 2025
https://adventofcode.com/2025/day/1
1. 密碼鎖 環形 0~99
2. 往右轉數字變大,往左轉數字減小。
3. 當 99 往右轉 1,會到 0。當 0 往左轉,會到 99。
4. 密碼為每次轉動後停在 0 的次數。
SA、SD:
1. 當下位置會隨著每次轉動而更新。故宣告為 var。
2. R 為正,;L 為負:用此決定數字變大或變小(正負號)。
3. 當轉動時,會有機會超過 99 或 0,故以餘數來求得轉動後的指針位置。
4. 但當餘數小於 0 時,得將指針位置對應到其實際所代表的數字。
5. 應要求得每次轉動後停在 0 的次數,以 currPos == 0 來判斷,並搭配使用 count。
val totalClicks = 100
var currPos = 50
readInput( "Day01" ).count { line ->
currPos += ( if ( line.first() == 'R' ) 1 else -1 ) *
line.substring( 1 ).toInt()
currPos %= totalClicks
if ( currPos < 0 ) {
currPos += totalClicks
}
currPos == 0
}.println()
--- Part 2 ---
1. 只要經過刻度 0,都算一次。
2. 密碼為 經過或停在刻度 0 的總次數。
SA、SD:
1. 先前位置 + 轉動距離 = 帶有正負號的新位置。
2. 當新位置為負時,表示有經過 0;次數加 1。
3. 當新位置為 0 時,次數加 1。
4. 把每次轉動經過或停在 0 的次數加總,使用 sumOf。
var prevPos = 50
readInput("Day01").sumOf { line ->
currPos = prevPos + (if (line.first() == 'R') 1 else -1) *
line.substring(1).toInt()
(( if ( prevPos * currPos < 0 ) 1 else 0 ) + ( if ( currPos == 0 ) 1
else 0 ) + currPos.absoluteValue / totalClicks ).also {
prevPos = currPos % totalClicks
if ( prevPos < 0 ) {
prevPos += totalClicks
}
}
}.println()
留言
張貼留言