aoc-all

My solutions to all Advent of Code
git clone https://git.instinctive.eu/aoc-all.git
Log | Files | Refs | README | LICENSE

day25.nim (1947B)


      1 # Copyright (c) 2024, Natacha Porté
      2 #
      3 # Permission to use, copy, modify, and distribute this software for any
      4 # purpose with or without fee is hereby granted, provided that the above
      5 # copyright notice and this permission notice appear in all copies.
      6 #
      7 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
      8 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
      9 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     10 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     11 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     12 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     13 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     14 
     15 from std/sequtils  import allIt, mapIt, zip
     16 
     17 # Read input file
     18 
     19 proc read_input(): (seq[seq[int]], seq[seq[int]]) =
     20   var
     21     in_key = false
     22     in_lock = false
     23     height = 0
     24     acc: seq[int]
     25   for line in stdin.lines():
     26     if line == "":
     27       assert in_key or in_lock
     28       assert not (in_key and in_lock)
     29       if in_key:
     30         result[0].add(acc)
     31       else:
     32         result[1].add(acc.mapIt(height - 2 - it))
     33       in_key = false
     34       in_lock = false
     35     elif in_key or in_lock:
     36       let c = if in_key: '#' else: '.'
     37       acc = zip(acc, line).mapIt(if it[1] == c: height else: it[0])
     38       height += 1
     39     else:
     40       if line.allIt(it == '#'):
     41         in_key = true
     42       elif line.allIt(it == '.'):
     43         in_lock = true
     44       else:
     45         assert false
     46       height = 1
     47       acc = line.mapIt(0)
     48   if in_key:
     49     result[0].add(acc)
     50   elif in_lock:
     51     result[1].add(acc.mapIt(height - 2 - it))
     52 
     53 let (keys, locks) = read_input()
     54 
     55 # echo "Keys:"
     56 # for k in keys:
     57 #   echo "  ", k
     58 # echo "Locks:"
     59 # for l in locks:
     60 #   echo "  ", l
     61 
     62 # Puzzle 1
     63 
     64 var answer = 0
     65 for l in locks:
     66   for k in keys:
     67     if zip(l,k).allIt(it[0] + it[1] <= 5):
     68       answer += 1
     69 
     70 echo "Puzzle 1: ", answer