diff --git a/Problem03Module.rb b/Problem03Module.rb new file mode 100644 index 0000000..4322de3 --- /dev/null +++ b/Problem03Module.rb @@ -0,0 +1,35 @@ +require "prime" + +module Problem03Module + + def Problem03Module.factorize(input) + primeFactors = [] + if Prime.prime?(input) || input == 1 + primeFactors[0,0] = input + return primeFactors + else + Integer.each_prime(input-1) do |aPrime| + if input % aPrime == 0 + primeFactors[0,0] = aPrime + return primeFactors.concat(factorize(input / aPrime)) + end + end + end + end + + def Problem03Module.main(args) + begin + inp = args.first.to_i + if inp <= 0 + raise "Enter a non-zero positive number" + end + primeFactors = factorize(inp) + printf("Largest prime factor for %d is %d\n", inp, primeFactors.last) + return primeFactors.last + rescue StandardError + printf("Unexpected exception occured finding largest prime factor! ") + printf("Usage: ruby problem03.rb \n") + return nil + end + end +end \ No newline at end of file diff --git a/README.md b/README.md index 4b4187d..b0dc4c7 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,13 @@ DevPreWork01 ============ +Usage: + +Problem#3 - Largest prime factor +ruby problem03.rb + +Problem#5 - Smallest multiple that is divisible by numbers 1..n +ruby problem05.rb + +Problem#8 - Largest product in a series of X digits +ruby problem08.rb + diff --git a/problem03.rb b/problem03.rb index e69de29..1e00b3a 100644 --- a/problem03.rb +++ b/problem03.rb @@ -0,0 +1,3 @@ +require_relative 'Problem03Module' + +Problem03Module.main(ARGV) \ No newline at end of file diff --git a/problem03_rspec.rb b/problem03_rspec.rb new file mode 100644 index 0000000..9044eb7 --- /dev/null +++ b/problem03_rspec.rb @@ -0,0 +1,17 @@ +require_relative 'Problem03Module' + +describe 'largest prime factor' do + it 'finds 1 as largest prime factor for input of 1' do + expect(Problem03Module.main([1])).to eq(1) + end + it 'finds 2 as largest prime factor for input of 2' do + expect(Problem03Module.main([2])).to eq(2) + end + it 'finds 5 as largest prime factor for input of 100' do + expect(Problem03Module.main([100])).to eq(5) + end + it 'mocks and stubs' do + double('ClassX').class + print instance_double("ClassX", :pages => 250).class.pretty_print_instance_variables + end +end \ No newline at end of file diff --git a/problem05.rb b/problem05.rb index e69de29..64c48e2 100644 --- a/problem05.rb +++ b/problem05.rb @@ -0,0 +1,54 @@ +require "prime" + +def factorize(input) + + primeFactors = [] + + if Prime.prime?(input) || input == 1 + primeFactors[0,0] = input + return primeFactors + else + Integer.each_prime(input-1) do |aPrime| + if input % aPrime == 0 + primeFactors[0,0] = aPrime + return primeFactors.concat(factorize(input / aPrime)) + end + end + end +end + +begin + n = ARGV[0].to_i + if n <= 0 + raise "Enter a number greater than 0" + end + factors = (1..n).to_a().inject([]) do |facs, num| + facs << factorize(num) + facs + end + all_factors = factors.flatten.uniq + exp_hash = factors.inject({}) do |e_hash, f| + count_hash = all_factors.inject({}) do |c_hash, factor| + c_hash[factor] = f.count(factor) + c_hash + end + count_hash.each_pair do |k, v| + if e_hash.has_key?(k) + e_hash[k] = (e_hash[k] < v) ? v : e_hash[k] + else + e_hash[k] = v + end + end + e_hash + end + + multiple = exp_hash.inject(1) do |m, (k,v)| + m = m * (k ** v) + m + end + exp_hash.each_pair { |k,v| printf("%d^%d * ", k, v) } + printf(" = %d\n", multiple); +rescue StandardError + printf("Unexpected exception occured finding smallest multiple that is divisible by numbers 1..n!\n") + printf("Usage: ruby problem05.rb \n") +end diff --git a/problem08.rb b/problem08.rb index e69de29..5dac842 100644 --- a/problem08.rb +++ b/problem08.rb @@ -0,0 +1,40 @@ +# generate random series of 1000 digits +begin + series_len = ARGV[0].to_i + digits = ARGV[1].to_i + if series_len <= 0 || digits <= 0 || digits > series_len + raise "Enter a number greater than 0" + end + series = (1..series_len).inject("") do |s, i| + s << (48 + Random.rand(10)).chr + s + end + + printf("Randomly generated series of %d digits is [ %s ]\n", series_len, series) + + # find the sequence + i = 0 + numseq = series.split(//).map { |i| i.to_i } + + product_seq = greatest_product_seq = numseq[i...digits] + product = greatest_product = product_seq.inject(:*) + + while i < series.length-digits + #printf("%d %d %s %d %d \n", i, i+digits, numseq[i...i+digits], product, greatest_product) + i = i+1 + + product_seq = numseq[i...i+digits] + product = product_seq.inject(:*) + if product > greatest_product + greatest_product = product + greatest_product_seq = product_seq + end + end + + printf("Largest product in the above series of %d consecutive digits is %s\n", digits, greatest_product_seq) + +rescue StandardError + printf("Unexpected exception occured finding largest product in X length series of Y consecutive digits\n") + printf("Usage: ruby problem08.rb \n") + +end