Advertisement
Guest User

Clojurescript "Playable" Rubiks for your REPL

a guest
Feb 18th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (ns rubiks.compudharma
  2.   (:require
  3.         [goog.string :as gstring]
  4.             [goog.string.format]))
  5.  
  6. (use '[clojure.string :only (join split)])
  7.  
  8. (defn transpose [m]
  9.   (apply mapv vector m))
  10.  
  11. (defn xmirror [m]
  12.   (map reverse m))
  13.  
  14. (def rotl (comp transpose xmirror))
  15. (def rotr (comp rotl rotl rotl))
  16.  
  17.  
  18. (defn print-face [face]
  19.   (doseq [i (range 0 (count face))] (println (get face i))))
  20.  
  21. (defn print-cube [cube]
  22.   (doseq [i (range 0 (count cube))] (do (print-face (get cube i)) (println "-------"))))
  23.  
  24. (defn init-face [a n]
  25.   (loop [row [] i n]
  26.     (if (= i 0)
  27.       row
  28.       (recur (conj row (vec (replicate n a))) (dec i)))))
  29.  
  30. (defn num-face [n]
  31.   (loop [row [] i 1]
  32.     (if (= i (inc n))
  33.       row
  34.       (recur (conj row (vec (range (* (dec i) n) (* i n)))) (inc i)))))
  35.  
  36. (defn row-subst [face idx row]
  37.   (assoc face idx row))
  38.  
  39. (defn col-subst [face idx col]
  40.   (transpose (assoc (transpose face) idx col)))
  41.  
  42. (defn ninit-cube [n init]
  43.   (loop [cube [] i 0]
  44.     (if (= i 6)
  45.       cube
  46.       (recur (conj cube (init-face init n)) (inc i)))))
  47.  
  48. (defn init-cube [n]
  49.   (loop [cube [] i 0]
  50.     (if (= i 6)
  51.       cube
  52.       (recur (conj cube (init-face i n)) (inc i)))))
  53.  
  54. (defn rotxy-cube [cube]
  55.  [(rotl (get cube 4)) (rotl (get cube 1)) (rotl (get cube 0)) (rotr (get cube 3)) (rotl (get cube 5)) (rotl (get cube 2))])
  56.  
  57. (defn rotyz-cube [cube]
  58.  [(rotl (rotl (get cube 3))) (get cube 0) (rotr (get cube 2)) (rotl (rotl (get cube 5))) (rotl (get cube 4)) (get cube 1)])
  59.  
  60. (def nrotxy-cube (comp rotxy-cube rotxy-cube rotxy-cube))
  61. (def nrotyz-cube (comp rotyz-cube rotyz-cube rotyz-cube))
  62.  
  63.  
  64. (defn facerot-u [cube]
  65.   (loop [ret [(rotr (get cube 0))] row (get (get cube 4) 0) i 1]
  66.     (if (= i 5)
  67.       (vec (concat ret [(get cube i)]))
  68.       (recur (concat ret [(row-subst (get cube i) 0 row)]) (get (get cube i) 0) (inc i)))))
  69.  
  70. (defn facerot-ui [cube]
  71.   (loop [ret [] row (get (get cube 1) 0) i 4]
  72.     (if (= i 0)
  73.       (vec (concat [(rotl (get cube 0))] ret [(get cube 5)]))
  74.       (recur (concat [(row-subst (get cube i) 0 row)] ret) (get (get cube i) 0) (dec i)))))
  75.  
  76. (defn facerot-f [cube]
  77.   ((comp rotyz-cube facerot-u nrotyz-cube) cube))
  78.  
  79. (defn facerot-fi [cube]
  80.   ((comp rotyz-cube facerot-ui nrotyz-cube) cube))
  81.  
  82. (defn facerot-r [cube]
  83.   ((comp nrotxy-cube facerot-u rotxy-cube) cube))
  84.  
  85. (defn facerot-ri [cube]
  86.   ((comp nrotxy-cube facerot-ui rotxy-cube) cube))
  87.  
  88. (defn facerot-l [cube]
  89.   ((comp rotxy-cube facerot-u nrotxy-cube) cube))
  90.  
  91. (defn facerot-li [cube]
  92.   ((comp rotxy-cube facerot-ui nrotxy-cube) cube))
  93.  
  94. (defn facerot-b [cube]
  95.   ((comp nrotyz-cube facerot-u rotyz-cube) cube))
  96.  
  97. (defn facerot-bi [cube]
  98.   ((comp nrotyz-cube facerot-ui rotyz-cube) cube))
  99.  
  100. (defn facerot-d [cube]
  101.   ((comp nrotyz-cube nrotyz-cube facerot-u rotyz-cube rotyz-cube) cube))
  102.  
  103. (defn facerot-di [cube]
  104.   ((comp nrotyz-cube nrotyz-cube facerot-ui rotyz-cube rotyz-cube) cube))
  105.  
  106.  
  107. (defn facerot-str [cube rot]
  108.   (case rot
  109.     "u"   (facerot-u cube)
  110.     "ui"  (facerot-ui cube)
  111.     "f"   (facerot-f cube)
  112.     "fi"  (facerot-fi cube)
  113.     "l"   (facerot-l cube)
  114.     "li"  (facerot-li cube)
  115.     "b"   (facerot-b cube)
  116.     "bi"  (facerot-bi cube)
  117.     "r"   (facerot-r cube)
  118.     "ri" (facerot-ri cube)
  119.     "d" (facerot-d cube)
  120.     "di" (facerot-di cube)))
  121.  
  122.  
  123. (defn facerot-idx [cube rotidx]
  124.   (case rotidx
  125.     0 (facerot-u cube)
  126.     1 (facerot-ui cube)
  127.     2 (facerot-f cube)
  128.     3 (facerot-fi cube)
  129.     4 (facerot-l cube)
  130.     5 (facerot-li cube)
  131.     6 (facerot-b cube)
  132.     7 (facerot-bi cube)
  133.     8 (facerot-r cube)
  134.     9 (facerot-ri cube)
  135.     10 (facerot-d cube)
  136.     11 (facerot-di cube)))
  137.  
  138. (defn facerot-batch [cube rotbatch]
  139.   (loop [rots (split rotbatch #",") c cube]
  140.     (if (= 0 (count rots))
  141.       c
  142.       (recur (subvec rots 1) (facerot-str c (first rots))))))
  143.  
  144. (defn randomize-cube [cube n]
  145.   (loop [c cube i n]
  146.     (if (= i 0)
  147.       c
  148.       (recur (facerot-idx c (rand-int 12)) (dec i)))))
  149.  
  150. (defn solved-cube [cube n]
  151.   (= cube (init-cube n)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement