
diff -r b84ea52bfd8f -r cdfb2ce30a3d slides/slides03.tex
--- a/slides/slides03.tex	Tue Nov 12 10:47:27 2019 +0000
+++ b/slides/slides03.tex	Tue Nov 19 00:40:27 2019 +0000
@@ -1,8 +1,10 @@
+% !TEX program = xelatex
 \documentclass[dvipsnames,14pt,t,xelatex]{beamer}
 \usepackage{../slides}
 \usepackage{../graphics}
 \usepackage{../langs}
 %%\usepackage{../data}
+\usetikzlibrary{shapes}
 \usepackage[export]{adjustbox}
 
 \hfuzz=220pt 
@@ -21,6 +23,22 @@
 % beamer stuff 
 \renewcommand{\slidecaption}{PEP (Scala) 03, King's College London}
 
+\newcommand{\UParrow}[3]{%
+\begin{textblock}{0}(#2,#3)%
+\onslide<#1>{%
+\begin{tikzpicture}%
+\node at (0,0) [single arrow, shape border rotate=90, fill=red,text=red]{a};%
+\end{tikzpicture}}%
+\end{textblock}}
+
+\newcommand{\DOWNarrow}[3]{%
+\begin{textblock}{0}(#2,#3)%
+\onslide<#1>{%
+\begin{tikzpicture}%
+\node at (0,0) [single arrow, shape border rotate=270, fill=red,text=red]{a};%
+\end{tikzpicture}}%
+\end{textblock}}
+
 \begin{document}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \begin{frame}[t]
@@ -34,39 +52,33 @@
   \begin{center}
   \begin{tabular}{ll}
     Email:  & christian.urban at kcl.ac.uk\\
-    Office: & N7.07 (North Wing, Bush House)\\
-    Slides \& Code: & KEATS\medskip\\
-    Office Hours: &  \alert{next Monday} 11 -- 12 \& 13 -- 14\\
+    Office: & N\liningnums{7.07} (North Wing, Bush House)\bigskip\\
+    Slides \& Code: & KEATS\bigskip\\
+    Office Hours: &  Thursdays 12:00 -- 14:00\\
+    Additionally: & (for Scala) Tuesdays 10:45 -- 11:45\\ 
   \end{tabular}
   \end{center}
 
-
 \end{frame}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     
+\begin{frame}[c]
+\frametitle{Preliminary 6}
 
-\begin{frame}[c]
-\frametitle{Marks for CW6 (Part 1 + 2)}
-
-Raw marks (234 submissions):
+Raw marks (261 submissions):\bigskip
 
 \begin{itemize}
-\item 6\%: \hspace{4mm}163 students
-\item 5\%: \hspace{4mm}29
-\item 4\%: \hspace{4mm}3
-\item 3\%: \hspace{4mm}13
-\item 2\%: \hspace{4mm}3
+\item 3\%: \hspace{4mm}219
+\item 2\%: \hspace{4mm}19
 \item 1\%: \hspace{4mm}0
-\item 0\%: \hspace{4mm}23 
+\item 0\%: \hspace{4mm}23 \;(4 no submission)
 \end{itemize}  
 \end{frame}
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \begin{frame}[c,fragile]
 
@@ -86,65 +98,139 @@
 \begin{lstlisting}[language=Scala, numbers=none, xleftmargin=-1mm]
 def collatz(n: Long) : Long =
   collatzHelper(n, 0)
-\end{lstlisting}\pause
-
-
-\end{frame}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\begin{frame}[c,fragile]
-
-\begin{lstlisting}[language=Scala, numbers=none, xleftmargin=-1mm]
-def collatz_max(bnd: Long) : (Long,Long) = {val lst = for(a<-(1 to bnd.toInt)) yield (collatz(a),a.toLong);val lst2 = lst.sortBy(_._1);lst2(lst2.length-1)}
-\end{lstlisting}\bigskip
-
-\tiny
-\begin{lstlisting}[language=Scala, numbers=none, xleftmargin=-1mm]
-def collatz_max(bnd: Long) : (Long,Long) = {val lst = for(a<-(1 to bnd.toInt)) yield (collatz(a),a.toLong);val lst2 = lst.sortBy(_._1);lst2(lst2.length-1)}
-\end{lstlisting}\pause
-
+\end{lstlisting}
 
 \end{frame}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \begin{frame}[c,fragile]
+\frametitle{Default Arguments}
 
 \small
-\begin{lstlisting}[language=Scala, xleftmargin=-4mm,numbers=left]
- def process_ratings(lines: List[String]) = {
-    val values = List[(String,String)]()
+\begin{lstlisting}[language=Scala, numbers=none, xleftmargin=-3mm]
+def collatzHelper(n: Int, a: Int = 0) : Int = ...
 
-    for(line <- lines) {
-        val splitList = ...
 
-        if(splitList(2).toInt >= 4){
-            val userID = splitList(0)
-            val movieID = splitList(1)
-            val tuple = (userID, movieID)
-            tuple :: values
-        }
-    }
-    
-    values
- }
+collatzHelper(n, 3)
+collatzHelper(n, 0)
+
+collatzHelper(n)   // a = 0   
 \end{lstlisting}
 
-\normalsize
-What does this function (always) return?
-
+\DOWNarrow{1}{10.7}{3.4}
 
 \end{frame}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     
+\begin{frame}[c,fragile]
+\frametitle{Last Week: Options \& HO Funs.}
 
+\begin{lstlisting}[language=Scala, numbers=none, xleftmargin=-1mm]
+List(7,2,3,4,5,6).find(_ < 4)
+res: Option[Int] = Some(2)
+ 
+
+List(5,6,7,8,9).find(_ < 4)
+res: Option[Int] = None
+
+
+List(1,2,3,4,5).map(x => x * x)
+res: List[Int] = List(1, 4, 9, 16, 25)
+\end{lstlisting}
+  
+  \end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     
+\begin{frame}[c,fragile]
+\frametitle{Web-Crawler (1)}
+
+\small
+\begin{lstlisting}[language=Scala, numbers=none, xleftmargin=-7mm]
+def get_page(url: String) : String = {
+Try(fromURL(url)("ISO-8859-1").take(10000).mkString)
+   .getOrElse { println(s" Problem with: $url"); ""}
+}
+\end{lstlisting}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     
+\begin{frame}[c,fragile]
+\frametitle{Web-Crawler (2)}
+
+\small
+\begin{lstlisting}[language=Scala, numbers=none, 
+                    xleftmargin=-7mm, escapeinside={(*@}{@*)}]
+val http_pattern = """(*@\textcolor{codegreen}{"}@*)https?://[\^(*@\textcolor{codegreen}{"}@*)]*(*@\textcolor{codegreen}{"}@*)""".r
+val email_pattern = 
+ """([a-z\d\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})""".r
+
+
+def unquote(s: String) = s.drop(1).dropRight(1)
+
+
+def get_all_URLs(page: String): Set[String] = 
+  http_pattern.findAllIn(page).map(unquote).toSet
+
+  // returns all URLs in a page  
+\end{lstlisting}
+  
+  \end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     
+\begin{frame}[c,fragile]
+\frametitle{Web-Crawler (3)}
+
+\small
+\begin{lstlisting}[language=Scala, numbers=none, xleftmargin=-1mm]
+def crawl(url: String, n: Int) : Unit = {
+  if (n == 0) ()
+  else {
+    println(s"  Visiting: $n $url")
+    val page = get_page(url)
+    for (u <- get_all_URLs(page)) 
+      crawl(u, n - 1)
+  }
+}
+\end{lstlisting}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     
+\begin{frame}[c,fragile]
+\frametitle{Email Harvester}
+
+\small
+\begin{lstlisting}[language=Scala, numbers=none, xleftmargin=-3mm]
+def emails(url: String, n: Int) : Set[String] = {
+ if (n == 0) Set()
+ else {
+  println(s"  Visiting: $n $url")
+  val page = get_page(url)
+  val new_emails = 
+    email_pattern.findAllIn(page).toSet
+  new_emails ++ 
+    (for (u <- get_all_URLs(page)) 
+       yield emails(u, n - 1)).flatten
+ }
+} 
+
+\end{lstlisting}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     
 \begin{frame}[c]
 \frametitle{Jumping Towers}
 
 \begin{center}
-\begin{tikzpicture}[scale=1.2]
+\begin{tikzpicture}[scale=1.3]
   \draw[line width=1mm,cap=round] (0,0) -- (5,0);
   \draw[line width=1mm,cap=round] (0,1) -- (5,1);
 
@@ -186,9 +272,7 @@
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     
-
 \begin{frame}[c]
 \frametitle{``Children'' / moves}
 
@@ -205,14 +289,38 @@
 \end{tikzpicture}
 \end{center}
 
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     
+\begin{frame}[c,fragile]
+\frametitle{Reverse Polish Notation}
+
+{\Large\bl{$(3 + 1) * (2 + 9)$}}\bigskip
+
+{\Large$\Rightarrow$}\bigskip
+
+{\;\;\Large\bl{$3\;\;1\;+\;2\;\;9\;+\;*$}}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ 
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     
+\begin{frame}[c,fragile]
+\frametitle{Sudoku}
+
+A very simple-minded version on 110 problems:\bigskip
+
+\begin{itemize}
+\item 1 core: 800 secs
+\item 2 cores: 400 secs
+\item 8 cores: 290 secs
+\item 18 cores: 142 secs
+\end{itemize}
 
 \end{frame}
-
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
+ 
 
 \end{document}
 




