-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprob8.rb
99 lines (77 loc) · 3.89 KB
/
prob8.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# Find the greatest product of five consecutive digits in the 1000-digit number.
#
# 73167176531330624919225119674426574742355349194934
# 96983520312774506326239578318016984801869478851843
# 85861560789112949495459501737958331952853208805511
# 12540698747158523863050715693290963295227443043557
# 66896648950445244523161731856403098711121722383113
# 62229893423380308135336276614282806444486645238749
# 30358907296290491560440772390713810515859307960866
# 70172427121883998797908792274921901699720888093776
# 65727333001053367881220235421809751254540594752243
# 52584907711670556013604839586446706324415722155397
# 53697817977846174064955149290862569321978468622482
# 83972241375657056057490261407972968652414535100474
# 82166370484403199890008895243450658541227588666881
# 16427171479924442928230863465674813919123162824586
# 17866458359124566529476545682848912883142607690042
# 24219022671055626321111109370544217506941658960408
# 07198403850962455444362981230987879927244284909188
# 84580156166097919133875499200524063689912560717606
# 05886116467109405077541002256983155200055935729725
# 71636269561882670428252483600823257530420752963450
# ================================== Utils ===================================
def input_string
result = "73167176531330624919225119674426574742355349194934"
result += "96983520312774506326239578318016984801869478851843"
result += "85861560789112949495459501737958331952853208805511"
result += "12540698747158523863050715693290963295227443043557"
result += "66896648950445244523161731856403098711121722383113"
result += "62229893423380308135336276614282806444486645238749"
result += "30358907296290491560440772390713810515859307960866"
result += "70172427121883998797908792274921901699720888093776"
result += "65727333001053367881220235421809751254540594752243"
result += "52584907711670556013604839586446706324415722155397"
result += "53697817977846174064955149290862569321978468622482"
result += "83972241375657056057490261407972968652414535100474"
result += "82166370484403199890008895243450658541227588666881"
result += "16427171479924442928230863465674813919123162824586"
result += "17866458359124566529476545682848912883142607690042"
result += "24219022671055626321111109370544217506941658960408"
result += "07198403850962455444362981230987879927244284909188"
result += "84580156166097919133875499200524063689912560717606"
result += "05886116467109405077541002256983155200055935729725"
result += "71636269561882670428252483600823257530420752963450"
result
end
def convert_to_fixnum_array num_string
num_string.split('').map(&:to_i)
end
def compute_product_of_five_tuples num_array
result = []
iterations = num_array.length - 4
return result if iterations < 1
iterations.times do |index|
last_index = index + 4
product = num_array[index..last_index].inject &:*
result.push(product)
end
result
end
# ================================= Solution ==================================
# First pass: build the naive implementation: step through each grouping of 5
# digits, starting with the first 5. This would give 996
# multiplication-of-five-numbers to perform (my first estimate was 200)
target = input_string
input_digit_array = convert_to_fixnum_array(target)
input_products = compute_product_of_five_tuples input_digit_array
puts input_products.length
result = input_products.max
puts "The largest product of 5 consecutive digits of the input string is: #{result}"
# ========================== Potential improvements ===========================
# Since a grouping including a zero automatically results in the least possible
# product, this large number can be split up, using the zeroes as delimiters.
# At first glance, this looks like a huge reduction in the number of
# multiplications needed.
# A better implementation might memoize multiplications, since any 3
# consecutive digits will be used in 3 separate calculations, but perhaps YAGNI