1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 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 v8 [[8 6 7 3 2 5 1 4] [6 8 3 7] [7 3 8 6] [3 7 6 8 1 4 5 2] [1 8 5 2 4] [8 1 2 4 5]]) (letfn [(dropTake [dn tn coll] (take tn (drop dn coll))) (rotate90 [colls] (apply map list colls)) (cartesian-product ; from clojure.contrib.combinatorics [& seqs] (let [v-original-seqs (vec seqs) step (fn step [v-seqs] (let [increment (fn [v-seqs] (loop [i (dec (count v-seqs)), v-seqs v-seqs] (if (= i -1) nil (if-let [rst (next (v-seqs i))] (assoc v-seqs i rst) (recur (dec i) (assoc v-seqs i (v-original-seqs i)))))))] (when v-seqs (cons (map first v-seqs) (lazy-seq (step (increment v-seqs)))))))] (when (every? first seqs) (lazy-seq (step v-original-seqs))))) (getLatinSquare [V x y o] (let [fullRows (dropTake y o V) rows (map #(dropTake x o %) fullRows) cols (rotate90 rows) sortDistinct (fn [coll] (map #(sort (distinct %)) coll)) nils (map #(every? identity %) rows)] (if (every? identity nils) (if (apply = (concat (map sort cols) (sortDistinct cols) (sortDistinct rows))) rows)))) (possibleArrangements [maxCount row] (let [c (count row) d (- maxCount c)] (for [lp (range (inc d)) :let [rp (- d lp)]] (concat (repeat lp nil) row (repeat rp nil))))) (generateBoards [V] (let [maxCount (apply max (map count V)) arrs (map (partial possibleArrangements maxCount) V)] (apply cartesian-product arrs))) (findLatinSquares [Vs o] (let [width (count (first (first Vs))) height (count (first Vs))] (filter first (for [x (range (inc (- width o))) y (range (inc (- height o))) V Vs] [(getLatinSquare V x y o) V x y o])))) (countLatinSquares [Vs o] (count (distinct (map first (findLatinSquares Vs o))))) (countAllLatinSquares [Vs] (let [width (count (first (first Vs))) height (count (first Vs)) maxO (min width height)] (apply hash-map (flatten (for [o (range 2 (inc maxO)) :let [c (countLatinSquares Vs o)] :when (< 0 c)] [o c]))))) ] (defn lsq [V] (countAllLatinSquares (generateBoards V))) ) (lsq v8) |
KGRlZiB2OCBbWzggNiA3IDMgMiA1IDEgNF0KICAgICAgICBbNiA4IDMgN10KICAgICAgICBbNyAzIDggNl0KICAgICAgICBbMyA3IDYgOCAxIDQgNSAyXQogICAgICAgICAgICAgIFsxIDggNSAyIDRdCiAgICAgICAgICAgICAgWzggMSAyIDQgNV1dKQoKKGxldGZuIFsoZHJvcFRha2UgW2RuIHRuIGNvbGxdICh0YWtlIHRuIChkcm9wIGRuIGNvbGwpKSkKICAgICAgICAocm90YXRlOTAgW2NvbGxzXSAoYXBwbHkgbWFwIGxpc3QgY29sbHMpKQogICAgICAgIChjYXJ0ZXNpYW4tcHJvZHVjdAogICAgICAgICAgOyBmcm9tIGNsb2p1cmUuY29udHJpYi5jb21iaW5hdG9yaWNzCiAgICAgICAgICBbJiBzZXFzXQogICAgICAgICAgKGxldCBbdi1vcmlnaW5hbC1zZXFzICh2ZWMgc2VxcykKICAgICAgICAgICAgc3RlcAogICAgICAgICAgICAoZm4gc3RlcCBbdi1zZXFzXQogICAgICAgICAgICAgIChsZXQgW2luY3JlbWVudAogICAgICAgICAgICAgICAgKGZuIFt2LXNlcXNdCiAgICAgICAgICAgICAgICAgIChsb29wIFtpIChkZWMgKGNvdW50IHYtc2VxcykpLCB2LXNlcXMgdi1zZXFzXQogICAgICAgICAgICAgICAgICAgIChpZiAoPSBpIC0xKSBuaWwKICAgICAgICAgICAgICAgICAgICAoaWYtbGV0IFtyc3QgKG5leHQgKHYtc2VxcyBpKSldCiAgICAgICAgICAgICAgICAgICAgICAoYXNzb2Mgdi1zZXFzIGkgcnN0KQogICAgICAgICAgICAgICAgICAgICAgKHJlY3VyIChkZWMgaSkgKGFzc29jIHYtc2VxcyBpICh2LW9yaWdpbmFsLXNlcXMgaSkpKSkpKSldCiAgICAgICAgICAgICAgICAod2hlbiB2LXNlcXMKICAgICAgICAgICAgICAgICAgIChjb25zIChtYXAgZmlyc3Qgdi1zZXFzKQogICAgICAgICAgICAgICAgICAgICAobGF6eS1zZXEgKHN0ZXAgKGluY3JlbWVudCB2LXNlcXMpKSkpKSkpXQogICAgICAgICAgICAod2hlbiAoZXZlcnk/IGZpcnN0IHNlcXMpCiAgICAgICAgICAgICAgKGxhenktc2VxIChzdGVwIHYtb3JpZ2luYWwtc2VxcykpKSkpCiAgICAgICAgKGdldExhdGluU3F1YXJlIFtWIHggeSBvXQogICAgICAgICAgKGxldCBbZnVsbFJvd3MgKGRyb3BUYWtlIHkgbyBWKQogICAgICAgICAgICAgICAgcm93cyAobWFwICMoZHJvcFRha2UgeCBvICUpIGZ1bGxSb3dzKQogICAgICAgICAgICAgICAgY29scyAocm90YXRlOTAgcm93cykKICAgICAgICAgICAgICAgIHNvcnREaXN0aW5jdCAoZm4gW2NvbGxdIChtYXAgIyhzb3J0IChkaXN0aW5jdCAlKSkgY29sbCkpCiAgICAgICAgICAgICAgICBuaWxzIChtYXAgIyhldmVyeT8gaWRlbnRpdHkgJSkgcm93cyldCiAgICAgICAgICAgIChpZiAoZXZlcnk/IGlkZW50aXR5IG5pbHMpCiAgICAgICAgICAgICAgKGlmIChhcHBseSA9IChjb25jYXQgKG1hcCBzb3J0IGNvbHMpIChzb3J0RGlzdGluY3QgY29scykgKHNvcnREaXN0aW5jdCByb3dzKSkpCiAgICAgICAgICAgICAgICByb3dzKSkpKQogICAgICAgIChwb3NzaWJsZUFycmFuZ2VtZW50cyBbbWF4Q291bnQgcm93XQogICAgICAgICAgICAgICAobGV0IFtjIChjb3VudCByb3cpCiAgICAgICAgICAgICAgICAgICAgIGQgKC0gbWF4Q291bnQgYyldCiAgICAgICAgICAgICAgIChmb3IgW2xwIChyYW5nZSAoaW5jIGQpKSA6bGV0IFtycCAoLSBkIGxwKV1dCiAgICAgICAgICAgICAgICAgKGNvbmNhdCAocmVwZWF0IGxwIG5pbCkgcm93IChyZXBlYXQgcnAgbmlsKSkpKSkKICAgICAgICAoZ2VuZXJhdGVCb2FyZHMgW1ZdCiAgICAgICAgICAobGV0IFttYXhDb3VudCAoYXBwbHkgbWF4IChtYXAgY291bnQgVikpCiAgICAgICAgICAgICAgICBhcnJzIChtYXAgKHBhcnRpYWwgcG9zc2libGVBcnJhbmdlbWVudHMgbWF4Q291bnQpIFYpXQogICAgICAgICAgICAoYXBwbHkgY2FydGVzaWFuLXByb2R1Y3QgYXJycykpKQogICAgICAgIChmaW5kTGF0aW5TcXVhcmVzIFtWcyBvXQogICAgICAgICAgIChsZXQgW3dpZHRoIChjb3VudCAoZmlyc3QgKGZpcnN0IFZzKSkpCiAgICAgICAgICAgICAgICBoZWlnaHQgKGNvdW50IChmaXJzdCBWcykpXQogICAgICAgICAgICAoZmlsdGVyIGZpcnN0CiAgICAgICAgICAgICAgKGZvciBbeCAocmFuZ2UgKGluYyAoLSB3aWR0aCBvKSkpCiAgICAgICAgICAgICAgICAgICAgeSAocmFuZ2UgKGluYyAoLSBoZWlnaHQgbykpKQogICAgICAgICAgICAgICAgICAgIFYgVnNdCiAgICAgICAgICAgICAgICBbKGdldExhdGluU3F1YXJlIFYgeCB5IG8pIFYgeCB5IG9dKSkpKQogICAgICAgIChjb3VudExhdGluU3F1YXJlcyBbVnMgb10KICAgICAgICAgIChjb3VudCAoZGlzdGluY3QgKG1hcCBmaXJzdCAoZmluZExhdGluU3F1YXJlcyBWcyBvKSkpKSkKICAgICAgICAoY291bnRBbGxMYXRpblNxdWFyZXMgW1ZzXQogICAgICAgICAgKGxldCBbd2lkdGggKGNvdW50IChmaXJzdCAoZmlyc3QgVnMpKSkKICAgICAgICAgICAgICAgIGhlaWdodCAoY291bnQgKGZpcnN0IFZzKSkKICAgICAgICAgICAgICAgIG1heE8gKG1pbiB3aWR0aCBoZWlnaHQpXQogICAgICAgICAgICAoYXBwbHkgaGFzaC1tYXAKICAgICAgICAgICAgICAoZmxhdHRlbgogICAgICAgICAgICAgICAgKGZvciBbbyAocmFuZ2UgMiAoaW5jIG1heE8pKSA6bGV0IFtjIChjb3VudExhdGluU3F1YXJlcyBWcyBvKV0gOndoZW4gKDwgMCBjKV0gW28gY10pKSkpKQogICAgICAgIF0KIAogIChkZWZuIGxzcSBbVl0gKGNvdW50QWxsTGF0aW5TcXVhcmVzIChnZW5lcmF0ZUJvYXJkcyBWKSkpCikKCihsc3Egdjgp
-
upload with new input
-
result: Success time: 1.88s memory: 220224 kB returned value: 0


