2016-06-25 9 views
-1

最高の製品を持つ1000桁の数字の13個の隣接する数字を探します。この製品の価値は? https://projecteuler.net/problem=8オイラー8のネストされたループのRuby正しいコード

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

コードは次のとおりです。

def largest_product_series 
    mx = 0 
    arr = data.split("") 
    arr.map!{ |x| x.to_i} 
    (arr.size - 13).times do |i| 
    0.upto(13) do |c| 
     result = arr.inject() {|sum,c | sum * arr[i + c]} 
     puts result 
     if result >= mx 
      mx = result 
     end 
    end 
    end 
    #puts "#{mx}" 
    mx 
end 

それは私が働いているオイラープロジェクト8から実際にあります。私のコードを修正し、私に助言を与えるのを助けてください、私は100桁の出力を得ています。

+0

Iあなたが '0upto(13)do | c |'( '13'は' 12'、btw)を削除し、 'result = arr [i、13] .inject(1){| prod、n | prod * n} 'を実行します。第2行と第3行を組み合わせることもできます: 'arr = data.split( '')。map(&:to_i)'。 '' sum ''はおそらく、製品を含む変数の名前にとって最良の選択ではありません。 :-) –

答えて

1

Rubyのやり方は次のとおりです。

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

    def prod(arr) 
     arr.reduce(1, :*) 
    end   

    arr = data.each_char.map(&:to_i).each_cons(13).max_by { |a| prod(a) } 
     #=> [5, 5, 7, 6, 6, 8, 9, 6, 6, 4, 8, 9, 5] 
    [arr.join, prod(arr)] 
     #=> ["5576689664895", 23514624000] 

手順は次のとおりです。例えば、

data = '731671765313326' 

data.size #=> 15)とする。次いで

b = data.each_char.map(&:to_i) 
    #=> [7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 2, 6] 
c = b.each_cons(13) 
    #=> #<Enumerator: [7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 2, 6]:each_cons(13)> 

我々は、アレイに変換することによって、この列挙子によって生成される要素を見ることができます:

c.to_a 
    #=> [[7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3], 
    # [3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 2], 
    # [1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 2, 6]] 

arr = c.max_by { |a| prod(a) } 
    #=> [7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3] 

これを計算することにより得られた:

[prod [7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3], 
prod [3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 2], 
prod [1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 2, 6]].max 
    #=> [5_000_940, 1_428_840, 2_857_680].max 
    #=> 5000940 

最後のステップ配列を返すことです

[arr.join, prod(arr)] 
    #=> [[7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3].join, 
    #=> prod([7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3])] 
    #=> ["7316717653133", 5000940] 
+0

'arr.includeの場合は0を返しますか?( '0')'⇐never matched。ここには、 'String'インスタンスが含まれているのではなく、' FixNum'をチェックする必要があります。ところで、それは早すぎる最適化です、私はすべてのためにちょうど 'reduce'と行くでしょう。 – mudasobwa

+0

@ mudasobwa、ありがとう。私は実際にあなたのコメントを見た前に '' 0 ''を '' 0 ''に変更しました。私は表現の "時期尚早の最適化"を見てきましたが、それが何を意味するのか分かりません。私はそれを確認する必要があります。私は 'reduce'に関するあなたのコメントを理解していません。 –

+1

私は、ゼロを含む入力のチェックが冗長であることを意味しました。 'reduce'はあなたのためにそれを行います。このチェックによってコードが高速化されると思うかもしれませんが、コードが実証されていない限り(コード効率のボトルネックであることが分かっていない限り)、このチェックは不要です。基本的には時期尚早最適化と呼ばれています。https://en.wikipedia.org/wiki/Program_optimization#When_to_optimize – mudasobwa

関連する問題