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