-
-
Save tinomen/5250253 to your computer and use it in GitHub Desktop.
Find the greatest product of five consecutive digits in the 1000-digit number. | |
Make a program that recieves a string of numbers (see below) and outputs the answer | |
73167176531330624919225119674426574742355349194934 | |
96983520312774506326239578318016984801869478851843 | |
85861560789112949495459501737958331952853208805511 | |
12540698747158523863050715693290963295227443043557 | |
66896648950445244523161731856403098711121722383113 | |
62229893423380308135336276614282806444486645238749 | |
30358907296290491560440772390713810515859307960866 | |
70172427121883998797908792274921901699720888093776 | |
65727333001053367881220235421809751254540594752243 | |
52584907711670556013604839586446706324415722155397 | |
53697817977846174064955149290862569321978468622482 | |
83972241375657056057490261407972968652414535100474 | |
82166370484403199890008895243450658541227588666881 | |
16427171479924442928230863465674813919123162824586 | |
17866458359124566529476545682848912883142607690042 | |
24219022671055626321111109370544217506941658960408 | |
07198403850962455444362981230987879927244284909188 | |
84580156166097919133875499200524063689912560717606 | |
05886116467109405077541002256983155200055935729725 | |
71636269561882670428252483600823257530420752963450 |
find the greatest product of five consecutive digits int he 1000 digits number
This will hold the result of each 5 digit chunk of numbers from the string of numbers
arrayOfValues = []
stringOfNumbers = "73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450".split("\n").join
^ put into array, then join into a single string
stringOfNumbers.length # counting from 1 not 0, number of chars in the string
array range will be 0..length
arrayOfValues = (0..stringOfNumbers.length).map do |index|
chunk = stringOfNumbers.slice(index, 5)
if chunk.length == 5
product = 1
(0..4).each do |digit|
currentDigit = chunk.slice(digit, 1).to_i
product *= currentDigit
end
product # this is being placed into the array due to .map
end
end
compact removes the nil values
puts arrayOfValues.compact.max # check the array elements, find the highest value element
This is Matt and Max's solution:
describe "greatest product" do
context "calc method" do
it "should return product of 5 digits" do
str = "12345"
val = 1 * 2 * 3 * 4 * 5
calc_product(str).should == val
end
it "should iterate through list 5 char chunks of a str" do
str = "23456"
lists = get_str_lists(str)
lists.length.should == 1
lists[0].should == str
end
it "should iterate through list 5 char chunks of a str" do
str = "23456789"
lists = get_str_lists(str)
lists.length.should == 4
lists[0].should == "23456"
lists[1].should == '34567'
lists[2].should == '45678'
lists[3].should == '56789'
end
it "should return the largest value" do
str = "23456789"
val = 5*6*7*8*9
run(str).should == val
end
end
end
def get_str_lists(str)
list = []
index = 0
while index <= str.length-5
list << str.slice(index, 5)
index += 1
end
list
end
def calc_product(str)
start_idx = 0
i=1
str.split('').each{|ii| i = i*ii.to_i}
i
end
def run(str)
lists = get_str_lists(str)
val = 0
lists.each do |l|
tmp = calc_product(l)
if tmp > val
val = tmp
end
end
val
end
puts run("73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450".strip)
# Decompose first arg into first five elements a,b,c,d,e
# and xs is the remaining elements
def products ((a,b,c,d,e,*xs), hi)
return hi if e.nil? #return hi if we only have 4 elements left
prod = [a,b,c,d,e].reduce(&:*) #Multiply a, b, c, d, and e
# Recursively call products
# Passing the first arg with one less element
# And the max of prod or hi
products([b,c,d,e]+xs, [prod, hi].max)
end
# Map the characters into ints
ints = DATA.read.chars.map(&:to_i)
# Call products with the ints and initial max of 0
p products(ints, 0)
# Everything after __END__ is available as DATA
__END__
7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450
ubernumber =
"73167176531330624919225119674426574742355349194934"+
"96983520312774506326239578318016984801869478851843"+
"85861560789112949495459501737958331952853208805511"+
"12540698747158523863050715693290963295227443043557"+
"66896648950445244523161731856403098711121722383113"+
"62229893423380308135336276614282806444486645238749"+
"30358907296290491560440772390713810515859307960866"+
"70172427121883998797908792274921901699720888093776"+
"65727333001053367881220235421809751254540594752243"+
"52584907711670556013604839586446706324415722155397"+
"53697817977846174064955149290862569321978468622482"+
"83972241375657056057490261407972968652414535100474"+
"82166370484403199890008895243450658541227588666881"+
"16427171479924442928230863465674813919123162824586"+
"17866458359124566529476545682848912883142607690042"+
"24219022671055626321111109370544217506941658960408"+
"07198403850962455444362981230987879927244284909188"+
"84580156166097919133875499200524063689912560717606"+
"05886116467109405077541002256983155200055935729725"+
"71636269561882670428252483600823257530420752963450"
highest = 0
ubernumber.scan(/./).each_cons(5) do |group|
product = group.map(&:to_i).reduce(:*)
highest = product > highest ? product : highest
end
puts highest
numbers = <<CODE.gsub /\s*/, ''
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450
CODE
puts numbers.split('').map(&:to_i).each_cons(5).map{|a| a.reduce(:*)}.max
@statianzo, I wish ruby had tail call optimization.
With Jason Staten.