wsheets/wsh04.tex
author Christian Urban <christian.urban@kcl.ac.uk>
Mon, 25 Dec 2023 01:10:55 +0100
changeset 479 78cb5cdda3c3
parent 449 44f88dd66463
permissions -rw-r--r--
updated jars
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
197
Christian Urban <urbanc@in.tum.de>
parents: 195
diff changeset
     1
% !TEX program = xelatex
123
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     2
\documentclass{article}
423
554278cd4b70 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 400
diff changeset
     3
\usepackage{../styles/style}
554278cd4b70 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 400
diff changeset
     4
\usepackage{../styles/langs}
272
a091de62e3f8 updated
Christian Urban <urbanc@in.tum.de>
parents: 271
diff changeset
     5
\usepackage{tikz}
a091de62e3f8 updated
Christian Urban <urbanc@in.tum.de>
parents: 271
diff changeset
     6
\usepackage{pgf}
123
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     7
\usepackage{marvosym}
184
19b1e01054f6 updated
pdated
parents: 183
diff changeset
     8
\usepackage{boxedminipage}
123
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     9
352
644aca68e203 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 343
diff changeset
    10
\lstset{escapeinside={/*!}{!*/}}
644aca68e203 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 343
diff changeset
    11
\newcommand{\annotation}[1]{\hfill\footnotesize{}#1}
272
a091de62e3f8 updated
Christian Urban <urbanc@in.tum.de>
parents: 271
diff changeset
    12
352
644aca68e203 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 343
diff changeset
    13
\usepackage{menukeys}
335
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    14
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    15
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    16
% Exact colors from NB
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    17
\usepackage[breakable]{tcolorbox}
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    18
\definecolor{incolor}{HTML}{303F9F}
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    19
\definecolor{outcolor}{HTML}{D84315}
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    20
\definecolor{cellborder}{HTML}{CFCFCF}
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    21
\definecolor{cellbackground}{HTML}{F7F7F7}
334
305e1dcdb3bc updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 333
diff changeset
    22
335
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    23
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    24
    
123
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    25
\begin{document}
439
e27ff222fef3 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 438
diff changeset
    26
\fnote{\copyright{} Christian Urban, King's College London, 2022}
195
4bacbe753e66 updated
Christian Urban <urbanc@in.tum.de>
parents: 193
diff changeset
    27
449
44f88dd66463 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 446
diff changeset
    28
\section*{Scala Worksheet 4}
271
5c7279e09b15 updated
Christian Urban <urbanc@in.tum.de>
parents: 270
diff changeset
    29
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
    30
442
94117c4f8b67 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 441
diff changeset
    31
449
44f88dd66463 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 446
diff changeset
    32
\subsection*{Task 1 (Options Again)}
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
    33
446
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    34
301
aa0e86419773 updated
Christian Urban <urbanc@in.tum.de>
parents: 278
diff changeset
    35
446
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    36
\begin{itemize}
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    37
\item[(1)] Define a function \texttt{mirror} that takes a tree as argument and returns
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    38
the mirror-image of a tree (meaning left- and right-hand side are
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    39
exchanged).
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    40
\item[(2)] Define a function \texttt{sum\_tree} that sums up all
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    41
  leaves in a tree.
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    42
\end{itemize}  
123
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    43
446
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    44
\subsection*{Task 2 (Pattern-Matching, Accumulators)}
442
94117c4f8b67 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 441
diff changeset
    45
446
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    46
Define a function \texttt{remdups} that removes duplicates in a list,
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    47
say list of integers. This functions should take a list of integers
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    48
as argument and returns a list of integers. In order to remove
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    49
elements that have already been seen, use an accumulator which can be
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    50
a set of of integers (for fast lookup whether an element has already
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    51
been seen). The accumulator can be implemented either with an
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    52
auxiliary function or with a default argument like
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
    53
442
94117c4f8b67 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 441
diff changeset
    54
\begin{lstlisting}[numbers=none]
446
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    55
def remdups(xs: List[Int], acc: Set[Int] = Set()) : List[Int] = ???
343
51e25cc30483 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 335
diff changeset
    56
\end{lstlisting}
51e25cc30483 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 335
diff changeset
    57
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    58
\noindent
446
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    59
Are you familiar with polymorphic types in Scala? If yes, can you
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    60
define \texttt{remdups} generically so that it works for any type
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    61
of lists.
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    62
446
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    63
\subsection*{Task 3 (Pattern-Matching, Options, Maps)}
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    64
446
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    65
Remember that the method \texttt{indexOf} returns $-1$ whenever it
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    66
cannot find an element in a list. Define a better version of
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    67
this function, called \texttt{indexOfOption} that returns in
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    68
the failure case \texttt{None} and in the success case
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    69
\texttt{Some}$(n)$ where $n$ is the index of the element in the
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    70
list. Try to define this function recursively but without an
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    71
auxiliary function. For this use a \texttt{map}.
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
    72
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
    73
\begin{lstlisting}[numbers=none]
446
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    74
scala> indexOfOption(List(1,2,3,4,5,6), 7)   // => None
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    75
scala> indexOfOption(List(1,2,3,4,5,6), 4)   // => Some(3)
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    76
scala> indexOfOption(List(1,2,3,4,3,6), 3)   // => Some(2)
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
    77
\end{lstlisting}
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
    78
446
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    79
\subsection*{Task 4 (Pattern-Matching, If-guards,  hard)}
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    80
446
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    81
Recall the tree definition from Task 1. Define a \texttt{height}
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    82
function that calculates the height of a tree.
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    83
446
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    84
Define a second function \texttt{balance} that makes sure that the
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    85
height of a left and right child is balanced (only differ in heights
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    86
by maximal of one). Implement this function by balancing trees
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    87
stepwise - reorder that the height difference changes by one and then
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    88
the balancing is repeated.
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    89
446
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    90
\subsection*{Task 5 (Fold, hard)}
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    91
445
160cbb09027f updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 444
diff changeset
    92
Implement a function \texttt{fold} for lists of integers. It takes
160cbb09027f updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 444
diff changeset
    93
a list of integers as argument as well as a function $f$ and a unit element $u$.
446
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    94
The function $f$ is of type \texttt{(Int, Int) => Int} and the unit element
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    95
is of type \texttt{Int}. The return type of \texttt{fold} is \texttt{Int}.
445
160cbb09027f updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 444
diff changeset
    96
What is \texttt{fold} supposed to do? Well it should fold the function $f$
160cbb09027f updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 444
diff changeset
    97
over the elements of the list and in case of the empty list return the
446
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    98
unit element $u$.
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
    99
%
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
   100
\[
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
   101
  \begin{array}{lcl}
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
   102
    \texttt{fold}(Nil, f, u) & \dn & u\\
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
   103
    \texttt{fold}(x::xs, f, u) & \dn & f(x, \texttt{fold}(xs, f, u))\\
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
   104
  \end{array}\smallskip  
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
   105
\]
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
   106
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
   107
\noindent
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
   108
Use \texttt{fold} to define the sum of a list of integers and the
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
   109
product of a list of integers. Try to use Scala's shorthand notation
30b8f14b2655 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 445
diff changeset
   110
\texttt{\_ + \_} and \texttt{\_ * \_} for functions.
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
   111
123
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   112
\end{document}
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   113
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   114
%%% Local Variables: 
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   115
%%% mode: latex
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   116
%%% TeX-master: t
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   117
%%% End: