30 lines
823 B
Text
30 lines
823 B
Text
* Library for random()
|
|
-include 'Random.sno'
|
|
|
|
* # String -> array
|
|
define('s2a(str,n)i') :(s2a_end)
|
|
s2a s2a = array(n); str = str ' '
|
|
sa1 str break(' ') . s2a<i = i + 1> span(' ') = :s(sa1)f(return)
|
|
s2a_end
|
|
|
|
* # Array -> string
|
|
define('a2s(a)i') :(a2s_end)
|
|
a2s a2s = a2s a<i = i + 1> ' ' :s(a2s)f(return)
|
|
a2s_end
|
|
|
|
* # Knuth shuffle in-place
|
|
define('shuffle(a)alen,n,k,tmp') :(shuffle_end)
|
|
shuffle n = alen = prototype(a);
|
|
sh1 k = convert(random() * alen,'integer') + 1
|
|
eq(a<n>,a<k>) :s(sh2)
|
|
tmp = a<n>; a<n> = a<k>; a<k> = tmp
|
|
sh2 n = gt(n,1) n - 1 :s(sh1)
|
|
shuffle = a :(return)
|
|
shuffle_end
|
|
|
|
* # Test and display
|
|
a = s2a('1 2 3 4 5 6 7 8 9 10',10)
|
|
output = a2s(a) '->'
|
|
shuffle(a)
|
|
output = a2s(a)
|
|
end
|