1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
procedure main()
s1 := collate(&cset,&cset)
s2 := collate(reverse(&cset),reverse(&cset))
write(image(decollate(s1,0)))
write(image(decollate(s1,1)))
write(image(decollate(s2,1)))
write(image(decollate(s2,0)))
perm()
end
procedure collate(s1,s2)
local length, ltemp, rtemp, t
static llabels, rlabels, clabels, blabels, half
initial {
llabels := "abxy"
rlabels := "cduv"
blabels := llabels || rlabels
clabels := "acbdxuyv"
half := 4
ltemp := left(&cset,*&cset/2)
rtemp := right(&cset,*&cset/2)
clabels := collate(ltemp,rtemp)
llabels := ltemp
rlabels := rtemp
blabels := string(&cset)
half := *llabels
}
if *s1 > *s2 then {
t := s1[*s2+1:0]
s1 := s1[1:*s2+1]
}
else if *s2 > *s1 then {
t := s2[*s1+1:0]
s2 := s2[1:*s1+1]
}
else t := ""
length := *s1
if length <= half then
return map(left(clabels,2*length),left(llabels,length) ||
left(rlabels,length),s1 || s2) || t
else
return map(clabels,blabels,left(s1,half) || left(s2,half)) ||
collate(right(s1,length-half),right(s2,length-half)) || t
end
procedure decollate(s,n)
static dsize, image, object
local ssize
initial {
image := collate(&cset[2:0],repl(&cset[1],*&cset-1))
object := string(&cset)
dsize := *image
}
n %:= 2
ssize := *s
if ssize + n <= dsize then
return map(object[1+:(ssize+n)/2],image[(n+1)+:ssize],s)
else
return map(object[1+:(dsize-2)/2],image[(n+1)+:dsize-2],
s[1+:(dsize-2)]) || decollate(s[dsize-1:0],n)
end
procedure perm()
output := set()
every 1 to 2 do
every insert(output,permute("ogram"))
every write(!sort(output))
end
procedure permute(s)
local i, x, t
if s == "" then return ""
every i := 1 to *s do {
x := s[i]
t := s
t[i] := ""
suspend x || permute(t)
}
end
|