diff --git a/docs/examples/lists.mdx b/docs/examples/lists.mdx new file mode 100644 index 0000000..2dc2e7e --- /dev/null +++ b/docs/examples/lists.mdx @@ -0,0 +1,224 @@ +--- +sidebar_position: 2 +--- + +import { Hidden } from "@site/src/components/Hidden"; + +# Lists + +_By Kaz Zhou, June 2023_ + +Here are some coding exercises, where we use lists to represent the digits of arbitrarily large numbers, in any base. I encourage thinking about each question before peeking at the solution: each solution is short but challenging. + +## Flavortext + +Humans have 10 fingers, and thus represent numbers in base 10. +It's well known that parrots count using their wing feathers (maybe this is unrea*list*ic). +But the number of feathers on their wings varies! Polly has en*list*ed your help to write functions in an arbitrary base! +But first, to make the next task more simp*list*ic, +Polly asks you to write an `enum` function. + +## Enum + +Let $x_i$ be the $i$th element (0-indexed!) of the original list. The `enum` function outputs a list where the $i$th element is $(i, x_i)$. + +Formally, implement the function `enum : 'a list -> (int * 'a) list`. It should have the behavior `enum` $[x_0, x_1, x_2, \cdots, x_n] \Longrightarrow [(0,x_0), (1,x_1), (2,x_2), \cdots, (n,x_n)]$. + + +First we write a helper function which keeps track of the index `i`, +and tags each element with its appropriate index. +Then we call this helper function starting at index 0. + +``` +fun enumh i [] = [] + | enumh i (y::ys) = (i,y) :: (enumh (i+1) ys) + +fun enum L = enumh 0 L +``` + + + +## List to `int` +Polly represents numbers with lists as follows. Given a base $b \geq 1$, the list + +

+$[x_0,x_1,x_2,\cdots,x_n]$ +

