<?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>Thu, 24 Jul 2008 05:58:59 GMT</pubDate>
    <description>DZone Snippets: permutation code</description>
    <item>
      <title>Permutations</title>
      <link>http://snippets.dzone.com/posts/show/4607</link>
      <description>Generates all permutation of n. Uses the naive (stupid) "let's generate all imaginable possibilities and see which are permutations" algorithm.&lt;br /&gt;&lt;br /&gt;Time: O(n!)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;int next(int v[], int n) {&lt;br /&gt;	int i = n - 1;&lt;br /&gt;	v[i] = v[i] + 1;&lt;br /&gt;	while ((i &gt;= 0) &amp;&amp; (v[i] &gt; n)) {&lt;br /&gt;		v[i] = 1;&lt;br /&gt;		i--;&lt;br /&gt;		if(i &gt;= 0)&lt;br /&gt;			v[i]++;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	if (i &lt; 0)&lt;br /&gt;		return 0;&lt;br /&gt;	return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void printv(int v[],int n) {&lt;br /&gt;	int i;&lt;br /&gt;&lt;br /&gt;	for (i = 0; i &lt; n; i++)&lt;br /&gt;		printf("%d", v[i]);&lt;br /&gt;	printf("\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int is_perm(int v[], int n) {&lt;br /&gt;	int i, j;&lt;br /&gt;&lt;br /&gt;	for (i = 0; i &lt; n; i++)&lt;br /&gt;		for (j = i + 1; j &lt; n; j++)&lt;br /&gt;			if (v[i] == v[j])&lt;br /&gt;				return 0;&lt;br /&gt;&lt;br /&gt;	return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]) {&lt;br /&gt;	int v[128];&lt;br /&gt;	int n = 6;&lt;br /&gt;	int i;&lt;br /&gt;	for(i = 0; i &lt;= n; i++)&lt;br /&gt;		v[i] = i + 1;&lt;br /&gt;&lt;br /&gt;	while (next(v,n))&lt;br /&gt;		if (is_perm(v,n))&lt;br /&gt;			printv(v,n);&lt;br /&gt;&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 03 Oct 2007 10:00:09 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4607</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
    <item>
      <title>C - Permutation multiplication</title>
      <link>http://snippets.dzone.com/posts/show/4035</link>
      <description>This code multiplies the permutations given as imput via in. This uses the normal human search and write algorithm. It goes through the input many times.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;In: (acfg)(bcd)(aed)(fade)(bgfae)&lt;br /&gt;Out: (a d g) (c e b) (f)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;typedef char str[64];&lt;br /&gt;&lt;br /&gt;void pmul_c(str in, str out) {&lt;br /&gt;  int n = strlen(in);&lt;br /&gt;  char *m = (char*)malloc(sizeof(char) * n + 1);&lt;br /&gt;  memset(m, 0, n);&lt;br /&gt;  m[n] = 0;&lt;br /&gt;&lt;br /&gt;  int k = 0;&lt;br /&gt;  int i = 0;&lt;br /&gt;  int c;&lt;br /&gt;  for (; i &lt; n; ++i)&lt;br /&gt;    if (in[i] == '(') {&lt;br /&gt;      m[i] = 1;&lt;br /&gt;      c = in[i + 1];&lt;br /&gt;    } else if (in[i] == ')') {&lt;br /&gt;      m[i] = 1;&lt;br /&gt;      in[i] = c;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;  char start;&lt;br /&gt;  char curent;&lt;br /&gt;A2:&lt;br /&gt;  i = 0;&lt;br /&gt;  while (m[i] == 1)&lt;br /&gt;    ++i;&lt;br /&gt;  if (i == n)&lt;br /&gt;    return;&lt;br /&gt;  start = in[i];&lt;br /&gt;  out[k++] = '(';&lt;br /&gt;  out[k++] = start;&lt;br /&gt;  m[i] = 1;&lt;br /&gt;&lt;br /&gt;A3:&lt;br /&gt;  curent = in[++i];&lt;br /&gt;  ++i;&lt;br /&gt;&lt;br /&gt;A4:&lt;br /&gt;  while ((i &lt; n) &amp;&amp; (in[i] != curent))&lt;br /&gt;    ++i;&lt;br /&gt;  if (i &lt; n) {&lt;br /&gt;    m[i] = 1;&lt;br /&gt;    goto A3;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (curent != start) {&lt;br /&gt;    out[k++] = curent;&lt;br /&gt;    i = 0;&lt;br /&gt;    goto A4;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  out[k++] = ')';&lt;br /&gt;  goto A2;&lt;br /&gt;&lt;br /&gt;  out[k] = 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 17 May 2007 07:29:30 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4035</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
    <item>
      <title>All permutations of a list in Python</title>
      <link>http://snippets.dzone.com/posts/show/3556</link>
      <description>This function returns a list containing all permutations of the input list. Does not work directly on strings -- explode the string into a list of characters to do that.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def perm(l):&lt;br /&gt;    sz = len(l)&lt;br /&gt;    if sz &lt;= 1:&lt;br /&gt;        return [l]&lt;br /&gt;    return [p[:i]+[l[0]]+p[i:] for i in xrange(sz) for p in perm(l[1:])]&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 20 Feb 2007 23:46:04 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3556</guid>
      <author>brewbuck (Scott L)</author>
    </item>
    <item>
      <title>Permutations in Ruby</title>
      <link>http://snippets.dzone.com/posts/show/3332</link>
      <description>&lt;code&gt;&lt;br /&gt;&lt;br /&gt;# From: http://www.rubyonrailsblog.com/articles/2006/08/31/permutations-in-ruby-can-be-fun (in the comments)&lt;br /&gt;# Author: Brian Mitchell&lt;br /&gt;&lt;br /&gt;class Array&lt;br /&gt;  # The accumulation is a bit messy but it works ;-)&lt;br /&gt;  def sequence(i = 0, *a)&lt;br /&gt;    return [a] if i == size&lt;br /&gt;    self[i].map {|x|&lt;br /&gt;      sequence(i+1, *(a + [x]))&lt;br /&gt;    }.inject([]) {|m, x| m + x}     # this has to be used instead of flatten so I can sequence something&lt;br /&gt;                                    # like [[[4]]] -&gt; [[[4]]] rather than -&gt; [[4]]; ruby 1.9 has an option for flatten&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;p [(0..3), [4,6]].sequence             #=&gt; [[0, 4], [0, 6], [1, 4], [1, 6], [2, 4], [2, 6], [3, 4], [3, 6]]      &lt;br /&gt;p [(0..3).collect, [4, 6]].sequence&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# http://wiki.rubygarden.org/Ruby/page/show/ArrayPermute&lt;br /&gt;# Permute an array, and call a block for each permutation&lt;br /&gt;# Author: Paul Battley&lt;br /&gt;&lt;br /&gt;    class Array&lt;br /&gt;        def permute(prefixed=[])&lt;br /&gt;            if (length &lt; 2)&lt;br /&gt;                # there are no elements left to permute&lt;br /&gt;                yield(prefixed + self)&lt;br /&gt;            else&lt;br /&gt;                # recursively permute the remaining elements&lt;br /&gt;                each_with_index do |e, i|&lt;br /&gt;                    (self[0,i]+self[(i+1)..-1]).permute(prefixed+[e]) { |a| yield a }&lt;br /&gt;                end&lt;br /&gt;            end&lt;br /&gt;        end&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;%w[a b c].permute { |x| puts(x.join('')) } &lt;br /&gt;&lt;br /&gt;[0, 1, 2, 3 ].permute { |x| puts(x.join('-')) } &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/32844&lt;br /&gt;# Author: Steven Grady&lt;br /&gt;&lt;br /&gt;class Array&lt;br /&gt;  def permutations&lt;br /&gt;    return [self] if size &lt; 2&lt;br /&gt;    perm = []&lt;br /&gt;    each { |e| (self - [e]).permutations.each { |p| perm &lt;&lt; ([e] + p) } }&lt;br /&gt;    perm&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;p (1..4).to_a.permutations&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# http://blade.nagaokaut.ac.jp/~sinara/ruby/math/combinatorics/array-perm.rb&lt;br /&gt;# Author: Shin-ichiro Hara&lt;br /&gt;# For many more permutation snippets see: &lt;br /&gt;# http://blade.nagaokaut.ac.jp/~sinara/ruby/math/combinatorics/&lt;br /&gt;&lt;br /&gt;class Array&lt;br /&gt;  def perm(n = size)&lt;br /&gt;    if size &lt; n or n &lt; 0&lt;br /&gt;    elsif n == 0&lt;br /&gt;      yield([])&lt;br /&gt;    else&lt;br /&gt;      self[1..-1].perm(n - 1) do |x|&lt;br /&gt;	(0...n).each do |i|&lt;br /&gt;	  yield(x[0...i] + [first] + x[i..-1])&lt;br /&gt;	end&lt;br /&gt;      end&lt;br /&gt;      self[1..-1].perm(n) do |x|&lt;br /&gt;	yield(x)&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;if $0 == __FILE__&lt;br /&gt;  ["a", "b", "c", "d"].perm(3) do |x|  &lt;br /&gt;    p x&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Based on:&lt;br /&gt;# http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/139290&lt;br /&gt;# Author: Endy Tjahjono&lt;br /&gt;&lt;br /&gt;class String&lt;br /&gt;   def perm&lt;br /&gt;       return [self] if self.length &lt; 2&lt;br /&gt;       ret = []&lt;br /&gt;    &lt;br /&gt;       0.upto(self.length - 1) do |n|&lt;br /&gt;          #rest = self.split('')                &lt;br /&gt;          rest = self.split(//u)            # for UTF-8 encoded strings&lt;br /&gt;          picked = rest.delete_at(n)&lt;br /&gt;          rest.join.perm.each { |x| ret &lt;&lt; picked + x }&lt;br /&gt;       end&lt;br /&gt;&lt;br /&gt;       ret&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;p "abc".perm      #=&gt;  ["abc", "acb", "bac", "bca", "cab", "cba"]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;require 'permutation'&lt;br /&gt;&lt;br /&gt;# http://permutation.rubyforge.org &lt;br /&gt;# http://permutation.rubyforge.org/doc/classes/Permutation.html&lt;br /&gt;# sudo gem install permutation --remote&lt;br /&gt;# For more examples see permutation-0.1.4/examples/tsp.rb and permutation_0.1.4/lib/permutation.rb:&lt;br /&gt;# curl http://files.rubyforge.vm.bytemark.co.uk/permutation/permutation-0.1.4.tgz | tar xfz -&lt;br /&gt;&lt;br /&gt;perm = Permutation.new(3)   &lt;br /&gt;p perm.map { |p| p.value }        #=&gt;  [[0, 1, 2], [0, 2, 1], [1, 0, 2], [1, 2, 0], [2, 0, 1], [2, 1, 0]]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 19 Jan 2007 15:56:26 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3332</guid>
      <author>ntk ()</author>
    </item>
    <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>
    <item>
      <title>Generate all permutation of a list</title>
      <link>http://snippets.dzone.com/posts/show/753</link>
      <description>From Michael Davies's &lt;a href=http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252178&gt;recipe&lt;/a&gt;.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def all_perms(str):&lt;br /&gt;    if len(str) &lt;=1:&lt;br /&gt;        yield str&lt;br /&gt;    else:&lt;br /&gt;        for perm in all_perms(str[1:]):&lt;br /&gt;            for i in range(len(perm)+1):&lt;br /&gt;                yield perm[:i] + str[0:1] + perm[i:]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Some example usage&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; for p in all_perms(['a','b','c']):&lt;br /&gt;	print p&lt;br /&gt;&lt;br /&gt;['a', 'b', 'c']&lt;br /&gt;['b', 'a', 'c']&lt;br /&gt;['b', 'c', 'a']&lt;br /&gt;['a', 'c', 'b']&lt;br /&gt;['c', 'a', 'b']&lt;br /&gt;['c', 'b', 'a']&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;A great use of generator and recursive call.</description>
      <pubDate>Tue, 20 Sep 2005 21:40:02 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/753</guid>
      <author>korakot (Korakot Chaovavanich)</author>
    </item>
  </channel>
</rss>
