part1.scm 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #!/usr/bin/env guile
  2. !#
  3. (use-modules (ice-9 rdelim))
  4. (define port (open-input-file "input"))
  5. (define seed
  6. (let ()
  7. (define nums-str
  8. (string-trim
  9. (list-ref (string-split (read-line port) #\:) 1)))
  10. (map string->number (string-split nums-str #\space))))
  11. (read-line port)
  12. (define (read-line-convert-eof port)
  13. (define line (read-line port))
  14. (if (eof-object? line) "" line))
  15. (define (read-map)
  16. (define (loop ret)
  17. (define line (string-trim (read-line-convert-eof port)))
  18. (if (= 0 (string-length line))
  19. (reverse ret)
  20. (loop (cons (map string->number (string-split line #\space))
  21. ret))))
  22. (read-line port)
  23. (loop '()))
  24. (define s2s (read-map))
  25. (define s2f (read-map))
  26. (define f2w (read-map))
  27. (define w2l (read-map))
  28. (define l2t (read-map))
  29. (define t2h (read-map))
  30. (define h2l (read-map))
  31. (define maps (list s2s s2f f2w w2l l2t t2h h2l))
  32. (define (gen-mapper the-map)
  33. (define (mapper x)
  34. (define (loop the-map)
  35. (if (nil? the-map)
  36. x
  37. (let ()
  38. (define cur-map (car the-map))
  39. (define target (car cur-map))
  40. (define start (cadr cur-map))
  41. (define len (caddr cur-map))
  42. (if (and (>= x start)
  43. (<= x (+ start len)))
  44. (+ target (- x start))
  45. (loop (cdr the-map))))))
  46. (loop the-map))
  47. mapper)
  48. (define mappers (map gen-mapper maps))
  49. (define (comp-func funcs)
  50. (define procs (reverse funcs))
  51. (define (comp-rec arg)
  52. (if (null? procs)
  53. arg
  54. (let ((proc (car procs))
  55. (rest (cdr procs)))
  56. (set! procs rest)
  57. (proc (comp-rec arg)))))
  58. comp-rec)
  59. (define (find-location x)
  60. ((comp-func mappers) x))
  61. (display (apply min (map find-location seed)))