Skip to content

Ruby refresher done #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
source 'https://rubygems.org'
ruby '2.2.1'
ruby '2.3.0'

group :development do
gem 'rspec'
Expand Down
98 changes: 92 additions & 6 deletions lib/questions.rb
Original file line number Diff line number Diff line change
@@ -1,184 +1,221 @@
# keep only the elements that start with an a
def select_elements_starting_with_a(array)
array.select { |word| word[0] == 'a' }
end

# keep only the elements that start with a vowel
def select_elements_starting_with_vowel(array)
array.select { |word| word.match(/^[aeiouy]/) }
end

# remove instances of nil (but NOT false) from an array
def remove_nils_from_array(array)
array.select { |ele| !ele.nil? }
end

# remove instances of nil AND false from an array
def remove_nils_and_false_from_array(array)
array.select { |ele| !ele.nil? && ele != false }
end

# don't reverse the array, but reverse every word inside it. e.g.
# ['dog', 'monkey'] becomes ['god', 'yeknom']
def reverse_every_element_in_array(array)
array.map(&:reverse)
end

# given an array of student names, like ['Bob', 'Dave', 'Clive']
# give every possible pairing - in this case:
# [['Bob', 'Clive'], ['Bob', 'Dave'], ['Clive', 'Dave']]
# make sure you don't have the same pairing twice,
# make sure you don't have the same pairing twice,
def every_possible_pairing_of_students(array)
array.combination(2).to_a
end

# discard the first 3 elements of an array,
# discard the first 3 elements of an array,
# e.g. [1, 2, 3, 4, 5, 6] becomes [4, 5, 6]
def all_elements_except_first_3(array)
array[3..-1]
end

# add an element to the beginning of an array
def add_element_to_beginning_of_array(array, element)
array.insert(0, element)
end

# sort an array of words by their last letter, e.g.
# ['sky', 'puma', 'maker'] becomes ['puma', 'maker', 'sky']
def array_sort_by_last_letter_of_word(array)
array.sort { |x, y| x[-1] <=> y[-1] }
end

# cut strings in half, and return the first half, e.g.
# 'banana' becomes 'ban'. If the string is an odd number of letters
# round up - so 'apple' becomes 'app'
def get_first_half_of_string(string)
string[0..-(string.length / 2 + 1)]
end

# turn a positive integer into a negative integer. A negative integer
# stays negative
def make_numbers_negative(number)
-number.abs
end

# turn an array of numbers into two arrays of numbers, one an array of
# turn an array of numbers into two arrays of numbers, one an array of
# even numbers, the other an array of odd numbers
# even numbers come first
# so [1, 2, 3, 4, 5, 6] becomes [[2, 4, 6], [1, 3, 5]]
def separate_array_into_even_and_odd_numbers(array)
[array.select(&:even?), array.select(&:odd?)]
end

# count the numbers of elements in an element which are palindromes
# a palindrome is a word that's the same backwards as forward
# e.g. 'bob'. So in the array ['bob', 'radar', 'eat'], there
# are 2 palindromes (bob and radar), so the method should return 2
def number_of_elements_that_are_palindromes(array)
array.count { |ele| ele == ele.reverse }
end

# return the shortest word in an array
def shortest_word_in_array(array)
array.sort { |x, y| x.size <=> y.size }[0]
end

# return the shortest word in an array
def longest_word_in_array(array)
array.sort { |x, y| y.size <=> x.size }[0]
end

# add up all the numbers in an array, so [1, 3, 5, 6]
# returns 15
def total_of_array(array)
array.inject { |sum, ele| sum += ele }
end

# turn an array into itself repeated twice. So [1, 2, 3]
# becomes [1, 2, 3, 1, 2, 3]
def double_array(array)
array.concat(array)
end

# convert a symbol into a string
def turn_symbol_into_string(symbol)
symbol.to_s
end

# get the average from an array, rounded to the nearest integer
# so [10, 15, 25] should return 17
def average_of_array(array)
(array.inject { |sum, ele| sum += ele }.to_f / array.size).round
end

# get all the elements in an array, up until the first element
# which is greater than five. e.g.
# [1, 3, 5, 4, 1, 2, 6, 2, 1, 3, 7]
# becomes [1, 3, 5, 4, 1, 2]
def get_elements_until_greater_than_five(array)
array.take_while { |ele| ele <= 5 }
end

# turn an array (with an even number of elements) into a hash, by
# pairing up elements. e.g. ['a', 'b', 'c', 'd'] becomes
# {'a' => 'b', 'c' => 'd'}
def convert_array_to_a_hash(array)
Hash[*array]
end

# get all the letters used in an array of words and return
# it as a array of letters, in alphabetical order
# . e.g. the array ['cat', 'dog', 'fish'] becomes
# ['a', 'c', 'd', 'f', 'g', 'h', 'i', 'o', 's', 't']
def get_all_letters_in_array_of_words(array)
array.join.split('').uniq.sort
end

# swap the keys and values in a hash. e.g.
# {'a' => 'b', 'c' => 'd'} becomes
# {'b' => 'a', 'd' => 'c'}
def swap_keys_and_values_in_a_hash(hash)
hash.invert
end

