Quest 4: Teeth of the Wind

  • 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://topaz.github.io/paste/ if you prefer sending it through a URL

Link to participate: https://everybody.codes/

  • Amy@piefed.blahaj.zone
    link
    fedilink
    English
    arrow-up
    1
    ·
    3 hours ago

    I liked this one!

    import Control.Arrow  
    import Control.Monad  
    import Data.List  
    import Data.Ratio  
    
    simpleTrain = uncurry (%) . (head &&& last) . map read  
    
    compoundTrain input =  
      let a = read $ head input  
          z = read $ last input  
          gs =  
            map  
              ( uncurry (%)  
                  . (read *** read . tail)  
                  . break (== '|')  
              )  
              $ (tail . init) input  
       in foldl' (/) (a % z) gs  
    
    part1, part2, part3 :: [String] -> Integer  
    part1 = floor . (2025 *) . simpleTrain  
    part2 = ceiling . (10000000000000 /) . simpleTrain  
    part3 = floor . (100 *) . compoundTrain  
    
    main =  
      forM_  
        [ ("everybody_codes_e2025_q04_p1.txt", part1),  
          ("everybody_codes_e2025_q04_p2.txt", part2),  
          ("everybody_codes_e2025_q04_p3.txt", part3)  
        ]  
        $ \(input, solve) -> readFile input >>= print . solve . lines  
    
  • janAkali@lemmy.sdf.org
    link
    fedilink
    arrow-up
    1
    ·
    11 hours ago

    Nim

    For part 3 I parse gears as tuples, with regular gears having same value on both ends e.g.

    3|5 -> (3, 5)
    3   -> (3, 3)
    
    proc parseGears(input: string): seq[int] =
      for line in input.splitLines():
        result.add parseInt(line)
    
    proc parseNestedGears(input: string): seq[(int, int)] =
      for line in input.splitLines():
        let nested = line.split('|').mapIt(it.parseInt)
        result.add:
          if nested.len == 1: (nested[0], nested[0])
          else: (nested[0], nested[1])
    
    proc solve_part1*(input: string): Solution =
      let gears = parseGears(input)
      result := 2025 * gears[0] div gears[^1]
    
    proc solve_part2*(input: string): Solution =
      let gears = parseGears(input)
      result := ceil(10000000000000'f64 / (gears[0] / gears[^1])).int
    
    proc solve_part3*(input: string): Solution =
      let gears = parseNestedGears(input)
      let ratios = (0..gears.high-1).mapIt(gears[it][1] / gears[it+1][0])
      result := int(100 * ratios.prod)
    

    Full solution at Codeberg: solution.nim

  • hades@programming.devOPM
    link
    fedilink
    arrow-up
    2
    ·
    15 hours ago

    Rust

    use num::{BigInt, Integer};
    
    pub fn solve_part_1(input: &str) -> String {
        let gears: Vec<i64> = input.trim().lines().map(|g| g.parse().unwrap()).collect();
        (2025 * gears[0] / gears.last().unwrap()).to_string()
    }
    
    pub fn solve_part_2(input: &str) -> String {
        let gears: Vec<i64> = input.trim().lines().map(|g| g.parse().unwrap()).collect();
        let res = (BigInt::parse_bytes(b"10000000000000", 10).unwrap() * gears.last().unwrap())
            .div_ceil(&(BigInt::ZERO + gears[0]));
        res.to_string()
    }
    
    pub fn solve_part_3(input: &str) -> String {
        let mut lines = input.trim().lines();
        let first_gear = BigInt::parse_bytes(lines.next().unwrap().as_bytes(), 10).unwrap();
        let mut nominator: BigInt = first_gear * 100;
        let mut denominator: BigInt = BigInt::ZERO + 1;
        for line in lines {
            let mut split = line.split("|");
            denominator *= BigInt::parse_bytes(split.next().unwrap().as_bytes(), 10).unwrap();
            match split.next() {
                Some(size) => {
                    nominator *= BigInt::parse_bytes(size.as_bytes(), 10).unwrap();
                }
                None => {
                    break;
                }
            }
        }
        (nominator / denominator).to_string()
    }