From 6c1248e814b187c91a82e0a172e9b7e52a142c61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kier=C3=A1n=20Meinhardt?= Date: Thu, 5 Nov 2020 16:31:14 +0100 Subject: [PATCH] misc: add more scripts --- misc/Alliterations.hs | 56 ++ misc/Clock.hs | 37 + misc/ETIN.hs | 84 ++ misc/Nolindrom.hs | 14 + misc/PhoneNo.hs | 19 + misc/Set.hs | 145 +++ misc/Sierpinski.lhs | 37 + misc/Stopwords.hs | 1938 +++++++++++++++++++++++++++++++++++++++++ misc/init.sh | 99 +++ misc/sort.hs | 27 + misc/sort.py | 25 + 11 files changed, 2481 insertions(+) create mode 100644 misc/Alliterations.hs create mode 100644 misc/Clock.hs create mode 100644 misc/ETIN.hs create mode 100644 misc/Nolindrom.hs create mode 100644 misc/PhoneNo.hs create mode 100644 misc/Set.hs create mode 100644 misc/Sierpinski.lhs create mode 100644 misc/Stopwords.hs create mode 100755 misc/init.sh create mode 100644 misc/sort.hs create mode 100755 misc/sort.py diff --git a/misc/Alliterations.hs b/misc/Alliterations.hs new file mode 100644 index 0000000..9ab05f5 --- /dev/null +++ b/misc/Alliterations.hs @@ -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") diff --git a/misc/Clock.hs b/misc/Clock.hs new file mode 100644 index 0000000..61e38ec --- /dev/null +++ b/misc/Clock.hs @@ -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) diff --git a/misc/ETIN.hs b/misc/ETIN.hs new file mode 100644 index 0000000..e9a55f9 --- /dev/null +++ b/misc/ETIN.hs @@ -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 diff --git a/misc/Nolindrom.hs b/misc/Nolindrom.hs new file mode 100644 index 0000000..4adcbb4 --- /dev/null +++ b/misc/Nolindrom.hs @@ -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 + diff --git a/misc/PhoneNo.hs b/misc/PhoneNo.hs new file mode 100644 index 0000000..b80bcb9 --- /dev/null +++ b/misc/PhoneNo.hs @@ -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 diff --git a/misc/Set.hs b/misc/Set.hs new file mode 100644 index 0000000..6d47114 --- /dev/null +++ b/misc/Set.hs @@ -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] diff --git a/misc/Sierpinski.lhs b/misc/Sierpinski.lhs new file mode 100644 index 0000000..d741894 --- /dev/null +++ b/misc/Sierpinski.lhs @@ -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) diff --git a/misc/Stopwords.hs b/misc/Stopwords.hs new file mode 100644 index 0000000..3cb70be --- /dev/null +++ b/misc/Stopwords.hs @@ -0,0 +1,1938 @@ +{-# LANGUAGE OverloadedStrings #-} +module Stopwords (Language(..), stopwords) where + +import qualified Data.Text as T + +data Language = German | English | NoLanguage + +stopwords :: Language -> [T.Text] +stopwords German = german +stopwords English = english +stopwords NoLanguage = [] + +german, english :: [T.Text] + +german = + [ "a" + , "ab" + , "aber" + , "ach" + , "acht" + , "achte" + , "achten" + , "achter" + , "achtes" + , "ag" + , "alle" + , "allein" + , "allem" + , "allen" + , "aller" + , "allerdings" + , "alles" + , "allgemeinen" + , "als" + , "also" + , "am" + , "an" + , "ander" + , "andere" + , "anderem" + , "anderen" + , "anderer" + , "anderes" + , "anderm" + , "andern" + , "anderr" + , "anders" + , "au" + , "auch" + , "auf" + , "aus" + , "ausser" + , "ausserdem" + , "außer" + , "außerdem" + , "b" + , "bald" + , "bei" + , "beide" + , "beiden" + , "beim" + , "beispiel" + , "bekannt" + , "bereits" + , "besonders" + , "besser" + , "besten" + , "bin" + , "bis" + , "bisher" + , "bist" + , "c" + , "d" + , "d.h" + , "da" + , "dabei" + , "dadurch" + , "dafür" + , "dagegen" + , "daher" + , "dahin" + , "dahinter" + , "damals" + , "damit" + , "danach" + , "daneben" + , "dank" + , "dann" + , "daran" + , "darauf" + , "daraus" + , "darf" + , "darfst" + , "darin" + , "darum" + , "darunter" + , "darüber" + , "das" + , "dasein" + , "daselbst" + , "dass" + , "dasselbe" + , "davon" + , "davor" + , "dazu" + , "dazwischen" + , "daß" + , "dein" + , "deine" + , "deinem" + , "deinen" + , "deiner" + , "deines" + , "dem" + , "dementsprechend" + , "demgegenüber" + , "demgemäss" + , "demgemäß" + , "demselben" + , "demzufolge" + , "den" + , "denen" + , "denn" + , "denselben" + , "der" + , "deren" + , "derer" + , "derjenige" + , "derjenigen" + , "dermassen" + , "dermaßen" + , "derselbe" + , "derselben" + , "des" + , "deshalb" + , "desselben" + , "dessen" + , "deswegen" + , "dich" + , "die" + , "diejenige" + , "diejenigen" + , "dies" + , "diese" + , "dieselbe" + , "dieselben" + , "diesem" + , "diesen" + , "dieser" + , "dieses" + , "dir" + , "doch" + , "dort" + , "drei" + , "drin" + , "dritte" + , "dritten" + , "dritter" + , "drittes" + , "du" + , "durch" + , "durchaus" + , "durfte" + , "durften" + , "dürfen" + , "dürft" + , "e" + , "eben" + , "ebenso" + , "ehrlich" + , "ei" + , "ei," + , "eigen" + , "eigene" + , "eigenen" + , "eigener" + , "eigenes" + , "ein" + , "einander" + , "eine" + , "einem" + , "einen" + , "einer" + , "eines" + , "einig" + , "einige" + , "einigem" + , "einigen" + , "einiger" + , "einiges" + , "einmal" + , "eins" + , "elf" + , "en" + , "ende" + , "endlich" + , "entweder" + , "er" + , "ernst" + , "erst" + , "erste" + , "ersten" + , "erster" + , "erstes" + , "es" + , "etwa" + , "etwas" + , "euch" + , "euer" + , "eure" + , "eurem" + , "euren" + , "eurer" + , "eures" + , "f" + , "folgende" + , "früher" + , "fünf" + , "fünfte" + , "fünften" + , "fünfter" + , "fünftes" + , "für" + , "g" + , "gab" + , "ganz" + , "ganze" + , "ganzen" + , "ganzer" + , "ganzes" + , "gar" + , "gedurft" + , "gegen" + , "gegenüber" + , "gehabt" + , "gehen" + , "geht" + , "gekannt" + , "gekonnt" + , "gemacht" + , "gemocht" + , "gemusst" + , "genug" + , "gerade" + , "gern" + , "gesagt" + , "geschweige" + , "gewesen" + , "gewollt" + , "geworden" + , "gibt" + , "ging" + , "gleich" + , "gott" + , "gross" + , "grosse" + , "grossen" + , "grosser" + , "grosses" + , "groß" + , "große" + , "großen" + , "großer" + , "großes" + , "gut" + , "gute" + , "guter" + , "gutes" + , "h" + , "hab" + , "habe" + , "haben" + , "habt" + , "hast" + , "hat" + , "hatte" + , "hatten" + , "hattest" + , "hattet" + , "heisst" + , "her" + , "heute" + , "hier" + , "hin" + , "hinter" + , "hoch" + , "hätte" + , "hätten" + , "i" + , "ich" + , "ihm" + , "ihn" + , "ihnen" + , "ihr" + , "ihre" + , "ihrem" + , "ihren" + , "ihrer" + , "ihres" + , "im" + , "immer" + , "in" + , "indem" + , "infolgedessen" + , "ins" + , "irgend" + , "ist" + , "j" + , "ja" + , "jahr" + , "jahre" + , "jahren" + , "je" + , "jede" + , "jedem" + , "jeden" + , "jeder" + , "jedermann" + , "jedermanns" + , "jedes" + , "jedoch" + , "jemand" + , "jemandem" + , "jemanden" + , "jene" + , "jenem" + , "jenen" + , "jener" + , "jenes" + , "jetzt" + , "k" + , "kam" + , "kann" + , "kannst" + , "kaum" + , "kein" + , "keine" + , "keinem" + , "keinen" + , "keiner" + , "keines" + , "kleine" + , "kleinen" + , "kleiner" + , "kleines" + , "kommen" + , "kommt" + , "konnte" + , "konnten" + , "kurz" + , "können" + , "könnt" + , "könnte" + , "l" + , "lang" + , "lange" + , "leicht" + , "leide" + , "lieber" + , "los" + , "m" + , "machen" + , "macht" + , "machte" + , "mag" + , "magst" + , "mahn" + , "mal" + , "man" + , "manche" + , "manchem" + , "manchen" + , "mancher" + , "manches" + , "mann" + , "mehr" + , "mein" + , "meine" + , "meinem" + , "meinen" + , "meiner" + , "meines" + , "mensch" + , "menschen" + , "mich" + , "mir" + , "mit" + , "mittel" + , "mochte" + , "mochten" + , "morgen" + , "muss" + , "musst" + , "musste" + , "mussten" + , "muß" + , "mußt" + , "möchte" + , "mögen" + , "möglich" + , "mögt" + , "müssen" + , "müsst" + , "müßt" + , "n" + , "na" + , "nach" + , "nachdem" + , "nahm" + , "natürlich" + , "neben" + , "nein" + , "neue" + , "neuen" + , "neun" + , "neunte" + , "neunten" + , "neunter" + , "neuntes" + , "nicht" + , "nichts" + , "nie" + , "niemand" + , "niemandem" + , "niemanden" + , "noch" + , "nun" + , "nur" + , "o" + , "ob" + , "oben" + , "oder" + , "offen" + , "oft" + , "ohne" + , "ordnung" + , "p" + , "q" + , "r" + , "recht" + , "rechte" + , "rechten" + , "rechter" + , "rechtes" + , "richtig" + , "rund" + , "s" + , "sa" + , "sache" + , "sagt" + , "sagte" + , "sah" + , "satt" + , "schlecht" + , "schluss" + , "schon" + , "sechs" + , "sechste" + , "sechsten" + , "sechster" + , "sechstes" + , "sehr" + , "sei" + , "seid" + , "seien" + , "sein" + , "seine" + , "seinem" + , "seinen" + , "seiner" + , "seines" + , "seit" + , "seitdem" + , "selbst" + , "sich" + , "sie" + , "sieben" + , "siebente" + , "siebenten" + , "siebenter" + , "siebentes" + , "sind" + , "so" + , "solang" + , "solche" + , "solchem" + , "solchen" + , "solcher" + , "solches" + , "soll" + , "sollen" + , "sollst" + , "sollt" + , "sollte" + , "sollten" + , "sondern" + , "sonst" + , "soweit" + , "sowie" + , "später" + , "startseite" + , "statt" + , "steht" + , "suche" + , "t" + , "tag" + , "tage" + , "tagen" + , "tat" + , "teil" + , "tel" + , "tritt" + , "trotzdem" + , "tun" + , "u" + , "uhr" + , "um" + , "und" + , "und?" + , "uns" + , "unse" + , "unsem" + , "unsen" + , "unser" + , "unsere" + , "unserer" + , "unses" + , "unter" + , "v" + , "vergangenen" + , "viel" + , "viele" + , "vielem" + , "vielen" + , "vielleicht" + , "vier" + , "vierte" + , "vierten" + , "vierter" + , "viertes" + , "vom" + , "von" + , "vor" + , "w" + , "wahr?" + , "wann" + , "war" + , "waren" + , "warst" + , "wart" + , "warum" + , "was" + , "weg" + , "wegen" + , "weil" + , "weit" + , "weiter" + , "weitere" + , "weiteren" + , "weiteres" + , "welche" + , "welchem" + , "welchen" + , "welcher" + , "welches" + , "wem" + , "wen" + , "wenig" + , "wenige" + , "weniger" + , "weniges" + , "wenigstens" + , "wenn" + , "wer" + , "werde" + , "werden" + , "werdet" + , "weshalb" + , "wessen" + , "wie" + , "wieder" + , "wieso" + , "will" + , "willst" + , "wir" + , "wird" + , "wirklich" + , "wirst" + , "wissen" + , "wo" + , "woher" + , "wohin" + , "wohl" + , "wollen" + , "wollt" + , "wollte" + , "wollten" + , "worden" + , "wurde" + , "wurden" + , "während" + , "währenddem" + , "währenddessen" + , "wäre" + , "würde" + , "würden" + , "x" + , "y" + , "z" + , "z.b" + , "zehn" + , "zehnte" + , "zehnten" + , "zehnter" + , "zehntes" + , "zeit" + , "zu" + , "zuerst" + , "zugleich" + , "zum" + , "zunächst" + , "zur" + , "zurück" + , "zusammen" + , "zwanzig" + , "zwar" + , "zwei" + , "zweite" + , "zweiten" + , "zweiter" + , "zweites" + , "zwischen" + , "zwölf" + , "über" + , "überhaupt" + , "übrigens" + ] + +english = + [ "'ll" + , "'tis" + , "'twas" + , "'ve" + , "10" + , "39" + , "a" + , "a's" + , "able" + , "ableabout" + , "about" + , "above" + , "abroad" + , "abst" + , "accordance" + , "according" + , "accordingly" + , "across" + , "act" + , "actually" + , "ad" + , "added" + , "adj" + , "adopted" + , "ae" + , "af" + , "affected" + , "affecting" + , "affects" + , "after" + , "afterwards" + , "ag" + , "again" + , "against" + , "ago" + , "ah" + , "ahead" + , "ai" + , "ain't" + , "aint" + , "al" + , "all" + , "allow" + , "allows" + , "almost" + , "alone" + , "along" + , "alongside" + , "already" + , "also" + , "although" + , "always" + , "am" + , "amid" + , "amidst" + , "among" + , "amongst" + , "amoungst" + , "amount" + , "an" + , "and" + , "announce" + , "another" + , "any" + , "anybody" + , "anyhow" + , "anymore" + , "anyone" + , "anything" + , "anyway" + , "anyways" + , "anywhere" + , "ao" + , "apart" + , "apparently" + , "appear" + , "appreciate" + , "appropriate" + , "approximately" + , "aq" + , "ar" + , "are" + , "area" + , "areas" + , "aren" + , "aren't" + , "arent" + , "arise" + , "around" + , "arpa" + , "as" + , "aside" + , "ask" + , "asked" + , "asking" + , "asks" + , "associated" + , "at" + , "au" + , "auth" + , "available" + , "aw" + , "away" + , "awfully" + , "az" + , "b" + , "ba" + , "back" + , "backed" + , "backing" + , "backs" + , "backward" + , "backwards" + , "bb" + , "bd" + , "be" + , "became" + , "because" + , "become" + , "becomes" + , "becoming" + , "been" + , "before" + , "beforehand" + , "began" + , "begin" + , "beginning" + , "beginnings" + , "begins" + , "behind" + , "being" + , "beings" + , "believe" + , "below" + , "beside" + , "besides" + , "best" + , "better" + , "between" + , "beyond" + , "bf" + , "bg" + , "bh" + , "bi" + , "big" + , "bill" + , "billion" + , "biol" + , "bj" + , "bm" + , "bn" + , "bo" + , "both" + , "bottom" + , "br" + , "brief" + , "briefly" + , "bs" + , "bt" + , "but" + , "buy" + , "bv" + , "bw" + , "by" + , "bz" + , "c" + , "c'mon" + , "c's" + , "ca" + , "call" + , "came" + , "can" + , "can't" + , "cannot" + , "cant" + , "caption" + , "case" + , "cases" + , "cause" + , "causes" + , "cc" + , "cd" + , "certain" + , "certainly" + , "cf" + , "cg" + , "ch" + , "changes" + , "ci" + , "ck" + , "cl" + , "clear" + , "clearly" + , "click" + , "cm" + , "cmon" + , "cn" + , "co" + , "co." + , "com" + , "come" + , "comes" + , "computer" + , "con" + , "concerning" + , "consequently" + , "consider" + , "considering" + , "contain" + , "containing" + , "contains" + , "copy" + , "corresponding" + , "could" + , "could've" + , "couldn" + , "couldn't" + , "couldnt" + , "course" + , "cr" + , "cry" + , "cs" + , "cu" + , "currently" + , "cv" + , "cx" + , "cy" + , "cz" + , "d" + , "dare" + , "daren't" + , "darent" + , "date" + , "de" + , "dear" + , "definitely" + , "describe" + , "described" + , "despite" + , "detail" + , "did" + , "didn" + , "didn't" + , "didnt" + , "differ" + , "different" + , "differently" + , "directly" + , "dj" + , "dk" + , "dm" + , "do" + , "does" + , "doesn" + , "doesn't" + , "doesnt" + , "doing" + , "don" + , "don't" + , "done" + , "dont" + , "doubtful" + , "down" + , "downed" + , "downing" + , "downs" + , "downwards" + , "due" + , "during" + , "dz" + , "e" + , "each" + , "early" + , "ec" + , "ed" + , "edu" + , "ee" + , "effect" + , "eg" + , "eh" + , "eight" + , "eighty" + , "either" + , "eleven" + , "else" + , "elsewhere" + , "empty" + , "end" + , "ended" + , "ending" + , "ends" + , "enough" + , "entirely" + , "er" + , "es" + , "especially" + , "et" + , "et-al" + , "etc" + , "even" + , "evenly" + , "ever" + , "evermore" + , "every" + , "everybody" + , "everyone" + , "everything" + , "everywhere" + , "ex" + , "exactly" + , "example" + , "except" + , "f" + , "face" + , "faces" + , "fact" + , "facts" + , "fairly" + , "far" + , "farther" + , "felt" + , "few" + , "fewer" + , "ff" + , "fi" + , "fifteen" + , "fifth" + , "fifty" + , "fify" + , "fill" + , "find" + , "finds" + , "fire" + , "first" + , "five" + , "fix" + , "fj" + , "fk" + , "fm" + , "fo" + , "followed" + , "following" + , "follows" + , "for" + , "forever" + , "former" + , "formerly" + , "forth" + , "forty" + , "forward" + , "found" + , "four" + , "fr" + , "free" + , "from" + , "front" + , "full" + , "fully" + , "further" + , "furthered" + , "furthering" + , "furthermore" + , "furthers" + , "fx" + , "g" + , "ga" + , "gave" + , "gb" + , "gd" + , "ge" + , "general" + , "generally" + , "get" + , "gets" + , "getting" + , "gf" + , "gg" + , "gh" + , "gi" + , "give" + , "given" + , "gives" + , "giving" + , "gl" + , "gm" + , "gmt" + , "gn" + , "go" + , "goes" + , "going" + , "gone" + , "good" + , "goods" + , "got" + , "gotten" + , "gov" + , "gp" + , "gq" + , "gr" + , "great" + , "greater" + , "greatest" + , "greetings" + , "group" + , "grouped" + , "grouping" + , "groups" + , "gs" + , "gt" + , "gu" + , "gw" + , "gy" + , "h" + , "had" + , "hadn't" + , "hadnt" + , "half" + , "happens" + , "hardly" + , "has" + , "hasn" + , "hasn't" + , "hasnt" + , "have" + , "haven" + , "haven't" + , "havent" + , "having" + , "he" + , "he'd" + , "he'll" + , "he's" + , "hed" + , "hell" + , "hello" + , "help" + , "hence" + , "her" + , "here" + , "here's" + , "hereafter" + , "hereby" + , "herein" + , "heres" + , "hereupon" + , "hers" + , "herself" + , "herse”" + , "hes" + , "hi" + , "hid" + , "high" + , "higher" + , "highest" + , "him" + , "himself" + , "himse”" + , "his" + , "hither" + , "hk" + , "hm" + , "hn" + , "home" + , "homepage" + , "hopefully" + , "how" + , "how'd" + , "how'll" + , "how's" + , "howbeit" + , "however" + , "hr" + , "ht" + , "htm" + , "html" + , "http" + , "hu" + , "hundred" + , "i" + , "i'd" + , "i'll" + , "i'm" + , "i've" + , "i.e." + , "id" + , "ie" + , "if" + , "ignored" + , "ii" + , "il" + , "ill" + , "im" + , "immediate" + , "immediately" + , "importance" + , "important" + , "in" + , "inasmuch" + , "inc" + , "inc." + , "indeed" + , "index" + , "indicate" + , "indicated" + , "indicates" + , "information" + , "inner" + , "inside" + , "insofar" + , "instead" + , "int" + , "interest" + , "interested" + , "interesting" + , "interests" + , "into" + , "invention" + , "inward" + , "io" + , "iq" + , "ir" + , "is" + , "isn" + , "isn't" + , "isnt" + , "it" + , "it'd" + , "it'll" + , "it's" + , "itd" + , "itll" + , "its" + , "itself" + , "itse”" + , "ive" + , "j" + , "je" + , "jm" + , "jo" + , "join" + , "jp" + , "just" + , "k" + , "ke" + , "keep" + , "keeps" + , "kept" + , "keys" + , "kg" + , "kh" + , "ki" + , "kind" + , "km" + , "kn" + , "knew" + , "know" + , "known" + , "knows" + , "kp" + , "kr" + , "kw" + , "ky" + , "kz" + , "l" + , "la" + , "large" + , "largely" + , "last" + , "lately" + , "later" + , "latest" + , "latter" + , "latterly" + , "lb" + , "lc" + , "least" + , "length" + , "less" + , "lest" + , "let" + , "let's" + , "lets" + , "li" + , "like" + , "liked" + , "likely" + , "likewise" + , "line" + , "little" + , "lk" + , "ll" + , "long" + , "longer" + , "longest" + , "look" + , "looking" + , "looks" + , "low" + , "lower" + , "lr" + , "ls" + , "lt" + , "ltd" + , "lu" + , "lv" + , "ly" + , "m" + , "ma" + , "made" + , "mainly" + , "make" + , "makes" + , "making" + , "man" + , "many" + , "may" + , "maybe" + , "mayn't" + , "maynt" + , "mc" + , "md" + , "me" + , "mean" + , "means" + , "meantime" + , "meanwhile" + , "member" + , "members" + , "men" + , "merely" + , "mg" + , "mh" + , "microsoft" + , "might" + , "might've" + , "mightn't" + , "mightnt" + , "mil" + , "mill" + , "million" + , "mine" + , "minus" + , "miss" + , "mk" + , "ml" + , "mm" + , "mn" + , "mo" + , "more" + , "moreover" + , "most" + , "mostly" + , "move" + , "mp" + , "mq" + , "mr" + , "mrs" + , "ms" + , "msie" + , "mt" + , "mu" + , "much" + , "mug" + , "must" + , "must've" + , "mustn't" + , "mustnt" + , "mv" + , "mw" + , "mx" + , "my" + , "myself" + , "myse”" + , "mz" + , "n" + , "na" + , "name" + , "namely" + , "nay" + , "nc" + , "nd" + , "ne" + , "near" + , "nearly" + , "necessarily" + , "necessary" + , "need" + , "needed" + , "needing" + , "needn't" + , "neednt" + , "needs" + , "neither" + , "net" + , "netscape" + , "never" + , "neverf" + , "neverless" + , "nevertheless" + , "new" + , "newer" + , "newest" + , "next" + , "nf" + , "ng" + , "ni" + , "nine" + , "ninety" + , "nl" + , "no" + , "no-one" + , "nobody" + , "non" + , "none" + , "nonetheless" + , "noone" + , "nor" + , "normally" + , "nos" + , "not" + , "noted" + , "nothing" + , "notwithstanding" + , "novel" + , "now" + , "nowhere" + , "np" + , "nr" + , "nu" + , "null" + , "number" + , "numbers" + , "nz" + , "o" + , "obtain" + , "obtained" + , "obviously" + , "of" + , "off" + , "often" + , "oh" + , "ok" + , "okay" + , "old" + , "older" + , "oldest" + , "om" + , "omitted" + , "on" + , "once" + , "one" + , "one's" + , "ones" + , "only" + , "onto" + , "open" + , "opened" + , "opening" + , "opens" + , "opposite" + , "or" + , "ord" + , "order" + , "ordered" + , "ordering" + , "orders" + , "org" + , "other" + , "others" + , "otherwise" + , "ought" + , "oughtn't" + , "oughtnt" + , "our" + , "ours" + , "ourselves" + , "out" + , "outside" + , "over" + , "overall" + , "owing" + , "own" + , "p" + , "pa" + , "page" + , "pages" + , "part" + , "parted" + , "particular" + , "particularly" + , "parting" + , "parts" + , "past" + , "pe" + , "per" + , "perhaps" + , "pf" + , "pg" + , "ph" + , "pk" + , "pl" + , "place" + , "placed" + , "places" + , "please" + , "plus" + , "pm" + , "pmid" + , "pn" + , "point" + , "pointed" + , "pointing" + , "points" + , "poorly" + , "possible" + , "possibly" + , "potentially" + , "pp" + , "pr" + , "predominantly" + , "present" + , "presented" + , "presenting" + , "presents" + , "presumably" + , "previously" + , "primarily" + , "probably" + , "problem" + , "problems" + , "promptly" + , "proud" + , "provided" + , "provides" + , "pt" + , "put" + , "puts" + , "pw" + , "py" + , "q" + , "qa" + , "que" + , "quickly" + , "quite" + , "qv" + , "r" + , "ran" + , "rather" + , "rd" + , "re" + , "readily" + , "really" + , "reasonably" + , "recent" + , "recently" + , "ref" + , "refs" + , "regarding" + , "regardless" + , "regards" + , "related" + , "relatively" + , "research" + , "reserved" + , "respectively" + , "resulted" + , "resulting" + , "results" + , "right" + , "ring" + , "ro" + , "room" + , "rooms" + , "round" + , "ru" + , "run" + , "rw" + , "s" + , "sa" + , "said" + , "same" + , "saw" + , "say" + , "saying" + , "says" + , "sb" + , "sc" + , "sd" + , "se" + , "sec" + , "second" + , "secondly" + , "seconds" + , "section" + , "see" + , "seeing" + , "seem" + , "seemed" + , "seeming" + , "seems" + , "seen" + , "sees" + , "self" + , "selves" + , "sensible" + , "sent" + , "serious" + , "seriously" + , "seven" + , "seventy" + , "several" + , "sg" + , "sh" + , "shall" + , "shan't" + , "shant" + , "she" + , "she'd" + , "she'll" + , "she's" + , "shed" + , "shell" + , "shes" + , "should" + , "should've" + , "shouldn" + , "shouldn't" + , "shouldnt" + , "show" + , "showed" + , "showing" + , "shown" + , "showns" + , "shows" + , "si" + , "side" + , "sides" + , "significant" + , "significantly" + , "similar" + , "similarly" + , "since" + , "sincere" + , "site" + , "six" + , "sixty" + , "sj" + , "sk" + , "sl" + , "slightly" + , "sm" + , "small" + , "smaller" + , "smallest" + , "sn" + , "so" + , "some" + , "somebody" + , "someday" + , "somehow" + , "someone" + , "somethan" + , "something" + , "sometime" + , "sometimes" + , "somewhat" + , "somewhere" + , "soon" + , "sorry" + , "specifically" + , "specified" + , "specify" + , "specifying" + , "sr" + , "st" + , "state" + , "states" + , "still" + , "stop" + , "strongly" + , "su" + , "sub" + , "substantially" + , "successfully" + , "such" + , "sufficiently" + , "suggest" + , "sup" + , "sure" + , "sv" + , "sy" + , "system" + , "sz" + , "t" + , "t's" + , "take" + , "taken" + , "taking" + , "tc" + , "td" + , "tell" + , "ten" + , "tends" + , "test" + , "text" + , "tf" + , "tg" + , "th" + , "than" + , "thank" + , "thanks" + , "thanx" + , "that" + , "that'll" + , "that's" + , "that've" + , "thatll" + , "thats" + , "thatve" + , "the" + , "their" + , "theirs" + , "them" + , "themselves" + , "then" + , "thence" + , "there" + , "there'd" + , "there'll" + , "there're" + , "there's" + , "there've" + , "thereafter" + , "thereby" + , "thered" + , "therefore" + , "therein" + , "therell" + , "thereof" + , "therere" + , "theres" + , "thereto" + , "thereupon" + , "thereve" + , "these" + , "they" + , "they'd" + , "they'll" + , "they're" + , "they've" + , "theyd" + , "theyll" + , "theyre" + , "theyve" + , "thick" + , "thin" + , "thing" + , "things" + , "think" + , "thinks" + , "third" + , "thirty" + , "this" + , "thorough" + , "thoroughly" + , "those" + , "thou" + , "though" + , "thoughh" + , "thought" + , "thoughts" + , "thousand" + , "three" + , "throug" + , "through" + , "throughout" + , "thru" + , "thus" + , "til" + , "till" + , "tip" + , "tis" + , "tj" + , "tk" + , "tm" + , "tn" + , "to" + , "today" + , "together" + , "too" + , "took" + , "top" + , "toward" + , "towards" + , "tp" + , "tr" + , "tried" + , "tries" + , "trillion" + , "truly" + , "try" + , "trying" + , "ts" + , "tt" + , "turn" + , "turned" + , "turning" + , "turns" + , "tv" + , "tw" + , "twas" + , "twelve" + , "twenty" + , "twice" + , "two" + , "tz" + , "u" + , "ua" + , "ug" + , "uk" + , "um" + , "un" + , "under" + , "underneath" + , "undoing" + , "unfortunately" + , "unless" + , "unlike" + , "unlikely" + , "until" + , "unto" + , "up" + , "upon" + , "ups" + , "upwards" + , "us" + , "use" + , "used" + , "useful" + , "usefully" + , "usefulness" + , "uses" + , "using" + , "usually" + , "uucp" + , "uy" + , "uz" + , "v" + , "va" + , "value" + , "various" + , "vc" + , "ve" + , "versus" + , "very" + , "vg" + , "vi" + , "via" + , "viz" + , "vn" + , "vol" + , "vols" + , "vs" + , "vu" + , "w" + , "want" + , "wanted" + , "wanting" + , "wants" + , "was" + , "wasn" + , "wasn't" + , "wasnt" + , "way" + , "ways" + , "we" + , "we'd" + , "we'll" + , "we're" + , "we've" + , "web" + , "webpage" + , "website" + , "wed" + , "welcome" + , "well" + , "wells" + , "went" + , "were" + , "weren" + , "weren't" + , "werent" + , "weve" + , "wf" + , "what" + , "what'd" + , "what'll" + , "what's" + , "what've" + , "whatever" + , "whatll" + , "whats" + , "whatve" + , "when" + , "when'd" + , "when'll" + , "when's" + , "whence" + , "whenever" + , "where" + , "where'd" + , "where'll" + , "where's" + , "whereafter" + , "whereas" + , "whereby" + , "wherein" + , "wheres" + , "whereupon" + , "wherever" + , "whether" + , "which" + , "whichever" + , "while" + , "whilst" + , "whim" + , "whither" + , "who" + , "who'd" + , "who'll" + , "who's" + , "whod" + , "whoever" + , "whole" + , "wholl" + , "whom" + , "whomever" + , "whos" + , "whose" + , "why" + , "why'd" + , "why'll" + , "why's" + , "widely" + , "width" + , "will" + , "willing" + , "wish" + , "with" + , "within" + , "without" + , "won" + , "won't" + , "wonder" + , "wont" + , "words" + , "work" + , "worked" + , "working" + , "works" + , "world" + , "would" + , "would've" + , "wouldn" + , "wouldn't" + , "wouldnt" + , "ws" + , "www" + , "x" + , "y" + , "ye" + , "year" + , "years" + , "yes" + , "yet" + , "you" + , "you'd" + , "you'll" + , "you're" + , "you've" + , "youd" + , "youll" + , "young" + , "younger" + , "youngest" + , "your" + , "youre" + , "yours" + , "yourself" + , "yourselves" + , "youve" + , "yt" + , "yu" + , "z" + , "za" + , "zero" + , "zm" + , "zr" + ] diff --git a/misc/init.sh b/misc/init.sh new file mode 100755 index 0000000..866764e --- /dev/null +++ b/misc/init.sh @@ -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. diff --git a/misc/sort.hs b/misc/sort.hs new file mode 100644 index 0000000..d6e5961 --- /dev/null +++ b/misc/sort.hs @@ -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) diff --git a/misc/sort.py b/misc/sort.py new file mode 100755 index 0000000..ab799bf --- /dev/null +++ b/misc/sort.py @@ -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)