module PrimeNumberTable
Constants
- VERSION
Public Instance Methods
dialog()
click to toggle source
# File lib/prime_number_table.rb, line 8 def dialog width, height = loop do printf "=> Please give matrix dimension (<width>x<height>)\n-> " dimension = gets.delete(' ').strip.downcase break dimension if /^\d+x\d+$/ =~ dimension end.split('x').map(&:to_i) numbers = begin printf "=> Should I use (P)rime numbers or (F)ibonacci numbers?\n-> " input = gets.strip.downcase { p: :prime, f: :fibonacci }.fetch(input.to_sym, input).tap(&method(:validate_numbers!)) rescue ArgumentError retry end operation = begin printf "=> Multiplication (*) or Addition (+)\n-> " input = gets.strip.downcase { m: :multiplication, a: :addition }.fetch(input.to_sym, input).tap(&method(:validate_operation!)) rescue ArgumentError retry end puts print(width: width, height: height, numbers: numbers, operation: operation) puts end
fibonacci_number(index)
click to toggle source
# File lib/prime_number_table.rb, line 55 def fibonacci_number(index) @fibonacci_numbers ||= Hash.new { |hash, key| hash[key] = key < 2 ? key : hash[key - 1] + hash[key - 2] } @fibonacci_numbers[index] end
prime?(number)
click to toggle source
# File lib/prime_number_table.rb, line 66 def prime?(number) return false if number < 2 @prime_numbers ||= [] @prime_numbers[number] = (2..number / 2).none? { |i| (number % i).zero? } if @prime_numbers[number].nil? @prime_numbers[number] end
prime_number(index)
click to toggle source
# File lib/prime_number_table.rb, line 60 def prime_number(index) number = 0 (index -= 1 if prime?(number += 1)) while index.positive? number end
print(table_size: nil, width: 3, height: 3, numbers: :prime, operation: :addition)
click to toggle source
# File lib/prime_number_table.rb, line 36 def print(table_size: nil, width: 3, height: 3, numbers: :prime, operation: :addition) validate_numbers!(numbers) validate_operation!(operation) operation = { addition: :+, multiplication: :* }.fetch(operation.to_sym, operation) (1..table_size || height).each do |row| (1..table_size || width).each do |column| y = public_send("#{numbers}_number", row) x = public_send("#{numbers}_number", column) printf('%3d ', x.public_send(operation, y)) end puts end nil end
Private Instance Methods
validate_numbers!(numbers)
click to toggle source
# File lib/prime_number_table.rb, line 76 def validate_numbers!(numbers) numbers_options = %w[prime fibonacci] return if numbers_options.include?(numbers.to_s) raise(ArgumentError, "numbers: '#{numbers}', allowed options: '#{numbers_options.join("', '")}'") end
validate_operation!(operation)
click to toggle source
# File lib/prime_number_table.rb, line 83 def validate_operation!(operation) operation_options = %w[addition + multiplication *] return if operation_options.include?(operation.to_s) raise(ArgumentError, "operation: '#{operation}', allowed options: '#{operation_options.join("', '")}'") end