fork download
  1. (defvar +directions-to-character-alist-template+
  2. ;; ((from . to) . char)
  3. '(((0 . X) . #\↓)
  4. ((0 . 1) . #\→)
  5. ((0 . -1) . #\←)
  6. ((0 . -X) . #\↑)
  7. ((-1 . 1) . #\─) ;→
  8. ((1 . -1) . #\─) ;←
  9. ((-X . X) . #\│) ;↓
  10. ((X . -X) . #\│) ;↑
  11. ((-1 . -X) . #\┘)
  12. ((-1 . X) . #\┐)
  13. ((-X . -1) . #\┘)
  14. ((-X . 1) . #\└)
  15. ((1 . -X) . #\└)
  16. ((1 . X) . #\┌)
  17. ((X . -1) . #\┐)
  18. ((X . 1) . #\┌)))
  19.  
  20. (defun read-integers-from-string (string &key (radix 10))
  21. (let ((integers '())
  22. (start 0))
  23. (loop
  24. (multiple-value-bind (int end)
  25. (parse-integer string :start start
  26. :radix radix
  27. :junk-allowed t)
  28. (when int
  29. (push int integers))
  30. (setf start (1+ end))
  31. (when (>= end (length string))
  32. (return-from read-integers-from-string (nreverse integers)))))))
  33.  
  34. (defun read-matrix (stream)
  35. (let ((data (loop initially (peek-char t stream nil nil) ;skip blank lines
  36. for line = (read-line stream nil nil)
  37. while (and line (not (equal line "")))
  38. collect (read-integers-from-string line))))
  39. (assert (or (null data)
  40. (apply #'= (mapcar #'length data))))
  41. data))
  42.  
  43. (defun odai-pt13-746 (data)
  44. (let* ((num-cols (length (car data)))
  45. (dir-to-char (subst num-cols 'X
  46. (subst (- num-cols) '-X
  47. +directions-to-character-alist-template+)))
  48. (data (apply #'append data)))
  49. (format t (format nil "~~{~~~D@{~~A~~}~~%~~}" num-cols)
  50. (loop for cur from 0 below (length data)
  51. for prv = (or (position (1- (nth cur data)) data) cur)
  52. for nxt = (position (1+ (nth cur data)) data)
  53. collect (if nxt
  54. (cdr (assoc (cons (- prv cur)
  55. (- nxt cur))
  56. dir-to-char
  57. :test #'equal))
  58. #\★)))))
  59.  
  60. (loop for data = (read-matrix *standard-input*)
  61. while data
  62. do (odai-pt13-746 data)
  63. (terpri))
  64.  
Success #stdin #stdout 0s 203840KB
stdin
 1  4  5  6
 2  3  8  7
15 14  9 10
16 13 12 11

 1  2  3  4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

 1  4  5
 2  3  6
 9  8  7
10 15 14
11 12 13

1 4 5 8  9 12
2 3 6 7 10 11

4 1
3 2
stdout
↓┌─┐
└┘┌┘
┌┐└┐
★└─┘

→───┐
┌──┐│
│┌★││
│└─┘│
└───┘

↓┌┐
└┘│
┌─┘
│★┐
└─┘

↓┌┐┌┐★
└┘└┘└┘

★↓
└┘