Non-transitive dice: Difference between revisions

→‎{{header|F_Sharp|F#}}: Extra credit (6 sided die)
(→‎{{header|F_Sharp|F#}}: Extra credit (6 sided die))
Line 87:
 
=={{header|F_Sharp|F#}}==
===The task (4 sided die)===
<lang fsharp>
// Non-transitive diceNigel Galloway: August 9th., 2020
let die=let g=[for n0 in [1..4] do for n1 in [n0..4] do for n2 in [n1..4] do for n3 in [n2..4]->[n0;n1;n2;n3]]
let N=seq{for n in die->(n,[for ng in gdie do forif g in g->(n,g)]|>List.filter(fun(n,g)->seq{for n in n do for g in g->compare n g}|>Seq.sum<0) then yield g])}|>Map.ofSeq
let n4n3=seq{for d1,d2 in die do for _,d3d2 in die|>ListN.filter(fun(n,_)->n=d2)[d1] do for _,d4d3 in die|>ListN.filter(fun(n,g)->n=d3[d2] do &&if List.contains (g,d1) die)->N.[d3] then yield (d1,d2,d3,d4)}
 
let n3n4=seq{for d1,d2 in die do for _,d2 in N.[d1] do for d3 in die|>ListN.filter(fun(n,g)->n=[d2] &&do for d4 in N.[d3] do if List.contains (g,d1) die)->N.[d4] then yield (d1,d2,d3,d4)}
n3|>Seq.iter(fun((d1,d2),(_,d3))->printfn "%A<%A; %A<%A; %A>%A\n" d1 d2 d2 d3 d1 d3)
let n4=seq{for d1,d2 in die do for _,d3 in die|>List.filter(fun(n,_)->n=d2) do for _,d4 in die|>List.filter(fun(n,g)->n=d3 && List.contains (g,d1) die)->(d1,d2,d3,d4)}
n3|>Seq.iter(fun((d1,d2),(_,d3))->printfn "%A<%A; %A<%A; %A>%A\n" d1 d2 d2 d3 d1 d3)
n4|>Seq.iter(fun(d1,d2,d3,d4)->printfn "%A<%A; %A<%A; %A<%A; %A>%A" d1 d2 d2 d3 d3 d4 d1 d4)</lang>
{{out}}
Line 101:
[1; 3; 3; 3]<[1; 1; 4; 4]; [1; 1; 4; 4]<[2; 2; 2; 4]; [1; 3; 3; 3]>[2; 2; 2; 4]
[2; 2; 2; 4]<[1; 3; 3; 3]; [1; 3; 3; 3]<[1; 1; 4; 4]; [2; 2; 2; 4]>[1; 1; 4; 4]
Real: 00:00:00.830039
 
[1; 1; 4; 4]<[2; 2; 2; 4]; [2; 2; 2; 4]<[2; 2; 3; 3]; [2; 2; 3; 3]<[1; 3; 3; 3]; [1; 1; 4; 4]>[1; 3; 3; 3]
Line 107:
[2; 2; 2; 4]<[2; 2; 3; 3]; [2; 2; 3; 3]<[1; 3; 3; 3]; [1; 3; 3; 3]<[1; 1; 4; 4]; [2; 2; 2; 4]>[1; 1; 4; 4]
[2; 2; 3; 3]<[1; 3; 3; 3]; [1; 3; 3; 3]<[1; 1; 4; 4]; [1; 1; 4; 4]<[2; 2; 2; 4]; [2; 2; 3; 3]>[2; 2; 2; 4]
Real: 00:00:0500.867152
</pre>
===Extra credit (6 sided die)===
;Sides numbered 1..6
<lang fsharp>
// Non-transitive diceNigel Galloway: August 9th., 2020
let die=[for n0 in [1..6] do for n1 in [n0..6] do for n2 in [n1..6] do for n3 in [n2..6] do for n4 in [n3..6] do for n5 in [n4..6]->[n0;n1;n2;n3;n4;n5]]
let N=seq{for n in die->(n,[for g in die do if (seq{for n in n do for g in g->compare n g}|>Seq.sum<0) then yield g])}|>Map.ofSeq
let n3=[for d1 in die do for d2 in N.[d1] do for d3 in N.[d2] do if List.contains d1 N.[d3] then yield (d1,d2,d3)]
let d1,d2,d3=List.last n3 in printfn "Solutions found = %d\nLast solution found is %A<%A; %A<%A; %A>%A" (n3.Length) d1 d2 d2 d3 d1 d3
</lang>
{{out}}
<pre>
Solutions found = 121998
Last solution found is [5; 5; 5; 5; 5; 6]<[3; 3; 5; 6; 6; 6]; [3; 3; 5; 6; 6; 6]<[4; 4; 4; 6; 6; 6]; [5; 5; 5; 5; 5; 6]>[4; 4; 4; 6; 6; 6]
Real: 00:05:32.984
</pre>
;Sides numbered 1..7
<lang fsharp>
// Non-transitive diceNigel Galloway: August 9th., 2020
let die=[for n0 in [1..7] do for n1 in [n0..7] do for n2 in [n1..7] do for n3 in [n2..7] do for n4 in [n3..7] do for n5 in [n4..7]->[n0;n1;n2;n3;n4;n5]]
let N=seq{for n in die->(n,[for g in die do if (seq{for n in n do for g in g->compare n g}|>Seq.sum<0) then yield g])}|>Map.ofSeq
let n3=[for d1 in die do for d2 in N.[d1] do for d3 in N.[d2] do if List.contains d1 N.[d3] then yield (d1,d2,d3)]
let d1,d2,d3=List.last n3 in printfn "Solutions found = %d\nLast solution found is %A<%A; %A<%A; %A>%A" (n3.Length) d1 d2 d2 d3 d1 d3
</lang>
{{out}}
<pre>
Solutions found = 1269189
Last solution found is [6; 6; 6; 6; 6; 7]<[4; 4; 6; 7; 7; 7]; [4; 4; 6; 7; 7; 7]<[5; 5; 5; 7; 7; 7]; [6; 6; 6; 6; 6; 7]>[5; 5; 5; 7; 7; 7]
Real: 01:21:36.912
</pre>
 
2,172

edits