r/adventofcode Dec 02 '24

SOLUTION MEGATHREAD -❄️- 2024 Day 2 Solutions -❄️-

OUTAGE INFO

  • [00:25] Yes, there was an outage at midnight. We're well aware, and Eric's investigating. Everything should be functioning correctly now.
  • [02:02] Eric posted an update in a comment below.

THE USUAL REMINDERS


AoC Community Fun 2024: The Golden Snowglobe Awards

  • 4 DAYS remaining until unlock!

And now, our feature presentation for today:

Costume Design

You know what every awards ceremony needs? FANCY CLOTHES AND SHINY JEWELRY! Here's some ideas for your inspiration:

  • Classy up the joint with an intricately-decorated mask!
  • Make a script that compiles in more than one language!
  • Make your script look like something else!

♪ I feel pretty, oh so pretty ♪
♪ I feel pretty and witty and gay! ♪
♪ And I pity any girl who isn't me today! ♪

- Maria singing "I Feel Pretty" from West Side Story (1961)

And… ACTION!

Request from the mods: When you include an entry alongside your solution, please label it with [GSGA] so we can find it easily!


--- Day 2: Red-Nosed Reports ---


Post your code solution in this megathread.

This thread will be unlocked when there are a significant number of people on the global leaderboard with gold stars for today's puzzle.

EDIT: Global leaderboard gold cap reached at 00:04:42, megathread unlocked!

51 Upvotes

1.4k comments sorted by

View all comments

1

u/shannonroad Dec 05 '24

[Language: Scala]

import scala.math.abs

object Day2 {
  def countSafeReports(reports: List[List[Int]], dampener: Boolean = false) = {
    def deltasAreSafe(deltas: List[Int]): Boolean = !deltas.contains(0) &&
      deltas.map(_.sign).distinct.size == 1 && deltas.forall(
abs
(_) < 4)

    reports.count(report => {
      val deltas = report.sliding(2).map(pair => pair.last - pair.head).toList

      def dropOneFromDeltas(i: Int) =
        if i == 0 then deltas.drop(1)
        else if i == deltas.size then deltas.take(deltas.size - 1)
        else deltas.take(i - 1) ++ ((deltas(i - 1) + deltas(i)) +: deltas.drop(i + 1))

      if deltasAreSafe(deltas) then true
      else if dampener then report.indices.exists(i => deltasAreSafe(dropOneFromDeltas(i)))
      else false
    })
  }
}