Advertisement
Guest User

Untitled

a guest
Apr 7th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Clojure 12.69 KB | None | 0 0
  1. ; solve i transform se po specifikaciajta vo zadachata
  2. ; za vizuelizacija se povikuva (solve-and-visualise input-matrix)
  3.  
  4.  
  5. (import 'javax.swing.JFrame)
  6. (import 'javax.swing.JPanel)
  7. (import 'javax.swing.JLabel)
  8. (import 'javax.swing.JTextField)
  9. (import 'javax.swing.BorderFactory)
  10. (import 'java.awt.Font)
  11. (import 'java.awt.Color)
  12. (import 'java.awt.GridLayout)
  13. (import 'java.awt.Toolkit)
  14. (import 'java.awt.Dimension)
  15.  
  16. ; transform
  17. (defn transform0 [vektor]
  18.   (cond
  19.     (= vektor '()) '()
  20.     :else (cond
  21.             (= 0 (first vektor)) (vec(cons #{1 2 3 4 5 6 7 8 9} (transform0 (rest vektor))))
  22.             :else (vec (cons #{(first vektor)} (transform0 (rest vektor)))))))
  23.          
  24.  
  25. (defn transform "Transforms the input to possible elements for each position (containted in a set)." [matrix]
  26.   (cond
  27.     (= matrix '()) '()
  28.     :else (vec (cons (transform0 (first matrix)) (transform (rest matrix))))))
  29.  
  30. ; find-single
  31.  
  32. (defn find-single0 [set-vector ctr]
  33.   (cond
  34.     (= set-vector '()) nil
  35.     (and (= (count (first set-vector)) 1) (> (first (first set-vector)) 0)) [ctr (first (first set-vector))]
  36.     :else (find-single0 (rest set-vector) (inc ctr))))
  37.    
  38.  
  39.  
  40. (defn find-single [matrix ctr]
  41.   (let [found (find-single0 (first matrix) ctr)]
  42.     (cond
  43.       (= matrix '()) nil
  44.       (= found nil) (find-single (rest matrix) (+ ctr 9))
  45.       :else found)))
  46.  
  47.  
  48. ; fix-rows
  49. (defn fix-rows0 [set-vector koj-vrednost]
  50.   (cond
  51.     (= set-vector '()) '()
  52.     ; set negative
  53.     (and (= (count (first set-vector)) 1) (= koj-vrednost (first (first set-vector)))) (vec (cons #{ (* -1 (first (first set-vector)))} (fix-rows0 (rest set-vector) koj-vrednost)))
  54.     (> (count (first set-vector)) 1) (vec (cons (disj (first set-vector) koj-vrednost) (fix-rows0 (rest set-vector) koj-vrednost)))
  55.     :else (vec (cons (first set-vector) (fix-rows0 (rest set-vector) koj-vrednost)))))
  56.  
  57. (defn fix-rows [matrix koj-idx koj-vrednost ctr]
  58.   (do
  59.     ;(print koj-idx)
  60.     (cond
  61.       (= matrix '()) '()
  62.       (= (quot koj-idx 9) (quot ctr 9)) (vec (cons (fix-rows0 (first matrix) koj-vrednost) (fix-rows (rest matrix) koj-idx koj-vrednost (+ ctr 9))))
  63.       :else (vec (cons (first matrix) (fix-rows (rest matrix) koj-idx koj-vrednost (+ ctr 9)))))))
  64.    
  65.  
  66. ; fix-columns
  67.  
  68. (defn fix-columns0 [set-vector koj-idx koj-vrednost ctr]
  69.   (cond
  70.     (= set-vector '()) '()
  71.     (= (mod koj-idx 9) (mod ctr 9)) (vec (cons (disj (first set-vector) koj-vrednost) (fix-columns0 (rest set-vector) koj-idx koj-vrednost (inc ctr))))
  72.     :else (vec (cons (first set-vector) (fix-columns0 (rest set-vector) koj-idx koj-vrednost (inc ctr))))))
  73.    
  74.  
  75. (defn fix-columns [matrix koj-idx koj-vrednost ctr]
  76.   (do
  77.     (cond
  78.       (= matrix '()) '()
  79.       (not= (quot koj-idx 9) (quot ctr 9)) (vec (cons (fix-columns0 (first matrix) koj-idx koj-vrednost 0) (fix-columns (rest matrix) koj-idx koj-vrednost (+ ctr 9))))  
  80.       :else (vec (cons (first matrix) (fix-columns (rest matrix) koj-idx koj-vrednost (+ ctr 9)))))))
  81.  
  82.  
  83. ; fix-3x3
  84.  
  85. (defn fix-3x30 [set-vector koj-idx koj-vrednost ctr]
  86.   (cond
  87.     (= set-vector '()) '()
  88.     (and (> (count (first set-vector)) 1) (= (quot (mod koj-idx 9) 3) (quot (mod ctr 9) 3))) (vec (cons (disj (first set-vector) koj-vrednost) (fix-3x30 (rest set-vector) koj-idx koj-vrednost (inc ctr))))
  89.     :else (vec (cons (first set-vector) (fix-3x30 (rest set-vector) koj-idx koj-vrednost (inc ctr))))))
  90.  
  91. (defn fix-3x3 [matrix koj-idx koj-vrednost ctr]
  92.   (do
  93.     (cond
  94.       (= matrix '()) '()
  95.       (= (quot koj-idx 27) (quot ctr 27)) (vec (cons (fix-3x30 (first matrix) koj-idx koj-vrednost ctr) (fix-3x3 (rest matrix) koj-idx koj-vrednost (+ ctr 9))))
  96.       :else (vec (cons (first matrix) (fix-3x3 (rest matrix) koj-idx koj-vrednost (+ ctr 9)))))))
  97.  
  98.  
  99. ;fix
  100.  
  101. (defn fix [matrix]
  102.   (let [pair-found (find-single matrix 0)]
  103.     (cond
  104.       (= pair-found nil) matrix
  105.       :else (fix (fix-rows (fix-columns (fix-3x3 matrix (first pair-found) (second pair-found) 0) (first pair-found) (second pair-found) 0) (first pair-found) (second pair-found) 0)))))
  106.  
  107.  
  108. ; find-set
  109.  
  110. (defn find-set0 [set-vector last ctr]
  111.   (cond
  112.     (= set-vector '()) nil
  113.     (and (> (count (first set-vector)) 1) (> ctr last)) [ctr (first set-vector)]
  114.     :else (find-set0 (rest set-vector) last (inc ctr))))
  115.    
  116.  
  117.  
  118. (defn find-set [matrix last ctr]
  119.   (let [found (find-set0 (first matrix) last ctr)]
  120.     (cond
  121.       (= matrix '()) nil
  122.       (= found nil) (find-set (rest matrix) last (+ ctr 9))
  123.       :else found)))
  124.    
  125. ; check-rows
  126.  
  127. (defn check-rows0 [set-vector koj-idx koj-element ctr]
  128.   (do
  129.     ;(println koj-element)
  130.     (cond
  131.       (= set-vector '()) true
  132.       (= koj-idx ctr) (check-rows0 (rest set-vector) koj-idx koj-element (inc ctr))
  133.       (or (contains? (first set-vector) koj-element) (contains? (first set-vector) (* -1 koj-element))) false
  134.       :else (check-rows0 (rest set-vector) koj-idx koj-element (inc ctr)))))
  135.  
  136.  
  137.  
  138. (defn check-rows [matrix koj-idx koj-element ctr]
  139.   (cond
  140.     (= (quot koj-idx 9) (quot ctr 9)) (check-rows0 (first matrix) koj-idx koj-element ctr)
  141.     :else (check-rows (rest matrix) koj-idx koj-element (+ ctr 9))))
  142.  
  143.  
  144. ; check-columns
  145.  
  146. (defn check-columns0 [set-vector koj-idx koj-element ctr]
  147.   (cond
  148.     (= (mod koj-idx 9) (mod ctr 9)) (not (or (contains? (first set-vector) koj-element) (contains? (first set-vector) (* -1 koj-element))))
  149.     :else (check-columns0 (rest set-vector) koj-idx koj-element (inc ctr))))
  150.  
  151.  
  152.  
  153. (defn check-columns [matrix koj-idx koj-element ctr]
  154.   (cond
  155.     (= matrix '()) true
  156.     (not= (quot koj-idx 9) (quot ctr 9)) (cond
  157.                                            (= false (check-columns0 (first matrix) koj-idx koj-element ctr)) false
  158.                                            :else (check-columns (rest matrix) koj-idx koj-element (+ ctr 9)))
  159.    
  160.     :else (check-columns (rest matrix) koj-idx koj-element (+ ctr 9))))
  161.  
  162.  
  163. ; check-3x3
  164.  
  165. (defn check-3x30 [set-vector koj-idx koj-element ctr]
  166.   (cond
  167.     (= set-vector '()) true
  168.     (= koj-idx ctr) (check-3x30 (rest set-vector) koj-idx koj-element (inc ctr))
  169.     (= (quot (mod koj-idx 9) 3) (quot (mod ctr 9) 3)) (cond
  170.                                                         (= false (not (or (contains? (first set-vector) koj-element) (contains? (first set-vector) (* -1 koj-element))))) false
  171.                                                         :else (check-3x30 (rest set-vector) koj-idx koj-element (inc ctr)))
  172.     :else (check-3x30 (rest set-vector) koj-idx koj-element (inc ctr))))
  173.  
  174. (defn check-3x3 [matrix koj-idx koj-element ctr]
  175.   (cond
  176.     (= matrix '()) true
  177.     (= (quot koj-idx 27) (quot ctr 27)) (cond
  178.                                           (= false (check-3x30 (first matrix) koj-idx koj-element ctr)) false
  179.                                           :else (check-3x3 (rest matrix) koj-idx koj-element (+ ctr 9)))
  180.     :else (check-3x3 (rest matrix) koj-idx koj-element (+ ctr 9))))
  181.  
  182.  
  183.  
  184.  
  185.  
  186. ; check
  187.  
  188. (defn is-ok [matrix koj-idx koj-element]
  189.   ;(println koj-element)
  190.   (or (check-3x3 matrix koj-idx koj-element 0) (check-columns matrix koj-idx koj-element 0) (check-rows matrix koj-idx koj-element 0)))
  191.  
  192. (defn check-element [matrix koj-idx org-set koj-set]
  193.   (cond
  194.     (= koj-set '()) org-set
  195.     (= true (is-ok matrix koj-idx (first koj-set))) (do
  196. ;                                                      (println koj-idx)
  197.                                                       #{(first koj-set)})
  198.     :else (check-element matrix koj-idx org-set (rest koj-set))))
  199.  
  200.  
  201.  
  202. (defn check0 [org-matrix set-vector koj-idx koj-set ctr]
  203.   (cond
  204.     (= set-vector '()) '()
  205.     (= koj-idx ctr) (vec (cons (check-element org-matrix koj-idx koj-set koj-set) (check0 org-matrix (rest set-vector) koj-idx koj-set (inc ctr))))
  206.     :else (vec (cons (first set-vector) (check0 org-matrix (rest set-vector) koj-idx koj-set (inc ctr))))))
  207.  
  208.  
  209. (defn check1 [org-matrix matrix koj-idx koj-set ctr]
  210.   (cond
  211.     (= matrix '()) '()
  212.     :else (vec (cons (check0 org-matrix (first matrix) koj-idx koj-set ctr) (check1 org-matrix (rest matrix) koj-idx koj-set (+ 9 ctr)))))); vrakja celosnata set-matrix samo so taa pozicija smeneta dokolku teba.
  213.  
  214. (defn check [matrix last]
  215.   (let [pair-found (find-set matrix last 0)]
  216.     (do
  217.       ;      (print (first pair-found))
  218.       (cond
  219.         (= pair-found nil) matrix
  220.         :else (check (check1 matrix matrix (first pair-found) (second pair-found) 0) (first pair-found))))))
  221.    
  222.    
  223.  
  224. ; finalize
  225.  
  226. (defn finalize0 [set-vector]
  227.   (cond
  228.     (= set-vector '()) '()
  229.     :else (vec (cons (* -1 (first (first set-vector))) (finalize0 (rest set-vector))))))
  230.  
  231.  
  232. (defn finalize [matrix]
  233.   (cond
  234.     (= matrix '()) '()
  235.     :else (vec (cons (finalize0 (first matrix)) (finalize (rest matrix))))))
  236.  
  237.  
  238.  
  239.  
  240. ; solve
  241. (defn solve0 [set-matrix]
  242.   (let [prv (find-single set-matrix 0)
  243.         vtor (find-set set-matrix -1 0)]
  244.     (do
  245.       ;(println prv)
  246.       ; (println vtor)
  247.       (cond
  248.         (and (= nil prv) (= nil vtor)) set-matrix
  249.         :else (solve0 (check (fix set-matrix) -1))))))
  250.  
  251.  
  252. (defn solve "Solves a simple sudoku sudoku given in a matrix where every element is a vector representing a row." [input]
  253.   (do
  254.     (finalize (solve0 (transform input)))))
  255.    
  256.  
  257.    
  258.  
  259.  
  260. ; row to 3x3
  261.  
  262. (defn dodaj-i-j0 [vector j ctr acc]
  263.   (cond
  264.     (= vector '()) acc
  265.     (= j (quot (mod ctr 9) 3)) (dodaj-i-j0 (rest vector) j (inc ctr) (vec (cons (first vector) acc)))
  266.     :else (dodaj-i-j0 (rest vector) j (inc ctr) acc)))
  267.  
  268.  
  269. (defn dodaj-i-j1 [matrix i j ctr]
  270.   (cond
  271.     (= matrix '()) '()
  272.     (= i (quot ctr 27)) (vec (apply (partial conj (dodaj-i-j1 (rest matrix) i j (+ ctr 9))) (dodaj-i-j0 (first matrix) j ctr [])))
  273.     :else (dodaj-i-j1 (rest matrix) i j (+ ctr 9))))
  274.  
  275. (defn dodaj-i-j [matrix i j ctr]
  276.   (reverse (dodaj-i-j1 matrix i j ctr)))
  277.  
  278. (defn row-to-3x3 [matrix]
  279.   (do
  280.     (conj (conj (conj (conj (conj (conj (conj (conj (conj [] (dodaj-i-j matrix 0 0 0)) (dodaj-i-j matrix 0 1 0)) (dodaj-i-j matrix 0 2 0)) (dodaj-i-j matrix 1 0 0)) (dodaj-i-j matrix 1 1 0)) (dodaj-i-j matrix 1 2 0)) (dodaj-i-j matrix 2 0 0)) (dodaj-i-j matrix 2 1 0)) (dodaj-i-j matrix 2 2 0))))
  281.  
  282. ; visualise
  283. (defn visualise [sudoku-input sudoku-output]
  284.  
  285.  
  286.   (def panel-begin-content (JPanel. (GridLayout. 3 3)))
  287.   (def panel-end-content (JPanel. (GridLayout. 3 3)))
  288.  
  289.   (defn fill-frame0 [element]
  290.     (let [dummy-label (JLabel.)]
  291.       (do
  292.         (cond
  293.           (not= 0 element) (.setText dummy-label (str element))
  294.           :else nil))
  295.       (.setBorder dummy-label (BorderFactory/createLineBorder (Color/BLACK)))
  296.       (.setHorizontalAlignment dummy-label (JTextField/CENTER))
  297.       (.setFont dummy-label (Font. "Arial" (Font/BOLD) 20))
  298.       dummy-label))
  299.  
  300.  
  301.   (defn fill-frame1 [vektor t-panel]
  302.     (cond
  303.       (= vektor '()) t-panel
  304.       :else (do
  305.               (.add t-panel (fill-frame0 (first vektor)))
  306.               (fill-frame1 (rest vektor) t-panel))))
  307.  
  308.   (defn fill-begin-frame [input]
  309.     (cond
  310.       (= input '()) nil
  311.       :else (do
  312.               (let [t (fill-frame1 (first input) (JPanel. (GridLayout. 3 3)))]
  313.                 (.setBorder t (BorderFactory/createLineBorder (Color/BLACK)))
  314.                 (.add panel-begin-content t))
  315.               (fill-begin-frame (rest input)))))
  316.  
  317.   (defn fill-end-frame [input]
  318.     (cond
  319.       (= input '()) nil
  320.       :else (do
  321.               (let [t (fill-frame1 (first input) (JPanel. (GridLayout. 3 3)))]
  322.                 (.setBorder t (BorderFactory/createLineBorder (Color/BLACK)))
  323.                 (.add panel-end-content t))
  324.               (fill-end-frame (rest input)))))
  325.  
  326.   ; 3x3-transform
  327.   (fill-begin-frame (row-to-3x3 sudoku-input))
  328.   ; solve and 3x3-transform
  329.   (fill-end-frame (row-to-3x3 sudoku-output))
  330.  
  331.  
  332.   (def screen-size (Dimension. (.getScreenSize (Toolkit/getDefaultToolkit))))
  333.   (def center-point-x (- (/ (int (.getWidth screen-size)) 2) 200))
  334.   (def center-point-y (- (/ (int (.getHeight screen-size)) 2) 200))
  335.  
  336.   (def frame-begin (JFrame. "Input"))
  337.   (.setSize frame-begin 400 398)
  338.   (.setLocation frame-begin (- center-point-x 200) center-point-y)
  339.   (.setDefaultCloseOperation frame-begin (JFrame/EXIT_ON_CLOSE))
  340.   (.setContentPane frame-begin panel-begin-content)
  341.   (.setVisible frame-begin true)
  342.  
  343.   (def frame-end (JFrame. "Output"))
  344.   (.setSize frame-end 400 398)
  345.   (.setLocation frame-end (+ center-point-x 200) center-point-y)
  346.   (.setDefaultCloseOperation frame-end (JFrame/EXIT_ON_CLOSE))
  347.   (.setContentPane frame-end panel-end-content)
  348.   (.setVisible frame-end true)
  349.  
  350.   (println "Visualisation complete!")
  351.   sudoku-output)
  352.  
  353.  
  354.    
  355. (defn solve-and-visualise [input]
  356.   (visualise input (finalize (solve0 (transform input)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement