fork download
  1. (def wall 9999)
  2. (def floor 2000)
  3. (def GOAL 0)
  4. (def height 60)
  5. (def width 60)
  6.  
  7. (def dstr (str
  8. "############################################################"
  9. "#########......###...##........####...####.....#############"
  10. "####............................##.....##............#######"
  11. "###................###.....##..........................#####"
  12. "###...............#####...####..........................####"
  13. "###...............#####....####............#............####"
  14. "####...###.........####.......##.................G.....#####"
  15. "##########..........###........##.....................######"
  16. "##########...........#..........##...................#######"
  17. "#########.......................#####..............#########"
  18. "######.........................#######...#......############"
  19. "#####..........................############....#############"
  20. "####...........................###########......######..####"
  21. "###..........##.................#########................###"
  22. "##.......#######........#..........######...###.........####"
  23. "##......########.......##............###...######.....######"
  24. "###.....#######...............#####........########..#######"
  25. "###......#####...##...........######........################"
  26. "###......#####..####...........#####.........###############"
  27. "#######..#####..####............###...........#######....###"
  28. "########..###...#####......###.................#####......##"
  29. "########.......######......####.................###.......##"
  30. "########.......######.......##....##..................##..##"
  31. "#######.......######....##..G....####.........##.....####..#"
  32. "#####........#######....###......####........#####..#####..#"
  33. "####........#######.....######...#####.......############..#"
  34. "####.......######..........####..#########..#############..#"
  35. "###........#####............###..########################.##"
  36. "##.........####.............###..################.######..##"
  37. "#....###...####......####....#...######..#######...#####..##"
  38. "#.....#.....##......######.......#####..G.#####....#####..##"
  39. "#...................######........####....###.....#####...##"
  40. "#....................#####........#####..###......##......##"
  41. "#....G...............######........########................#"
  42. "##......#............########.......#######................#"
  43. "##......##...........#########......#######...............##"
  44. "###.....#..G.........####...##.....#######..##...........###"
  45. "###..........#......####...........######..####..........###"
  46. "##..........####....####...........#####..######.........###"
  47. "##...........####..#####............##....######.........###"
  48. "##............###..######......#...........####..........###"
  49. "##............###..#######.....##........................###"
  50. "##.......###...#....#######....#..........................##"
  51. "###......###.........######.........................##.....#"
  52. "###.......#..........######........#####...........####....#"
  53. "###............###...######......########.........#####....#"
  54. "###...........#####..######.....#########.........####.....#"
  55. "###...........#####.#######.....########...........###.....#"
  56. "###...........####..########...#########......##...###....##"
  57. "###...........####...##################......####..###....##"
  58. "###...........####......##############.......####..###....##"
  59. "###...........####..........##########........##...###....##"
  60. "###............####..........#########.............####..###"
  61. "###...........#####...........#######..............#########"
  62. "###.....##########............######.......##......#########"
  63. "##.....###########.....###.....####.......####......########"
  64. "##.....############....###......##.......#####........######"
  65. "###...##############..#####.............#######.......######"
  66. "################################...##..#####################"
  67. "############################################################"))
  68. (def dungeon (vec (replace {\# wall \. floor \G GOAL} dstr)))
  69.  
  70. (defn find-goals [m]
  71. (into {} (for [x (keep-indexed #(if (= %2 0) %1) dungeon)] [x 0])))
  72.  
  73. (defn find-walls [m]
  74. (into {} (for [x (keep-indexed #(if (= %2 wall) %1) dungeon)] [x wall])))
  75.  
  76. (defn find-floors [m]
  77. (into {} (for [x (keep-indexed #(if (= %2 floor) %1) dungeon)] [x floor])))
  78.  
  79. (defn step-value [d x]
  80. (if (> d floor)
  81. d
  82. (if (> (dec d) (val x))
  83. (inc (val x)))))
  84.  
  85. (defn step [m x]
  86. (if (= (val x) wall)
  87. [{(key x) wall}]
  88. (let [n (m (- (key x) width))
  89. s (m (+ (key x) width))
  90. w (m (- (key x) 1 ))
  91. e (m (+ (key x) 1 ))
  92. rv
  93. (filter #(distinct? (val (first %)) wall nil)
  94. [{(- (key x) width) (step-value n x)}
  95. {(+ (key x) width) (step-value s x)}
  96. {(- (key x) 1 ) (step-value w x)}
  97. {(+ (key x) 1 ) (step-value e x)}])]
  98. rv)))
  99.  
  100. (defn merge-maps [a b]
  101. (merge-with min a b))
  102.  
  103. (defn dijkstra
  104. ([m]
  105. (dijkstra m (find-walls m) (find-goals m)))
  106. ([m closed open]
  107. (if (empty? open)
  108. (merge-with min closed (find-floors m))
  109. (recur
  110. m
  111. (merge-with min closed open)
  112. (let [ms (flatten (map #(step (fn [index] (or (closed index) (m index))) %) open))]
  113. (reduce merge-maps {} ms))))))
  114.  
  115. (defn -main
  116. [& args]
  117. (time (do ;(println (str (into (sorted-map) (dijkstra dungeon))))
  118. (println (clojure.string/replace (reduce #(str %1 (condp = (val %2) wall "█" floor "ʔ" (char (+ (int \A) -1 (val %2) )))) "" (into (sorted-map) (dijkstra dungeon))) #"(.{60})" "$1\n"))
  119. )))
  120. (-main)
Success #stdin #stdout 2.16s 335104KB
stdin
Standard input is empty
stdout
████████████████████████████████████████████████████████████
█████████hggfed███`_^██[ZYZ[ZYX████SRQ████LKJIH█████████████
████lkjihgffedcba`_^]\[ZYXYZYXWV██SRQPO██LKJIHGFEDEFG███████
███lkjihgfeedcba`_`███ZYXWX██WVUTSRQPONMLKJIHGFEDCDEFGH█████
███kjihgfeddcba`_^█████XWV████UTSRQPONMLKJIHGFEDCBCDEFGH████
███jihgfedccba`_^]█████WVUT████SRQPONMLKJIH█FEDCBABCDEFG████
████jih███bba`_^]\[████VUTSTUV██QPONMLKJIHGFEDCBA@ABCDE█████
██████████aa`_^]\[ZY███UTSRSTUV██QPONMLKJIHGFEDCBABCDE██████
██████████``_^]\[ZYXW█UTSRQRSTUV██QPONMLKJIHGFEDCBCDE███████
█████████^__^]\[ZYXWVUTSRQPQRSTU█████ONMLKJIHGFEDCD█████████
██████\[\]^^]\[ZYXWVUTSRQPOPQRS███████ONM█KJIHGF████████████
█████\[Z[\]]\[ZYXWVUTSRQPONOPQR████████████KJIH█████████████
████\[ZYZ[\\[ZYXWVUTSRQPONMNOPQ███████████MLKJIJ██████ST████
███\[ZYXYZ[\\██WVUTSRQPONMLMNOPQ█████████ONMLKJKLMNOPQRST███
██\[ZYXWX███████UTSRQPOP█LKLMNOPQRS██████PON███LMNOPQRST████
██[ZYXWV████████TSRQPON██KJKLMNOPQRQP███RQP██████OPQRS██████
███YXWVU███████TSRQPONMLKJIJKL█████POPQRSRQ████████RS███████
███XWVUTS█████VUT██ONMLKJIHIJK██████NOPQRSRS████████████████
███WVUTSR█████WV████MLKJIHGHIJI█████MNOPQRSTU███████████████
███████RQ█████VW████LKJIHGFGHIHG███KLMNOPQRSTU███████_`ab███
████████PQ███TUV█████JIHGFE███GFGHIJKLMNOPQRSTU█████]^_`ab██
████████OPPQRST██████IHGFED████EFGHIJKLMNOPQRSTU███[\]^_`a██
████████NOOPQRS██████HGFEDCB██CDEF██KLMNOPQRSTUVWXYZ[\██ab██
███████NMNNOPQ██████JIHG██BA@ABCD████MNOPQRSTU██XYZ[\████cd█
█████KLMLMMNO███████KJIH███BABCDE████NOPQRSTU█████[\█████de█
████IJKLKLLM███████MLKJI██████DEF█████PQRSTUV████████████ef█
████HIJKJKK██████PONMLKJKLM████FG█████████UV█████████████fg█
███HGHIJIJJ█████NOPONMLKLMNO███GH████████████████████████g██
██HGFGHIHII████LMNOPONMLMNOP███HI████████████████r██████ih██
█HGFE███GHH████KLMNOP████OPON█JIJ██████BA███████pqr█████ji██
█GFEDC█EFGGF██IJKLMN██████ONMLKJK█████BA@A█████nopq█████kj██
█FEDCBCDEFFEFGHIJKLM██████PONMLKLM████CBAB███klmno█████mlk██
█EDCBABCDEEDEFGHIJKLM█████QPONMLMN█████CB███ijklmn██qponml██
█DCBA@ABCDDCDEFGHIJKL██████QPONMNOP████████ghijklmnopqponmn█
██DCBABC█DCBCDEFGHIJK████████PONOPQR███████fghijklmnopqpono█
██EDCBCD██BABCDEFGHIJ█████████POPQRS███████efghijklmnopqpo██
███EDCDE█BA@ABCDEFGHI████XWV██QPQRS███████cd██ijklmnopqrq███
███FEDEEDCBAB█DEFGHI████XWVUTSRQRST██████ab████kjklmnopqr███
██HGFEFFEDCB████GHIJ████YXWVUTSRSTU█████_`██████ijklmnopq███
██IHGFGGFEDCD████IJ█████ZYXWVUTSTUVW██\]^_██████hijklmnop███
██JIHGHHGFEDEF███JK██████ZYXWVU█UVWXYZ[\]^_████fghijklmno███
██KJIHIIHGFEFG███KL███████ZYXWV██WXYZ[\]^_`abcdefghijklmn███
██LKJIJJI███GHI█MLMN███████ZYXW█YXYZ[\]^_`abcdefghijklmnop██
███LKJKKJ███HIJKLMNOP██████[ZYXYZYZ[\]^_`abcdefghijk██nopqr█
███MLKLLKL█JIJKLMNOPQ██████\[ZYZ[Z[█████abcdefghijk████pqrs█
███NMLMMLMLKJKL███PQR██████]\[Z[\████████cdefghijk█████qrst█
███ONMNNMNMLKL█████RS██████^]\[\█████████defghijkl████srstu█
███PONOONONMLM█████S███████_^]\]████████fefghijklmn███tstuv█
███QPOPPOPONMN████UT████████_^]█████████gfghij██mno███utuv██
███RQPQQPQPONO████VUV██████████████████ihghij████op███vuvw██
███SRQRRQRQPOP████WVWXYZ██████████████kjihijk████pq███wvwx██
███TSRSSRSRQPQ████XWXYZ[\]^_██████████lkjijklm██rqr███xwxy██
███UTSTTSTSRQRS████XYZ[\]^_`a█████████mlkjklmnopqrs████xy███
███VUTUUTUTSRS█████YZ[\]^_`abc███████onmlklmnopqrst█████████
███WVUVV██████████[Z[\]^_`abcd██████qponmlm██pqrstu█████████
██YXWVW███████████\[\]^███bcdef████opqponm████rstuvw████████
██ZYXWX████████████\]^_███cdefgh██mnopqpo█████stuvwxyz██████
███ZYX██████████████^_█████efghijklmnopq███████uvwxyz{██████
████████████████████████████████klm██pq█████████████████████
████████████████████████████████████████████████████████████

"Elapsed time: 316.012694 msecs"