I'm going to reply 2 or 3 separate answers ... otherwise it will get confusing :-) Sorry if this overloads anyone trying to delete or ignore the thread message by message.

On 27/08/2014 21:15, Beat Cornaz wrote:
As for the Duplicates :

Alex wrote :

permut() is the optimized version - optimize simepl cases of 1 or 2 chars, 
eliminate duplicates as we go.
Well, it does so, but not completely. First, as I discovered in my own script 
with eliminating duplicates, it needs the input in the form of the most 
duplicates in the beginning and then trailing off.
F.i. 111223 would work , but 112223  or 112333 would not return all of the 
possible (non duplicate) permutations.
Hmmm - I can't see what it gets wrong in these cases.
Can you be specific about what is missed ?   (maybe off-list)
Thanks.

Moreover, in the script of Alex, a couple of duplicates slip thru.
F.I. 1123  gives 14 permutations i.s.o. 12. In the list below, the # are the 
doubles.
Yeah, sorry - bad optimization on my part.

The lines at fault were
        case 2
            put temp & CR & char 2 of temp & char 1 of temp into t2
            break

and their equivalent at the head of the function. This misses the case where the last two chars of the output string are the same (i.e. a duplicate in the last two places). Update version of the function enclosed below, changing those lines to

         case 2
            put temp into t2
if char 1 of temp <> char 2 of temp then put CR & char 2 of temp & char 1 of temp after t2
            break

Full script follows below.
-- Alex.

function permut pMute
   if the number of chars in pMute = 1 then return pMute
   if the number of chars in pMute = 2 then
      if char 1 of pMute = char 2 of pMute then
         return pMute
      else
         return pMute & CR & char 2 of pMute & char 1 of pMute
      end if
   end if

   put empty into t3
   put empty into tDone
   repeat with i = 1 to the number of chars in pMute
      put char i of pMute into c
      if c is among the chars of tDone then next repeat
      put c after tDone
      put pMute into temp
      delete char i of temp
      switch the the number of chars in temp
         case 1
            put temp into t2
            break
         case 2
            put temp into t2
if char 1 of temp <> char 2 of temp then put CR & char 2 of temp & char 1 of temp after t2
            break
         default
            put permut(temp) into t2
      end switch
      repeat for each line L in t2
         put c & L & CR after t3
      end repeat

   end repeat
   return t3

end permut




_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to