From f2d5c154b6020038d268007acf921787fce579af Mon Sep 17 00:00:00 2001 From: Gogs Date: Fri, 20 Jun 2014 07:25:59 -0400 Subject: [PATCH 1/4] solutions without exception handling --- README.md | 8 ++++++++ problem03.rb | 22 ++++++++++++++++++++++ problem05.rb | 45 +++++++++++++++++++++++++++++++++++++++++++++ problem08.rb | 30 ++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+) diff --git a/README.md b/README.md index 4b4187d..4d8ce36 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,10 @@ DevPreWork01 ============ +Usage: + +ruby problem03.rb + +ruby problem05.rb + +ruby problem08.rb + diff --git a/problem03.rb b/problem03.rb index e69de29..1c78645 100644 --- a/problem03.rb +++ b/problem03.rb @@ -0,0 +1,22 @@ +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 + +inp = ARGV.first.to_i +primeFactors = factorize(inp) +printf("Largest prime factor for %d is %d\n", inp, primeFactors.last) diff --git a/problem05.rb b/problem05.rb index e69de29..be4b87a 100644 --- a/problem05.rb +++ b/problem05.rb @@ -0,0 +1,45 @@ +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 + +factors = (1..ARGV[0].to_i).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); diff --git a/problem08.rb b/problem08.rb index e69de29..e47e3bb 100644 --- a/problem08.rb +++ b/problem08.rb @@ -0,0 +1,30 @@ +# generate random series of 1000 digits +series_len = ARGV[0].to_i +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 +digits = ARGV[1].to_i +i = 0 +numseq = series.split(//).map { |i| i.to_i } +product_seq = greatest_product_seq = numseq[i...digits] +product = greatest_product = product_seq.inject(:*) + +begin + #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 while i < series.length-digits + +printf("Largest product in the above series of %d consecutive digits is %s\n", digits, greatest_product_seq) + From 677d77d599110b04743be8ac1e5aefabc7cfb545 Mon Sep 17 00:00:00 2001 From: kvattikuti Date: Sat, 21 Jun 2014 16:50:28 -0400 Subject: [PATCH 2/4] solutions with exception handling --- README.md | 5 ++++- problem03.rb | 14 ++++++++++--- problem05.rb | 51 +++++++++++++++++++++++++++-------------------- problem08.rb | 56 +++++++++++++++++++++++++++++++--------------------- 4 files changed, 78 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 4d8ce36..b0dc4c7 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,12 @@ DevPreWork01 ============ Usage: +Problem#3 - Largest prime factor ruby problem03.rb -ruby problem05.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 1c78645..0612408 100644 --- a/problem03.rb +++ b/problem03.rb @@ -17,6 +17,14 @@ def factorize(input) end end -inp = ARGV.first.to_i -primeFactors = factorize(inp) -printf("Largest prime factor for %d is %d\n", inp, primeFactors.last) +begin + inp = ARGV.first.to_i + if n <= 0 + raise "Enter a non-zero positive number" + end + primeFactors = factorize(inp) + printf("Largest prime factor for %d is %d\n", inp, primeFactors.last) +rescue StandardError + printf("Unexpected exception occured finding largest prime factor! ") + printf("Usage: ruby problem03.rb \n") +end \ No newline at end of file diff --git a/problem05.rb b/problem05.rb index be4b87a..64c48e2 100644 --- a/problem05.rb +++ b/problem05.rb @@ -17,29 +17,38 @@ def factorize(input) end end -factors = (1..ARGV[0].to_i).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 +begin + n = ARGV[0].to_i + if n <= 0 + raise "Enter a number greater than 0" 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 + 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 - e_hash -end -multiple = exp_hash.inject(1) do |m, (k,v)| - m = m * (k ** v) - m + 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 -exp_hash.each_pair { |k,v| printf("%d^%d * ", k, v) } -printf(" = %d\n", multiple); diff --git a/problem08.rb b/problem08.rb index e47e3bb..5dac842 100644 --- a/problem08.rb +++ b/problem08.rb @@ -1,30 +1,40 @@ # generate random series of 1000 digits -series_len = ARGV[0].to_i -series = (1..series_len).inject("") do |s, i| - s << (48 + Random.rand(10)).chr - s -end +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) + printf("Randomly generated series of %d digits is [ %s ]\n", series_len, series) -# find the sequence -digits = ARGV[1].to_i -i = 0 -numseq = series.split(//).map { |i| i.to_i } -product_seq = greatest_product_seq = numseq[i...digits] -product = greatest_product = product_seq.inject(:*) + # 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(:*) -begin - #printf("%d %d %s %d %d \n", i, i+digits, numseq[i...i+digits], product, greatest_product) - i = i+1 + 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 while i < series.length-digits + 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) + 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 From 0ab6e448996e2214a66c1f5af865fdb45c295734 Mon Sep 17 00:00:00 2001 From: kvattikuti Date: Sat, 26 Jul 2014 18:19:30 -0400 Subject: [PATCH 3/4] module and rspec --- Problem03Module.rb | 35 +++++++++++++++++++++++++++++++++++ problem03.rb | 31 ++----------------------------- problem03_rspec.rb | 13 +++++++++++++ 3 files changed, 50 insertions(+), 29 deletions(-) create mode 100644 Problem03Module.rb create mode 100644 problem03_rspec.rb 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/problem03.rb b/problem03.rb index 0612408..1e00b3a 100644 --- a/problem03.rb +++ b/problem03.rb @@ -1,30 +1,3 @@ -require "prime" +require_relative 'Problem03Module' -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 - inp = ARGV.first.to_i - if n <= 0 - raise "Enter a non-zero positive number" - end - primeFactors = factorize(inp) - printf("Largest prime factor for %d is %d\n", inp, primeFactors.last) -rescue StandardError - printf("Unexpected exception occured finding largest prime factor! ") - printf("Usage: ruby problem03.rb \n") -end \ No newline at end of file +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..8a3017a --- /dev/null +++ b/problem03_rspec.rb @@ -0,0 +1,13 @@ +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 +end \ No newline at end of file From 0b405990cbd11bd8ea0a463594c5f49a92615edf Mon Sep 17 00:00:00 2001 From: kvattikuti Date: Sun, 27 Jul 2014 05:09:19 -0400 Subject: [PATCH 4/4] test cases --- problem03_rspec.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/problem03_rspec.rb b/problem03_rspec.rb index 8a3017a..9044eb7 100644 --- a/problem03_rspec.rb +++ b/problem03_rspec.rb @@ -10,4 +10,8 @@ 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