<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: permutation code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 29 Aug 2008 10:43:18 GMT</pubDate>
    <description>DZone Snippets: permutation code</description>
    <item>
      <title>Another Pyrex Permutation Generator</title>
      <link>http://snippets.dzone.com/posts/show/2353</link>
      <description>// description of your code here&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;cdef class PermuteJ:&lt;br /&gt;&lt;br /&gt;   cdef int n, first&lt;br /&gt;   cdef int lst3[32]&lt;br /&gt;   cdef object lst, lst2&lt;br /&gt;&lt;br /&gt;   def __init__(self, lst):&lt;br /&gt;       cdef int i&lt;br /&gt;       self.lst = lst&lt;br /&gt;       self.lst2 = lst[:]&lt;br /&gt;       self.first = 0&lt;br /&gt;       self.n = len(lst) - 1&lt;br /&gt;       if self.n &gt;= 31:&lt;br /&gt;           raise Exception, "Are you kidding?"&lt;br /&gt;       for i from 0 &lt;= i &lt; len(lst):&lt;br /&gt;           self.lst3[i] = i&lt;br /&gt;&lt;br /&gt;   def __iter__(self):&lt;br /&gt;       return self&lt;br /&gt;&lt;br /&gt;   def __next__(self):&lt;br /&gt;       cdef int j, l, k, x, y, z, sn, length, neg1, neg2, neg3&lt;br /&gt;       cdef int* sl&lt;br /&gt;       cdef object output&lt;br /&gt;&lt;br /&gt;       if self.first == 0:&lt;br /&gt;           self.first = 1&lt;br /&gt;           return self.lst2&lt;br /&gt;       if self.n == 1:&lt;br /&gt;           return [self.lst[1], self.lst[0]]&lt;br /&gt;&lt;br /&gt;       sn = self.n&lt;br /&gt;       length = sn + 1&lt;br /&gt;       sl = self.lst3&lt;br /&gt;       neg1 = sn&lt;br /&gt;       neg2 = length - 2&lt;br /&gt;       neg3 = length - 3&lt;br /&gt;       while 1:&lt;br /&gt;           if sl[neg2] &lt; sl[neg1]:&lt;br /&gt;               sl[neg2], sl[neg1] = sl[neg1], sl[neg2]&lt;br /&gt;           elif sl[neg3] &lt; sl[neg2]:&lt;br /&gt;               if sl[neg3] &lt; sl[neg1]:&lt;br /&gt;                   sl[neg3], sl[neg2], sl[neg1] = sl[neg1], sl[neg3], sl[neg2]&lt;br /&gt;               else:&lt;br /&gt;                   sl[neg3], sl[neg2], sl[neg1] = sl[neg2], sl[neg1], sl[neg3]&lt;br /&gt;           else:&lt;br /&gt;               j = sn - 3&lt;br /&gt;               if j &lt; 0: raise StopIteration&lt;br /&gt;               y = sl[j]&lt;br /&gt;               x = sl[neg3]&lt;br /&gt;               z = sl[neg1]&lt;br /&gt;               while y &gt;= x:&lt;br /&gt;                   j = j - 1&lt;br /&gt;                   if j &lt; 0: raise StopIteration&lt;br /&gt;                   x = y&lt;br /&gt;                   y = sl[j]&lt;br /&gt;               if y &lt; z:&lt;br /&gt;                   sl[j] = z&lt;br /&gt;                   sl[j+1] = y&lt;br /&gt;                   sl[sn] = x&lt;br /&gt;               else:&lt;br /&gt;                   l = neg2&lt;br /&gt;                   while y &gt;= sl[l]:&lt;br /&gt;                       l = l - 1&lt;br /&gt;                   sl[j], sl[l] = sl[l], y&lt;br /&gt;                   sl[sn], sl[j+1] = sl[j+1], sl[sn]&lt;br /&gt;               k = j + 2&lt;br /&gt;               l = neg2&lt;br /&gt;               while k &lt; l:&lt;br /&gt;                   sl[k], sl[l] = sl[l], sl[k]&lt;br /&gt;                   k = k + 1&lt;br /&gt;                   l = l - 1&lt;br /&gt;&lt;br /&gt;           lst = self.lst&lt;br /&gt;           lst2 = self.lst2&lt;br /&gt;           for j from 0 &lt;= j &lt; length:&lt;br /&gt;               lst2[j] = sl[j]&lt;br /&gt;&lt;br /&gt;           return lst2&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 02 Aug 2006 23:59:41 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2353</guid>
      <author>llimllib (Bill Mill)</author>
    </item>
  </channel>
</rss>
