|
|
1.1 ! root 1: procedure main() ! 2: s1 := collate(&cset,&cset) ! 3: s2 := collate(reverse(&cset),reverse(&cset)) ! 4: write(image(decollate(s1,0))) ! 5: write(image(decollate(s1,1))) ! 6: write(image(decollate(s2,1))) ! 7: write(image(decollate(s2,0))) ! 8: end ! 9: ! 10: procedure collate(s1,s2) ! 11: local length, ltemp, rtemp, t ! 12: static llabels, rlabels, clabels, blabels, half ! 13: initial { ! 14: llabels := "abxy" ! 15: rlabels := "cduv" ! 16: blabels := llabels || rlabels ! 17: clabels := "acbdxuyv" ! 18: half := 4 ! 19: ltemp := left(&cset,*&cset/2) ! 20: rtemp := right(&cset,*&cset/2) ! 21: clabels := collate(ltemp,rtemp) ! 22: llabels := ltemp ! 23: rlabels := rtemp ! 24: blabels := string(&cset) ! 25: half := *llabels ! 26: } ! 27: if *s1 > *s2 then { ! 28: t := s1[*s2+1:0] ! 29: s1 := s1[1:*s2+1] ! 30: } ! 31: else if *s2 > *s1 then { ! 32: t := s2[*s1+1:0] ! 33: s2 := s2[1:*s1+1] ! 34: } ! 35: else t := "" ! 36: length := *s1 ! 37: if length <= half then ! 38: return map(left(clabels,2*length),left(llabels,length) || ! 39: left(rlabels,length),s1 || s2) || t ! 40: else ! 41: return map(clabels,blabels,left(s1,half) || left(s2,half)) || ! 42: collate(right(s1,length-half),right(s2,length-half)) || t ! 43: end ! 44: ! 45: procedure decollate(s,n) ! 46: static dsize, image, object ! 47: local ssize ! 48: initial { ! 49: image := collate(&cset[2:0],repl(&cset[1],*&cset-1)) ! 50: object := string(&cset) ! 51: dsize := *image ! 52: } ! 53: n %:= 2 ! 54: ssize := *s ! 55: if ssize + n <= dsize then ! 56: return map(object[1+:(ssize+n)/2],image[(n+1)+:ssize],s) ! 57: else ! 58: return map(object[1+:(dsize-2)/2],image[(n+1)+:dsize-2], ! 59: s[1+:(dsize-2)]) || decollate(s[dsize-1:0],n) ! 60: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.