Dutch national flag problem: Difference between revisions

m (→‎{{header|Phix}}: bugfix (j<n ==> j<=n), added syntax colouring, made p2js compatible)
Line 2,765:
Unsorted: blue blue blue blue red white white red white red white blue
Sorted: red red red white white white white blue blue blue blue blue
</pre>
 
=={{header|Picat}}==
<lang Picat>go =>
_ = random2(), % random seed
N=21,
Map = new_map([1=red,2=white,3=blue]),
[Rand,Sorted] = dutch_random_sort(N,Map,Map.inverse()),
println('rand '=Rand),
println(sorted=Sorted),
nl.
 
% generate a random order and ensure it's not already dutch sorted
dutch_random_sort(N,Map,MapInv) = [Rand,Sorted] =>
Rand = dutch_random1(N,Map),
Sorted = dutch_sort(Rand,MapInv),
while (Rand == Sorted)
println("Randomize again"),
Rand := dutch_random1(N,Map),
Sorted := dutch_sort(Rand,MapInv)
end.
 
dutch_random1(N,Map) = [Map.get(1+(random() mod Map.map_to_list().length)) : _I in 1..N].
 
dutch_sort(L,MapInv) = [R : _=R in [MapInv.get(R)=R : R in L].sort()].
 
inverse(Map) = new_map([V=K : K=V in Map]).</lang>
 
Output:
<pre>rand = [red,blue,white,white,white,blue,blue,blue,red,red,blue,white,blue,blue,red,white,blue,blue,white,white,red]
sorted = [red,red,red,red,red,white,white,white,white,white,white,white,blue,blue,blue,blue,blue,blue,blue,blue,blue]
 
</pre>
 
495

edits