<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: ruby code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Thu, 24 Jul 2008 04:27:42 GMT</pubDate>
    <description>DZone Snippets: ruby code</description>
    <item>
      <title>Permutations of letters in a word</title>
      <link>http://snippets.dzone.com/posts/show/5763</link>
      <description>I've been programming for a while but for some reason figuring this out was really hard - it took me 2 and a half hours. Unsurprisingly, the solution is extremely simple...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/ruby&lt;br /&gt;# permute - takes a word and returns all the permutations of the letters in the word&lt;br /&gt;&lt;br /&gt;def permute(word="")&lt;br /&gt;  permutations_among(word.split(//))&lt;br /&gt;end&lt;br /&gt;def permutations_among(letters)&lt;br /&gt;  permutations = []&lt;br /&gt;  if letters.size == 1&lt;br /&gt;    permutations &lt;&lt; letters.first&lt;br /&gt;  else&lt;br /&gt;    letters.each_with_index do |letter, i|&lt;br /&gt;      surrounding_letters = letters.dup; surrounding_letters.delete_at(i)&lt;br /&gt;      permutations += permutations_among(surrounding_letters).map {|permutation| letter + permutation }&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  permutations&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;permute(ARGV.shift).each {|permutation| puts permutation }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Some benchmarks against other implementations:&lt;br /&gt;&lt;br /&gt;* Array#permutations: &lt;a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/32844"&gt;http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/32844&lt;/a&gt;&lt;br /&gt;* Array#perm: &lt;a href="http://blade.nagaokaut.ac.jp/~sinara/ruby/math/combinatorics/array-perm.rb"&gt;http://blade.nagaokaut.ac.jp/~sinara/ruby/math/combinatorics/array-perm.rb&lt;/a&gt;&lt;br /&gt;* geta: &lt;a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/139290"&gt;http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/139290&lt;/a&gt;&lt;br /&gt;* String#perm (based on geta)&lt;br /&gt;* Array#each_permutation: &lt;a href="http://knanshon.blogspot.com/2006/08/ruby-permutations.html"&gt;http://knanshon.blogspot.com/2006/08/ruby-permutations.html&lt;/a&gt;&lt;br /&gt;* permutation: &lt;a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/140345"&gt;http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/140345&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;                                              user     system      total        real&lt;br /&gt;permutations_among:                       1.680000   0.010000   1.690000 (  1.700779)&lt;br /&gt;Array#permutations:                       1.740000   0.010000   1.750000 (  1.798288)&lt;br /&gt;geta:                                     2.430000   0.010000   2.440000 (  2.506668)&lt;br /&gt;String#perm:                              2.260000   0.010000   2.270000 (  2.280652)&lt;br /&gt;Array#each_permutation:                   0.820000   0.000000   0.820000 (  0.827463)&lt;br /&gt;permutation:                              2.140000   0.010000   2.150000 (  2.171966)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Benchmark code:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'benchmark'&lt;br /&gt;&lt;br /&gt;N = 1_000&lt;br /&gt;Benchmark.bm(40) do |x|&lt;br /&gt;  letters = %w(a b c d e)&lt;br /&gt;  string = "abcde"&lt;br /&gt;  x.report("permutations_among:") do&lt;br /&gt;    N.times { permutations_among(letters) }&lt;br /&gt;  end&lt;br /&gt;  x.report('Array#permutations:') do&lt;br /&gt;    N.times { letters.permutations }&lt;br /&gt;  end&lt;br /&gt;  x.report('geta:') do&lt;br /&gt;    N.times { geta(string) }&lt;br /&gt;  end&lt;br /&gt;  x.report('String#perm:') do&lt;br /&gt;    N.times { string.perm }&lt;br /&gt;  end&lt;br /&gt;  x.report('Array#each_permutation:') do&lt;br /&gt;    N.times { letters.each_permutation {|perm| } }&lt;br /&gt;  end&lt;br /&gt;  x.report('permutation:') do&lt;br /&gt;    N.times { 0.upto(string.length.factorial-1) {|i| permutation(string, i)} }&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So, not bad for a first try ;)</description>
      <pubDate>Sun, 13 Jul 2008 22:21:49 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5763</guid>
      <author>mcmire ()</author>
    </item>
    <item>
      <title>String.random</title>
      <link>http://snippets.dzone.com/posts/show/5681</link>
      <description>&lt;code&gt;&lt;br /&gt;class String&lt;br /&gt;  def self.random(length=20)&lt;br /&gt;    chars = ('a'..'z').to_a + ('A'..'Z').to_a + ("0".."9").to_a&lt;br /&gt;    hash = ""; length.times { hash &lt;&lt; chars[rand(chars.size)] }; hash&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 23 Jun 2008 15:58:23 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5681</guid>
      <author>mcmire ()</author>
    </item>
    <item>
      <title>Perform a Rails find() and iterate over the resulting records in groups</title>
      <link>http://snippets.dzone.com/posts/show/5461</link>
      <description>&lt;code&gt;&lt;br /&gt;module ActiveRecord&lt;br /&gt;  class Base&lt;br /&gt;    # This method lets you iterate over the results of a .find, in groups.&lt;br /&gt;    # (Basically an interface to LIMIT.)&lt;br /&gt;    # Anything you can pass as options to .find, you can pass here. &lt;br /&gt;    # Example 1:&lt;br /&gt;    #   Order.each_by(100, :conditions =&gt; { :cc_processed_at =&gt; nil }) do |order|&lt;br /&gt;    #     # do stuff with order&lt;br /&gt;    #   end&lt;br /&gt;    # Example 2:&lt;br /&gt;    #   Person.each_by(50, :order =&gt; 'name') do |person, index|&lt;br /&gt;    #     # do stuff with person and index&lt;br /&gt;    #   end&lt;br /&gt;    # Pass :update =&gt; true in the options to print a message before each group is&lt;br /&gt;    # fetched from the db.&lt;br /&gt;    #&lt;br /&gt;    # Author: Elliot Winkler &lt;elliot.winkler@gmail.com&gt;&lt;br /&gt;    # Source: http://snippets.dzone.com/posts/show/5461&lt;br /&gt;    def self.each_by(group_size, options={}, &amp;blk)&lt;br /&gt;      update = options.delete(:update) || false&lt;br /&gt;      num_records = count(options.except(:from))&lt;br /&gt;      return 0 if num_records == 0&lt;br /&gt;      #raise "Number of records: #{num_records}"&lt;br /&gt;      also_pass_offset = (blk.arity == 2)&lt;br /&gt;      0.step(num_records, group_size) do |offset|&lt;br /&gt;        find_options = { :offset =&gt; offset, :limit =&gt; group_size }.merge(options)&lt;br /&gt;        if update&lt;br /&gt;          if num_records == 1&lt;br /&gt;            puts "&gt;&gt; Reading the only record."&lt;br /&gt;          else&lt;br /&gt;            start_offset = offset + 1&lt;br /&gt;            end_offset   = offset + group_size&lt;br /&gt;            end_offset   = num_records if num_records &lt; end_offset&lt;br /&gt;            puts "&gt;&gt; Reading records #{start_offset}-#{end_offset}."&lt;br /&gt;          end&lt;br /&gt;        end &lt;br /&gt;        find(:all, find_options).each do |record|&lt;br /&gt;          also_pass_offset ? blk.call(record, offset) : blk.call(record)&lt;br /&gt;        end&lt;br /&gt;      end&lt;br /&gt;      num_records&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Also see:&lt;br /&gt;&lt;br /&gt;* http://weblog.jamisbuck.org/2007/4/6/faking-cursors-in-activerecord&lt;br /&gt;* http://weblog.jamisbuck.org/2007/2/28/poor-man-s-pagination</description>
      <pubDate>Mon, 05 May 2008 15:35:43 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5461</guid>
      <author>mcmire ()</author>
    </item>
  </channel>
</rss>
