part2.scm 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. (define (pairing l)
  11. (define (loop ret l)
  12. (if (null? l)
  13. ret
  14. (loop
  15. (cons (cons
  16. (car l)
  17. (+ (car l) (cadr l)))
  18. ret)
  19. (cddr l))))
  20. (loop '() l))
  21. (reverse
  22. (pairing (map string->number (string-split nums-str #\space))))))
  23. (read-line port)
  24. (define (read-line-convert-eof port)
  25. (define line (read-line port))
  26. (if (eof-object? line) "" line))
  27. (define (read-map)
  28. (define (loop ret)
  29. (define line (string-trim (read-line-convert-eof port)))
  30. (if (= 0 (string-length line))
  31. (sort (reverse ret) (lambda (x y) (< (cadr x) (cadr y))))
  32. (loop (cons (map string->number (string-split line #\space))
  33. ret))))
  34. (read-line port)
  35. (loop '()))
  36. (define s2s (read-map))
  37. (define s2f (read-map))
  38. (define f2w (read-map))
  39. (define w2l (read-map))
  40. (define l2t (read-map))
  41. (define t2h (read-map))
  42. (define h2l (read-map))
  43. (define maps (list s2s s2f f2w w2l l2t t2h h2l))
  44. (define (range-map mlist r)
  45. ;; r :: Range :: (start . end)
  46. ;; mlist :: List of (Map :: (dest, src, len))
  47. (define (loop result mlist r)
  48. (define start (car r))
  49. (define end (cdr r))
  50. (if (null? mlist)
  51. (cons r result)
  52. (let ()
  53. (define cur-map (car mlist))
  54. (define map-target (car cur-map))
  55. (define map-start (cadr cur-map))
  56. (define map-end (+ map-start (caddr cur-map)))
  57. (define offset (- map-target map-start))
  58. (define (pair-offset p) (cons (+ offset (car p)) (+ offset (cdr p))))
  59. (cond ((<= end start)
  60. result)
  61. ((>= start map-end)
  62. (loop result (cdr mlist) r))
  63. ((>= start map-start)
  64. (loop
  65. (cons (pair-offset (cons start (min end map-end)))
  66. result)
  67. (cdr mlist)
  68. (cons (min end map-end) end)))
  69. ((<= end map-start)
  70. (cons r result))
  71. ((< start map-start)
  72. (loop
  73. (cons (cons start map-start) result)
  74. mlist
  75. (cons map-start end)))
  76. (else (error "unhandled cond in range-map"))))))
  77. (reverse (loop '() mlist r)))
  78. (define (gen-range-mapper the-map)
  79. (define (mapper range-list)
  80. (apply append
  81. (map
  82. (lambda (range)
  83. (range-map the-map range))
  84. range-list)))
  85. mapper)
  86. (define mappers (map gen-range-mapper maps))
  87. (define (comp-func funcs)
  88. (define procs (reverse funcs))
  89. (define (comp-rec arg)
  90. (if (null? procs)
  91. arg
  92. (let ((proc (car procs))
  93. (rest (cdr procs)))
  94. (set! procs rest)
  95. (proc (comp-rec arg)))))
  96. comp-rec)
  97. (define (find-location x)
  98. ((comp-func mappers) x))
  99. (display (apply min (map car (find-location seed))))