我目前正在解決歐拉問題以改善Haskell的過程。雖然,我的解決problem n° 43的嘗試沒有輸出。項目歐拉43:我的嘗試沒有輸出
要說清楚,即使我錯了,我也不會要求「問題算法」部分的幫助。我特別要求在Haskell部分提供幫助。
所以,我將我的嘗試分爲簡單的功能。首先,我建立一個列表,保存所有0-9pandigital號碼,然後我定義功能削減這些數字到了有趣的部分,最後我只能過濾正確的:
import Data.List
main = print $ foldl1 (+) goodOnes
pands = [read x :: Integer | x <- permutations "", head x /= '0']
cut3from :: Integer -> Integer -> Integer
cut3from x n = mod (div x nd) 1000
where
l = fromIntegral $ length $ show x :: Integer
nd = 10^(l - 3 - n)
cut :: Integer -> [Integer]
cut x = map (cut3from x) [1..7]
testDiv :: Integral a => [a] -> Bool
testDiv l = and zipped
where
zipped = zipWith mult l [2, 3, 5, 7, 11, 13, 17]
mult :: Integral a => a -> a -> Bool
mult a b = mod a b == 0
goodOnes = filter (testDiv.cut) pands
雖然,編譯它(與-O2
)和時執行它,它什麼都不輸出。即使與+RTS -s
。
我想兩點主要的建議是:
- 爲什麼這是錯的代碼,如何提高它
- 我怎麼可能已經調試它自己
- 作爲麪點,如果你對如何輕鬆處理Integer和Ints提出建議,請張貼它們。我覺得把兩者結合起來很麻煩。
但是歡迎任何其他評論!
編輯:它似乎GHCi緩慢建立結果列表goodOnes,並能夠在很長時間後回答(只有在GHCi,編譯時仍然如報道)。這當然不是我想要在我的程序中觀察到的行爲。我怎麼能解決這個問題?
編輯2:它現在也編譯時也工作(代碼不變)。我對所有這些不一致感到困惑,並歡迎任何解釋!
EDIT3:semihappy結束:在重新啓動後,都去恢復正常~~
@Mog - 當您從ghci的'main'會發生什麼? – 2012-03-22 16:35:39
@Mog是當你觀察「無輸出」時加載你的CPU嗎?這可能是因爲你的搜索算法非常慢。 – ulidtko 2012-03-22 17:05:22
@MattFenwick:看起來在重新啓動後,所有事情都很好。無論如何感謝您的時間! – m09 2012-03-22 22:52:27