$ 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


Reply via email to