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/

  • janAkali@lemmy.sdf.org
    link
    fedilink
    arrow-up
    1
    ·
    12 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