Problem 8
以下の1000桁の数字から5つの連続する数字を取り出してその積を計算する。そのような積の中で最大のものの値はいくらか
73167176531330624919225119674426574742355349194934
Problem 8 - PukiWiki
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450
ちょっと桁が大きくて数字として扱うとめんどくさそうなので文字列として読み込んでから数字の配列に変換する方針で。
Ruby
str = <<NUMBERS 7316717653133062491922511967442657474235534919493496983520312774506326239578318\ 0169848018694788518438586156078911294949545950173795833195285320880551112540698\ 7471585238630507156932909632952274430435576689664895044524452316173185640309871\ 1121722383113622298934233803081353362766142828064444866452387493035890729629049\ 1560440772390713810515859307960866701724271218839987979087922749219016997208880\ 9377665727333001053367881220235421809751254540594752243525849077116705560136048\ 3958644670632441572215539753697817977846174064955149290862569321978468622482839\ 7224137565705605749026140797296865241453510047482166370484403199890008895243450\ 6585412275886668811642717147992444292823086346567481391912316282458617866458359\ 1245665294765456828489128831426076900422421902267105562632111110937054421750694\ 1658960408071984038509624554443629812309878799272442849091888458015616609791913\ 3875499200524063689912560717606058861164671094050775410022569831552000559357297\ 2571636269561882670428252483600823257530420752963450 NUMBERS nums = str.split(//).map{|i|i.to_i} x = 0 for i in 0..(str.length-5) do n = nums[i]*nums[i+1]*nums[i+2]*nums[i+3]*nums[i+4] if n > x then x = n end end puts x
何も考えないでコードを書くとCっぽくなってしまう手続き型脳…
R
str <- "73167176531330624919225119674426574742355349194934969835203127745063262\ 3957831801698480186947885184385861560789112949495459501737958331952853208805511\ 1254069874715852386305071569329096329522744304355766896648950445244523161731856\ 4030987111217223831136222989342338030813533627661428280644448664523874930358907\ 2962904915604407723907138105158593079608667017242712188399879790879227492190169\ 9720888093776657273330010533678812202354218097512545405947522435258490771167055\ 6013604839586446706324415722155397536978179778461740649551492908625693219784686\ 2248283972241375657056057490261407972968652414535100474821663704844031998900088\ 9524345065854122758866688116427171479924442928230863465674813919123162824586178\ 6645835912456652947654568284891288314260769004224219022671055626321111109370544\ 2175069416589604080719840385096245544436298123098787992724428490918884580156166\ 0979191338754992005240636899125607176060588611646710940507754100225698315520005\ 593572972571636269561882670428252483600823257530420752963450" nums <- mapply(as.numeric, strsplit(str,NULL)) print(max(mapply(function(n){prod(nums[n:(n+4)])},1:(length(nums)-4))))
Rubyのコードを反省して色々変えた。まぁやってる事は同じですけど。
Haskell
import Char str = "731671765313306249192251196744265747423553491949349698352031277450632623\ 9578318016984801869478851843858615607891129494954595017379583319528532088055111\ 2540698747158523863050715693290963295227443043557668966489504452445231617318564\ 0309871112172238311362229893423380308135336276614282806444486645238749303589072\ 9629049156044077239071381051585930796086670172427121883998797908792274921901699\ 7208880937766572733300105336788122023542180975125454059475224352584907711670556\ 0136048395864467063244157221553975369781797784617406495514929086256932197846862\ 2482839722413756570560574902614079729686524145351004748216637048440319989000889\ 5243450658541227588666881164271714799244429282308634656748139191231628245861786\ 6458359124566529476545682848912883142607690042242190226710556263211111093705442\ 1750694165896040807198403850962455444362981230987879927244284909188845801561660\ 9791913387549920052406368991256071760605886116467109405077541002256983155200055\ 93572972571636269561882670428252483600823257530420752963450" main = print $ maximum $ f [] nums where f a b | length b < 5 = a | otherwise = f (a++[product $ take 5 b]) $ tail b nums = map digitToInt str
maximumをmaxと書いてしまう罠にはまって5分程度無駄にした…