Ruby Algorithm Interview Challenge

I recently had a Junior Ruby Developer interview where I had to complete a coding challenge live. I didn’t finish in time and didn’t get the position, but I wanted to complete it anyway.

The Challenge:

Convert numbers into their word equivalent.

ie. 1 = “one”, 23 = “twenty three”, 1234 = “one thousand two hundred thirty four”


My Solution:

def convert_num(num)
	ones = {
		'1' => "one",
		'2' => "two",
		'3' => "three",
		'4' => "four", 
		'5' => "five",
		'6' => "six",
		'7' => "seven",
		'8' => "eight",
		'9' => "nine"
	}

	teens = {
		'11' => "eleven",
		'12' => "twelve",
		'13' => "thirteen",
		'14' => "fourteen",
		'15' => "fifteen",
		'16' => "sixteen",
		'17' => "seventeen",
		'18' => "eighteen",
		'19' => "nineteen"
	}

	tens = {
		'10' => "ten",
		'20' => "twenty",
		'30' => "thirty",
		'40' => "forty",
		'50' => "fifty",
		'60' => "sixty",
		'70' => "seventy",
		'80' => "eighty",
		'90' => 'ninety'
	}

	hundreds = {
		'100' => "one hundred",
		'1000' => "one thousand"
	}

big_num = []
#first check ones place
	string_num = num.to_s
	if ones.include?(string_num)
		ones[string_num]
#check teens
	elsif teens.include?(string_num)
		teens[string_num]
#check tens
	elsif tens.include?(string_num)
		tens[string_num]
#check hundreds
	elsif hundreds.include?(string_num)
		hundreds[string_num]
#split the number up 
	else
		num_array = string_num.split('')
		if num_array.length == 4
			big_num << ones[num_array[0]] + " thousand"
			big_num << ones[num_array[1]] + " hundred"
			big_num << tens[num_array[2] + '0']
			big_num << ones[num_array[3]]
		elsif num_array.length == 3
			big_num << ones[num_array[0]] + " hundred"
			big_num << tens[num_array[1] + '0']
			big_num << ones[num_array[2]]
		else
			big_num << tens[num_array[0] + '0']
			big_num << ones[num_array[1]]
		end
		big_num.join(" ")
	end
	
end

How I approached this challenge (my thinking process):
I was told that the highest number passed into this algorithm would be 9,999

  1. First I knew I needed to create a list of all the numbers and their written equivalent. Since the keys would not match an array index sequence, I decided to store the information in a hash.
  2. The ones place is its own hash because I knew I would need to use this hash again when dealing with hundreds and thousands.
  3. I placed the teens in their own hash because there’s no pattern to the written form and would only be used if one if the numbers in the teens hash appeared.
  4. Same goes for the tens. Twenty is different from two and thirty is different from three. So they get their own hash as well.
  5. If the number being passed matches exactly with any of the keys in these hashes, then I just need to use that key to grab the value and output it.
  6. If the number being passed does NOT match with any of the keys in my hashes, then I want to split the number up and search through the array created.
  7. If the length of the array is 4 (has 4 digits), then I know I need to add the word “thousand” after the first index (0), and “hundred” after the second index (1). I push these in order into a new array called big_num.
  8. The tens place is tricky as the numbers are all single digits. I add a ‘0’ to the end of the digit and search my tens hash for the matching key.
  9. I follow this same pattern for numbers that have a length of 3 and numbers with a length of 2.
  10. Then I join the elements in big_num together so that they form one string.

The following tests and outputs:

p convert_num(3)
  => "three"
p convert_num(15)
  => "fifteen"
p convert_num(90)
  => "ninety"
p convert_num(45)
  => "forty five"
p convert_num(202)
  => "two hundred two"
p convert_num(100)
  => "one hundred"
p convert_num(1200)
  => "one thousand two hundred"
p convert_num(9999)
  => "nine thousand nine hundred ninety nine"

Pretty sure that there can be some more refactoring, but will have to keep working through the logic to find a way to simplify it.

Dual Boot Ubuntu and Windows 10

I am on a Toshiba Satellite L55 and wanted to install a Linux operating system alongside my Windows 10 OS.

Here is a great YouTube video that explains how to allow both operating systems to work alongside each other:

I had trouble creating a partition using the Windows 10 Disk Management so I downloaded this EaseUS Partition Manager program to help me set aside a big enough partition manually.

Instead of saving the Ubuntu image .iso file onto a DVD, I used a USB. There are some tutorials online on how to change some settings in your BIOS to be able to boot from a USB drive. On my Toshiba Satellite, I didn’t have to alter anything in my computer BIOS and was able to just press F12 on computer start-up and choose USB as my boot source.

Making a Ruby Gem

I made my very first Ruby gem today! Check it out here!

You can make a Ruby gem! Make an account with Rubygems.org and then follow the following steps. These steps assume you already have some code that works and you want to package it as a gem. It’s always good to keep copies of your code on Github or Bitbucket

  1. First check if your gem name has been taken by doing a search on Rubygems.org.
  2. Next, run this in your Terminal:
    $ bundle gem <gem-name>

    This will create the files you need in your gem package.

  3. Open up the gem-name.gemspec file and replace all the items that start with ‘TODO’ with your own information. Also replace the push host link to rubygems.org. Mine was located on line 19:
    spec.metadata['allowed_push_host'] = "https://rubygems.org"
  4. Go into your lib/gem-name/version.rb file and add your version number in this format: MAJOR.MINOR.PATCH
    MAJOR: for big changes to your gem
    MINOR: for small additions to your gem
    PATCH: bug fixes and such
    Unnamed QQ Screenshot20160106224046
  5. Create a new file inside your lib/gem-name/ folder named gem-name.rb and add your classes and methods here.
  6. Inside a different file located at lib/gem-name.rb you can make any module specifications. In this file, the first line should be
    require 'gem-name/gem-name' to pull in the file located at lib/gem-name/gem-name.rb
  7. Add, commit, and push to Git
  8. $ rake install

    This will build and install locally

    * $ rake build

    will build the gem locally

  9. $rake release

    build and push to Rugygems.org

  10. $ gem bump --to minor
    $ gem bump --to major
    $ gem bump --to 1.1.1

To add another owner to the gem, type this in your Terminal

$ gem owner gem-name --add <owner@email.com>