diff --git a/lib/questions.rb b/lib/questions.rb index 3f0bfb0..2d40ded 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 { |x| x[0]=="a" } end # keep only the elements that start with a vowel def select_elements_starting_with_vowel(array) + array.select { |x| x[0]=~ /[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) + array.compact!.delete_if{ |x| x==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 { |x| x.reverse } end # given an array of student names, like ['Bob', 'Dave', 'Clive'] @@ -24,31 +29,37 @@ 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).to_a 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[3...array.length] 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.map{|x| x.reverse}.sort.map{|x| x.reverse} 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.to_f/2).ceil)] end # turn a positive integer into a negative integer. A negative integer # stays negative def make_numbers_negative(number) + number<0 ? number : -number end # turn an array of numbers into two arrays of numbers, one an array of @@ -56,6 +67,7 @@ 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{|x| x.even?} << array.select{|x| x.odd?} end # count the numbers of elements in an element which are palindromes @@ -63,33 +75,40 @@ def separate_array_into_even_and_odd_numbers(array) # 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.select{|x| x.reverse==x}.length end # return the shortest word in an array def shortest_word_in_array(array) + array.min{|a,b| a.length <=> b.length } end # return the shortest 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 * 2 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.to_f)+0.5).to_i end # get all the elements in an array, up until the first element @@ -97,12 +116,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 { |x| x < 6 } 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) + array.each_slice(2).to_a.to_h end # get all the letters used in an array of words and return @@ -110,43 +131,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 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(2).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.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.to_i end # round down a float up and convert it to an Integer, # so 9.52 becomes 9 def round_down_number(float) + float.floor.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[email.index("@")+1...email.index(".")] end # capitalize the first letter in each word of a string, @@ -155,30 +184,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) + # array = string.split + # array.each do |word| + # unless word=="a" || word =="and" || word=="the" + # 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) + string.length != string.gsub!(/[^0-9A-Za-z]/, '').length 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.last 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.to_s.include?("...") 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, "r") + file.read.split.length end # --- tougher ones --- @@ -208,6 +248,8 @@ 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) + # file = File.open(file_path, "r") + # file.read.split.each end # implement fizzbuzz without modulo, i.e. the % method