2017-03-24 7 views
0

私はthisを解決しようとしましたが、以下は試行品です。私のコードでIOがフラッシュされないのはなぜですか?

これをghciでhSetBuffering stdout NoBuffering,solveAct 1,15 10とテストすると、ghciは数行の結果を示し、多くの時間をブロックし、一度に残りの結果を示しました。

どのようにしてリアルタイムで中間結果を確認できますか?リアルタイムで結果を見て

import Control.Monad 
import Data.List 
import Data.Maybe 
import System.IO 

readInts = fmap read . words <$> getLine :: IO [Int] 

main = do 
    t <- readLn :: IO Int 
    hSetBuffering stdout NoBuffering 
    sequence_ $ solveAct <$> [1..t] 

showTable x = intercalate "\n" $ intercalate " " . fmap show <$> x 

solveAct i = do 
    [j, n] <- readInts 
    putStrLn $ "Case #" ++ show i ++ ":" 
    putStrLn $ showTable (take n $ solve (j-1)) 

digits n = [[x^y | y <- [1..n-1]] | x <- [2..10]] 

primes = 2 : [x | x <- [3,5..], all (\y -> x `rem` y /= 0) $ takeWhile (<= intSqrt x) primes] 

intSqrt = floor . sqrt . fromIntegral 
getNDivisor n = listToMaybe [x | x <- takeWhile (<= intSqrt n) primes, n `rem` x == 0] 

casesOfMat = subsequences . transpose . digits 
casesOfJam n = fmap ([1 + x^n | x <- [2..10]]:) $ casesOfMat n 
eachBaseReps n = fmap sum . transpose <$> casesOfJam n 

solve :: Int -> [[Int]] 
solve n = do 
    decimals <- eachBaseReps n 
    let divs = getNDivisor <$> decimals 
    guard $ all isJust divs 
    return $ last decimals : catMaybes divs 
+0

'sequence :: [Maybe a] - > Maybe [a]'が好きかもしれません。入力のすべての要素が 'Just'であるときに' Just xs'を正確に返します。次に、 'all isJust'チェックと' catMaybes'オペレーションを単一の 'case'オペレーションにラップすることができます。 –

答えて

1

あなたあるall isJust . map getNDivisorの計算では、eachBaseReps 14の3番目の要素に長い時間がかかります。

+0

お返事ありがとうございました。あなたは正しいです、私は質問があります。それはCコードだった場合、私はデバッグ中に一時停止を使用することができます。これには特派員がいますか? – jeiea

+0

@jeiea ghciにはデバッガが内蔵されています。このマニュアルでは、使用方法をよく紹介していますので、ぜひチェックしてください。あなたの正確な質問に関しては 'threadDelay'がありますが、' IO'の中にあり、純粋なコードでは使用できません。 –

関連する問題