let perms xs =
let distrib e L =
let rec aux pre post =
seq {
match post with
| [] -> yield (L @ [e])
| h::t -> yield (List.rev pre @ [e] @ post)
yield! aux (h::pre) t
}
aux [] L
let rec loop = function
| [] -> Seq.singleton []
| h::t -> Seq.collect (distrib h) (loop t)
loop xs
let solve xs =
let dxs = dict xs
let yxs = seq {
for var in perms xs do
let row = var
|> List.collect (fun (n,xs) -> xs |> List.mapi (fun i e -> (n, i + 1, i + 2, e)))
|> List.toArray
let fname
(a
,x
,_
,_
) = sprintf "%s%A" a x
let lname
(a
,_
,x
,_
) = sprintf "%s%A" a x
yield! seq {
for i = 0 to row.Length - 2 do
for k = i to row.Length - 1 do
let pins = row.[i..k]
|> Seq.map (fun (a,_,_,_) -> a)
|> Seq.distinct
|> Seq.pairwise
|> Seq.
map (fun
(a
, b
) -> sprintf "%s%A-%s%A" a
(dxs.
[a
].
Length + 1) b
1 ) |> String.concat ", "
yield (fname row.[i]), (lname row.[k]), (row.[i..k] |> Seq.sumBy (fun (_,_,_,e)->e)), pins
}
}
let xs = yxs
|> Seq.distinct
|> Seq.toArray
|> Array.sortBy (fun (_,_,a,_) -> a)
printfn " outputs = V\t jumper"
for (a,b,c,d) in xs do
printfn " %5s..%-5s = %A \t%s" a b c d
do
let xs = [
("xx", [4.4; 7.7; 3.85])
("xxx", [1.1; 0.55])
]
solve xs
bGV0IHBlcm1zIHhzID0gCiAgICBsZXQgZGlzdHJpYiBlIEwgPQogICAgICAgIGxldCByZWMgYXV4IHByZSBwb3N0ID0gCiAgICAgICAgICAgIHNlcSB7CiAgICAgICAgICAgICAgICBtYXRjaCBwb3N0IHdpdGgKICAgICAgICAgICAgICAgIHwgW10gLT4geWllbGQgKEwgQCBbZV0pCiAgICAgICAgICAgICAgICB8IGg6OnQgLT4geWllbGQgKExpc3QucmV2IHByZSBAIFtlXSBAIHBvc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQhIGF1eCAoaDo6cHJlKSB0IAogICAgICAgICAgICB9CiAgICAgICAgYXV4IFtdIEwKICAgIGxldCByZWMgbG9vcCA9IGZ1bmN0aW9uIAogICAgICAgIHwgW10gLT4gU2VxLnNpbmdsZXRvbiBbXQogICAgICAgIHwgaDo6dCAtPiBTZXEuY29sbGVjdCAoZGlzdHJpYiBoKSAobG9vcCB0KQogICAgbG9vcCB4cwoKCmxldCBzb2x2ZSB4cyA9IAogICAgbGV0IGR4cyA9IGRpY3QgeHMKICAgIGxldCB5eHMgPSBzZXEgewogICAgICAgIGZvciB2YXIgaW4gcGVybXMgeHMgZG8KICAgICAgICAgICAgbGV0IHJvdyA9IHZhciAKICAgICAgICAgICAgICAgICAgICAgIHw+IExpc3QuY29sbGVjdCAoZnVuIChuLHhzKSAtPiB4cyB8PiBMaXN0Lm1hcGkgKGZ1biBpIGUgLT4gKG4sIGkgKyAxLCBpICsgMiwgZSkpKQogICAgICAgICAgICAgICAgICAgICAgfD4gTGlzdC50b0FycmF5CiAgICAgICAgICAgIGxldCBmbmFtZSAoYSx4LF8sXykgPSBzcHJpbnRmICIlcyVBIiBhIHgKICAgICAgICAgICAgbGV0IGxuYW1lIChhLF8seCxfKSA9IHNwcmludGYgIiVzJUEiIGEgeAoKICAgICAgICAgICAgeWllbGQhIHNlcSB7CiAgICAgICAgICAgICAgICBmb3IgaSA9IDAgdG8gcm93Lkxlbmd0aCAtIDIgZG8KICAgICAgICAgICAgICAgICAgICBmb3IgayA9IGkgIHRvIHJvdy5MZW5ndGggLSAxIGRvCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwaW5zID0gcm93LltpLi5rXSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8PiBTZXEubWFwIChmdW4gKGEsXyxfLF8pIC0+IGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfD4gU2VxLmRpc3RpbmN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfD4gU2VxLnBhaXJ3aXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfD4gU2VxLm1hcCAoZnVuIChhLCBiKSAtPiBzcHJpbnRmICIlcyVBLSVzJUEiIGEgKGR4cy5bYV0uTGVuZ3RoICsgMSkgYiAxICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfD4gU3RyaW5nLmNvbmNhdCAiLCAiCiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIChmbmFtZSByb3cuW2ldKSwgKGxuYW1lIHJvdy5ba10pLCAocm93LltpLi5rXSB8PiBTZXEuc3VtQnkgKGZ1biAoXyxfLF8sZSktPmUpKSwgcGlucwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgbGV0IHhzID0geXhzIAogICAgICAgICAgICAgfD4gU2VxLmRpc3RpbmN0IAogICAgICAgICAgICAgfD4gU2VxLnRvQXJyYXkKICAgICAgICAgICAgIHw+IEFycmF5LnNvcnRCeSAoZnVuIChfLF8sYSxfKSAtPiBhKSAKICAgIHByaW50Zm4gIiAgICBvdXRwdXRzICAgPSAgIFZcdCBqdW1wZXIiIAogICAgZm9yIChhLGIsYyxkKSBpbiB4cyBkbyAKICAgICAgICBwcmludGZuICIgJTVzLi4lLTVzID0gJUEgXHQlcyIgYSBiIGMgZAoKCgpkbwogICAgbGV0IHhzID0gWwogICAgICAgICgieHgiLCBbNC40OyA3Ljc7IDMuODVdKQogICAgICAgICgieHh4IiwgWzEuMTsgMC41NV0pCiAgICBdCiAgICBzb2x2ZSB4cw==