Skip to content

Instantly share code, notes, and snippets.

@tinomen
Last active December 15, 2015 11:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tinomen/5250253 to your computer and use it in GitHub Desktop.
Save tinomen/5250253 to your computer and use it in GitHub Desktop.
2013-03 slc.rb problem 1
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
@coderberry
Copy link

ret = %w{
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450
}.join

def get_product(nums)
  nums.inject(1) {|product, n| product * n }
end

max_product = 0
max_nums = ""

i = 0
loop do
  nums = ret.slice(i,5)
  if nums.length < 5
    break
  end
  arr = nums.split('').map(&:to_i)
  product = get_product(arr)
  if product > max_product
    max_product = product
    max_nums = nums
  end
  puts "#{nums} : #{product}"
  i += 1
end

puts "MAX PROD: #{max_product}"
puts "MAX NUMS: #{max_nums}"

@cwoodcox
Copy link

number = File.readlines(ARGV.first).join

puts( (0..number.length - 4).inject(0) do |high,index|
  current = number[index].to_i * number[index + 1].to_i * number[index + 2].to_i * number[index + 3].to_i * number[index + 4].to_i 
  current > high ? current : high
end)

@cmaxw
Copy link

cmaxw commented Mar 27, 2013

str = "73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450".split("/n").join.split("").map(&:to_i)

puts 0.upto(str.length).inject do |prod, index|
  this_prod = str[index, 5].inject(1) {|memo, el| memo*el}
  this_prod > prod ? this_prod : prod
end

@dandorman
Copy link

With Jason Staten.

p DATA.read.scan(/\d/).map(&:to_i).each_cons(5).reduce(0) { |largest, digits| [largest, digits.reduce(:*)].max }

__END__
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

@rickarubio
Copy link

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

@aamax
Copy link

aamax commented Mar 27, 2013

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)

@statianzo
Copy link

# 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

@phaedryx
Copy link

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

@scizo
Copy link

scizo commented Mar 27, 2013

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

@scizo
Copy link

scizo commented Mar 27, 2013

@statianzo, I wish ruby had tail call optimization.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment