User talk:Gaaijz: Difference between revisions
(→Zigzag: improved version) |
|||
Line 12: | Line 12: | ||
== Zigzag == |
== Zigzag == |
||
Two different approaches with Haskell for the zigzag task. |
Two different approaches with Haskell for the zigzag task. |
||
⚫ | |||
flist = map (:[]) |
|||
⚫ | |||
elist = cycle [[]] |
|||
⚫ | |||
⚫ | |||
transp_wof = unfoldr (\xs -> if null xs then Nothing else Just $ next xs) |
|||
next xs = (,) (concatMap (take 1) ks) ((map (drop 1) $ drop 1 ks) ++ ts) |
|||
where (ks,ts) = splitAt n xs |
|||
zigzag m n = transpose. map concat. transpose |
|||
. uncurry ((.(map (liftM2 (++) ((`take`elist).(`subtract`n).length) flist))).(++) |
|||
.(map (liftM2 (++) flist ((`take`elist).(`subtract`n).length)))) |
|||
$ splitAt k revcs |
|||
where |
|||
k = truncate . sqrt . fromIntegral $ (m*n) |
|||
⚫ | |||
nd = abs (m-n) |
|||
⚫ | |||
⚫ | |||
⚫ | |||
:Slower version, almost complete emulation of the J-solution |
:Slower version, almost complete emulation of the J-solution |
||
groupon f x y= f x == f y |
groupon f x y= f x == f y |
Revision as of 16:05, 12 September 2008
welcome!
Welcome to Rosetta Code! If you have any questions, drop them in the appropriate talk page, and someone will get back to you. If you have a more general question, try Mwn3d's or my talk pages. --Short Circuit 04:10, 2 September 2008 (UTC)
Jers
Hey Arie. This is Dan Bron from the J forums. Tracy Harms is here too. It's good to have J representation on RosettaCode. I'm glad you posted a J solution to the Pyramid of Numbers, that was near the top of my to do list. Have you considered posting a task along the lines of your Rabbit Sequence?
Oh, by the way, I linkified your user page. I hope you don't mind. Go ahead and revert it if you like it better the other way.
DanBron 13:48, 2 September 2008 (UTC)
Zigzag
Two different approaches with Haskell for the zigzag task.
zigzag m n = take m .transp_wof $ zipWith id (cycle [reverse,id]) antiDiags where mmn = min m n antiDiags = unfoldr (\((c:cs),xs) -> if null xs then Nothing else Just (take c xs,(cs,drop c xs))) ([1..mmn-1]++(replicate (succ.abs $ m-n) mmn)++[mmn-1,mmn-2..0], [0..m*n-1]) transp_wof = unfoldr (\xs -> if null xs then Nothing else Just $ next xs) next xs = (,) (concatMap (take 1) ks) ((map (drop 1) $ drop 1 ks) ++ ts) where (ks,ts) = splitAt n xs
- Slower version, almost complete emulation of the J-solution
groupon f x y= f x == f y tab n = fst . until (null.snd) (\(xs,ys)-> (xs++[take n ys], drop n ys)) . (,) [] grade xs = map snd. sort $ zip xs [0..] zigzagJ m n = tab n. grade .concat $ zipWith id (cycle [reverse,id]) fdiag where fdiag = map (map snd). groupBy (groupon fst).sortBy (comparing fst) $ zip (map sum $ sequence [[0..m-1],[0..n-1]] ) [0..]
*Main> sum.map sum $ zigzag 500 500 1185103928 (0.69 secs, 103908376 bytes) *Main> sum.map sum $ zigzagJ 500 500 31249875000 (4.55 secs, 575802084 bytes)