Saturday, May 24, 2014

A look at three different ways to implement QuickSort in ruby

I am teaching myself computer science concepts like Big Oh notation and different sorting algorithms. I found several ways of implementing quicksort that taught me some Ruby fun that I thought I'd share.

To quicksort an array, you pick one of the array elements to use as a pivot point. Then divide the array into two different arrays; the left array is very element less than the pivot and the right array is everything that is greater than the pivot.

Then recursively call quicksort on the left and right arrays until they are split into one element arrays. Join all the one element arrays into the final sorted array.

# Quick Sort
# Select element closest to middle (called pivot element)
# puts all elements <= pivot  to the left
# puts all elements > pivot to the right
# recursively call this method on the sublists

# solution one

def quick_sort(list)
   sl = list.clone
   return sl if sl.size <= 1
   pivot = sl.pop                                                  # last element of array
   left, right = sl.partition {|e| e < pivot}               # partion divides the array into two arrays
                                                                          # left = ( e < pivot) and right is ( e > pivot)
   quick_sort(left) + [pivot] + quick_sort(right)    # recursively divide and sort left and right arrays
end


# solution two
def qsort(list)
 return [] if list.size == 0
 # splat operator  splits list into x & xs
 # x is the pivot and first element in arrray, xs is the rest of the list
 x, *xs = list
 less, more = xs.partition{|y| y < x}
 qsort(less) + [x] + qsort(more)
end

#solution three
def quicksort(list)
   return if not list || list == []
    x, *xs = list
    # uses select to create array with elements where condition is true
    # recursively keeps checking
    quicksort(xs.select { |i| i <  x }) + [x] + quicksort(xs.select { |i| i >= x })
 end


list = [9,0,2,45,32,6,7,20,19,5]
p list
p quick_sort(list)
p qsort(list)
p quicksort(list)

Thursday, May 15, 2014

An RVM cheat sheet for newbies



RVM (aka Ruby Version Manager) is a very useful tool. It allows you to install and manage several different versions and implementations of Ruby on one computer, including the ability to manage different sets of RubyGems one each.
There is lots of good advice on how to use RVM (Ruby Version Manager) scattered all over the interwebs. I put together this cheat sheet as a learning aid for myself. I hope you find it helpful (and please ignore the wonky formatting).

Installing RVM (on a Mac)
# install development version
\curl -sSL https://get.rvm.io | bash  
# stable RVM with latest ruby
\curl -sSL https://get.rvm.io | bash -s stable --ruby
# stable RVM with latest rails
\curl -sSL https://get.rvm.io | bash -s stable --rails

Setting a new gemset for a project

1) Install ruby in the project directory

$ rvm install 2.1.2
# list the version of ruby in use, verify the version installed
$ ruby -v   

2) Create a gemset with the a particular version of ruby

$ rvm list
# generic syntax for creating a gemset                                  
$ rvm use ruby_version@project_name --create

3) Real life example:

$ rvm gemset list   # to verify things went well)
$ gem install rails # you install rails into that gemset              
$ rails -v          # to verify that rails installation went well
# ‘rvm use’ sets the gemset in use       

Dealing with incompatible versions of Ruby and Rails

Oh Noes ... time to reverse the process and de-install rails because it’s not compatible with the latest version of ruby at the time of this posting.

1) Uninstall rails in the project directory

$ gem uninstall rails -v 4.1.1

$ gem uninstall railties -v 4.1.1 # need to uninstall also

2) Uninstall ruby versions that are not compatible

$ rvm remove 2.1.2p95

3) Delete the gemset

$ rvm gemset delete super_tictactoe


Steps to update to a different version of Ruby and Rails

In this example we will be installing Ruby 2.1.1 and Rails 4.1.0.

1. Check for a gemset and delete if needed

$ rvm gemset list
$ rvm gemset delete <gemset name>

2. install desired version of ruby

$ rvm install 2.1.1

3. Create a sticky gemset


# check for hidden files
$ ls -lpa   
# delete hidden RMV files if they exist
$ rm .ruby*
$ rvm use ruby-2.0.0-p353@superTTT --create --ruby-version
$ gem install rails


The --ruby-version argument creates two files, .ruby-version and .ruby-gemset, that   set RVM   every time we cd to the project directory. Without these two hidden files you need to enter the following command every time you work on your project if you close the console.

4. Install specific version of rails

$ gem install rails -v 4.1.0

5. Update the project Gemfile

$ gem 'rails', '4.1.0'
$ ruby "2.1.1"

6. Run bundle update to fix conflicts

$ bundle update

7. Read the output from 'bundle update' and update your .gemfile accordingly

∴ bundle update
Fetching gem metadata from https://rubygems.org/..........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Installing rake 10.3.1                   # update entry in gemfile
............
Installing coffee-script 2.2.0        # update entry in gemfle
Using railties 4.1.0 (was 4.0.2)    # using existing gem, no update needed
Installing coffee-rails 4.0.1         # update entry in gemfile
Your bundle is updated!
Some other useful info

To install older versions of Ruby

$ rvm list known  
# lists all  rubies that can still be installed
# may need CC=/usr/bin/gcc to get the binary to compile
$ rvm install 1.8.7  # pick version you want to install     

Upgrading RVM

$ rvm get stable

Data for troubleshooting:

$ rvm info  # verbose listing of the ruby dev environment
$ gem list -dl   # lists all the gems installed