$ ghc -O -O2-for-C -fvia-c -o teiler teiler.hs
panic! (the `impossible' happened):
funResultTy t{-r270-}
Please report it as a compiler bug to [EMAIL PROTECTED]
$ gcc -dumpversion
2.95.2
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 4.05, patchlevel
0
it works without -O, doesn't with -O2
cu, Robert
--
Join the best: news://tui.programming_contest
http://www.tu-ilmenau.de/~robertw/icpc
main = einzeln $ numslist $ genlist []
einzeln (x:xs) = do
print x
getLine
einzeln xs
sonst = True
primes :: Integral a => [a]
primes = map head (iterate sieve [2..])
sieve (p:xs) = [ x | x<-xs, x `rem` p /= 0 ]
type Forest a = [Tree a]
data Tree a = Tree a (Forest a) deriving (Show, Eq, Ord)
generate ps = Tree (zahl ps, teiler ps) (map generate pss)
where pss = filter sorted $ zipWith inc_ith [1..length ps +1] (repeat ps)
inc_ith 1 [] = [1]
inc_ith 1 (x:xs) = x+1 : xs
inc_ith n (x:xs) = x : inc_ith (n-1) xs
-- Liste kann h�chstens um 1 k�rzer sein, als n
sorted [] = True
sorted [x] = True
sorted (x:y:xs) = (x>=y) && (sorted (y:xs))
zahl ps = product $ zipWith (^) primes ps
teiler ps = product $ map (+1) ps
nums (Tree x@(_,n) ts) = x : (nums $ purge (\(_,xn) -> xn<=n) $ reTree ts)
purge :: Ord a => (a->Bool) -> Tree a -> Tree a
{- Knoten, die p erf�llen, werden unter Nachrutschen entfernt -}
purge p (Tree x ts) | p x = reTree rs
| sonst = Tree x rs
where rs = map (purge p) ts
reTree :: Ord a => Forest a -> Tree a
{- kleinste Wurzel der Teilb�ume wird die gemeinsame Wurzel -}
reTree ts = Tree min $ map (plop min) ts
where min = minimum $ map (\(Tree x _) -> x) ts
plop m t@(Tree x ts) | m==x = reTree ts
| sonst = t
-- try: nums $ generate []
genlist ps = (zahl ps, teiler ps) : foldl merge [] (map genlist pss)
where pss = filter sorted $ zipWith inc_ith [1..length ps +1] (repeat ps)
inc_ith 1 [] = [1]
inc_ith 1 (x:xs) = x+1 : xs
inc_ith n (x:xs) = x : inc_ith (n-1) xs
-- Liste kann h�chstens um 1 k�rzer sein, als n
merge [] ys = ys
merge xs [] = xs
merge (x:xs) (y:ys) | x==y = x : merge xs ys
| x<y = x : merge xs (y:ys)
| sonst = y : merge (x:xs) ys
numslist (x@(_,n): xs) = x : (numslist $ filter ( \(_,xn) -> xn>n ) xs)
-- Versuchsfunktionen
-- Wie oft ist p als Faktor in x enthalten?
drin x p | mod x p == 0 = 1+ drin (div x p) p
| sonst = 0
purgeh h (Tree x []) = Tree x []
purgeh 0 (Tree x _) = Tree 0 []
purgeh h (Tree x ts) = Tree x $ map (purgeh (h-1)) ts
gen :: Int -> Tree Int
gen 0 = Tree 1 []
gen n = Tree (n+1) $ map gen [0..div n 2]
suml (Tree x []) = x
suml (Tree x ts) = sum $ map suml ts
verteile n k = suml $ purgeh k $ gen n