\documentclass[a4paper,twoside,12pt]{article}
%\usepackage [reqno] {amsmath}
\usepackage{amsfonts,amstext}
\usepackage{amsmath}
\usepackage{german}
\usepackage{graphicx}
\usepackage{fullpage}
\usepackage{verbatim}

\newcommand{\ZETTELNUMMER}{7}
\newcommand{\ABGABEDATUM}{am 8. Dezember 2015 bis 12 Uhr in die
Tutorenf\"acher}

\newcounter{AUFGNR}
\setcounter{AUFGNR}{1}
\newcommand{\AUFGABE}[2]{\vspace{0.3cm}\item[Aufgabe~\arabic{AUFGNR}]\stepcounter{AUFGNR} #1\hfill\emph{#2}}


\newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor}
\newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil}
\newcommand{\half}[1]{\frac{#1}{2}}
\newcommand{\B}{\mathbb{B}}
\newcommand{\Z}{\mathbb{Z}}
\newcommand{\R}{\mathbb{R}}
\newcommand{\N}{\mathbb{N}}
\newcommand{\Q}{\mathbb{Q}}



\renewcommand{\labelenumi}{(\alph{enumi})}
\renewcommand{\labelenumii}{(\roman{enumii})}


\begin{document}
\pagestyle{empty}
\hrule\medskip
\rule{0ex}{0ex}\\[-1ex]
\ZETTELNUMMER. Aufgabenblatt zur Vorlesung

\smallskip
\noindent
\large
\textbf{Informatik A}\hfill WiSe 2015/16 \\[0.5ex]
\normalsize
Wolfgang Mulzer

\medskip\hrule

\smallskip
\noindent
\textbf{Abgabe} \ABGABEDATUM

\vskip 0.5cm


\begin{description}

\AUFGABE{Uhrzeit}{10 Punkte}

Wir f\"uhren den Datentypen 
\texttt{type Zeit = (Int,Int)} ein, der eine Uhrzeit als
Paar $(h, m)$ von Stunden- und Minutenwert darstellt
($h \in \{0, 1, \dots, 23\}$, $m \in \{0, 1, \dots , 59\}$).

Implementieren Sie die folgenden Funktionen. Geben Sie alle
Signaturen an und machen Sie geeignete Testl\"aufe.
Versehen Sie Ihr Skript mit sinnvollen Kommentaren.

\begin{enumerate}
\item Geben Sie Funktionen 
\texttt{addStd, addMin:: Zeit -> Int -> Zeit},
welche die Uhr um eine bestimmte Anzahl von Stunden bzw.\@ Minuten vor oder 
zur\"uck 
stellen. 

\emph{Achtung}: Beachten Sie m\"ogliche Spr\"unge \"uber Stunden- oder 
Tagesgrenzen. Zum Beispiel soll
\texttt{addMin (23,58) 4} das Ergebnis \texttt{(0,2)} haben.
\item 
Implementieren Sie eine Funktion 
\texttt{dauer:: Zeit -> Zeit -> Zeit}, die f\"ur zwei
gegebene Zeiten \texttt{t1 t2} die Zeitdauer berechnet, wann 
zum ersten Mal nach der
Zeit \texttt{t1} die Zeit \texttt{t2} angezeigt wird 
(bei Gleichheit ist das Ergebnis \texttt{(0,0)}).
\item Implementieren Sie eine Funktion 
\texttt{anzeige:: Zeit -> String}, mit der eine Zeit
$(h,m)$ in einen String der Form ''h:m Uhr`` umgewandelt wird, 
wobei der Minutenwert immer zweistellig dargestellt werden soll.
\end{enumerate}

\AUFGABE{C\"asar-Chiffre}{10 Punkte}

In der Vorlesung haben wir 
den C\"asar-Chiffre in Haskell gesehen.


\begin{enumerate}
\item
Verallgemeinern Sie das Skript aus
der Vorlesung so, dass nun auch Gro\ss{}buchstaben erlaubt sind.
  
\item
Verallgemeinern Sie das Skript aus
der Vorlesung zu einem \emph{Substitutionschiffre}.
Implementieren Sie dazu Funktionen
\texttt{kodiere, dekodiere:: [(Char, Char)] -> String -> String},
welche eine gegebene Zeichenkette kodieren bzw.~dekodieren.
Das erste Argument ist der \emph{Schl\"ussel}. Er besteht aus
einer Folge von Paaren von Zeichen.
Dabei bedeutet ein Eintrag \texttt{(c,d)} im Schl\"ussel,
dass das Zeichen \texttt{c} im Klartext durch das Zeichen
\texttt{d} im verschl\"usselten Text dargestellt wird.
Die Zeichen, die nicht in der  Schl\"usselliste vorkommen,
sollen nicht ver\"andert werden. Sie k\"onnen davon ausgehen,
dass der Schl\"ussel wohldefiniert ist, so dass beim Dekodieren
keine Mehrdeutigkeiten auftreten k\"onnen.

Beispiele:
\[
\texttt{kodiere [('a','b'),('b','a'),('l','o'),('o','l')] ''hallo''}
\]
soll \texttt{''hbool''} liefern, und
\[
\texttt{dekodiere [('a','b'),('b','a'),('l', 'o'),('o', 'l')] ''hbool''}
\]
soll \texttt{''hallo''} ergeben.


\item \emph{(freiwillig, 5 Zusatzpunkte)}
Implementieren Sie den C\"asar-Chiffre mit Hilfe des
Substitionschiffre. Schreiben Sie dazu eine
Funktion \texttt{erzeugeSchluessel:: Int -> [(Char, Char)]},
welche aus einem Schl\"ussel f\"ur den C\"asar-Chiffre
einen Schl\"ussel f\"ur den Substitutionschiffre erzeugt.

\end{enumerate}

Geben Sie alle
Signaturen an und machen Sie geeignete Testl\"aufe.
Versehen Sie Ihr Skript mit sinnvollen Kommentaren.

\AUFGABE{Funktionen h\"oherer Ordnung}{10 Punkte}

\begin{enumerate}
  \item Schreiben Sie eine Funktion 
    \texttt{tausche}, welche als Eingabe eine
    zweistellige Funktion \texttt{f:: a -> b -> c}
    erh\"alt und welche eine Funktion \texttt{f':: b -> a -> c}
    liefert, die das gleiche tut wie \texttt{f}, bei der 
    aber die Reihenfolge der Argumente vertauscht ist.
  \item Schreiben Sie Funktionen \texttt{komplett}, \texttt{eins},
    \texttt{behalteBis} und \texttt{verwirfBis}. Diese Funktionen
    sollen jeweils eine Liste \texttt{xs} vom Typ \texttt{a} und 
    ein Pr\"adikat 
    \texttt{p:: a -> Bool} erhalten. 

    Die Funktion \texttt{komplett} 
    soll genau dann \texttt{True} liefern, falls alle Elemente von 
    \texttt{xs} das Pr\"adikat \texttt{p} erf\"ullen.
    Die Funktion \texttt{eins} 
    soll genau dann \texttt{True} liefern, falls mindestens ein Element von 
    \texttt{xs} das Pr\"adikat \texttt{p} erf\"ullt.
    Die Funktion \texttt{behalteBis} 
    soll den l\"angsten \emph{Pr\"afix} von \texttt{xs} liefern, in dem
    kein Element das Pr\"adikat \texttt{p} erf\"ullt.
    Die Funktion \texttt{verwirfBis} 
    soll den l\"angsten Pr\"afix von \texttt{xs} entfernen, in dem
    kein Element das Pr\"adikat \texttt{p} erf\"ullt.

   Ihre Funktionen sollen direkt rekursiv arbeiten.

 \item Definieren Sie \texttt{komplett} und \texttt{eins} aus (b)
   mit Hilfe von \texttt{map} und \texttt{foldl}.
\end{enumerate}

Geben Sie alle
Signaturen an und machen Sie geeignete Testl\"aufe.
Versehen Sie Ihr Skript mit sinnvollen Kommentaren.


\end{description}
\end{document}
