Skip to content

Commit 990ebfd

Browse files
committed
Updates part 2
1 parent 78a7355 commit 990ebfd

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

2024/src/main/kotlin/org/suggs/aoc2024/Day02RedNosedReports.kt

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,29 @@ object Day02RedNosedReports {
88
private val log = LoggerFactory.getLogger(this::class.java)
99

1010
fun countNumberOfSafeReportsFrom(data: List<String>) =
11-
data.count { isSafe(it.split(" ").map { it.toInt() }.zipWithNext().map { it.first - it.second }) }
12-
13-
private fun isSafe(lineDeltas: List<Int>) = allInRange(lineDeltas) && sameDirection(lineDeltas)
11+
data.count { isSafeLine(it.split(" ").map { it.toInt() }) }
1412

13+
private fun isSafeLine(line: List<Int>) = isSafeDeltas(line.zipWithNext().map { it.second - it.first })
14+
private fun isSafeDeltas(lineDeltas: List<Int>) = allInRange(lineDeltas) && allSameDirection(lineDeltas)
1515
private fun allInRange(lineDeltas: List<Int>) = lineDeltas.all { abs(it) in 1..3 }
16+
private fun allSameDirection(lineDeltas: List<Int>) = lineDeltas.all { it > 0 } || lineDeltas.all { it < 0 }
17+
18+
fun countNumberOfDampenedSafeReportsFrom(data: List<String>): Int =
19+
data.count { isDampenedSafeLine(it.split(" ").map { it.toInt() }) }
20+
21+
private fun isDampenedSafeLine(line: List<Int>): Boolean {
22+
return if(isSafeLine(line)) true
23+
else findSubLisThatIsSafe(line)
24+
}
25+
26+
private fun findSubLisThatIsSafe(line: List<Int>): Boolean {
27+
for(i in line.indices) {
28+
val mutated = line.toMutableList()
29+
mutated.removeAt(i)
30+
if(isSafeLine(mutated)) return true
31+
}
32+
return false
33+
}
1634

17-
private fun sameDirection(lineDeltas: List<Int>) = lineDeltas.all { it > 0 } || lineDeltas.all { it < 0 }
1835

1936
}

2024/src/test/kotlin/org/suggs/aoc2024/Day02RedNosedReportsTest.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import org.junit.jupiter.api.Disabled
55
import org.junit.jupiter.api.DisplayName
66
import org.junit.jupiter.api.Test
77
import org.suggs.adventofcode.Util.getFileLinesFrom
8+
import org.suggs.aoc2024.Day02RedNosedReports.countNumberOfDampenedSafeReportsFrom
89
import org.suggs.aoc2024.Day02RedNosedReports.countNumberOfSafeReportsFrom
910

1011
@DisplayName("Red-Nosed Reports")
@@ -21,6 +22,17 @@ class Day02RedNosedReportsTest {
2122
countNumberOfSafeReportsFrom(largeData) shouldBe 123
2223
}
2324

25+
@Test
26+
fun `counts number of dampened safe reports from a short list`() {
27+
countNumberOfDampenedSafeReportsFrom(smallData) shouldBe 4
28+
}
29+
30+
@Test
31+
@Disabled
32+
fun `counts number of dampened safe reports from a larger list`() {
33+
countNumberOfDampenedSafeReportsFrom(largeData) shouldBe 123
34+
}
35+
2436
private val largeData = getFileLinesFrom("day02-input.txt")
2537
private val smallData = """7 6 4 2 1
2638
1 2 7 8 9

0 commit comments

Comments
 (0)