Add UE1 A.2
This commit is contained in:
parent
44f00d0e7e
commit
b1caccfe26
@ -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"]
|
||||||
|
@ -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:
|
||||||
...
|
...
|
||||||
-}
|
-}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user