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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 | (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]]) (defn mapv "Returns a vector consisting of the result of applying f to the set of first items of each coll, followed by applying f to the set of second items in each coll, until any one of the colls is exhausted. Any remaining items in other colls are ignored. Function f should accept number-of-colls arguments." {:added "1.4" :static true} ([f coll] (-> (reduce (fn [v o] (conj! v (f o))) (transient []) coll) persistent!)) ([f c1 c2] (into [] (map f c1 c2))) ([f c1 c2 c3] (into [] (map f c1 c2 c3))) ([f c1 c2 c3 & colls] (into [] (apply map f c1 c2 c3 colls)))) (def lsq (fn [x](letfn [ (max-row-len [x] (reduce max (map count x))) (min-row-len [x] (reduce min (map count x))) (fill-x [x] (loop [y [] row 0] (cond (= row (count x)) y :else (recur (cond (< (count (nth x row)) (max-row-len x)) (conj y (vec (concat (nth x row) (take (- (max-row-len x) (count (nth x row))) (repeat :nil))))) :else (conj y (nth x row))) (inc row))))) (vec-contains-:nil? [v] (cond (= () (filter #(= :nil %) v)) false :else true)) (contains-:nil? [x] (cond (= (some #{:nil} (flatten x)) :nil) true :else false)) (only-:nil? [x] (= (count (filter (fn [y] (= :nil y)) (flatten x))) (count (flatten x)))) (any-:nil? [x] (= (count (filter (fn [y] (= :nil y)) (flatten x))) 0)) (shift-row [row] (cond (or (only-:nil? row) (not= (last row) :nil)) nil :else (vec (concat [:nil] (butlast row))))) (append-variants [x v] (cond (or (any-:nil? v) (only-:nil? v)) (conj [] (vec (conj x v))) :else (loop [y [] w v] (cond (nil? w) y :else (recur (conj y (vec (conj x w))) (shift-row w)))))) (build-search-base [x] (cond (any-:nil? x) (vector x) :else (loop [y (append-variants nil (nth x 0)) row-x 1] (cond (= row-x (count x)) y :else (recur (loop [iter-y 0 new-y []] (cond (= iter-y (count y)) new-y :else (recur (inc iter-y) (into new-y (append-variants (nth y iter-y) (nth x row-x)))))) (inc row-x)))))) (part-rows [x dim] (mapv #( vec (partition dim 1 (take dim (repeat :nil)) %)) x)) (build-grid-base [x FIX] (loop [y [(part-rows x 2)] dim 3] (cond (> dim (min (count x) FIX)) y :else (recur (into y [(part-rows x dim)]) (inc dim))))) (square-at [parted-x dim i j] (loop [y [] di 0] (cond (= di dim) y :else (let [curr-row (nth (nth parted-x (+ i di)) j)] (cond (vec-contains-:nil? curr-row) nil :else (recur (conj y curr-row) (inc di))))))) (transpose [m] (loop [y (map vector (nth m 0)) i 1] (cond (= i (count m)) y :else (recur (mapv concat y (map vector (nth m i))) (inc i))))) (max-row-member [x] (reduce max (map #(count (set %)) x))) (min-row-member [x] (reduce min (map #(count (set %)) x))) (latin-square? [s] (cond (nil? s) false :else (let [dim (count s)] (cond (not= dim (min-row-member s)) false (not= dim (max-row-member s)) false (not= dim (count (set (flatten s)))) false (not= dim (count (set s))) false (not= dim (min-row-len s)) false (not= dim (max-row-len s)) false (not= dim (count (set (transpose s)))) false (not= dim (min-row-member (transpose s))) false (not= dim (max-row-member (transpose s))) false :else true)))) (count-a-grid-item [x] (let [dim-sq (count (nth (nth x 0) 0)) dim-x-x (inc (- (count x) dim-sq)) dim-x-y (count (nth x 0))] (loop [sq (square-at x dim-sq 0 0) result (cond (latin-square? sq) (conj #{} sq) :else #{}) i 0 j 1] (cond (= i dim-x-x) result :else (recur (cond (and (< i dim-x-x) (< j dim-x-y)) (square-at x dim-sq i j) :else sq) (cond (and (< i dim-x-x) (< j dim-x-y)) (cond (latin-square? sq) (conj result sq) :else result) :else result) (cond (= j dim-x-y) (inc i) :else i) (cond (= j dim-x-y) 0 :else (inc j))))))) (solve [x] (let [search-base (build-search-base (fill-x x)) dim-base (count search-base) result (atom []) FIX (min-row-len x)] (doseq [i (range dim-base)] (let [grid-base (build-grid-base (nth search-base i) FIX)] (doseq [j (range (count grid-base))] (swap! result into (count-a-grid-item (nth grid-base j)))))) (set @result))) (summary [lsq] (reduce conj {} (for [[x xs] (group-by identity (sort < (for [r lsq] (count r))))] [x (count xs)])))] (summary (solve x))))) (lsq v8) |
KGRlZiB2OCBbWzggNiA3IDMgMiA1IDEgNF0KICAgICAgICBbNiA4IDMgN10KICAgICAgICBbNyAzIDggNl0KICAgICAgICBbMyA3IDYgOCAxIDQgNSAyXQogICAgICAgICAgICAgIFsxIDggNSAyIDRdCiAgICAgICAgICAgICAgWzggMSAyIDQgNV1dKQogCihkZWZuIG1hcHYKICAiUmV0dXJucyBhIHZlY3RvciBjb25zaXN0aW5nIG9mIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgZiB0byB0aGUKICBzZXQgb2YgZmlyc3QgaXRlbXMgb2YgZWFjaCBjb2xsLCBmb2xsb3dlZCBieSBhcHBseWluZyBmIHRvIHRoZSBzZXQKICBvZiBzZWNvbmQgaXRlbXMgaW4gZWFjaCBjb2xsLCB1bnRpbCBhbnkgb25lIG9mIHRoZSBjb2xscyBpcwogIGV4aGF1c3RlZC4gIEFueSByZW1haW5pbmcgaXRlbXMgaW4gb3RoZXIgY29sbHMgYXJlIGlnbm9yZWQuIEZ1bmN0aW9uCiAgZiBzaG91bGQgYWNjZXB0IG51bWJlci1vZi1jb2xscyBhcmd1bWVudHMuIgogIHs6YWRkZWQgIjEuNCIKICAgOnN0YXRpYyB0cnVlfQogIChbZiBjb2xsXQogICAgICgtPiAocmVkdWNlIChmbiBbdiBvXSAoY29uaiEgdiAoZiBvKSkpICh0cmFuc2llbnQgW10pIGNvbGwpCiAgICAgICAgIHBlcnNpc3RlbnQhKSkKICAoW2YgYzEgYzJdCiAgICAgKGludG8gW10gKG1hcCBmIGMxIGMyKSkpCiAgKFtmIGMxIGMyIGMzXQogICAgIChpbnRvIFtdIChtYXAgZiBjMSBjMiBjMykpKQogIChbZiBjMSBjMiBjMyAmIGNvbGxzXQogICAgIChpbnRvIFtdIChhcHBseSBtYXAgZiBjMSBjMiBjMyBjb2xscykpKSkKIAooZGVmIGxzcSAoZm4gW3hdKGxldGZuIFsKKG1heC1yb3ctbGVuIFt4XQogIChyZWR1Y2UgbWF4IChtYXAgY291bnQgeCkpKQogCihtaW4tcm93LWxlbiBbeF0KICAocmVkdWNlIG1pbiAobWFwIGNvdW50IHgpKSkKIAooZmlsbC14ICBbeF0KICAobG9vcCBbeSBbXQogICAgICAgICByb3cgMF0KICAgIChjb25kICg9IHJvdyAoY291bnQgeCkpIHkKICAgICAgICAgIDplbHNlIChyZWN1cgogICAgICAgICAgICAgICAgIChjb25kICg8IChjb3VudCAobnRoIHggcm93KSkgKG1heC1yb3ctbGVuIHgpKQogICAgICAgICAgICAgICAgICAgICAgIChjb25qIHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25jYXQgKG50aCB4IHJvdykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGFrZSAoLSAobWF4LXJvdy1sZW4geCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY291bnQgKG50aCB4IHJvdykpKSAocmVwZWF0IDpuaWwpKSkpKQogICAgICAgICAgICAgICAgICAgICAgIDplbHNlIChjb25qIHkgKG50aCB4IHJvdykpKQogICAgICAgICAgICAgICAgIChpbmMgcm93KSkpKSkKIAogCih2ZWMtY29udGFpbnMtOm5pbD8gW3ZdCiAgKGNvbmQgKD0gKCkgKGZpbHRlciAjKD0gOm5pbCAlKSB2KSkgZmFsc2UgOmVsc2UgdHJ1ZSkpCiAKKGNvbnRhaW5zLTpuaWw/ICBbeF0KICAoY29uZCAoPSAoc29tZSAjezpuaWx9IChmbGF0dGVuIHgpKSA6bmlsKSB0cnVlIDplbHNlIGZhbHNlKSkKIAoob25seS06bmlsPyBbeF0KICAoPSAoY291bnQgKGZpbHRlciAoZm4gW3ldICg9IDpuaWwgeSkpIChmbGF0dGVuIHgpKSkgKGNvdW50IChmbGF0dGVuIHgpKSkpCiAKKGFueS06bmlsPyBbeF0KICAoPSAoY291bnQgKGZpbHRlciAoZm4gW3ldICg9IDpuaWwgeSkpIChmbGF0dGVuIHgpKSkgMCkpCiAKIAooc2hpZnQtcm93ICBbcm93XQogICAoY29uZCAob3IgKG9ubHktOm5pbD8gcm93KSAobm90PSAobGFzdCByb3cpIDpuaWwpKSBuaWwKICAgICAgICA6ZWxzZSAodmVjIChjb25jYXQgWzpuaWxdIChidXRsYXN0IHJvdykpKSkpCiAKKGFwcGVuZC12YXJpYW50cyAgW3ggdl0KICAgKGNvbmQgKG9yIChhbnktOm5pbD8gdikgKG9ubHktOm5pbD8gdikpIChjb25qIFtdICh2ZWMgKGNvbmogeCB2KSkpCiAgICAgICAgOmVsc2UgKGxvb3AgW3kgW10KICAgICAgICAgICAgICAgICAgICAgdyB2XQogICAgICAgICAgICAgICAgKGNvbmQgKG5pbD8gdykgeQogICAgICAgICAgICAgICAgICAgICAgOmVsc2UgKHJlY3VyIChjb25qIHkgKHZlYyAoY29uaiB4IHcpKSkgKHNoaWZ0LXJvdyB3KSkpKSkpCiAKIAooYnVpbGQtc2VhcmNoLWJhc2UgIFt4XQogICAoY29uZCAoYW55LTpuaWw/IHgpICh2ZWN0b3IgeCkKICAgICAgICA6ZWxzZSAobG9vcCBbeSAoYXBwZW5kLXZhcmlhbnRzIG5pbCAobnRoIHggMCkpCiAgICAgICAgICAgICAgICAgICAgIHJvdy14IDFdCiAgICAgICAgICAgICAgICAoY29uZCAoPSByb3cteCAoY291bnQgeCkpIHkKICAgICAgICAgICAgICAgICAgICAgIDplbHNlIChyZWN1cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb29wIFtpdGVyLXkgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcteSBbXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25kICg9IGl0ZXIteSAoY291bnQgeSkpIG5ldy15CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZWxzZSAocmVjdXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5jIGl0ZXIteSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50byBuZXcteQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcHBlbmQtdmFyaWFudHMgKG50aCB5IGl0ZXIteSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudGggeCByb3cteCkpKSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmMgcm93LXgpKSkpKSkKIAogCiAKKHBhcnQtcm93cyAgW3ggZGltXQogICAobWFwdiAjKCB2ZWMgKHBhcnRpdGlvbiBkaW0gMSAodGFrZSBkaW0gKHJlcGVhdCA6bmlsKSkgJSkpIHgpKQogCiAKKGJ1aWxkLWdyaWQtYmFzZSBbeCBGSVhdCiAgIChsb29wIFt5IFsocGFydC1yb3dzIHggMildCiAgICAgICAgIGRpbSAzXQogICAgKGNvbmQgKD4gZGltIChtaW4gKGNvdW50IHgpIEZJWCkpIHkKICAgICAgICAgIDplbHNlIChyZWN1ciAoaW50byB5IFsocGFydC1yb3dzIHggZGltKV0pIChpbmMgZGltKSkpKSkKIAogCihzcXVhcmUtYXQgIFtwYXJ0ZWQteCBkaW0gaSBqXQogICAobG9vcCBbeSBbXQogICAgICAgICBkaSAwXQogICAgKGNvbmQgKD0gZGkgZGltKSB5CiAgICAgICAgICA6ZWxzZSAobGV0IFtjdXJyLXJvdyAobnRoIChudGggcGFydGVkLXggKCsgaSBkaSkpIGopXQogICAgICAgICAgICAgICAgICAoY29uZCAodmVjLWNvbnRhaW5zLTpuaWw/IGN1cnItcm93KSBuaWwKICAgICAgICAgICAgICAgICAgICAgICAgOmVsc2UgKHJlY3VyIChjb25qIHkgY3Vyci1yb3cpIChpbmMgZGkpKSkpKSkpCiAKKHRyYW5zcG9zZSAgW21dCiAgKGxvb3AgW3kgKG1hcCB2ZWN0b3IgKG50aCBtIDApKQogICAgICAgICBpIDFdCiAgICAoY29uZCAoPSBpIChjb3VudCBtKSkgeQogICAgICAgICAgOmVsc2UgKHJlY3VyIChtYXB2IGNvbmNhdCB5IChtYXAgdmVjdG9yIChudGggbSBpKSkpIChpbmMgaSkpKSkpCiAKKG1heC1yb3ctbWVtYmVyICBbeF0KICAocmVkdWNlIG1heCAobWFwICMoY291bnQgKHNldCAlKSkgeCkpKQogCihtaW4tcm93LW1lbWJlciAgW3hdCiAgKHJlZHVjZSBtaW4gKG1hcCAjKGNvdW50IChzZXQgJSkpIHgpKSkKIAogCihsYXRpbi1zcXVhcmU/ICBbc10KICAoY29uZCAobmlsPyBzKSBmYWxzZQogICAgICAgIDplbHNlIChsZXQgW2RpbSAoY291bnQgcyldCiAgICAgICAgICAgICAgICAoY29uZCAobm90PSBkaW0gKG1pbi1yb3ctbWVtYmVyIHMpKSBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgKG5vdD0gZGltIChtYXgtcm93LW1lbWJlciBzKSkgZmFsc2UKICAgICAgICAgICAgICAgICAgICAgIChub3Q9IGRpbSAoY291bnQgKHNldCAoZmxhdHRlbiBzKSkpKSBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgKG5vdD0gZGltIChjb3VudCAoc2V0IHMpKSkgZmFsc2UKICAgICAgICAgICAgICAgICAgICAgIChub3Q9IGRpbSAobWluLXJvdy1sZW4gcykpIGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAobm90PSBkaW0gKG1heC1yb3ctbGVuIHMpKSBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgKG5vdD0gZGltIChjb3VudCAoc2V0ICh0cmFuc3Bvc2UgcykpKSkgZmFsc2UKICAgICAgICAgICAgICAgICAgICAgIChub3Q9IGRpbSAobWluLXJvdy1tZW1iZXIgKHRyYW5zcG9zZSBzKSkpIGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAobm90PSBkaW0gKG1heC1yb3ctbWVtYmVyICh0cmFuc3Bvc2UgcykpKSBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgOmVsc2UgdHJ1ZSkpKSkKIAogCihjb3VudC1hLWdyaWQtaXRlbSAgW3hdCiAgIChsZXQgW2RpbS1zcSAoY291bnQgKG50aCAobnRoIHggMCkgMCkpCiAgICAgICAgZGltLXgteCAoaW5jICgtIChjb3VudCB4KSBkaW0tc3EpKQogICAgICAgIGRpbS14LXkgKGNvdW50IChudGggeCAwKSldCiAgICAobG9vcCBbc3EgKHNxdWFyZS1hdCB4IGRpbS1zcSAwIDApCiAgICAgICAgICAgcmVzdWx0IChjb25kIChsYXRpbi1zcXVhcmU/IHNxKSAoY29uaiAje30gc3EpCiAgICAgICAgICAgICAgICAgICAgICAgIDplbHNlICN7fSkKICAgICAgICAgICBpIDAKICAgICAgICAgICBqIDFdCiAgICAgIChjb25kICg9IGkgZGltLXgteCkgcmVzdWx0CiAgICAgICAgICAgIDplbHNlIChyZWN1ciAoY29uZCAoYW5kICg8IGkgZGltLXgteCkgKDwgaiBkaW0teC15KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcXVhcmUtYXQgeCBkaW0tc3EgaSBqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmVsc2Ugc3EpCiAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZCAoYW5kICg8IGkgZGltLXgteCkgKDwgaiBkaW0teC15KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25kIChsYXRpbi1zcXVhcmU/IHNxKSAoY29uaiByZXN1bHQgc3EpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZWxzZSByZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZWxzZSByZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZCAoPSBqIGRpbS14LXkpIChpbmMgaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplbHNlIGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZCAoPSBqIGRpbS14LXkpIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplbHNlIChpbmMgaikpKSkpKSkKIAogCiAKKHNvbHZlICBbeF0KICAobGV0IFtzZWFyY2gtYmFzZSAoYnVpbGQtc2VhcmNoLWJhc2UgKGZpbGwteCB4KSkKICAgICAgICBkaW0tYmFzZSAoY291bnQgc2VhcmNoLWJhc2UpCiAgICAgICAgcmVzdWx0IChhdG9tIFtdKQogICAgICAgIEZJWCAobWluLXJvdy1sZW4geCldCiAgICAoZG9zZXEgW2kgKHJhbmdlIGRpbS1iYXNlKV0KICAgICAgKGxldCBbZ3JpZC1iYXNlIChidWlsZC1ncmlkLWJhc2UgKG50aCBzZWFyY2gtYmFzZSBpKSBGSVgpXQogICAgICAgIChkb3NlcSBbaiAocmFuZ2UgKGNvdW50IGdyaWQtYmFzZSkpXQogICAgICAgICAgKHN3YXAhICByZXN1bHQgaW50byAoY291bnQtYS1ncmlkLWl0ZW0gKG50aCBncmlkLWJhc2UgaikpKSkpKQogICAgKHNldCBAcmVzdWx0KSkpCiAKIAooc3VtbWFyeSAgW2xzcV0KICAocmVkdWNlIGNvbmoge30gKGZvciBbW3ggeHNdCiAgICAgICAgICAgICAgICAgICAgICAgIChncm91cC1ieSBpZGVudGl0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNvcnQgPCAoZm9yIFtyIGxzcV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvdW50IHIpKSkpXQogICAgICAgICAgICAgICAgICAgIFt4IChjb3VudCB4cyldKSkpXQooc3VtbWFyeSAoc29sdmUgeCkpKSkpCiAKKGxzcSB2OCkK
-
upload with new input
-
result: Success time: 2.05s memory: 220288 kB returned value: 0


