Day 6: Wait for It


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)
  • Code block support is not fully rolled out yet but likely will be in the middle of the event. Try to share solutions as both code blocks and using something such as https://topaz.github.io/paste/ , pastebin, or github (code blocks to future proof it for when 0.19 comes out and since code blocks currently function in some apps and some instances as well if they are running a 0.19 beta)

FAQ

11 points
*

Today was easy enough that I felt confident enough to hammer out a solution in Uiua, so read and enjoy (or try it out live):

{"Time:      7  15   30"
 "Distance:  9  40  200"}
StoInt ← /(+ Γ—10) β–½Γ—βŠƒ(β‰₯0)(≀9). -@0
Count ← (
  βŠ™βŠ’βˆš-Γ—4:Γ—.⍘⊟.           # Determinant, and time
  +1-βŠƒ(+1β†₯0⌊÷2-)(-1⌈÷2+) # Diff of sanitised roots
)
≑(β†˜1βŠβŠœβˆ˜β‰ @\s.)
βŠƒ(/×≑Countβ‰βˆ΅StoInt)(Count⍉≑(StoInt⊐/βŠ‚))
permalink
report
reply
8 points

Rust

I went with solving the quadratic equation, so part 2 was just a trivial change in parsing. It was a bit janky to find the integer that is strictly larger than a floating point number, but it all worked out.

permalink
report
reply
3 points

(number+1).floor() does the trick

permalink
report
parent
reply
2 points

Oh yeah, that’s clever. I’ll remember that when it comes up again.

permalink
report
parent
reply
1 point
*

In Python when using numpy to find the roots, sometimes you get a numeric artifact like 30.99999999999, which breaks this. Make sure to limit the significant digits to a sane amount like 5 with rounding to prevent that.

permalink
report
parent
reply
2 points

I wanted to try the easy approach first and see how slow it was. Didn’t even take a second for part 2. So I just skipped the mathematical solution entirely.

permalink
report
parent
reply
6 points

Nim

Hey, waitaminute, this isn’t a programming puzzle. This is algebra homework!

Part 2 only required a trivial change to the parsing, the rest of the code still worked. I kept the data as singleton arrays to keep it compatible.

permalink
report
reply
2 points

Hi there! Looks like you linked to a Lemmy community using a URL instead of its name, which doesn’t work well for people on different instances. Try fixing it like this: !nim@programming.dev

permalink
report
parent
reply
4 points
*

Dart Solution

I decided to use the quadratic formula to solve part 1 which slowed me down while I struggled to remember how it went, but meant that part 2 was a one line change.

This year really is a roller coaster…

int countGoodDistances(int time, int targetDistance) {
  var det = sqrt(time * time - 4 * targetDistance);
  return (((time + det) / 2).ceil() - 1) -
      (max(((time - det) / 2).floor(), 0) + 1) +
      1;
}

solve(List> data, [param]) {
  var distances = data.first
      .indices()
      .map((ix) => countGoodDistances(data[0][ix], data[1][ix]));
  return distances.reduce((s, t) => s * t);
}

getNums(l) => l.split(RegExp(r'\s+')).skip(1);

part1(List lines) =>
    solve([for (var l in lines) getNums(l).map(int.parse).toList()]);

part2(List lines) => solve([
      for (var l in lines) [int.parse(getNums(l).join(''))]
    ]);
permalink
report
reply
4 points
*

Haskell

This problem has a nice closed form solution, but brute force also works.

(My keyboard broke during part two. Yet another day off the bottom of the leaderboard…)

import Control.Monad
import Data.Bifunctor
import Data.List

readInput :: String -> [(Int, Int)]
readInput = map (\[t, d] -> (read t, read d)) . tail . transpose . map words . lines

-- Quadratic formula
wins :: (Int, Int) -> Int
wins (t, d) =
  let c = fromIntegral t / 2 :: Double
      h = sqrt (fromIntegral $ t * t - 4 * d) / 2
   in ceiling (c + h) - floor (c - h) - 1

main = do
  input <- readInput <$> readFile "input06"
  print $ product . map wins $ input
  print $ wins . join bimap (read . concatMap show) . unzip $ input
permalink
report
reply

Advent Of Code

!advent_of_code@programming.dev

Create post

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 2023

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

  • Follow the programming.dev instance rules
  • Keep all content related to advent of code in some way
  • If what youre posting relates to a day, put in brackets the year and then day number in front of the post title (e.g. [2023 Day 10])
  • When an event is running, keep solutions in the solution megathread to avoid the community getting spammed with posts

Relevant Communities

Relevant Links

Credits

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

console.log('Hello World')

Community stats

  • 1

    Monthly active users

  • 76

    Posts

  • 778

    Comments