Add UE1 A.2

This commit is contained in:
Ivaylo Ivanov 2021-10-15 19:30:29 +02:00
parent 44f00d0e7e
commit b1caccfe26
2 changed files with 41 additions and 21 deletions

View File

@ -1,3 +1,7 @@
FROM haskell:buster FROM haskell:buster
RUN apt-get update && apt-get install -y haskell-platform RUN apt-get update && apt-get install -y haskell-platform
WORKDIR /opt
CMD ["ghci"]

View File

@ -16,9 +16,6 @@ type Zerlegungszeugen = [Zerlegungszeuge]
-- Aufgabe A.1 -- Aufgabe A.1
ist_tzr :: Zeichenreihe -> Teilzeichenreihe -> IstTeilzeichenreihe
{- {-
Solution: Solution:
- if both strings are the same, True - if both strings are the same, True
@ -29,26 +26,49 @@ ist_tzr :: Zeichenreihe -> Teilzeichenreihe -> IstTeilzeichenreihe
If it is not, the first string will get smaller than the second eventually and the function will return False If it is not, the first string will get smaller than the second eventually and the function will return False
-} -}
ist_tzr x y ist_tzr :: Zeichenreihe -> Teilzeichenreihe -> IstTeilzeichenreihe
| y == x = True
| y == [] = True ist_tzr z t
| length y > length x = False | t == z = True
| t == [] = True
| length t > length z = False
| otherwise = | otherwise =
if head x == head y then if head z == head t then
ist_tzr (tail x) (tail y) ist_tzr (tail z) (tail t)
else else
ist_tzr (tail x) y ist_tzr (tail z) t
-- Aufgabe A.2 -- Aufgabe A.2
{-
--tzr_zeuge :: Zeichenreihe -> Teilzeichenreihe -> Zerlegungszeuge Solution:
- the base cases are as follows:
{- Knapp, aber gut nachvollziehbar geht tzr_zeuge folgendermassen vor: - both strings are empty, return a triple with empty strings
... - the second string is empty, return a triple with empty strings as first two elements and the whole first string as a third.
The problem description states that the split doesn't matter, so we take this because it is easy and cheap to do :)
- the second string is not a subset of the first string, return the "error triple"
- for handling the other cases:
- we find the position of the last subset string in the first string
- we take all of the characters until this position - this is the first element of the triple
- we then take all of the characters after this position summed with the length of the second string - this is the third element of the triple
-} -}
tzr_zeuge :: Zeichenreihe -> Teilzeichenreihe -> Zerlegungszeuge
tzr_zeuge [] [] = ("", "", "")
tzr_zeuge z [] = ("", "", z)
tzr_zeuge z t
| not (ist_tzr z t) = ("", t ++ t, "")
| otherwise =
let pos = (find_tzr_position z t 0) - 1
pre = take (pos) z
suf = drop (pos + (length t)) z
in (pre, t, suf)
-- find the index of the last occurrence of t in z
find_tzr_position :: Zeichenreihe -> Teilzeichenreihe -> Nat0 -> Nat0
find_tzr_position (z:zs) t n
| not (ist_tzr (z:zs) t) = n
| otherwise = find_tzr_position zs t (n + 1)
-- Aufgabe A.3 -- Aufgabe A.3
--tzr_zeugen :: Zeichenreihe -> Teilzeichenreihe -> Zerlegungszeugen --tzr_zeugen :: Zeichenreihe -> Teilzeichenreihe -> Zerlegungszeugen
@ -65,7 +85,3 @@ ist_tzr x y
{- Knapp, aber gut nachvollziehbar geht wieOft folgendermassen vor: {- Knapp, aber gut nachvollziehbar geht wieOft folgendermassen vor:
... ...
-} -}