Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; solve i transform se po specifikaciajta vo zadachata
- ; za vizuelizacija se povikuva (solve-and-visualise input-matrix)
- (import 'javax.swing.JFrame)
- (import 'javax.swing.JPanel)
- (import 'javax.swing.JLabel)
- (import 'javax.swing.JTextField)
- (import 'javax.swing.BorderFactory)
- (import 'java.awt.Font)
- (import 'java.awt.Color)
- (import 'java.awt.GridLayout)
- (import 'java.awt.Toolkit)
- (import 'java.awt.Dimension)
- ; transform
- (defn transform0 [vektor]
- (cond
- (= vektor '()) '()
- :else (cond
- (= 0 (first vektor)) (vec(cons #{1 2 3 4 5 6 7 8 9} (transform0 (rest vektor))))
- :else (vec (cons #{(first vektor)} (transform0 (rest vektor)))))))
- (defn transform "Transforms the input to possible elements for each position (containted in a set)." [matrix]
- (cond
- (= matrix '()) '()
- :else (vec (cons (transform0 (first matrix)) (transform (rest matrix))))))
- ; find-single
- (defn find-single0 [set-vector ctr]
- (cond
- (= set-vector '()) nil
- (and (= (count (first set-vector)) 1) (> (first (first set-vector)) 0)) [ctr (first (first set-vector))]
- :else (find-single0 (rest set-vector) (inc ctr))))
- (defn find-single [matrix ctr]
- (let [found (find-single0 (first matrix) ctr)]
- (cond
- (= matrix '()) nil
- (= found nil) (find-single (rest matrix) (+ ctr 9))
- :else found)))
- ; fix-rows
- (defn fix-rows0 [set-vector koj-vrednost]
- (cond
- (= set-vector '()) '()
- ; set negative
- (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)))
- (> (count (first set-vector)) 1) (vec (cons (disj (first set-vector) koj-vrednost) (fix-rows0 (rest set-vector) koj-vrednost)))
- :else (vec (cons (first set-vector) (fix-rows0 (rest set-vector) koj-vrednost)))))
- (defn fix-rows [matrix koj-idx koj-vrednost ctr]
- (do
- ;(print koj-idx)
- (cond
- (= matrix '()) '()
- (= (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))))
- :else (vec (cons (first matrix) (fix-rows (rest matrix) koj-idx koj-vrednost (+ ctr 9)))))))
- ; fix-columns
- (defn fix-columns0 [set-vector koj-idx koj-vrednost ctr]
- (cond
- (= set-vector '()) '()
- (= (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))))
- :else (vec (cons (first set-vector) (fix-columns0 (rest set-vector) koj-idx koj-vrednost (inc ctr))))))
- (defn fix-columns [matrix koj-idx koj-vrednost ctr]
- (do
- (cond
- (= matrix '()) '()
- (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))))
- :else (vec (cons (first matrix) (fix-columns (rest matrix) koj-idx koj-vrednost (+ ctr 9)))))))
- ; fix-3x3
- (defn fix-3x30 [set-vector koj-idx koj-vrednost ctr]
- (cond
- (= set-vector '()) '()
- (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))))
- :else (vec (cons (first set-vector) (fix-3x30 (rest set-vector) koj-idx koj-vrednost (inc ctr))))))
- (defn fix-3x3 [matrix koj-idx koj-vrednost ctr]
- (do
- (cond
- (= matrix '()) '()
- (= (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))))
- :else (vec (cons (first matrix) (fix-3x3 (rest matrix) koj-idx koj-vrednost (+ ctr 9)))))))
- ;fix
- (defn fix [matrix]
- (let [pair-found (find-single matrix 0)]
- (cond
- (= pair-found nil) matrix
- :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)))))
- ; find-set
- (defn find-set0 [set-vector last ctr]
- (cond
- (= set-vector '()) nil
- (and (> (count (first set-vector)) 1) (> ctr last)) [ctr (first set-vector)]
- :else (find-set0 (rest set-vector) last (inc ctr))))
- (defn find-set [matrix last ctr]
- (let [found (find-set0 (first matrix) last ctr)]
- (cond
- (= matrix '()) nil
- (= found nil) (find-set (rest matrix) last (+ ctr 9))
- :else found)))
- ; check-rows
- (defn check-rows0 [set-vector koj-idx koj-element ctr]
- (do
- ;(println koj-element)
- (cond
- (= set-vector '()) true
- (= koj-idx ctr) (check-rows0 (rest set-vector) koj-idx koj-element (inc ctr))
- (or (contains? (first set-vector) koj-element) (contains? (first set-vector) (* -1 koj-element))) false
- :else (check-rows0 (rest set-vector) koj-idx koj-element (inc ctr)))))
- (defn check-rows [matrix koj-idx koj-element ctr]
- (cond
- (= (quot koj-idx 9) (quot ctr 9)) (check-rows0 (first matrix) koj-idx koj-element ctr)
- :else (check-rows (rest matrix) koj-idx koj-element (+ ctr 9))))
- ; check-columns
- (defn check-columns0 [set-vector koj-idx koj-element ctr]
- (cond
- (= (mod koj-idx 9) (mod ctr 9)) (not (or (contains? (first set-vector) koj-element) (contains? (first set-vector) (* -1 koj-element))))
- :else (check-columns0 (rest set-vector) koj-idx koj-element (inc ctr))))
- (defn check-columns [matrix koj-idx koj-element ctr]
- (cond
- (= matrix '()) true
- (not= (quot koj-idx 9) (quot ctr 9)) (cond
- (= false (check-columns0 (first matrix) koj-idx koj-element ctr)) false
- :else (check-columns (rest matrix) koj-idx koj-element (+ ctr 9)))
- :else (check-columns (rest matrix) koj-idx koj-element (+ ctr 9))))
- ; check-3x3
- (defn check-3x30 [set-vector koj-idx koj-element ctr]
- (cond
- (= set-vector '()) true
- (= koj-idx ctr) (check-3x30 (rest set-vector) koj-idx koj-element (inc ctr))
- (= (quot (mod koj-idx 9) 3) (quot (mod ctr 9) 3)) (cond
- (= false (not (or (contains? (first set-vector) koj-element) (contains? (first set-vector) (* -1 koj-element))))) false
- :else (check-3x30 (rest set-vector) koj-idx koj-element (inc ctr)))
- :else (check-3x30 (rest set-vector) koj-idx koj-element (inc ctr))))
- (defn check-3x3 [matrix koj-idx koj-element ctr]
- (cond
- (= matrix '()) true
- (= (quot koj-idx 27) (quot ctr 27)) (cond
- (= false (check-3x30 (first matrix) koj-idx koj-element ctr)) false
- :else (check-3x3 (rest matrix) koj-idx koj-element (+ ctr 9)))
- :else (check-3x3 (rest matrix) koj-idx koj-element (+ ctr 9))))
- ; check
- (defn is-ok [matrix koj-idx koj-element]
- ;(println koj-element)
- (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)))
- (defn check-element [matrix koj-idx org-set koj-set]
- (cond
- (= koj-set '()) org-set
- (= true (is-ok matrix koj-idx (first koj-set))) (do
- ; (println koj-idx)
- #{(first koj-set)})
- :else (check-element matrix koj-idx org-set (rest koj-set))))
- (defn check0 [org-matrix set-vector koj-idx koj-set ctr]
- (cond
- (= set-vector '()) '()
- (= 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))))
- :else (vec (cons (first set-vector) (check0 org-matrix (rest set-vector) koj-idx koj-set (inc ctr))))))
- (defn check1 [org-matrix matrix koj-idx koj-set ctr]
- (cond
- (= matrix '()) '()
- :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.
- (defn check [matrix last]
- (let [pair-found (find-set matrix last 0)]
- (do
- ; (print (first pair-found))
- (cond
- (= pair-found nil) matrix
- :else (check (check1 matrix matrix (first pair-found) (second pair-found) 0) (first pair-found))))))
- ; finalize
- (defn finalize0 [set-vector]
- (cond
- (= set-vector '()) '()
- :else (vec (cons (* -1 (first (first set-vector))) (finalize0 (rest set-vector))))))
- (defn finalize [matrix]
- (cond
- (= matrix '()) '()
- :else (vec (cons (finalize0 (first matrix)) (finalize (rest matrix))))))
- ; solve
- (defn solve0 [set-matrix]
- (let [prv (find-single set-matrix 0)
- vtor (find-set set-matrix -1 0)]
- (do
- ;(println prv)
- ; (println vtor)
- (cond
- (and (= nil prv) (= nil vtor)) set-matrix
- :else (solve0 (check (fix set-matrix) -1))))))
- (defn solve "Solves a simple sudoku sudoku given in a matrix where every element is a vector representing a row." [input]
- (do
- (finalize (solve0 (transform input)))))
- ; row to 3x3
- (defn dodaj-i-j0 [vector j ctr acc]
- (cond
- (= vector '()) acc
- (= j (quot (mod ctr 9) 3)) (dodaj-i-j0 (rest vector) j (inc ctr) (vec (cons (first vector) acc)))
- :else (dodaj-i-j0 (rest vector) j (inc ctr) acc)))
- (defn dodaj-i-j1 [matrix i j ctr]
- (cond
- (= matrix '()) '()
- (= i (quot ctr 27)) (vec (apply (partial conj (dodaj-i-j1 (rest matrix) i j (+ ctr 9))) (dodaj-i-j0 (first matrix) j ctr [])))
- :else (dodaj-i-j1 (rest matrix) i j (+ ctr 9))))
- (defn dodaj-i-j [matrix i j ctr]
- (reverse (dodaj-i-j1 matrix i j ctr)))
- (defn row-to-3x3 [matrix]
- (do
- (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))))
- ; visualise
- (defn visualise [sudoku-input sudoku-output]
- (def panel-begin-content (JPanel. (GridLayout. 3 3)))
- (def panel-end-content (JPanel. (GridLayout. 3 3)))
- (defn fill-frame0 [element]
- (let [dummy-label (JLabel.)]
- (do
- (cond
- (not= 0 element) (.setText dummy-label (str element))
- :else nil))
- (.setBorder dummy-label (BorderFactory/createLineBorder (Color/BLACK)))
- (.setHorizontalAlignment dummy-label (JTextField/CENTER))
- (.setFont dummy-label (Font. "Arial" (Font/BOLD) 20))
- dummy-label))
- (defn fill-frame1 [vektor t-panel]
- (cond
- (= vektor '()) t-panel
- :else (do
- (.add t-panel (fill-frame0 (first vektor)))
- (fill-frame1 (rest vektor) t-panel))))
- (defn fill-begin-frame [input]
- (cond
- (= input '()) nil
- :else (do
- (let [t (fill-frame1 (first input) (JPanel. (GridLayout. 3 3)))]
- (.setBorder t (BorderFactory/createLineBorder (Color/BLACK)))
- (.add panel-begin-content t))
- (fill-begin-frame (rest input)))))
- (defn fill-end-frame [input]
- (cond
- (= input '()) nil
- :else (do
- (let [t (fill-frame1 (first input) (JPanel. (GridLayout. 3 3)))]
- (.setBorder t (BorderFactory/createLineBorder (Color/BLACK)))
- (.add panel-end-content t))
- (fill-end-frame (rest input)))))
- ; 3x3-transform
- (fill-begin-frame (row-to-3x3 sudoku-input))
- ; solve and 3x3-transform
- (fill-end-frame (row-to-3x3 sudoku-output))
- (def screen-size (Dimension. (.getScreenSize (Toolkit/getDefaultToolkit))))
- (def center-point-x (- (/ (int (.getWidth screen-size)) 2) 200))
- (def center-point-y (- (/ (int (.getHeight screen-size)) 2) 200))
- (def frame-begin (JFrame. "Input"))
- (.setSize frame-begin 400 398)
- (.setLocation frame-begin (- center-point-x 200) center-point-y)
- (.setDefaultCloseOperation frame-begin (JFrame/EXIT_ON_CLOSE))
- (.setContentPane frame-begin panel-begin-content)
- (.setVisible frame-begin true)
- (def frame-end (JFrame. "Output"))
- (.setSize frame-end 400 398)
- (.setLocation frame-end (+ center-point-x 200) center-point-y)
- (.setDefaultCloseOperation frame-end (JFrame/EXIT_ON_CLOSE))
- (.setContentPane frame-end panel-end-content)
- (.setVisible frame-end true)
- (println "Visualisation complete!")
- sudoku-output)
- (defn solve-and-visualise [input]
- (visualise input (finalize (solve0 (transform input)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement