How many words do you want to handle? You say *any* but the number of permutations increases very quickly, so you'd have to come up with a different way of solving it if you wanted to handle 100 words, for example. If N is the number of words, the number of strings to generate is

N!*2^(N-1)

So 2 words have 4 arrangements, 3 words have 24 arrangements (as shown below), 4 words have 192 arrangements...10 words have 1,857,945,600 permutations, etc.

For rearranging the words, a recursive function would work nicely. For selectively pulling out the spaces my first guess would be to count from 0 to 2^(N-1) -1, convert each number to binary using baseConvert, and use the 1s and 0s of the resulting string as a guide to inserting a space or not. As it turned out, it was better to count from 2^(N-1) to 2^N - 1 and then pull the leading "1" in order to get the leading zeroes.

This will do the trick, but will quickly choke out on longer strings. Try it with "test this code" or "this is a test" or "fuzzy wuzzy was a bear" but save your work before attempting "peter piper picked a peck of pickled peppers" -- it would produce a string over 200MB in size (assuming your system's virtual memory system is up to the task).

local sResultList

on rearrangeWords pString,pWordList
  if the number of words of pWordList is 1 then
    put enumerateSpaces(pString && pWordList) after sResultList
    exit rearrangeWords
  end if
  repeat with i = 1 to the number of words in pWordList
    put pWordList into tWordList
    delete word i of tWordList
    rearrangeWords pString && word i of pWordList,tWordList
  end repeat
end rearrangeWords

function enumerateSpaces pString
  put empty into tReturn
  put the number of words in pString into tWC
  repeat with i = 2^(tWC -1) to 2^(tWC)-1
    put char 2 to -1 of baseConvert(i,10,2) into tBitString
    put 0 into tCounter
    repeat for each word W in pString
      add 1 to tCounter
      if tCounter is tWC then
        put W & cr after tReturn
      else
        if char tCounter of tBitString is 1 then
          put W & space after tReturn
        else
          put W after tReturn
        end if
      end if
    end repeat
  end repeat
  return tReturn
end enumerateSpaces



regards,

Geoff Canyon
[EMAIL PROTECTED]

On Nov 24, 2003, at 3:32 PM, [EMAIL PROTECTED] wrote:

Hi all,

Help! :) I've been trying to figure this out but it's been a mess, even
though I think it's probably an easy one.

What I need is rev code that can do this:

Given any phrase, e.g.: "my fat cat"

Spit out all of the following (no need to be in this order):

my fat cat
my cat fat
fat my cat
fat cat my
cat my fat
cat fat my

myfat cat
my fatcat
myfatcat

mycat fat
my catfat
mycatfat

fatmy cat
fat mycat
fatmycat

fatcat my
fat catmy
fatcatmy

catmy fat
cat myfat
catmyfat

catfat my
cat fatmy
catfatmy


Conditions:


1. The input phrase can be *any* number of words (not just 3).

2. Each line of the results must contain all the words within (no missing
words).


Any takers? Thanks in advance! :)

Valetia



_______________________________________________
use-revolution mailing list
[EMAIL PROTECTED]
http://lists.runrev.com/mailman/listinfo/use-revolution


_______________________________________________ use-revolution mailing list [EMAIL PROTECTED] http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to