2012-03-22 46 views
1

我目前正在解決歐拉問題以改善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結束:在重新啓動後,都去恢復正常~~

回答

2

要回答 「怎麼可能我已經調試它自己」:

退房ghci的。

prompt$ ghci 
GHCi, version 6.12.3: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Loading package ffi-1.0 ... linking ... done. 
Prelude> 

這是一個互動的解釋,使您可以:

  • 加載文件和定義與內容播放

    Prelude> :load myfile.hs 
    [1 of 1] Compiling Main    (myfile.hs, interpreted) 
    Ok, modules loaded: Main. 
    *Main> xyz "abc" 
    *Main> 3 
    
  • 類型和使用它們

    *Main> let f x = x + 3 
    
  • 計算表達式,並查看結果

    *Main> f 14 
    17 
    
  • 檢查類型和種類

    *Main> :t f 
    f :: (Num a) => a -> a 
    
    *Main> :k Maybe 
    Maybe :: * -> * 
    

確保您測試每個小塊的你測試整個事情之前 - 它更容易找到小東西比大東西存在問題。如果您正在進行單元測試,請查看QuickCheck

對於Int s與Integer的問題,您可以通過僅使用Integer s來回避問題(當然,它們可能效率較低:YMMV)。 Data.List具有以generic爲前綴的功能,即genericLength,這是非常有用的。


以下是我編譯並運行它:

prompt$ ghc euler43.hs 
prompt$ ./a.out 
<some number is printed out> 
+0

@Mog - 當您從ghci的'main'會發生什麼? – 2012-03-22 16:35:39

+0

@Mog是當你觀察「無輸出」時加載你的CPU嗎?這可能是因爲你的搜索算法非常慢。 – ulidtko 2012-03-22 17:05:22

+0

@MattFenwick:看起來在重新啓動後,所有事情都很好。無論如何感謝您的時間! – m09 2012-03-22 22:52:27