Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
12
Task/Best-shuffle/Haskell/best-shuffle-1.hs
Normal file
12
Task/Best-shuffle/Haskell/best-shuffle-1.hs
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
shufflingQuality l1 l2 = length $ filter id $ zipWith (==) l1 l2
|
||||
|
||||
printTest prog = mapM_ test texts
|
||||
where
|
||||
test s = do
|
||||
x <- prog s
|
||||
putStrLn $ unwords $ [ show s
|
||||
, show x
|
||||
, show $ shufflingQuality s x]
|
||||
texts = [ "abba", "abracadabra", "seesaw", "elk" , "grrrrrr"
|
||||
, "up", "a", "aaaaa.....bbbbb"
|
||||
, "Rosetta Code is a programming chrestomathy site." ]
|
||||
20
Task/Best-shuffle/Haskell/best-shuffle-2.hs
Normal file
20
Task/Best-shuffle/Haskell/best-shuffle-2.hs
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
import Data.Vector ((//), (!))
|
||||
import qualified Data.Vector as V
|
||||
import Data.List (delete, find)
|
||||
|
||||
swapShuffle :: Eq a => [a] -> [a] -> [a]
|
||||
swapShuffle lref lst = V.toList $ foldr adjust (V.fromList lst) [0..n-1]
|
||||
where
|
||||
vref = V.fromList lref
|
||||
n = V.length vref
|
||||
adjust i v = case find alternative [0.. n-1] of
|
||||
Nothing -> v
|
||||
Just j -> v // [(j, v!i), (i, v!j)]
|
||||
where
|
||||
alternative j = and [ v!i == vref!i
|
||||
, i /= j
|
||||
, v!i /= vref!j
|
||||
, v!j /= vref!i ]
|
||||
|
||||
shuffle :: Eq a => [a] -> [a]
|
||||
shuffle lst = swapShuffle lst lst
|
||||
11
Task/Best-shuffle/Haskell/best-shuffle-3.hs
Normal file
11
Task/Best-shuffle/Haskell/best-shuffle-3.hs
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
perfectShuffle :: [a] -> [a]
|
||||
perfectShuffle [] = []
|
||||
perfectShuffle lst | odd n = b : shuffle (zip bs a)
|
||||
| even n = shuffle (zip (b:bs) a)
|
||||
where
|
||||
n = length lst
|
||||
(a,b:bs) = splitAt (n `div` 2) lst
|
||||
shuffle = foldMap (\(x,y) -> [x,y])
|
||||
|
||||
shuffleP :: Eq a => [a] -> [a]
|
||||
shuffleP lst = swapShuffle lst $ perfectShuffle lst
|
||||
1
Task/Best-shuffle/Haskell/best-shuffle-4.hs
Normal file
1
Task/Best-shuffle/Haskell/best-shuffle-4.hs
Normal file
|
|
@ -0,0 +1 @@
|
|||
import Control.Monad.Random (getRandomR)
|
||||
10
Task/Best-shuffle/Haskell/best-shuffle-5.hs
Normal file
10
Task/Best-shuffle/Haskell/best-shuffle-5.hs
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
randomShuffle :: [a] -> IO [a]
|
||||
randomShuffle [] = return []
|
||||
randomShuffle lst = do
|
||||
i <- getRandomR (0,length lst-1)
|
||||
let (a, x:b) = splitAt i lst
|
||||
xs <- randomShuffle $ a ++ b
|
||||
return (x:xs)
|
||||
|
||||
shuffleR :: Eq a => [a] -> IO [a]
|
||||
shuffleR lst = swapShuffle lst <$> randomShuffle lst
|
||||
25
Task/Best-shuffle/Haskell/best-shuffle-6.hs
Normal file
25
Task/Best-shuffle/Haskell/best-shuffle-6.hs
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
{-# LANGUAGE TupleSections, LambdaCase #-}
|
||||
import Conduit
|
||||
import Control.Monad.Random (getRandomR)
|
||||
import Data.List (delete, find)
|
||||
|
||||
shuffleC :: Eq a => Int -> Conduit a IO a
|
||||
shuffleC 0 = awaitForever yield
|
||||
shuffleC k = takeC k .| sinkList >>= \v -> delay v .| randomReplace v
|
||||
|
||||
delay :: Monad m => [a] -> Conduit t m (a, [a])
|
||||
delay [] = mapC $ \x -> (x,[x])
|
||||
delay (b:bs) = await >>= \case
|
||||
Nothing -> yieldMany (b:bs) .| mapC (,[])
|
||||
Just x -> yield (b, [x]) >> delay (bs ++ [x])
|
||||
|
||||
randomReplace :: Eq a => [a] -> Conduit (a, [a]) IO a
|
||||
randomReplace vars = awaitForever $ \(x,b) -> do
|
||||
y <- case filter (/= x) vars of
|
||||
[] -> pure x
|
||||
vs -> lift $ (vs !!) <$> getRandomR (0, length vs - 1)
|
||||
yield y
|
||||
randomReplace $ b ++ delete y vars
|
||||
|
||||
shuffleW :: Eq a => Int -> [a] -> IO [a]
|
||||
shuffleW k lst = yieldMany lst =$= shuffleC k $$ sinkList
|
||||
4
Task/Best-shuffle/Haskell/best-shuffle-7.hs
Normal file
4
Task/Best-shuffle/Haskell/best-shuffle-7.hs
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
import Data.ByteString.Builder (charUtf8)
|
||||
import Data.ByteString.Char8 (ByteString, unpack, pack)
|
||||
import Data.Conduit.ByteString.Builder (builderToByteString)
|
||||
import System.IO (stdin, stdout)
|
||||
13
Task/Best-shuffle/Haskell/best-shuffle-8.hs
Normal file
13
Task/Best-shuffle/Haskell/best-shuffle-8.hs
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
shuffleBS :: Int -> ByteString -> IO ByteString
|
||||
shuffleBS n s =
|
||||
yieldMany (unpack s)
|
||||
=$ shuffleC n
|
||||
=$ mapC charUtf8
|
||||
=$ builderToByteString
|
||||
$$ foldC
|
||||
|
||||
main :: IO ()
|
||||
main =
|
||||
sourceHandle stdin
|
||||
=$ mapMC (shuffleBS 10)
|
||||
$$ sinkHandle stdout
|
||||
Loading…
Add table
Add a link
Reference in a new issue