diff --git a/lib/questions.rb b/lib/questions.rb index 3f0bfb0..129c5ae 100644 --- a/lib/questions.rb +++ b/lib/questions.rb @@ -1,22 +1,27 @@ # keep only the elements that start with an a def select_elements_starting_with_a(array) + array.select { |word| word[0].downcase == 'a' } end # keep only the elements that start with a vowel def select_elements_starting_with_vowel(array) + array.select { |word| word[0].downcase[/([aeiou])/] } end # remove instances of nil (but NOT false) from an array def remove_nils_from_array(array) + array.compact! end # remove instances of nil AND false from an array def remove_nils_and_false_from_array(array) + remove_nils_from_array(array).reject { |value| value == 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 { |value| value.reverse } end # given an array of student names, like ['Bob', 'Dave', 'Clive'] @@ -24,31 +29,38 @@ def reverse_every_element_in_array(array) # [['Bob', 'Clive'], ['Bob', 'Dave'], ['Clive', 'Dave']] # make sure you don't have the same pairing twice, def every_possible_pairing_of_students(array) + array.combination(2) end # 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.select {|el| array.index(el) > 2 } end # add an element to the beginning of an array def add_element_to_beginning_of_array(array, element) + array.unshift(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_by { |word| word[-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) + midpoint = (string.length.to_f / 2).ceil + string[0...(midpoint)] 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 @@ -56,40 +68,48 @@ def make_numbers_negative(number) # 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 { |el| el.even? }, array.select { |el| el.odd? } ] end -# count the numbers of elements in an element which are palindromes +# count the numbers of elements in an array 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 & reverse_every_element_in_array(array)).length end # return the shortest word in an array def shortest_word_in_array(array) + array.min end -# return the shortest word in an array +# return the longest word in an array def longest_word_in_array(array) + array.max { |a,b| a.length <=> b.length } end # add up all the numbers in an array, so [1, 3, 5, 6] # returns 15 def total_of_array(array) + array.sum end # turn an array into itself repeated twice. So [1, 2, 3] # becomes [1, 2, 3, 1, 2, 3] def double_array(array) + array + 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.sum.to_f / array.length).ceil end # get all the elements in an array, up until the first element @@ -97,12 +117,14 @@ def average_of_array(array) # [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 { |element| element <= 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 @@ -110,43 +132,51 @@ def convert_array_to_a_hash(array) # . 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('').sort.uniq 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.sum end # take out all the capital letters from a string # so 'Hello JohnDoe' becomes 'ello ohnoe' def remove_capital_letters_from_string(string) + string.gsub(/[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.to_i end # take a date and format it like dd/mm/yyyy, so Halloween 2013 # becomes 31/10/2013 def format_date_nicely(date) + date.strftime('%d/%m/%Y') end # get the domain name *without* the .com part, from an email address # so alex@makersacademy.com becomes makersacademy def get_domain_name_from_email_address(email) + email.split('@')[1].split('.')[0] end # capitalize the first letter in each word of a string, @@ -155,30 +185,41 @@ def get_domain_name_from_email_address(email) # 'the lion the witch and the wardrobe' becomes # 'The Lion the Witch and the Wardrobe' def titleize_a_string(string) + excluded_words = %w(the and a) + string.capitalize.gsub(/\w+/) do |word| + excluded_words.include?(word) ? word : word.capitalize + end 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) + /\W/ === string 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 # normal 2 dot range def is_a_3_dot_range?(range) + range.exclude_end? 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 = File.open(file_path, "rb") + contents = file.read + contents.split.count end # --- tougher ones --- @@ -187,6 +228,7 @@ 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) + this.str_method end # return true if the date is a uk bank holiday for 2014