this post was submitted on 02 Dec 2024
44 points (97.8% liked)

Advent Of Code

996 readers
4 users here now

An unofficial home for the advent of code community on programming.dev!

Advent of Code is an annual Advent calendar of small programming puzzles for a variety of skill sets and skill levels that can be solved in any programming language you like.

AoC 2024

Solution Threads

M T W T F S S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25

Rules/Guidelines

Relevant Communities

Relevant Links

Credits

Icon base by Lorc under CC BY 3.0 with modifications to add a gradient

console.log('Hello World')

founded 1 year ago
MODERATORS
 

Day 2: Red-Nosed Reports

Megathread guidelines

  • Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
  • You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://blocks.programming.dev if you prefer sending it through a URL

FAQ

you are viewing a single comment's thread
view the rest of the comments
[โ€“] proved_unglue 1 points 1 month ago

Kotlin

A bit late to the party, but here you go.

import kotlin.math.abs

fun part1(input: String): Int {
    return solve(input, ::isSafe)
}

fun part2(input: String): Int {
    return solve(input, ::isDampSafe)
}

private fun solve(input: String, condition: (List<Int>) -> Boolean): Int {
    var safeCount = 0
    input.lines().forEach { line ->
        if (line.isNotBlank()) {
            val nums = line.split("\\s+".toRegex()).map { it.toInt() }
            safeCount += if (condition(nums)) 1 else 0
        }
    }
    return safeCount
}

private fun isSafe(list: List<Int>): Boolean {
    val safeDiffs = setOf(1, 2, 3)
    var incCount = 0
    var decCount = 0
    for (idx in 0..<list.lastIndex) {
        if (!safeDiffs.contains(abs(list[idx] - list[idx + 1]))) {
            return false
        }
        if (list[idx] <= list[idx + 1]) incCount++
        if (list[idx] >= list[idx + 1]) decCount++
    }
    return incCount == 0 || decCount == 0
}

private fun isDampSafe(list: List<Int>): Boolean {
    if (isSafe(list)) {
        return true
    } else {
        for (idx in 0..list.lastIndex) {
            val shortened = list.toMutableList()
            shortened.removeAt(idx)
            if (isSafe(shortened)) {
                return true
            }
        }
    }
    return false
}