misc: add more scripts
This commit is contained in:
56
misc/Alliterations.hs
Normal file
56
misc/Alliterations.hs
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
|
import Control.Arrow ((>>>), (&&&), (***))
|
||||||
|
import Data.Char (isPunctuation)
|
||||||
|
import Data.List
|
||||||
|
import Options.Applicative
|
||||||
|
import Text.Printf
|
||||||
|
import qualified Data.Text as T
|
||||||
|
import qualified Data.Text.IO as T
|
||||||
|
|
||||||
|
import Stopwords
|
||||||
|
|
||||||
|
slidingWindow :: Int -> [a] -> [[a]]
|
||||||
|
slidingWindow n xs
|
||||||
|
| n > length xs = []
|
||||||
|
| otherwise = take n xs : slidingWindow n (tail xs)
|
||||||
|
|
||||||
|
alliterations :: Language -> T.Text -> [T.Text]
|
||||||
|
alliterations language =
|
||||||
|
cleanUp language
|
||||||
|
>>> filter containsAlliteration >>>
|
||||||
|
map (T.intercalate " ")
|
||||||
|
|
||||||
|
cleanUp language =
|
||||||
|
T.filter (not.isPunctuation)
|
||||||
|
>>> T.toLower
|
||||||
|
>>> T.words
|
||||||
|
>>> filter (`notElem` stopwords language)
|
||||||
|
>>> slidingWindow 2
|
||||||
|
|
||||||
|
containsAlliteration :: [T.Text] -> Bool
|
||||||
|
containsAlliteration = map T.head >>> ((nub >>> length) &&& length) >>> uncurry (<)
|
||||||
|
|
||||||
|
measure :: Num a => Language -> T.Text -> (a, a)
|
||||||
|
measure language = (alliterations language &&& cleanUp language) >>> (genericLength *** genericLength)
|
||||||
|
|
||||||
|
data Mode = Alliterations | Statistics
|
||||||
|
|
||||||
|
mode :: Parser (Language, Mode)
|
||||||
|
mode =
|
||||||
|
(,)
|
||||||
|
<$> ((English <$ switch (long "english" <> help "Cut out english stopwords"))
|
||||||
|
<|> (German <$ switch (long "german" <> help "Cut out german stopwords"))
|
||||||
|
<|> pure NoLanguage)
|
||||||
|
<*> ((Alliterations <$ switch (long "alliterations" <> short 'a' <> help "List all alliterations"))
|
||||||
|
<|> (Statistics <$ switch (long "statistics" <> short 's' <> help "Show statistics (quota)")))
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = execParser options >>= \(language, mode) ->
|
||||||
|
case mode of
|
||||||
|
Alliterations ->
|
||||||
|
T.interact $ T.unlines . alliterations language
|
||||||
|
Statistics -> T.interact $ \text ->
|
||||||
|
let (als, ws) = measure language text :: (Int, Int)
|
||||||
|
in T.pack (printf "Bigrams found: %u\nAlliterations found: %u\n\n%.2f%%\n" ws als (100 * fromIntegral als/fromIntegral ws :: Double))
|
||||||
|
where options = info (mode <**> helper) (fullDesc <> progDesc "finds alliterations and there density in German texts")
|
||||||
37
misc/Clock.hs
Normal file
37
misc/Clock.hs
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
module Clock where
|
||||||
|
|
||||||
|
newtype Angle = Angle
|
||||||
|
{ degrees :: Double
|
||||||
|
}
|
||||||
|
|
||||||
|
instance Show Angle where
|
||||||
|
show alpha = show (degrees alpha) ++ "°"
|
||||||
|
|
||||||
|
data Clock = Clock
|
||||||
|
{ hourHand :: Angle
|
||||||
|
, minuteHand :: Angle
|
||||||
|
}
|
||||||
|
|
||||||
|
instance Show Clock where
|
||||||
|
show (Clock h m) = show (h, m)
|
||||||
|
|
||||||
|
data Time = Time
|
||||||
|
{ hour :: Int
|
||||||
|
, minute :: Int
|
||||||
|
}
|
||||||
|
|
||||||
|
time :: Int -> Int -> Time
|
||||||
|
time h m = Time (h `mod` 12) (m `mod` 60)
|
||||||
|
|
||||||
|
instance Show Time where
|
||||||
|
show (Time h m) = show h ++ ":" ++ (if m < 10 then "0" else "") ++ show m
|
||||||
|
|
||||||
|
toClock :: Time -> Clock
|
||||||
|
toClock (Time h m) = Clock (Angle $ 30 * h' + m' / 2) (Angle $ m' * 6)
|
||||||
|
where
|
||||||
|
h' = fromIntegral h
|
||||||
|
m' = fromIntegral m
|
||||||
|
|
||||||
|
fromClock :: Clock -> Time
|
||||||
|
fromClock (Clock (Angle h) (Angle m)) =
|
||||||
|
Time (round $ (h - m / 2) / 30) (round $ m / 6)
|
||||||
84
misc/ETIN.hs
Normal file
84
misc/ETIN.hs
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
import Data.Text (Text)
|
||||||
|
import qualified Data.Text as Text
|
||||||
|
|
||||||
|
isConsonant :: Char -> Bool
|
||||||
|
isConsonant = flip elem ("BCDFGHJKLMNPQRSTVWXYZ" :: String)
|
||||||
|
|
||||||
|
isVowel :: Char -> Bool
|
||||||
|
isVowel = flip elem ("AEIOU" :: String)
|
||||||
|
|
||||||
|
serialize :: Text -> Text
|
||||||
|
serialize =
|
||||||
|
Text.filter (\c -> isConsonant c || isVowel c) .
|
||||||
|
Text.replace "Ä" "AE" .
|
||||||
|
Text.replace "Ö" "OE" .
|
||||||
|
Text.replace "Ü" "UE" .
|
||||||
|
Text.replace "ß" "SS" . Text.replace "SCH" "Y" . Text.toUpper
|
||||||
|
|
||||||
|
data Person =
|
||||||
|
Person
|
||||||
|
{ lastName :: Text
|
||||||
|
, firstName :: Text
|
||||||
|
, dateOfBirth :: (Int, Int, Int)
|
||||||
|
}
|
||||||
|
|
||||||
|
serializeName :: Text -> Text
|
||||||
|
serializeName n =
|
||||||
|
Text.pack $
|
||||||
|
take 4 $ filter isConsonant n' <> reverse (filter isVowel n') <> repeat 'X'
|
||||||
|
where
|
||||||
|
n' = Text.unpack $ serialize n
|
||||||
|
|
||||||
|
etin :: Person -> Text
|
||||||
|
etin (Person last first (y, m, d)) =
|
||||||
|
let etin' =
|
||||||
|
serializeName last <> serializeName first <> Text.pack (last2 (show y)) <>
|
||||||
|
Text.singleton (encode (m - 1)) <>
|
||||||
|
Text.pack (fill0 (show d))
|
||||||
|
in etin' <> Text.singleton (encode $ checksum $ Text.unpack etin')
|
||||||
|
where
|
||||||
|
last2 = until (\x -> length x == 2) tail
|
||||||
|
fill0 = until (\x -> length x == 2) ('0' :)
|
||||||
|
encode = (!!) ['A' .. 'Z']
|
||||||
|
checksum x = sum (zipWith value x (cycle [False, True])) `mod` 26
|
||||||
|
|
||||||
|
value :: Char -> Bool -> Int
|
||||||
|
value x = case x of
|
||||||
|
'0' -> eo 0 1
|
||||||
|
'1' -> eo 1 0
|
||||||
|
'2' -> eo 2 5
|
||||||
|
'3' -> eo 3 7
|
||||||
|
'4' -> eo 4 9
|
||||||
|
'5' -> eo 5 13
|
||||||
|
'6' -> eo 6 15
|
||||||
|
'7' -> eo 7 17
|
||||||
|
'8' -> eo 8 19
|
||||||
|
'9' -> eo 9 21
|
||||||
|
'A' -> eo 0 1
|
||||||
|
'B' -> eo 1 0
|
||||||
|
'C' -> eo 2 5
|
||||||
|
'D' -> eo 3 7
|
||||||
|
'E' -> eo 4 9
|
||||||
|
'F' -> eo 5 13
|
||||||
|
'G' -> eo 6 15
|
||||||
|
'H' -> eo 7 17
|
||||||
|
'I' -> eo 8 19
|
||||||
|
'J' -> eo 9 21
|
||||||
|
'K' -> eo 10 2
|
||||||
|
'L' -> eo 11 4
|
||||||
|
'M' -> eo 12 18
|
||||||
|
'N' -> eo 13 20
|
||||||
|
'O' -> eo 14 11
|
||||||
|
'P' -> eo 15 3
|
||||||
|
'Q' -> eo 16 6
|
||||||
|
'R' -> eo 17 8
|
||||||
|
'S' -> eo 18 12
|
||||||
|
'T' -> eo 19 14
|
||||||
|
'U' -> eo 20 16
|
||||||
|
'V' -> eo 21 10
|
||||||
|
'W' -> eo 22 22
|
||||||
|
'X' -> eo 23 23
|
||||||
|
'Y' -> eo 24 24
|
||||||
|
'Z' -> eo 25 25
|
||||||
|
where eo e o b = if b then e else o
|
||||||
14
misc/Nolindrom.hs
Normal file
14
misc/Nolindrom.hs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
module Nolindrom where
|
||||||
|
|
||||||
|
nolindrom :: Int -> Integer -> Bool
|
||||||
|
nolindrom i n
|
||||||
|
| i >= 100 = True
|
||||||
|
| otherwise =
|
||||||
|
let r = read . reverse . show $ n
|
||||||
|
n' = r + n
|
||||||
|
in not (palindrome n') && nolindrom (succ i) n'
|
||||||
|
where
|
||||||
|
palindrome x =
|
||||||
|
let s = show x
|
||||||
|
in s == reverse s
|
||||||
|
|
||||||
19
misc/PhoneNo.hs
Normal file
19
misc/PhoneNo.hs
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{-# LANGUAGE LambdaCase #-}
|
||||||
|
import Data.Char
|
||||||
|
|
||||||
|
letters = \case
|
||||||
|
2 -> "ABC"
|
||||||
|
3 -> "DEF"
|
||||||
|
4 -> "GHI"
|
||||||
|
5 -> "JKL"
|
||||||
|
6 -> "MNO"
|
||||||
|
7 -> "PQRS"
|
||||||
|
8 -> "TUV"
|
||||||
|
9 -> "WXYZ"
|
||||||
|
_ -> []
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = interact $ unlines . possibleWords . digitsOf
|
||||||
|
where
|
||||||
|
possibleWords = mapM letters
|
||||||
|
digitsOf = map digitToInt . filter isDigit
|
||||||
145
misc/Set.hs
Normal file
145
misc/Set.hs
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
{-# LANGUAGE TypeSynonymInstances, TypeFamilies #-}
|
||||||
|
module Set where
|
||||||
|
|
||||||
|
import Data.Char
|
||||||
|
import Data.Complex
|
||||||
|
import qualified GHC.Exts as Exts
|
||||||
|
|
||||||
|
import Prelude hiding (filter)
|
||||||
|
import qualified Prelude
|
||||||
|
import Data.Functor.Contravariant
|
||||||
|
import qualified Data.Functor.Contravariant.Divisible as Divisible
|
||||||
|
import Data.Isomorphism
|
||||||
|
|
||||||
|
liftP :: (Bool -> Bool) -> Predicate a -> Predicate a
|
||||||
|
liftP op p = Predicate $ op <$> getPredicate p
|
||||||
|
|
||||||
|
liftP2 :: (Bool -> Bool -> Bool) -> Predicate a -> Predicate a -> Predicate a
|
||||||
|
liftP2 op p q = Predicate $ op <$> getPredicate p <*> getPredicate q
|
||||||
|
|
||||||
|
type Set = Predicate
|
||||||
|
|
||||||
|
instance (Eq a) => Exts.IsList (Set a) where
|
||||||
|
type Item (Set a) = a
|
||||||
|
fromList = fromFoldable
|
||||||
|
toList = undefined
|
||||||
|
|
||||||
|
(\\) :: Set a -> Set a -> Set a
|
||||||
|
(\\) = difference
|
||||||
|
|
||||||
|
(\/) :: Set a -> Set a -> Set a
|
||||||
|
(\/) = union
|
||||||
|
|
||||||
|
(/\) :: Set a -> Set a -> Set a
|
||||||
|
(/\) = intersection
|
||||||
|
|
||||||
|
cantor :: (a -> Set a) -> Set a
|
||||||
|
cantor = Predicate . (<*>) notMember
|
||||||
|
|
||||||
|
cartesian :: Set a -> Set b -> Set (a, b)
|
||||||
|
cartesian = Divisible.divided
|
||||||
|
|
||||||
|
complement :: Set a -> Set a
|
||||||
|
complement = liftP not
|
||||||
|
|
||||||
|
containing :: a -> Set (Set a)
|
||||||
|
containing = Predicate . member
|
||||||
|
|
||||||
|
delete :: (Eq a) => a -> Set a -> Set a
|
||||||
|
delete x m = m \\ singleton x
|
||||||
|
|
||||||
|
difference :: Set a -> Set a -> Set a
|
||||||
|
difference = liftP2 (\x y -> x && not y)
|
||||||
|
|
||||||
|
disjointUnion :: Set a -> Set b -> Set (Either a b)
|
||||||
|
disjointUnion = Divisible.chosen
|
||||||
|
|
||||||
|
empty :: Set a
|
||||||
|
empty = Predicate $ const False
|
||||||
|
|
||||||
|
universal :: Set a
|
||||||
|
universal = mempty
|
||||||
|
|
||||||
|
filter :: (a -> Bool) -> Set a -> Set a
|
||||||
|
filter f m = Predicate $ (&&) <$> getPredicate m <*> f
|
||||||
|
|
||||||
|
fromFoldable :: (Foldable t, Eq a) => t a -> Set a
|
||||||
|
fromFoldable = Predicate . flip elem
|
||||||
|
|
||||||
|
insert :: (Eq a) => a -> Set a -> Set a
|
||||||
|
insert = union . singleton
|
||||||
|
|
||||||
|
intersection :: Set a -> Set a -> Set a
|
||||||
|
intersection = liftP2 (&&)
|
||||||
|
|
||||||
|
member :: a -> Set a -> Bool
|
||||||
|
member = flip getPredicate
|
||||||
|
|
||||||
|
notMember :: a -> Set a -> Bool
|
||||||
|
notMember = (not .) . member
|
||||||
|
|
||||||
|
partition :: (a -> Bool) -> Set a -> (Set a, Set a)
|
||||||
|
partition f m = (filter f m, filter (not . f) m)
|
||||||
|
|
||||||
|
singleton :: (Eq a) => a -> Set a
|
||||||
|
singleton = Predicate . (==)
|
||||||
|
|
||||||
|
split :: (Ord a) => a -> Set a -> (Set a, Set a)
|
||||||
|
split pivot m = (filter (< pivot) m, filter (> pivot) m)
|
||||||
|
|
||||||
|
splitMember :: (Ord a) => a -> Set a -> (Set a, Bool, Set a)
|
||||||
|
splitMember pivot m = let (ls, gs) = split pivot m in (ls, member pivot m, gs)
|
||||||
|
|
||||||
|
toList :: (Enum a, Bounded a) => Set a -> [a]
|
||||||
|
toList m = Prelude.filter (getPredicate m) [minBound .. maxBound]
|
||||||
|
|
||||||
|
union :: Set a -> Set a -> Set a
|
||||||
|
union = liftP2 (||)
|
||||||
|
|
||||||
|
unions :: (Foldable t) => t (Set a) -> Set a
|
||||||
|
unions = foldr union empty
|
||||||
|
|
||||||
|
naturals :: (Ord a, Integral a) => Set a
|
||||||
|
naturals = Predicate (>= 0)
|
||||||
|
|
||||||
|
reals :: (Real a) => Set a
|
||||||
|
reals = universal
|
||||||
|
|
||||||
|
rationals :: (Fractional a) => Set a
|
||||||
|
rationals = universal
|
||||||
|
|
||||||
|
integers :: (Integral a) => Set a
|
||||||
|
integers = universal
|
||||||
|
|
||||||
|
complexes :: (Real a) => Set (Complex a)
|
||||||
|
complexes = universal
|
||||||
|
|
||||||
|
mapIso :: Iso (->) a b -> Set a -> Set b
|
||||||
|
mapIso = contramap . project
|
||||||
|
|
||||||
|
digit :: Iso (->) Int Char
|
||||||
|
digit = Iso intToDigit digitToInt
|
||||||
|
|
||||||
|
casePreserving :: (String -> String) -> String -> String
|
||||||
|
casePreserving f = applyCasing <$> map isUpper <*> f
|
||||||
|
where applyCasing = zipWith (bool toUpper toLower)
|
||||||
|
bool x y b = if b then x else y
|
||||||
|
|
||||||
|
main = do
|
||||||
|
let sampleSet = fromFoldable [0 .. 9]
|
||||||
|
let digitSet = mapIso digit sampleSet
|
||||||
|
print (toList digitSet)
|
||||||
|
|
||||||
|
shorten :: String -> String
|
||||||
|
shorten word
|
||||||
|
| n <= 10 = word
|
||||||
|
| otherwise = [head word] ++ show (n - 2) ++ [last word]
|
||||||
|
where
|
||||||
|
n = length word
|
||||||
|
|
||||||
|
lev :: (Eq a) => [a] -> [a] -> Int
|
||||||
|
lev [] ys = length ys
|
||||||
|
lev xs [] = length xs
|
||||||
|
lev xxs@(x:xs) yys@(y:ys)
|
||||||
|
| x == y = lev xs ys
|
||||||
|
| otherwise = 1 + minimum [lev xs yys, lev xxs ys, lev xs ys]
|
||||||
37
misc/Sierpinski.lhs
Normal file
37
misc/Sierpinski.lhs
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
> import Diagrams.Backend.SVG.CmdLine
|
||||||
|
|
||||||
|
> {-# LANGUAGE NoMonomorphismRestriction #-}
|
||||||
|
> import Diagrams.Prelude
|
||||||
|
|
||||||
|
#### Brent's Original Code
|
||||||
|
> -- sierpinski 1 = triangle 1
|
||||||
|
> -- sierpinski n = s
|
||||||
|
> -- ===
|
||||||
|
> -- (s ||| s) # centerX
|
||||||
|
> -- where s = sierpinski (n-1)
|
||||||
|
|
||||||
|
#### Code to change color at each level
|
||||||
|
##### (Technically this is the complement of the Sierpinski triangle)
|
||||||
|
> import Diagrams.Prelude
|
||||||
|
> import Data.Colour.Palette.BrewerSet
|
||||||
|
>
|
||||||
|
> clrs :: [Colour Double]
|
||||||
|
> clrs = brewerSet Purples 9
|
||||||
|
>
|
||||||
|
> sierpinski :: Int -> [Colour Double] -> Diagram B
|
||||||
|
> sierpinski n c = go n <> triangle (2^n) # fc (clrs !! 0) # lw none
|
||||||
|
> where
|
||||||
|
> clrs = if null c then repeat black else cycle c
|
||||||
|
> go n
|
||||||
|
> | n == 1 = t1 # fc (clrs !! 1)
|
||||||
|
> | otherwise = appends tri (zip vecs (replicate 3 sierp))
|
||||||
|
> where
|
||||||
|
> tri = scale (2 ^ (n-1)) $ t1 # fc (clrs !! (n+1))
|
||||||
|
> vecs = [unitY, (rotateBy (-1/12) unitX), (rotateBy (1/12) unit_X)]
|
||||||
|
> sierp = go (n-1)
|
||||||
|
> t1 = triangle 1 # reflectY
|
||||||
|
>
|
||||||
|
> example = sierpinski 7 clrs # lw none # center # frame 2
|
||||||
|
|
||||||
|
|
||||||
|
> main = mainWith (example :: Diagram B)
|
||||||
1938
misc/Stopwords.hs
Normal file
1938
misc/Stopwords.hs
Normal file
File diff suppressed because it is too large
Load Diff
99
misc/init.sh
Executable file
99
misc/init.sh
Executable file
@@ -0,0 +1,99 @@
|
|||||||
|
#!/usr/bin/env nix-shell
|
||||||
|
#! nix-shell -i bash -p cryptsetup gptfdisk jq libxfs
|
||||||
|
set -xefuo pipefail
|
||||||
|
|
||||||
|
disk=$1
|
||||||
|
|
||||||
|
if mount | grep -q "$disk"; then
|
||||||
|
echo "target device is already mounted, bailout"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
bootdev="$disk"2
|
||||||
|
luksdev="$disk"3
|
||||||
|
luksmap=/dev/mapper/crypted
|
||||||
|
|
||||||
|
# vgname=vgname
|
||||||
|
|
||||||
|
|
||||||
|
rootdev="$luksmap"
|
||||||
|
# homedev=/dev/mapper/vgname-home
|
||||||
|
|
||||||
|
read -p "LUKS Password: " lukspw
|
||||||
|
|
||||||
|
#
|
||||||
|
# partitioning
|
||||||
|
#
|
||||||
|
|
||||||
|
# http://en.wikipedia.org/wiki/GUID_Partition_Table
|
||||||
|
# undo:
|
||||||
|
# dd if=/dev/zero bs=512 count=34 of=/dev/sda
|
||||||
|
# TODO zero last 34 blocks (lsblk -bno SIZE /dev/sda)
|
||||||
|
if ! test "$(blkid -o value -s PTTYPE "$disk")" = gpt; then
|
||||||
|
sgdisk -og "$disk"
|
||||||
|
sgdisk -n 1:2048:4095 -c 1:"BIOS Boot Partition" -t 1:ef02 "$disk"
|
||||||
|
sgdisk -n 2:4096:+1G -c 2:"EFI System Partition" -t 2:ef00 "$disk"
|
||||||
|
sgdisk -n 3:0:0 -c 3:"LUKS container" -t 3:8300 "$disk"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! test "$(blkid -o value -s PARTLABEL "$luksdev")" = "LUKS container"; then
|
||||||
|
echo zonk2
|
||||||
|
exit 23
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! cryptsetup isLuks "$luksdev"; then
|
||||||
|
# aes xts-plain64
|
||||||
|
echo -n "$lukspw" | cryptsetup luksFormat "$luksdev" - \
|
||||||
|
-h sha512 \
|
||||||
|
--iter-time 5000
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! test -e "$luksmap"; then
|
||||||
|
echo "$lukspw" | cryptsetup luksOpen "$luksdev" "$(basename "$luksmap")" -
|
||||||
|
fi
|
||||||
|
|
||||||
|
# if ! test "$(blkid -o value -s TYPE "$luksmap")" = LVM2_member; then pvcreate "$luksmap"; fi
|
||||||
|
|
||||||
|
# if ! vgdisplay -s "$vgname"; then vgcreate "$vgname" "$luksmap"; fi
|
||||||
|
|
||||||
|
# lvchange -a y /dev/mapper/"$vgname"
|
||||||
|
|
||||||
|
# if ! test -e "$rootdev"; then lvcreate -L 3G -n root "$vgname"; fi
|
||||||
|
|
||||||
|
|
||||||
|
# formatting
|
||||||
|
#
|
||||||
|
|
||||||
|
if ! test "$(blkid -o value -s TYPE "$bootdev")" = vfat; then
|
||||||
|
mkfs.vfat "$bootdev"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! test "$(blkid -o value -s TYPE "$rootdev")" = ext4; then
|
||||||
|
mkfs.ext4 "$rootdev"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! test "$(lsblk -n -o MOUNTPOINT "$rootdev")" = /mnt; then
|
||||||
|
mkdir -p /mnt
|
||||||
|
mount "$rootdev" /mnt
|
||||||
|
fi
|
||||||
|
if ! test "$(lsblk -n -o MOUNTPOINT "$bootdev")" = /mnt/boot; then
|
||||||
|
mkdir -m 0000 -p /mnt/boot
|
||||||
|
mount "$bootdev" /mnt/boot
|
||||||
|
fi
|
||||||
|
|
||||||
|
#
|
||||||
|
# dependencies for stockholm
|
||||||
|
#
|
||||||
|
|
||||||
|
# TODO: get sentinal file from target_path
|
||||||
|
mkdir -p /mnt/var/src
|
||||||
|
touch /mnt/var/src/.populate
|
||||||
|
|
||||||
|
#
|
||||||
|
# print all the infos
|
||||||
|
#
|
||||||
|
|
||||||
|
gdisk -l "$disk"
|
||||||
|
lsblk "$disk"
|
||||||
|
|
||||||
|
echo READY.
|
||||||
27
misc/sort.hs
Normal file
27
misc/sort.hs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{-# LANGUAGE LambdaCase #-}
|
||||||
|
import Control.Monad ( forM_ )
|
||||||
|
import Data.Char ( toLower )
|
||||||
|
import System.Environment ( getArgs )
|
||||||
|
|
||||||
|
insertionSortM :: Monad f => (a -> a -> f Ordering) -> [a] -> f [a]
|
||||||
|
insertionSortM cmp = foldr ((=<<) . insertByM cmp) (pure [])
|
||||||
|
where
|
||||||
|
insertByM cmp x = \case
|
||||||
|
[] -> pure [x]
|
||||||
|
yys@(y : ys) -> cmp x y >>= \case
|
||||||
|
GT -> (y :) <$> insertByM cmp x ys
|
||||||
|
_ -> pure (x : yys)
|
||||||
|
|
||||||
|
ask :: Show a => a -> a -> IO Ordering
|
||||||
|
ask a b = do
|
||||||
|
putStr (show a ++ " > " ++ show b ++ "? (y/n) ")
|
||||||
|
map toLower <$> getLine >>= \case
|
||||||
|
'y' : _ -> return GT
|
||||||
|
_ -> return LT
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
argv <- getArgs
|
||||||
|
sorted <- insertionSortM ask argv
|
||||||
|
forM_ (zip [1 ..] sorted)
|
||||||
|
$ \(place, thing) -> putStrLn (show place ++ ". " ++ show thing)
|
||||||
25
misc/sort.py
Executable file
25
misc/sort.py
Executable file
@@ -0,0 +1,25 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def insertion_sort(arr, compare=lambda x, y: x < y):
|
||||||
|
for i in range(1, len(arr)):
|
||||||
|
key = arr[i]
|
||||||
|
j = i - 1
|
||||||
|
while compare(key, arr[j]):
|
||||||
|
arr[j + 1] = arr[j]
|
||||||
|
j -= 1
|
||||||
|
arr[j + 1] = key
|
||||||
|
return arr
|
||||||
|
|
||||||
|
|
||||||
|
def manual_compare(x, y):
|
||||||
|
reply = input("{} <= {} (y/n)? ".format(x, y))
|
||||||
|
return reply.lower() == "y"
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
lines = sys.argv[1:]
|
||||||
|
sorted_lines = insertion_sort(lines, manual_compare)
|
||||||
|
for i, line in enumerate(lines):
|
||||||
|
print(i + 1, line)
|
||||||
Reference in New Issue
Block a user