# in a hash where the keys and values are all numbers
# add all the keys and all the values together, e.g.
# {1 => 1, 2 => 2} becomes 6
def add_together_keys_and_values(hash)
hash.flatten.inject { |sum, ele| sum += ele }
end

# take out all the capital letters from a string
# so 'Hello JohnDoe' becomes 'ello ohnoe'
def remove_capital_letters_from_string(string)
string.tr('A-Z', '')
end

# round up a float up and convert it to an Integer,
# so 3.214 becomes 4
def round_up_number(float)
float.ceil
end

# round down a float up and convert it to an Integer,
# so 9.52 becomes 9
def round_down_number(float)
float.floor
end

# take a date and format it like dd/mm/yyyy, so Halloween 2013
# becomes 31/10/2013
def format_date_nicely(date)
"#{date.day}/#{date.month}/#{date.year}"
end

# get the domain name *without* the .com part, from an email address
# so [email protected] becomes makersacademy
def get_domain_name_from_email_address(email)
email[/@(.+)\.com/, 1]
end

# capitalize the first letter in each word of a string,
# capitalize the first letter in each word of a string,
# except 'a', 'and' and 'the'
# *unless* they come at the start of the start of the string, e.g.
# 'the lion the witch and the wardrobe' becomes
# 'The Lion the Witch and the Wardrobe'
def titleize_a_string(string)
string.capitalize.split(' ').each do |ele|
ele.capitalize! unless %w(a and the).index(ele)
end.join(' ')
end

# return true if a string contains any special characters
# where 'special character' means anything apart from the letters
# a-z (uppercase and lower) or numbers
def check_a_string_for_special_characters(string)
string =~ /[^a-zA-Z1-9]+/ ? true : false
end

# get the upper limit of a range. e.g. for the range 1..20, you
# should return 20
def get_upper_limit_of(range)
range.max
end

# should return true for a 3 dot range like 1...20, false for a
# should return true for a 3 dot range like 1...20, false for a
# normal 2 dot range
def is_a_3_dot_range?(range)
range.include?(range.end) ? false : true
end

# get the square root of a number
def square_root_of(number)
Math.sqrt(number)
end

# count the number of words in a file
def word_count_a_file(file_path)
File.read(file_path).split(' ').count
end

# --- tougher ones ---
Expand All @@ -187,19 +224,37 @@ def word_count_a_file(file_path)
# called call_method_from_string('foobar')
# the method foobar should be invoked
def call_method_from_string(str_method)
"test".send(:str_method)
end

# return true if the date is a uk bank holiday for 2014
# the list of bank holidays is here:
# https://www.gov.uk/bank-holidays
def is_a_2014_bank_holiday?(date)
bank_holidays_2014 = [
Time.new(2014, 1, 1),
Time.new(2014, 4, 18),
Time.new(2014, 1, 21),
Time.new(2014, 5, 5),
Time.new(2014, 8, 25),
Time.new(2014, 12, 25),
Time.new(2014, 12, 26)
]
bank_holidays_2014.include?(date)
end

# given your birthday this year, this method tells you
# the next year when your birthday will fall on a friday
# e.g. january 1st, will next be a friday in 2016
# return the day as a capitalized string like 'Friday'
def your_birthday_is_on_a_friday_in_the_year(birthday)
t = birthday
y = t.year
until t.friday?
y += 1
t = Time.new(y, t.month, t.day)
end
t.year
end

# in a file, total the number of times words of different lengths
Expand All @@ -208,19 +263,50 @@ def your_birthday_is_on_a_friday_in_the_year(birthday)
# and 1 that is 4 letters long. Return it as a hash in the format
# word_length => count, e.g. {2 => 1, 3 => 5, 4 => 1}
def count_words_of_each_length_in_a_file(file_path)
hash_count = Hash.new
File.read(file_path).gsub!(/[^0-9A-Za-z]/, ' ').split(' ').each do |word|
hash_count[word.length] ||= 0
hash_count[word.length] += 1
end
hash_count
end

# implement fizzbuzz without modulo, i.e. the % method
# go from 1 to 100
# (there's no RSpec test for this one)
def fizzbuzz_without_modulo
(0..99).each do |i|
x = ''
x += 'Fizz' if i / 3.to_f == (i / 3)
x += 'Buzz' if i / 5.to_f == (i / 5)
puts(x.empty? ? i : x)
end
end

# print the lyrics of the song 99 bottles of beer on the wall
# http://www.99-bottles-of-beer.net/lyrics.html
# make sure you use the singular when you have one bottle of
# make sure you use the singular when you have one bottle of
# beer on the wall, and print 'no more bottles of beer on the wall'
# at the end.
# (there's no RSpec test for this one)
def ninety_nine_bottles_of_beer
(0..99).to_a.reverse.each do |i|
if i == 0
string = "No more bottles of beer on the wall, "\
"no more bottles of beer.\n"\
"Go to the store and buy some more, "\
"99 bottles of beer on the wall.\n\n"
elsif i == 1
string = "1 bottle of beer on the wall, "\
"1 bottle of beer.\n"\
"Take one down and pass it around, "\
"no more bottles of beer on the wall.\n\n"
else
string = "#{i} bottles of beer on the wall, "\
"#{i} bottles of beer.\n"\
"Take one down and pass it around, "\
"#{i - 1} bottles of beer on the wall.\n\n"
end
puts string
end
end