<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: combinatory code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sat, 26 Jul 2008 15:55:32 GMT</pubDate>
    <description>DZone Snippets: combinatory code</description>
    <item>
      <title>Calculate all combinations (permutations)</title>
      <link>http://snippets.dzone.com/posts/show/3545</link>
      <description>Calculates all combinations, including incomplete results.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;combine([1,2]) == [[1], [2], [1,2]];&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var combine = function(a) {&lt;br /&gt;  var fn = function(n, src, got, all) {&lt;br /&gt;    if (n == 0) {&lt;br /&gt;      if (got.length &gt; 0) {&lt;br /&gt;        all[all.length] = got;&lt;br /&gt;      }&lt;br /&gt;      return;&lt;br /&gt;    }&lt;br /&gt;    for (var j = 0; j &lt; src.length; j++) {&lt;br /&gt;      fn(n - 1, src.slice(j + 1), got.concat([src[j]]), all);&lt;br /&gt;    }&lt;br /&gt;    return;&lt;br /&gt;  }&lt;br /&gt;  var all = [];&lt;br /&gt;  for (var i=0; i &lt; a.length; i++) {&lt;br /&gt;    fn(i, a, [], all);&lt;br /&gt;  }&lt;br /&gt;  all.push(a);&lt;br /&gt;  return all;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 19 Feb 2007 12:51:44 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3545</guid>
      <author>troelskn (Troels)</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>Simple Permutation //JavaScript Function</title>
      <link>http://snippets.dzone.com/posts/show/1032</link>
      <description>&lt;a href="http://jsfromhell.com/array/permute"&gt;&lt;br /&gt;&lt;br /&gt;[UPDATED CODE AND HELP CAN BE FOUND HERE]&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;example&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var a = ["A", "B", "C", "D"], j = permute(a);&lt;br /&gt;document.write(&lt;br /&gt;    "&lt;h2&gt;", a.join(" - "), " = ", j.length, "&lt;/h2&gt;",&lt;br /&gt;    j.join("&lt;br /&gt;")&lt;br /&gt;);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;code&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com/array/permute [v1.0]&lt;br /&gt;&lt;br /&gt;permute = function(v, m){ //v1.0&lt;br /&gt;    for(var p = -1, j, k, f, r, l = v.length, q = 1, i = l + 1; --i; q *= i);&lt;br /&gt;    for(x = [new Array(l), new Array(l), new Array(l), new Array(l)], j = q, k = l + 1, i = -1;&lt;br /&gt;        ++i &lt; l; x[2][i] = i, x[1][i] = x[0][i] = j /= --k);&lt;br /&gt;    for(r = new Array(q); ++p &lt; q;)&lt;br /&gt;        for(r[p] = new Array(l), i = -1; ++i &lt; l; !--x[1][i] &amp;&amp; (x[1][i] = x[0][i],&lt;br /&gt;            x[2][i] = (x[2][i] + 1) % l), r[p][i] = m ? x[3][i] : v[x[3][i]])&lt;br /&gt;            for(x[3][i] = x[2][i], f = 0; !f; f = !f)&lt;br /&gt;                for(j = i; j; x[3][--j] == x[2][i] &amp;&amp; (x[3][i] = x[2][i] = (x[2][i] + 1) % l, f = 1));&lt;br /&gt;    return r;&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 29 Dec 2005 04:18:25 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/1032</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
    <item>
      <title>Simple Arrange //JavaScript Function</title>
      <link>http://snippets.dzone.com/posts/show/1031</link>
      <description>&lt;a href="http://jsfromhell.com/array/simple-arrange"&gt;&lt;br /&gt;&lt;br /&gt;[UPDATED CODE AND HELP CAN BE FOUND HERE]&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;example&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var a = ["A", "B", "C", "D"], q = 3, j = simpleArrange(a, q);&lt;br /&gt;document.write(&lt;br /&gt;    "&lt;h2&gt;", a.join(" - "), " : ", q, " = ", j.length, "&lt;/h2&gt;",&lt;br /&gt;    j.join("&lt;br /&gt;")&lt;br /&gt;);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;code&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com/array/simple-arrange [v1.0]&lt;br /&gt;&lt;br /&gt;simpleArrange = function(a, n, m){ //v1.0&lt;br /&gt;    var o = a;&lt;br /&gt;    if(n &gt;= o.length) return [];&lt;br /&gt;    for(var j, l, k, p, f, r, q = k = 1, i = (l = o.length) + 1, j = l - n; --i; i &lt;= j ? q *= i : k *= i);&lt;br /&gt;    for(x = [new Array(n), new Array(n), new Array(n), new Array(n)], j = q = k * q / q, k = l + 1, i = -1;&lt;br /&gt;        ++i &lt; n; x[2][i] = i, x[1][i] = x[0][i] = j /= --k);&lt;br /&gt;    for(r = new Array(q), p = -1; ++p &lt; q;)&lt;br /&gt;        for(r[p] = new Array(n), i = -1; ++i &lt; n; !--x[1][i] &amp;&amp; (x[1][i] = x[0][i],&lt;br /&gt;            x[2][i] = (x[2][i] + 1) % l), r[p][i] = m ? x[3][i] : o[x[3][i]])&lt;br /&gt;            for(x[3][i] = x[2][i], f = 0; !f; f = !f)&lt;br /&gt;                for(j = i; j;)&lt;br /&gt;                    if(x[3][--j] == x[2][i]){&lt;br /&gt;                        x[3][i] = x[2][i] = (x[2][i] + ++f) % l;&lt;br /&gt;                        break;&lt;br /&gt;                    }&lt;br /&gt;    return r;&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 29 Dec 2005 04:16:01 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/1031</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
    <item>
      <title>Arrange //JavaScript Function</title>
      <link>http://snippets.dzone.com/posts/show/681</link>
      <description>&lt;a href="http://www.jsfromhell.com/array/arrange"&gt;&lt;br /&gt;It arranges elements in an array, the "n" parameter determines the amount of elements in each combination and the "m" one is a boolean which says if the function should return an array with an "index map" or real values.&lt;br /&gt;&lt;br /&gt;[UPDATED CODE AND HELP CAN BE FOUND HERE]&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com/array/arrange [v1.0]&lt;br /&gt;&lt;br /&gt;arrange = function( v, n, m ){&lt;br /&gt; 	for( var i, j, k, sep = sep || "", l = v.length, r = new Array( i = Math.pow( l, n ) ), c = ( new Array( n + 1 ) ).join( 0 ).split( "" ); i; )&lt;br /&gt;		for( r[--i] = new Array( j = n ), k = 1; j--; r[i][j] = m ? c[j] : v[c[j]], k &amp;&amp; ( ++c[j] != l &amp;&amp; --k, c[j] %= l ) );&lt;br /&gt;	return r;&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Example&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;document.write( arrange( ["A", "B", "C" ], 3, 1 ).join( "&lt;br /&gt;" ), "&lt;hr /&gt;" );&lt;br /&gt;document.write( arrange( ["A", "B", "C" ], 3, 0 ).join( "&lt;br /&gt;" ) );&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 09 Sep 2005 07:24:33 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/681</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
    <item>
      <title>Permute //JavaScript Function</title>
      <link>http://snippets.dzone.com/posts/show/680</link>
      <description>&lt;a href="http://www.jsfromhell.com/array/permute"&gt;&lt;br /&gt;It permutes elements in an array, the "m" parameter is a boolean which determines if the function should return an array with an "index map" or the real value.&lt;br /&gt;&lt;br /&gt;[UPDATED CODE AND HELP CAN BE FOUND HERE]&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com/array/permute [v1.0]&lt;br /&gt;&lt;br /&gt;permute = function( v, m ){&lt;br /&gt;	for( var j, l = v.length, i = ( 1 &lt;&lt; l ) - 1, r = new Array( i ); i; )&lt;br /&gt;		for( r[--i] = [], j = l; j; i + 1 &amp; 1 &lt;&lt; --j &amp;&amp; ( r[i].push( m ? j : v[j] ) ) );&lt;br /&gt;	return r;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Example&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;document.write( permute( ["A", "B", "C" ], 1 ).join( "&lt;br /&gt;" ), "&lt;hr /&gt;" );&lt;br /&gt;document.write( permute( ["A", "B", "C" ], 0 ).join( "&lt;br /&gt;" ) );&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 09 Sep 2005 07:20:40 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/680</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
  </channel>
</rss>