+ +represents the number $x_0 b^0 + x_1 b^1 + x_2 b^2 + \cdots + x_n b^n$. Note that the least significant digit is at the head of the list. + +Formally, your task is to define a function `listToInt : (int * int list) -> int`. The first `int` is the base $b$, +and each element $x_i$ of the list satisfies $0 \leq x_i < b$. +Then `listToInt` $(b, [x_0,x_1,\cdots,x_n]) \Longrightarrow^* x_0b^0 + x_1b^1 + x_2b^2 + \cdots + x_nb^n$. + +You may use the exponentiation function, which satisfies `exp (x,y)` $\Longrightarrow^* x^y$. The definition is + +``` +fun exp (x,0) = 1 + | exp (x,n) = x * exp (x, n-1) +``` + +For example, +``` +listToInt 10 [0,5,1,5,1] ==> 15150 +listToInt 2 [1,1,1,1] ==> 15 +listToInt 5 [0,0,1,1] ==> 150 +``` + + +We first use the `enum` function to tag each digit with an index. +Then, we can calculate how much each digit contributes to the overall sum. + +``` +fun listToIntH (b, []) = 0 + | listToIntH (b, (power,digit)::xs) = + exp (b, power) * digit + listToIntH (b, xs) + +fun listToInt (b, L) = listToIntH (b, enum L) +``` + +If you know higher order functions, we can also use this elegant implementation: + +``` +fun listToInt (b, L) = foldr (fn ((power,digit), acc) => (digit * exp (b,power)) + acc) 0 (enum L) +``` + + + + + +## Decrement +Polly is a specia*list* of very large numbers that cannot be represented +using `int`'s. She wants a function that decrements a base $b$ number. + +Implement a function `dec : (int * int list) -> int list option`. + +We require $b \geq 0$, and each element $x_i$ of the list satisfies $0 \leq x_i < b$. + +If the input list represents 0, then the function outputs `NONE`. + +Otherwise, `dec (b,L)` $\Longrightarrow^*$ `SOME L1`, where `L1` represents the number 1 less than the number represented by `L`. + +As a constraint, do not convert the list to an integer. The purpose of the constraint is so that Polly can work with very large numbers. For example, + +`dec 15151 [0,0,0,42,42,42]` $\Longrightarrow^*$ `SOME [15150,15150,15150,41,42,42]` + +This would not work if we converted the list to an integer, due to overflow. + +Note that the input list may contain trailing zeroes, e.g. `[1,2,0,0,0]` in base 10 represents the number 21. Remember that the least significant digit is the head of the list. + +Here is a fun way to test your code. Use the helper function `decTest : int -> int list option -> int list option`, which has the following implementation: + +``` +fun decTest b NONE = NONE + | decTest b (SOME y) = dec b y +``` + +The below is an example REPL session of repeatedly decrementing a binary number. + +``` +- decTest 2 (SOME [0,1,0,1]); +val it = SOME [1,0,0,1] : int list option +- decTest 2 it; +val it = SOME [0,0,0,1] : int list option +- decTest 2 it; +val it = SOME [1,1,1,0] : int list option +- decTest 2 it; +val it = SOME [0,1,1,0] : int list option +- decTest 2 it; +val it = SOME [1,0,1,0] : int list option +``` + + +## Addition + +\begin{task}{add} +Your next task is to implement a function which adds two base $b$ numbers together. +\spec{add} +{int -> int list -> int list -> int list} +{$b \geq 0$, and each element $x_i$ of both lists satisfies $0 \leq x_i < b$.} +{`add b L1 L2} $\Longrightarrow^*$ `L3}, where `L3} is a list representation of the sum of `L1} and `L2}.} + + \begin{constraint} + Do not convert the list to an integer. + \end{constraint} + +You may want to implement a helper function which hauls around a ``carry flag'' as an extra argument. Also, here are some examples: +\begin{align*} + &`add 10 [1,2,3] [1,2,3]} \Longrightarrow^* `[2,4,6]} \\ + &`add 10 [6] [7]} \Longrightarrow^* `[3,1]} \\ + &`add 6 [1,2,2] [1,5,0]} \Longrightarrow^* `[2,1,3]} +\end{align*} +\end{task} + +\subsection{A colorful application} +\begin{task}{findTriple} +\vspace{10pt} +\begin{flavortext} +Polly is grateful for your implementation of base $b$ numbers! She now wants to apply them to another problem on her check\textit{list}. + +Polly is not a minima\textit{list} with her colors. She has very colorful wings! Polly wants to color the numbers $1,2,3,\cdots,13$ using three colors. But she has peculiar sty\textit{list}ic preferences... +\end{flavortext} +Polly wants to color the numbers $1,2,\cdots,n$ using $k$ colors, such that there does not exist any triple $x,y,z$ such that $x,y,z$ are all the same color, and $x+y=z$. Note that $x,y$ may be the same. We call such a coloring ``cool'', because Polly wants to be cool. + +For example, the below coloring is not cool because $1,4,5$ are all red, and $1+4=5$. +\[ \textcolor{red}{1}, \textcolor{orange}{2}, \textcolor{blue}{3}, \textcolor{red}{4}, \textcolor{red}{5} \] +The coloring below is not cool because $1,2$ are red, and $1+1=2$. +\[ \textcolor{red}{1}, \textcolor{red}{2}\] +The coloring below is cool, though. Polly approves! +\[ \textcolor{red}{1}, \textcolor{blue}{2}, \textcolor{blue}{3}, \textcolor{red}{4} \] + +First, Polly tasks you with determining whether a specific coloring is cool. We use numbers to represent colors. For example, we could associate 0 with red, 1 with orange, and 2 with blue. Then, the list `[0,1,2,0,0]} would represent \textcolor{red}{1}, \textcolor{orange}{2}, \textcolor{blue}{3}, \textcolor{red}{4}, \textcolor{red}{5}. + +\spec{findTriple} +{int list -> (int * int * int) option} +{Each element $x_i$ of the list satisfies $0 \leq x_i$.} +{`findTriple L} $\Longrightarrow^*$ `SOME (a,b,c)} if there exists some triple $a,b,c$, all of the same color, such that $a+b=c$. Otherwise, `findTriple L} $\Longrightarrow^*$ `NONE}.} + +Polly has provided some helper functions: +\begin{itemize} + \item `nth : 'a list -> int -> 'a option} finds the $n$th element of a list (if it exists). + \item `length : 'a list -> int} function finds the length of a list. + \item For testing purposes: `showColors : int list -> string} allows you to see a colorful version of a list. The function only supports up to x colors. Try out `showColors [0,1,2,3,4,5]} ! +\end{itemize} + +\textit{Hint:} You'll want to iterate over all triples $(a,b,c)$ such that $a+b=c$. Perhaps one of your base $b$ functions could help with that? +\end{task} + +\begin{task}{cool} +Let's help Polly find cool colorings! +\spec{cool} +{int -> int -> int list option} +{$k \geq 1$ and $n \geq 0$} +{`cool k n} $\Longrightarrow^*$ `SOME L}, where `findTriple L} $\Longrightarrow^*$ `NONE} if there exists some coloring of $1,2,\cdots,n$ with $k$ colors that is cool. Otherwise, `cool k n} $\Longrightarrow^*$ `NONE}.} + +For example, +\begin{align*} + &`cool 2 4} \Longrightarrow^* `SOME [0,1,1,0]} \text{ (Or another cool coloring)} \\ + &`cool 2 5} \Longrightarrow^* `NONE} +\end{align*} + +\textit{Hint:} You'll need to check every possible coloring of $1,2,\cdots,n$ with $k$ colors. One of the base $b$ functions can help with that! +\end{task} + +\begin{task}{findCool} +Using your function, find a cool coloring of $1,2,\cdots,13$ with $3$ colors! +\end{task} + +\begin{flavortext} +Awesome! Polly is so pleased with the cool coloring that she presents you with a gold medal. Now you're a gold medal\textit{list}! +\end{flavortext} + +\ + + +## Addition + + + +## Schur Triples + + + +## Congrats! +If you made it this far, congrats! Polly is pleased with your cool coloring and presents you with a gold medal. Now you're a gold medal*list*!