Day 2: Gift Shop

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

FAQ

  • janAkali@lemmy.sdf.org
    link
    fedilink
    arrow-up
    3
    ·
    edit-2
    1 month ago

    Nim

    Easy one today. Part 2 is pretty forgiving on performance, so regex bruteforce was only a couple seconds . But eventually I’ve cleaned it up and did a solution that runs in ~340 ms.

    type
      AOCSolution[T,U] = tuple[part1: T, part2: U]
    
    proc isRepeating(str:string, sectorLength=1): bool =
      if str.len mod sectorLength != 0: return false
      for i in countUp(0, str.len - sectorLength, sectorLength):
        if str.toOpenArray(i, i+sectorLength-1) != str.toOpenArray(0, sectorLength-1):
          return false
      true
    
    proc solve(input: string): AOCSolution[int, int] =
      let ranges = input.split(',').mapIt:
        let parts = it.split('-')
        (parseInt parts[0], parseInt parts[1])
    
      for (a, b) in ranges:
        for num in a .. b:
          if num < 10: continue
          let strnum = $num
          let half = strnum.len div 2
    
          for i in countDown(half, 1):
            if strnum.isRepeating(i):
              if i == half and strnum.len mod 2 == 0:
                result.part1 += num
              result.part2 += num
              break
    

    Full solution at Codeberg: solution.nim