START ESCWYP MUSIC VIDEOS
------------------------------------------------- permut.fs -----------------------
( F O R T H )
\ To run (for example with gforth): 
\ gforth permut.fs 4

2 value num
0 value index
1 value countie
0 value start
0 value old
0 value minfree

0 value f
0 value c

: aget cells + @ ;
: aset cells + ! ;

: prind
   num 0 do
      c i aget .
   loop
   ." | "
   . 
   cr
;

: freespot
   dup
   0> over 0= or
   if
      dup
      1 swap f swap
      aset
      dup
      minfree <
      if to minfree
      else drop then
   else drop then
;

: takespot
   dup
   0> over 0= or
   if
      dup
      0 swap f swap aset
      minfree =
      if
         minfree 1 + num <
         if
            num minfree 1 + do
               f i aget
               1 =
               if 
                  i to minfree 
                  leave
               then
            loop
         then
      then
   then
;

: perm
   2 to num
   dup
   num >
   if to num
   else drop then

   0 to index
   1 to countie
   0 to start
   0 to old
   0 to minfree

   align
   here to f
   num cells allot
   
   align
   here to c
   num cells allot

   num 0 do
      -1 c i aset
      1 f i aset
   loop

   begin
      index 0 > index 0 = or
      while
         c index aget   1 +    to start
         start 0 =
         if minfree to start then
         start num <
         if
            num start do
               f i aget 1 =
               if
                  c index aget
                  freespot
                  i takespot
                  i c index aset
                  index num 1 - <
                  if index 1 + to index
                  else
                     i freespot
                     countie prind
                     countie 1 + to countie
                  then
                  leave
               then
            loop
         then
         index old =
         if
            c index aget freespot
            -1 c index aset
            index 1 - to index
         then
         index to old
   repeat
;
: run
    0 0 next-arg 2dup
    0= swap 0= and
    if 2 perm bye
    else >number drop drop drop perm bye then
;
run


START ESCWYP MUSIC VIDEOS