open System
let [<Literal>] N = 8
let solve() =
let q = Array.create N 0
let rec succ h = function
| -1 -> true
| x when q.
[x
] = q.
[h
] || abs(q.
[x
] - q.
[h
]) = abs(x
- h
) -> false | x -> succ h (x - 1)
let acc = ref []
let rec back x y =
match x , y with
| N, N -> ()
| N , _ -> if succ (N - 1) (N - 2)
then acc := Array.map id q :: !acc
//else ()
| -1, _ -> ()
| _ , N -> q.[x] <- 0
| x , y -> q.[x] <- y
if succ x (x - 1)
then back (x + 1) 0
back x (y + 1)
else back (x) (y + 1)
back 0 0
!acc
let rec gen list n =
if n=N then[list] else
let n'=n+1
[0..(N-1)] |> List.filter (fun c ->
let rec chk lst l r =
let l',r'=l-1,r+1
match lst with
| [] -> true
| x::_ when x=c || x=l' || x=r' -> false
| _::t -> chk t l' r'
chk list c c)
|> List.map (fun i -> gen (i::list) n') |> List.concat
let solve1 () = gen [] 0
let show res =
for b in res do
for e in b do
String.replicate e ". " + "W " + String.replicate (7 - e) ". "
|> printfn "%s"
printfn ""
let bench f =
let stopWatch = System.Diagnostics.Stopwatch.StartNew()
Seq.length (f ()) |> ignore
stopWatch.Stop()
stopWatch.Elapsed.TotalMilliseconds
let rec benchTest cnt t0 t1 =
if cnt=100 then (t0,t1)
else let t0n=t0 + bench solve
let t1n=t1 + bench solve1
benchTest (cnt+1) t0n t1n
let res0,res1=benchTest 0 0.0 0.0
printfn "pycture : %f mS" res0
printfn "KolodeznyDiver : %f mS" res1
b3BlbiBTeXN0ZW0KIApsZXQgWzxMaXRlcmFsPl0gTiA9IDgKIApsZXQgc29sdmUoKSA9IAogICAgbGV0IHEgPSBBcnJheS5jcmVhdGUgTiAwCiAgICBsZXQgcmVjIHN1Y2MgaCA9IGZ1bmN0aW9uCiAgICAgICAgfCAtMSAtPiB0cnVlCiAgICAgICAgfCB4IHdoZW4gcS5beF0gPSBxLltoXSB8fCBhYnMocS5beF0gLSBxLltoXSkgPSBhYnMoeCAtIGgpIC0+IGZhbHNlCiAgICAgICAgfCB4ICAtPiBzdWNjIGggKHggLSAxKQogICAgbGV0IGFjYyA9IHJlZiBbXQogICAgbGV0IHJlYyBiYWNrIHggeSA9IAogICAgICAgIG1hdGNoIHggLCB5IHdpdGgKICAgICAgICB8IE4sIE4gIC0+ICgpCiAgICAgICAgfCBOICwgXyAtPiBpZiBzdWNjIChOIC0gMSkgKE4gLSAyKSAKICAgICAgICAgICAgICAgICAgIHRoZW4gYWNjIDo9IEFycmF5Lm1hcCBpZCBxIDo6ICFhY2MgCiAgICAgICAgICAgICAgICAgICAvL2Vsc2UgKCkKICAgICAgICB8IC0xLCBfIC0+ICgpCiAgICAgICAgfCBfICwgTiAtPiBxLlt4XSA8LSAwIAogICAgICAgIHwgeCAsIHkgLT4gcS5beF0gPC0geQogICAgICAgICAgICAgICAgICAgaWYgc3VjYyB4ICh4IC0gMSkKICAgICAgICAgICAgICAgICAgIHRoZW4gYmFjayAoeCArIDEpIDAgCiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2sgeCAoeSArIDEpIAogICAgICAgICAgICAgICAgICAgZWxzZSBiYWNrICh4KSAoeSArIDEpIAogICAgYmFjayAwIDAKICAgICFhY2MKIApsZXQgcmVjIGdlbiBsaXN0IG4gPSAKICAgIGlmIG49TiB0aGVuW2xpc3RdIGVsc2UKICAgICAgICBsZXQgbic9bisxCiAgICAgICAgWzAuLihOLTEpXSB8PiBMaXN0LmZpbHRlciAoZnVuIGMgLT4gCiAgICAgICAgICAgIGxldCByZWMgY2hrIGxzdCBsIHIgPSAKICAgICAgICAgICAgICAgIGxldCBsJyxyJz1sLTEscisxCiAgICAgICAgICAgICAgICBtYXRjaCBsc3Qgd2l0aAogICAgICAgICAgICAgICAgfCBbXSAtPiB0cnVlCiAgICAgICAgICAgICAgICB8IHg6Ol8gd2hlbiB4PWMgfHwgeD1sJyB8fCB4PXInIC0+IGZhbHNlIAogICAgICAgICAgICAgICAgfCBfOjp0IC0+IGNoayB0IGwnIHInCiAgICAgICAgICAgIGNoayBsaXN0IGMgYykKICAgICAgICB8PiBMaXN0Lm1hcCAoZnVuIGkgLT4gZ2VuIChpOjpsaXN0KSBuJykgfD4gTGlzdC5jb25jYXQKIApsZXQgc29sdmUxICgpID0gZ2VuIFtdIDAKIApsZXQgc2hvdyByZXMgPQogICAgZm9yIGIgaW4gcmVzIGRvCiAgICAgICAgZm9yIGUgaW4gYiBkbwogICAgICAgICAgICBTdHJpbmcucmVwbGljYXRlIGUgIi4gIiArICJXICIgKyBTdHJpbmcucmVwbGljYXRlICg3IC0gZSkgIi4gIgogICAgICAgICAgICB8PiBwcmludGZuICIlcyIKICAgIHByaW50Zm4gIiIKIApsZXQgYmVuY2ggZiA9CiAgICBsZXQgc3RvcFdhdGNoID0gU3lzdGVtLkRpYWdub3N0aWNzLlN0b3B3YXRjaC5TdGFydE5ldygpCiAgICBTZXEubGVuZ3RoIChmICgpKSB8PiBpZ25vcmUKICAgIHN0b3BXYXRjaC5TdG9wKCkKICAgIHN0b3BXYXRjaC5FbGFwc2VkLlRvdGFsTWlsbGlzZWNvbmRzCiAKbGV0IHJlYyBiZW5jaFRlc3QgY250IHQwIHQxID0KICAgIGlmIGNudD0xMDAgdGhlbiAodDAsdDEpIAogICAgZWxzZSBsZXQgdDBuPXQwICsgYmVuY2ggc29sdmUKICAgICAgICAgbGV0IHQxbj10MSArIGJlbmNoIHNvbHZlMQogICAgICAgICBiZW5jaFRlc3QgKGNudCsxKSB0MG4gdDFuCiAKbGV0IHJlczAscmVzMT1iZW5jaFRlc3QgMCAwLjAgMC4wCnByaW50Zm4gInB5Y3R1cmUgICAgICAgIDogICVmIG1TIiByZXMwCnByaW50Zm4gIktvbG9kZXpueURpdmVyIDogICVmIG1TIiByZXMxCgo=