35 lines
1.3 KiB
Text
35 lines
1.3 KiB
Text
include c:\cxpl\codes; \'code' declarations
|
|
string 0; \use zero-terminated string convention
|
|
|
|
func StrLen(A); \Return number of characters in an ASCIIZ string
|
|
char A;
|
|
int I;
|
|
for I:= 0 to -1>>1-1 do
|
|
if A(I) = 0 then return I;
|
|
|
|
proc Shuffle(W0); \Display best shuffle of characters in a word
|
|
char W0;
|
|
char W(20), SW(20);
|
|
int L, I, S, SS, C, T;
|
|
[L:= StrLen(W0); \word length
|
|
for I:= 0 to L do W(I):= W0(I); \get working copy of word (including 0)
|
|
SS:= 20; \initialize best (saved) score
|
|
for C:= 1 to 1_000_000 do \overkill? XPL0 is fast
|
|
[I:= Ran(L); \shuffle: swap random char with end char
|
|
T:= W(I); W(I):= W(L-1); W(L-1):= T;
|
|
S:= 0; \compute score
|
|
for I:= 0 to L-1 do
|
|
if W(I) = W0(I) then S:= S+1;
|
|
if S < SS then
|
|
[SS:= S; \save best score and best shuffle
|
|
for I:= 0 to L do SW(I):= W(I);
|
|
];
|
|
];
|
|
Text(0, W0); Text(0, ", "); \show original and shuffled words, score
|
|
Text(0, SW); Text(0, ", ("); IntOut(0, SS); ChOut(0, ^)); CrLf(0);
|
|
];
|
|
|
|
int S, I;
|
|
[S:= ["abracadabra", "seesaw", "elk", "grrrrrr", "up", "a"];
|
|
for I:= 0 to 5 do Shuffle(S(I));
|
|
]
|