Skip to content

Instantly share code, notes, and snippets.

@tuxfight3r
Forked from brownmike/ruby_monk_primer.rb
Created July 27, 2016 11:27
Show Gist options
  • Save tuxfight3r/8b2cd2751a3dc23ac6151124283c8700 to your computer and use it in GitHub Desktop.
Save tuxfight3r/8b2cd2751a3dc23ac6151124283c8700 to your computer and use it in GitHub Desktop.
Ruby Monk Primer My solutions to all problems in ascending order
# Problem Statement
# Create a class Calculator, which performs addition and subtraction of two numbers at a time.
class Calculator
def add(a, b)
a+b
end
def subtract(a, b)
a-b
end
end
# Problem Statement
# Given an array containing some strings, return an array containing the length of those strings.
def length_finder(input_array)
input_array.map { |s| s.length }
end
# Problem Statement
# Given a sentence containing multiple words, find the frequency of a given word in that sentence.
#
# Construct a method named 'find_frequency' which accepts two arguments 'sentence' and 'word',
# both of which are String objects.
#
# Example: The method, given 'Ruby is The best language in the World' and 'the', should return 2
# (comparison should be case-insensitive).
def find_frequency(sentence, word)
sentence.split.map { |w| w.downcase }.count(word.downcase)
end
# Problem Statement
# Create a method named 'sort_string' which accepts a String and rearranges all
# the words in ascending order, by length. Let's not treat the punctuation marks
# any different than other characters and assume that we will always have single
# space to separate the words.
#
# Example: Given a string "Sort words in a sentence", it should return "a in Sort words sentence".
def sort_string(string)
string.split.sort { |w1,w2| w1.length <=> w2.length }.join(" ")
end
# Problem Statement
# Create a method 'random_select' which, when given an array of elements (array) and
# a number (n), returns n randomly selected elements from that array.
#
# Example: Given an array [1, 2, 3, 4, 5] and 2 should return two random numbers from
# the given array. (Note: those two random numbers may be the same number.) The method
# should return those random values in a new array.
#
# Calling the method twice should ideally return different sets of values (though it may not).
#
# Note: Ruby has a method Array#sample which very concisely solves this problem. Unfortunately,
# it's too concise! The exercise is almost to write your own Array#sample, so it's been disallowed.
def random_select(array, n)
rand_elements = []
n.times do
rand_elements << array[rand(array.length-1)]
end
rand_elements
end
# Problem Statement
# Let us say you are trying to recruit team-members for your new startup!
# Given a candidate, you need an expression that will tell you whether
# they fit into certain types. This is how a candidate object would look:
#
# candidate.years_of_experience = 4
# candidate.github_points = 293
# candidate.languages_worked_with = ['C', 'Ruby', 'Python', 'Clojure']
# candidate.applied_recently? = false
# candidate.age = 26
#
# We are looking to hire experienced Ruby programmers. Our ideal candidate
# has 2 or more years of experience, but some programmers become really
# good even before that. We'll consider their Github points (a nice
# indicator of a good programmer), and even if they are not experienced,
# candidates with 500 Github points or more can apply. And there is one
# more catch: Ruby being a cool and awesome language, a lot of smart
# youngsters are very good at it. We love those kids, but for this
# particular job we'd rather have them study at school than work. Let us
# filter out candidates who are younger than 15. Also we don't want to
# consider candidates who applied recently for this opening.
is_an_experienced_programmer = (candidate.years_of_experience >= 2 or candidate.github_points >= 500) and candidate.languages_worked_with.include?('Ruby') and candidate.age >= 15 and not(candidate.applied_recently?)
# Problem Statement
# Given a sentence, return true if the sentence is a palindrome.
#
# You are supposed to write a method palindrome? to accomplish this task.
#
# Note Ignore whitespace and cases of characters.
#
# Example:
# Given "Never odd or even" the method should return true
def palindrome?(sentence)
clean_sentence = sentence.downcase.gsub(/\W/, "")
clean_sentence == clean_sentence.reverse
end
# Problem Statement
# Compute the sum of cubes for a given range a through b.
#
# Write a method called sum_of_cubes to accomplish this task
#
# Example Given range 1 to 3 the method should return 36
def sum_of_cubes(a, b)
sum = 0
(a..b).each do |n|
sum += n*n*n
end
sum
end
# Problem Statement
# Given an Array, return the elements that are present exactly once in the array.
#
# You need to write a method called non_duplicated_values to accomplish this task.
#
# Example: Given [1,2,2,3,3,4,5], the method should return [1,4,5]
def non_duplicated_values(values)
values.keep_if { |v| values.count(v) == 1 }
end
# Problem Statement
# Given an array, return true if all the elements are Fixnums.
#
# You need to write array_of_fixnums? method to accomplish this task.
#
# Example:
# Given [1,2,3], the method should return true
def array_of_fixnums?(array)
array.select { |e| e.is_a?(Fixnum) } == array
end
# Problem Statement
#
# 9 is a Kaprekar number since
# 9 ^ 2 = 81 and 8 + 1 = 9
#
# 297 is also Kaprekar number since
# 297 ^ 2 = 88209 and 88 + 209 = 297.
#
# In short, for a Kaprekar number k with n-digits, if you square it and add the right n digits to the left n or n-1 digits, the resultant sum is k.
# Find if a given number is a Kaprekar number.
def kaprekar?(k)
sqr = k**2
digits = k.to_s.length
right_n_digits = sqr.to_s[(0-digits)..-1].to_i
left_digits = sqr.to_s[0..(1-digits)].to_i
left_digits + right_n_digits == k
end
# Problem Statement
# For 2 Colors in RGB:
# (R1, G1, B1) and (R2, G2, B2),
#
# Brightness index is:
# ( 299*R1 + 587*G1 + 114*B1) / 1000
#
# Brightness difference is:
# Absolute difference in brighness indices
#
# Hue difference is:
# |R1 - R2| + |G1 - G2| + |B1 - B2|
# where |x| is the absolute value of x
#
# If Brightness difference is more than 125 and the Hue difference is more than 500 then the colors have sufficient contrast
#
# Find out if the given color combos have sufficient contrast and get all the tests passing.
class Color
attr_reader :r, :g, :b
def initialize(r, g, b)
@r = r
@g = g
@b = b
end
def brightness_index
(299*@r + 587*@g + 114*@b) / 1000
end
def brightness_difference(another_color)
(self.brightness_index - another_color.brightness_index).abs
end
def hue_difference(another_color)
(@r - another_color.r).abs + (@g - another_color.g).abs + (@b - another_color.b).abs
end
def enough_contrast?(another_color)
brightness_difference(another_color) > 125 && hue_difference(another_color) > 500
end
end
# Problem Statement
# You are given some code in the form of lambdas.
# Measure and return the time taken to execute that code.
# You may use Time.now to get the current time.
def exec_time(proc)
start_time = Time.now
proc.call
Time.now - start_time
end
# Problem Statement
# Given a 3 or 4 digit number with distinct digits, return a sorted array of all the unique numbers than can be formed with those digits.
#
# Example:
# Given: 123
# Return: [123, 132, 213, 231, 312, 321]
#
# method chaaaaaaaaaiiiiiiiiiin
def number_shuffle(number)
number.to_s.chars.map { |c| c.to_i }.
permutation.to_a.map { |set| set.join }.
map { |str| str.to_i }.sort
end
# Problem Statement
# A restaurant has incoming orders for which you need to compute the costs
# based on the menu.
#
# You might get multiple orders at times.
#
# Examples:
# if the order is {:rice => 1, :noodles => 1}, and the menu is {:rice => 3,
# :noodles => 2}, then the cost is 5.
#
# If the orders are {:rice => 1, :noodles => 1} and {:rice => 2, :noodles => 2}
# and the menu is {:rice => 3, :noodles => 2}, then the cost is 15.
class Restaurant
def initialize(menu)
@menu = menu
end
def cost(*orders)
total_cost = 0
orders.each do |order|
order.each_key do |item|
total_cost += order[item] * @menu[item]
end
end
total_cost
end
end
# Problem Statement
# Given a custom class MyArray,
# write a 'sum' method that takes a block parameter.
#
# Example:
# my_array = MyArray.new([1, 2, 3])
# my_array.sum gives 6
# my_array.sum(10) gives 16
# my_array.sum(0) {|n| n ** 2 } gives 14
class MyArray
attr_reader :array
def initialize(array)
@array = array
end
def sum(initial_value = 0)
total = initial_value
@array.each do |n|
if block_given?
total += yield(n)
else
total += n
end
end
total
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment