From 8c12c4681c9ffc37d818ce1c7e4892d81d83a3f6 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 22 Jan 2025 21:17:36 -0800 Subject: [PATCH 01/19] Convert "A Familiar Concept" to typst --- src/Warm-Ups/A Familiar Concept/main.tex | 35 ------------------------ src/Warm-Ups/A Familiar Concept/main.typ | 33 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 35 deletions(-) delete mode 100755 src/Warm-Ups/A Familiar Concept/main.tex create mode 100644 src/Warm-Ups/A Familiar Concept/main.typ diff --git a/src/Warm-Ups/A Familiar Concept/main.tex b/src/Warm-Ups/A Familiar Concept/main.tex deleted file mode 100755 index 8a754d3..0000000 --- a/src/Warm-Ups/A Familiar Concept/main.tex +++ /dev/null @@ -1,35 +0,0 @@ -\documentclass[ - solutions, - hidewarning, - singlenumbering, - nopagenumber -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - - - -\title{Warm-Up: A Familiar Concept} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today} - - -\begin{document} - - \maketitle - - - \problem{} - Let $v = [-5, -2, 0, 1, 4, 1000]$. Find all $x$ that minimize the following metric. \par - $$ - \sum_{\forall i} |v_i - x| = |v_1 - x| + |v_2 - x| + ... + |v_6 - x| - $$ - \vfill - - \problem{} - Let $v = [-5, -2, 0, 1, 4, 1000, 1001]$. Find all $x$ that minimize the metric in \ref{one}. - \vfill - - \problem{} - What is this metric usually called? - -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/A Familiar Concept/main.typ b/src/Warm-Ups/A Familiar Concept/main.typ new file mode 100644 index 0000000..2cfdc54 --- /dev/null +++ b/src/Warm-Ups/A Familiar Concept/main.typ @@ -0,0 +1,33 @@ +#import "@local/handout:0.1.0": * + +#show: handout.with( + title: [Warm-Up: A Familiar Concept], + by: "Mark", +) + +#problem() +Let $v = [-5, -2, 0, 1, 4, 1000]$. Find all $x$ that minimize the following metric: + +#align( + center, + box( + inset: 3mm, + $ + sum_(#sym.forall i) |v_i - x| = |v_1 - x| + |v_2 - x| + ... + |v_6 - x| + $, + ), +) + +#v(1fr) + +#problem() +Let $v = [-5, -2, 0, 1, 4, 1000, 1001]$. Find all $x$ that minimize the metric in the previous problem. + +#v(1fr) + + +#problem() +What is this metric usually called? + + +#v(0.25fr) -- 2.47.1 From 5121f74bded5bfd4a6491b4fe20d2e269d17db42 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 22 Jan 2025 21:18:07 -0800 Subject: [PATCH 02/19] Convert "fmod" to typst --- src/Warm-Ups/fmod/main.tex | 22 ---------------------- src/Warm-Ups/fmod/main.typ | 10 ++++++++++ 2 files changed, 10 insertions(+), 22 deletions(-) delete mode 100755 src/Warm-Ups/fmod/main.tex create mode 100644 src/Warm-Ups/fmod/main.typ diff --git a/src/Warm-Ups/fmod/main.tex b/src/Warm-Ups/fmod/main.tex deleted file mode 100755 index 693d94e..0000000 --- a/src/Warm-Ups/fmod/main.tex +++ /dev/null @@ -1,22 +0,0 @@ -\documentclass[ - solutions, - hidewarning, - singlenumbering, - nopagenumber -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - - -\title{Warm-Up: \texttt{fmod}} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today.} - -\begin{document} - - \maketitle - - \problem{} - I'm sure you're all familiar with how \texttt{mod(a, b)} and \texttt{remainder(a, b)} work with integers. \par - Devise an equivalent for floats (i.e, real numbers). - -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/fmod/main.typ b/src/Warm-Ups/fmod/main.typ new file mode 100644 index 0000000..2e973e1 --- /dev/null +++ b/src/Warm-Ups/fmod/main.typ @@ -0,0 +1,10 @@ +#import "@local/handout:0.1.0": * + +#show: handout.with( + title: [Warm-Up: `fmod`], + by: "Mark", +) + +#problem() +I'm sure you're all familiar with how `mod(a, b)` and `remainder(a, b)` \ work when `a` and `b` are integers. +Devise an equivalent for floats (i.e, real numbers). -- 2.47.1 From 9523881ef4d41ee4a1de84cce40d28b899842a09 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 22 Jan 2025 21:18:26 -0800 Subject: [PATCH 03/19] Convert "Fuse Timers" to typst --- src/Warm-Ups/Fuse Timers/main.tex | 31 ------------------------------- src/Warm-Ups/Fuse Timers/main.typ | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 31 deletions(-) delete mode 100755 src/Warm-Ups/Fuse Timers/main.tex create mode 100644 src/Warm-Ups/Fuse Timers/main.typ diff --git a/src/Warm-Ups/Fuse Timers/main.tex b/src/Warm-Ups/Fuse Timers/main.tex deleted file mode 100755 index b0c5d1a..0000000 --- a/src/Warm-Ups/Fuse Timers/main.tex +++ /dev/null @@ -1,31 +0,0 @@ -\documentclass[ - solutions, - hidewarning, - singlenumbering, - nopagenumber -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - - - -\title{Warm-Up: Fuse Timers} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today.} - -\begin{document} - - \maketitle - - - \problem{} - Suppose we have two strings and a lighter. Each string takes an hour to fully burn. \par - However, we do not know how fast each part of the string burns: - half might burn in 1 minute, and the rest could take 59. - - \vspace{2mm} - - How would we measure exactly 45 minutes using these strings? - - \vfill - -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/Fuse Timers/main.typ b/src/Warm-Ups/Fuse Timers/main.typ new file mode 100644 index 0000000..48cb0fa --- /dev/null +++ b/src/Warm-Ups/Fuse Timers/main.typ @@ -0,0 +1,15 @@ +#import "@local/handout:0.1.0": * + +#show: handout.with( + title: [Warm-Up: Fuse Timers], + by: "Mark", +) + +#problem() +Suppose we have two strings and a lighter. Each string takes exactly an hour to fully burn. \ +However, we do not know how fast each part of the string burns: +half might burn in 1 minute, and the rest could take 59. + +#v(2mm) + +How can we measure exactly 45 minutes using these two strings? -- 2.47.1 From dd0ccb5112732f755aa5b336b4b7c7ab23803155 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 22 Jan 2025 21:18:40 -0800 Subject: [PATCH 04/19] Convert "Mario Kart" to typst --- src/Warm-Ups/Mario Kart/main.tex | 54 -------------------------------- src/Warm-Ups/Mario Kart/main.typ | 35 +++++++++++++++++++++ 2 files changed, 35 insertions(+), 54 deletions(-) delete mode 100755 src/Warm-Ups/Mario Kart/main.tex create mode 100644 src/Warm-Ups/Mario Kart/main.typ diff --git a/src/Warm-Ups/Mario Kart/main.tex b/src/Warm-Ups/Mario Kart/main.tex deleted file mode 100755 index f5af8a0..0000000 --- a/src/Warm-Ups/Mario Kart/main.tex +++ /dev/null @@ -1,54 +0,0 @@ -\documentclass[ - solutions, - hidewarning, - singlenumbering, - nopagenumber -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - - -\title{Warm-Up: Mario Kart} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today} - - -\begin{document} - - \maketitle - - \problem{} - A standard Mario Kart cup consists of 12 players and four races. \par - Each race is scored as follows: - \begin{itemize} - \item 15 points are awarded for first place; - \item 12 for second; - \item and $(13 - \text{place})$ otherwise. - \end{itemize} - In any one race, no players may tie. - A player's score at the end of a cup is the sum of their scores for each of the four races. - - \vspace{2mm} - - An $n$-way tie occurs when the top $n$ players have the same score at the end of a round. \par - What is the largest possible $n$, and how is it achieved? - - \begin{solution} - A 12-way tie is impossible, since the total number of point is not divisible by 12. - - \vspace{2mm} - - A 11-way tie is possible, with a top score of 28: - \begin{itemize} - \item Four players finish $1^\text{st}$, $3^\text{ed}$, $11^\text{th}$, and $12^\text{th}$; - - % spell:off - \item Four players finish $2^\text{nd}$, $4^\text{th}$, $9^\text{th}$, and $10^\text{th}$; - % spell:on - - \item Two players finish fifth twice and seventh twice, - \item One player finishes sixth in each race. - \end{itemize} - The final player always finishes eighth, with a non-tie score of 20. - \end{solution} - -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/Mario Kart/main.typ b/src/Warm-Ups/Mario Kart/main.typ new file mode 100644 index 0000000..2768cc8 --- /dev/null +++ b/src/Warm-Ups/Mario Kart/main.typ @@ -0,0 +1,35 @@ +#import "@local/handout:0.1.0": * + +#show: handout.with( + title: [Warm-Up: Mario Kart], + by: "Mark", +) + +#problem() +A standard Mario Kart cup consists of 12 players and four races. \ +Each race is scored as follows: +- 15 points are awarded for first place; +- 12 for second; +- and $(13 - #text("place"))$ otherwise. + +In any one race, no players may tie. \ +A player's score at the end of a cup is the sum of their scores for each of the four races. + +#v(2mm) + +An $n$-way tie occurs when the top $n$ players have the same score at the end of a round. \ +What is the largest possible $n$, and how is it achieved? + +#solution([ + A 12-way tie is impossible, since the total number of point is not divisible by 12. + + #v(2mm) + + A 11-way tie is possible, with a top score of 28: + - Four players finish $1^#text("st")$, $3^#text("ed")$, $11^#text("th")$, and $12^#text("th")$; + - Four players finish $2^#text("nd")$, $4^#text("th")$, $9^#text("th")$, and $10^#text("th")$; // spell:disable-line + - Two players finish fifth twice and seventh twice, + - One player finishes sixth in each race. + The final player always finishes eighth, with a non-tie score of 20. + +]) -- 2.47.1 From df27f2d46e88daf65e01384c45f9076fefcdc417 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 22 Jan 2025 21:18:59 -0800 Subject: [PATCH 05/19] Convert "Partition Products" to typst --- src/Warm-Ups/Partition Products/main.tex | 57 ------------------------ src/Warm-Ups/Partition Products/main.typ | 41 +++++++++++++++++ 2 files changed, 41 insertions(+), 57 deletions(-) delete mode 100755 src/Warm-Ups/Partition Products/main.tex create mode 100644 src/Warm-Ups/Partition Products/main.typ diff --git a/src/Warm-Ups/Partition Products/main.tex b/src/Warm-Ups/Partition Products/main.tex deleted file mode 100755 index a440b7e..0000000 --- a/src/Warm-Ups/Partition Products/main.tex +++ /dev/null @@ -1,57 +0,0 @@ -\documentclass[ - solutions, - singlenumbering, - nopagenumber -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - - -\title{Warm-Up: Partition Products} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today.} - -\begin{document} - - \maketitle - - \problem{} - Take any positive integer $n$. \par - Now, write it as sum of smaller positive integers: $n = a_1 + a_2 + ... + a_k$ \par - Maximize the product $a_1 \times a_2 \times ... \times a_k$ - - - - \begin{solution} - - \textbf{Interesting Solution:} - - Of course, all $a_i$ should be greater than $1$. \par - Also, all $a_i$ should be smaller than four, since $x \leq x(x-2)$ if $x \geq 4$. \par - Thus, we're left with sequences that only contain 2 and 3. \par - \note{Note that two twos are the same as one four, but we exclude fours for simplicity.} - - \vspace{2mm} - - Finally, we see that $3^2 > 2^3$, so any three twos are better repackaged as two threes. \par - The best sequence $a_i$ thus consists of a maximal number of threes followed by 0, 1, or 2 twos. - - \linehack{} - - - - \textbf{Calculus Solution:} - - First, solve this problem for equal, non-integer $a_i$: - - \vspace{2mm} - - We know $n = \prod{a_i}$, thus $\ln(n) = \sum{\ln(a_i)}$. \par - If all $a_i$ are equal, we get $\ln(n) = k \times \ln(n / k)$. \par - Derive wrt $k$ and set to zero to get $\ln(n / k) = 1$ \par - So $k = n / e$ and $n / k = e \approx 2.7$ - - \vspace{2mm} - - If we try to approximate this with integers, we get the same solution as above. - \end{solution} -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/Partition Products/main.typ b/src/Warm-Ups/Partition Products/main.typ new file mode 100644 index 0000000..cd33c83 --- /dev/null +++ b/src/Warm-Ups/Partition Products/main.typ @@ -0,0 +1,41 @@ +#import "@local/handout:0.1.0": * + +#show: handout.with( + title: [Warm-Up: Partition Products], + by: "Mark", +) + +#problem() +Take any positive integer $n$. \ +Now, write it as sum of smaller positive integers: $n = a_1 + a_2 + ... a_k$ \ +Maximize the product $a_1 #sym.times a_2 #sym.times ... #sym.times a_k$ + + +#solution([ + *Interesting Solution:* + + Of course, all $a_i$ should be greater than $1$. \ + Also, all $a_i$ should be smaller than four, since $x <= x(x-2)$ if $x >= 4$. \ + Thus, we're left with sequences that only contain 2 and 3. \ + #note([Note that two twos are the same as one four, but we exclude fours for simplicity.]) + + #v(2mm) + + Finally, we see that $3^2 > 2^3$, so any three twos are better repackaged as two threes. \ + The best sequence $a_i$ thus consists of a maximal number of threes followed by 0, 1, or 2 twos. + + #v(8mm) + + *Calculus Solution:* + + First, solve this problem for equal, real $a_i$: + #v(2mm) + We know $n = product(a_i)$, thus $ln(n) = sum(ln(a_i))$. \ + If all $a_i$ are equal, we get $ln(n) = k #sym.times ln(n / k)$. \ + Derive wrt $k$ and set to zero to get $ln(n / k) = 1$ \ + So $k = n / e$ and $n / k = e #sym.approx 2.7$ + + #v(2mm) + + If we try to approximate this with integers, we get the same solution as above. +]) -- 2.47.1 From 5b245b9e16322b0a0f2ecd11911fb601ad835518 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 22 Jan 2025 21:19:14 -0800 Subject: [PATCH 06/19] Convert "Prime Factors" to typst --- src/Warm-Ups/Prime Factors/main.tex | 34 ----------------------------- src/Warm-Ups/Prime Factors/main.typ | 23 +++++++++++++++++++ 2 files changed, 23 insertions(+), 34 deletions(-) delete mode 100755 src/Warm-Ups/Prime Factors/main.tex create mode 100644 src/Warm-Ups/Prime Factors/main.typ diff --git a/src/Warm-Ups/Prime Factors/main.tex b/src/Warm-Ups/Prime Factors/main.tex deleted file mode 100755 index 4f5a400..0000000 --- a/src/Warm-Ups/Prime Factors/main.tex +++ /dev/null @@ -1,34 +0,0 @@ -\documentclass[ - solutions, - singlenumbering, - nopagenumber, - hidewarning -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - -\title{Warm-Up: Prime Factors} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today.} - -\begin{document} - - \maketitle - - \problem{} - What proportion of integers have $2$ as their smallest prime factor? - % 1^2 - \vfill - - - \problem{} - What proportion of integers have $3$ as their second-smallest prime factor? - % 1/6 - \vfill - - - \problem{} - What is the median second-smallest prime factor? - % 37 - \vfill - -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/Prime Factors/main.typ b/src/Warm-Ups/Prime Factors/main.typ new file mode 100644 index 0000000..1e81933 --- /dev/null +++ b/src/Warm-Ups/Prime Factors/main.typ @@ -0,0 +1,23 @@ +#import "@local/handout:0.1.0": * + +#show: handout.with( + title: [Warm-Up: Prime Factors], + by: "Mark", +) + +#problem() +What proportion of integers have $2$ as their smallest prime factor? +#solution([$1 div 2$]) +#v(1fr) + + +#problem() +What proportion of integers have $3$ as their second-smallest prime factor? +#solution([$1 div 6$]) +#v(1fr) + + +#problem() +What is the median second-smallest prime factor? +#solution([37]) +#v(1fr) -- 2.47.1 From 08eefd8d0b5aa029d6f18e6d30baa161232ccc20 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 22 Jan 2025 21:19:29 -0800 Subject: [PATCH 07/19] Convert "Regex" to typst --- src/Warm-Ups/Regex/main.tex | 153 ------------------------------------ src/Warm-Ups/Regex/main.typ | 135 +++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+), 153 deletions(-) delete mode 100644 src/Warm-Ups/Regex/main.tex create mode 100644 src/Warm-Ups/Regex/main.typ diff --git a/src/Warm-Ups/Regex/main.tex b/src/Warm-Ups/Regex/main.tex deleted file mode 100644 index a8f48e7..0000000 --- a/src/Warm-Ups/Regex/main.tex +++ /dev/null @@ -1,153 +0,0 @@ -\documentclass[ - solutions, - hidewarning, -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - - -\usepackage{xcolor} -\usepackage{soul} -\usepackage{hyperref} - -\definecolor{Light}{gray}{.90} -\sethlcolor{Light} -\newcommand{\htexttt}[1]{\texttt{\hl{#1}}} - - -\title{The Regex Warm-Up} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today} - -\begin{document} - - \maketitle - - - Last time, we discussed Deterministic Finite Automata. One interesting application of these mathematical objects is found in computer science: Regular Expressions. \par - This is often abbreviated \say{regex}, which is pronounced like \say{gif.} - - \vspace{2mm} - - Regex is a language used to specify patterns in a string. You can think of it as a concise way to define a DFA, using text instead of a huge graph. \par - - Often enough, a clever regex pattern can do the work of a few hundred lines of code. - - \vspace{2mm} - - Like the DFAs we've studied, a regex pattern \textit{accepts} or \textit{rejects} a string. However, we don't usually use this terminology with regex, and instead say that a string \textit{matches} or \textit{doesn't match} a pattern. - - \vspace{5mm} - - Regex strings consist of characters, quantifiers, sets, and groups. - - \vspace{5mm} - - \textbf{Quantifiers} \par - Quantifiers specify how many of a character to match. \par - There are four of these: \htexttt{+}, \htexttt{*}, \htexttt{?}, and \htexttt{\{ \}} - - \vspace{2mm} - - \htexttt{+} means \say{match one or more of the preceding token} \par - \htexttt{*} means \say{match zero or more of the preceding token} - - For example, the pattern \htexttt{ca+t} will match the following strings: - \begin{itemize} - \item \texttt{cat} - \item \texttt{caat} - \item \texttt{caaaaaaaat} - \end{itemize} - \htexttt{ca+t} will \textbf{not} match the string \texttt{ct}. \par - The pattern \htexttt{ca*t} will match all the strings above, including \texttt{ct}. - \vspace{2mm} - - - \htexttt{?} means \say{match one or none of the preceding token} \par - The pattern \htexttt{linea?r} will match only \texttt{linear} and \texttt{liner}. - \vspace{2mm} - - Brackets \htexttt{\{min, max\}} are the most flexible quantifier. \par - They specify exactly how many tokens to match: \par - \htexttt{ab\{2\}a} will match only \texttt{abba}. \par - \htexttt{ab\{1,3\}a} will match only \texttt{aba}, \texttt{abba}, and \texttt{abbba}. \par - % spell:off - \htexttt{ab\{2,\}a} will match any \texttt{ab...ba} with at least two \texttt{b}s. - % spell:on - - \vspace{5mm} - - \problem{} - Write the patterns \htexttt{a*} and \htexttt{a+} using only \htexttt{\{ \}}. - \vfill - - \problem{} - Draw a DFA equivalent to the regex pattern \htexttt{01*0}. - \vfill - - \pagebreak - - - - - - - \textbf{Characters, Sets, and Groups} \par - In the previous section, we saw how we can specify characters literally: \par - \texttt{a+} means \say{one or more \texttt{a} character} - - \vspace{2mm} - - There are, of course, other ways we can specify characters. - - \vspace{2mm} - - The first such way is the \textit{set}, denoted \htexttt{[ ]}. A set can pretend to be any character inside it. \par - For example, \htexttt{m[aoy]th} will match \texttt{math}, \texttt{moth}, or \texttt{myth}. \par - \htexttt{a[01]+b} will match \texttt{a0b}, \texttt{a111b}, \texttt{a1100110b}, and any other similar string. \par - You may negate a set with a \htexttt{\textasciicircum}. \par - \htexttt{[\textasciicircum abc]} will match any character except \texttt{a}, \texttt{b}, or \texttt{c}, including symbols and spaces. - - \vspace{2mm} - - If we want to keep characters together, we can use the \textit{group}, denoted \htexttt{( )}. \par - - Groups work exactly as you'd expect, representing an atomic\footnotemark{} group of characters. \par - \htexttt{a(01)+b} will match \texttt{a01b} and \texttt{a010101b}, but will \textbf{not} match \texttt{a0b}, \texttt{a1b}, or \texttt{a1100110b}. - - \footnotetext{In other words, \say{unbreakable}} - - - \problem{} - You are now familiar with most of the tools regex has to offer. \par - Write patterns that match the following strings: - \begin{enumerate}[itemsep=1mm] - \item An ISO-8601 date, like \texttt{2022-10-29}. \par - \hint{Invalid dates like \texttt{2022-13-29} should also be matched.} - - \item An email address. \par - \hint{Don't forget about subdomains, like \texttt{math.ucla.edu}.} - - \item A UCLA room number, like \texttt{MS 5118} or \texttt{Kinsey 1220B}. - - \item Any ISBN-10 of the form \texttt{0-316-00395-7}. \par - \hint{Remember that the check digit may be an \texttt{X}. Dashes are optional.} - - \item A word of even length. \par - \hint{The set \texttt{[A-z]} contains every english letter, capitalized and lowercase. \\ - \texttt{[a-z]} will only match lowercase letters.} - - \item A word with exactly 3 vowels. \par - \hint{The special token \texttt{\textbackslash w} will match any word character. It is equivalent to \texttt{[A-z0-9\_]} \\ \texttt{\_} stands for a literal underscore.} - - \item A word that has even length and exactly 3 vowels. - - \item A sentence that does not start with a capital letter. - \end{enumerate} - - \vfill - - \problem{} - If you'd like to know more, check out \url{https://regexr.com}. It offers an interactive regex prompt, as well as a cheatsheet that explains every other regex token there is. \par - You will find a nice set of challenges at \url{https://alf.nu/RegexGolf}. - I especially encourage you to look into this if you are interested in computer science. -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/Regex/main.typ b/src/Warm-Ups/Regex/main.typ new file mode 100644 index 0000000..47fa5d3 --- /dev/null +++ b/src/Warm-Ups/Regex/main.typ @@ -0,0 +1,135 @@ +#import "@local/handout:0.1.0": * + +#show: handout.with( + title: [The Regex Warm-Up], + by: "Mark", +) + + +Last time, we discussed Deterministic Finite Automata. One interesting application of these mathematical objects is found in computer science: Regular Expressions. \ +This is often abbreviated "regex," which is pronounced like "gif." + +#v(2mm) + +Regex is a language used to specify patterns in a string. You can think of it as a concise way to define a DFA, using text instead of a huge graph. \ + +Often enough, a clever regex pattern can do the work of a few hundred lines of code. + +#v(2mm) + +Like the DFAs we've studied, a regex pattern _accepts_ or _rejects_ a string. However, we don't usually use this terminology with regex, and instead say that a string _matches_ or _doesn't match_ a pattern. + +#v(5mm) + +Regex strings consist of characters, quantifiers, sets, and groups. + +#v(5mm) + + + +*Quantifiers* \ +Quantifiers specify how many of a character to match. \ +There are four of these: `+`, `*`, `?`, and `{ }`. + +#v(4mm) + +`+` means "match one or more of the preceding token" \ +`*` means "match zero or more of the preceding token" + +For example, the pattern `ca+t` will match the following strings: +- `cat` +- `caat` +- `caaaaaaaat` +`ca+t` will *not* match the string `ct`. \ +The pattern `ca*t` will match all the strings above, including `ct`. + + +#v(4mm) + + +`?` means "match one or none of the preceding token" \ +The pattern `linea?r` will match only `linear` and `liner`. + +#v(4mm) + +Brackets `{min, max}` are the most flexible quantifier. \ +They specify exactly how many tokens to match: \ +`ab{2}a` will match only `abba`. \ +`ab{1,3}a` will match only `aba`, `abba`, and `abbba`. \ +`ab{2,}a` will match any `ab...ba` with at least two `b`s. // spell:disable-line + +#problem() +Write the patterns `a*` and `a+` using only `{ }`. +#v(1fr) + +#problem() +Draw a DFA equivalent to the regex pattern `01*0`. +#v(1fr) + +#pagebreak() + + + + + + +*Characters, Sets, and Groups* \ +In the previous section, we saw how we can specify characters literally: \ +`a+` means "one or more `a` characters" \ +There are, of course, other ways we can specify characters. + +#v(4mm) + +The first such way is the _set_, denoted `[ ]`. A set can pretend to be any character inside it. \ +For example, `m[aoy]th` will match `math`, `moth`, or `myth`. \ +`a[01]+b` will match `a0b`, `a111b`, `a1100110b`, and any other similar string. \ + +#v(4mm) + +We can negate a set with a `^`. \ +`[^abc]` will match any single character except `a`, `b`, or `c`, including symbols and spaces. + +#v(4mm) + +If we want to keep characters together, we can use the _group_, denoted `( )`. \ + +Groups work exactly as you'd expect, representing an atomic#footnote([In other words, "unbreakable"]) group of characters. \ +`a(01)+b` will match `a01b` and `a010101b`, but will *not* match `a0b`, `a1b`, or `a1100110b`. + +#problem() +You are now familiar with most of the tools regex has to offer. \ +Write patterns that match the following strings: + +- An ISO-8601 date, like `2022-10-29`. \ + #hint([Invalid dates like `2022-13-29` should also be matched.]) + +- An email address. \ + #hint([Don't forget about subdomains, like `math.ucla.edu`.]) + +- A UCLA room number, like `MS 5118` or `Kinsey 1220B`. + +- Any ISBN-10 of the form `0-316-00395-7`. \ + #hint([Remember that the check digit may be an `X`. Dashes are optional.]) + +- A word of even length. \ + #hint([ + The set `[A-z]` contains every english letter, capitalized and lowercase. \ + `[a-z]` will only match lowercase letters. + ]) + +- A word with exactly 3 vowels. \ + #hint([ + The special token `\w` will match any word character. \ + It is equivalent to `[A-z0-9_]`. `_` represents a literal underscore. + ]) + +- A word that has even length and exactly 3 vowels. + +- A sentence that does not start with a capital letter. +#v(1fr) + +#problem() +If you'd like to know more, check out `https://regexr.com`. +It offers an interactive regex prompt, +as well as a cheatsheet that explains every other regex token there is. \ +You can find a nice set of challenges at `https://alf.nu/RegexGolf`. -- 2.47.1 From de44590e497de73e9ec1f359adc3bafbadd9b5d9 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 22 Jan 2025 21:19:47 -0800 Subject: [PATCH 08/19] Convert "Travellers" to typst --- src/Warm-Ups/Travellers/main.tex | 30 ------------------------------ src/Warm-Ups/Travellers/main.typ | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 30 deletions(-) delete mode 100755 src/Warm-Ups/Travellers/main.tex create mode 100644 src/Warm-Ups/Travellers/main.typ diff --git a/src/Warm-Ups/Travellers/main.tex b/src/Warm-Ups/Travellers/main.tex deleted file mode 100755 index cc38713..0000000 --- a/src/Warm-Ups/Travellers/main.tex +++ /dev/null @@ -1,30 +0,0 @@ -\documentclass[ - solutions, - singlenumbering, - nopagenumber -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - -\title{Warm-Up: Travellers} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today} - -\begin{document} - - \maketitle - - \problem{} - Four travellers are on a plane, each moving along a straight line at an arbitrary constant speed. \par - No two of their paths are parallel, and no three intersect at the same point. \par - We know that traveller A has met travelers B, C, and D, \par - and that traveller B has met C and D (and A). Show that C and D must also have met. \par - - \begin{solution} - When a body travels at a constant speed, its graph with respect to time is a straight line. \par - So, we add time axis in the third dimension, perpendicular to our plane. \par - Naturally, the projection of each of these onto the plane corresponds to a road. - - Now, note that two intersecting lines define a plane and use the conditions in the problem to show that no two lines are parallel. - \end{solution} - -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/Travellers/main.typ b/src/Warm-Ups/Travellers/main.typ new file mode 100644 index 0000000..8421898 --- /dev/null +++ b/src/Warm-Ups/Travellers/main.typ @@ -0,0 +1,20 @@ +#import "@local/handout:0.1.0": * + +#show: handout.with( + title: [Warm-Up: Travellers], + by: "Mark", +) + +#problem() +Four travellers are on a plane, each moving along a straight line at an arbitrary constant speed. \ +No two of their paths are parallel, and no three intersect at the same point. \ +We know that traveller A has met travelers B, C, and D, \ +and that traveller B has met C and D (and A). Show that C and D must also have met. + +#solution([ + When a body travels at a constant speed, its graph with respect to time is a straight line. \ + So, we add time axis in the third dimension, perpendicular to our plane. \ + Naturally, the projection of each of these onto the plane corresponds to a road. + + Now, note that two intersecting lines define a plane and use the conditions in the problem to show that no two lines are parallel. +]) -- 2.47.1 From 9ab33f47b3732fda53322c1acf9798e69cbc41ad Mon Sep 17 00:00:00 2001 From: Mark Date: Thu, 23 Jan 2025 12:11:59 -0800 Subject: [PATCH 09/19] Convert "Odd Dice" to typst --- src/Warm-Ups/Odd Dice/main.tex | 132 --------------------------------- src/Warm-Ups/Odd Dice/main.typ | 111 +++++++++++++++++++++++++++ 2 files changed, 111 insertions(+), 132 deletions(-) delete mode 100755 src/Warm-Ups/Odd Dice/main.tex create mode 100644 src/Warm-Ups/Odd Dice/main.typ diff --git a/src/Warm-Ups/Odd Dice/main.tex b/src/Warm-Ups/Odd Dice/main.tex deleted file mode 100755 index 270936d..0000000 --- a/src/Warm-Ups/Odd Dice/main.tex +++ /dev/null @@ -1,132 +0,0 @@ -\documentclass[ - nosolutions, - hidewarning, - singlenumbering, - nopagenumber -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - - - -\usepackage{tikz} -\usetikzlibrary{arrows.meta} -\usetikzlibrary{shapes.geometric} - -% We put nodes in a separate layer, so we can -% slightly overlap with paths for a perfect fit -\pgfdeclarelayer{nodes} -\pgfdeclarelayer{path} -\pgfsetlayers{main,nodes} - -% Layer settings -\tikzset{ - % Layer hack, lets us write - % later = * in scopes. - layer/.style = { - execute at begin scope={\pgfonlayer{#1}}, - execute at end scope={\endpgfonlayer} - }, - % - % Arrowhead tweak - >={Latex[ width=2mm, length=2mm ]}, - % - % Nodes - main/.style = { - draw, - circle, - fill = white, - line width = 0.35mm - } -} - -\title{Warm Up: Odd Dice} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today} - - -\begin{document} - - \maketitle - - \problem{} - - We say a set of dice $\{A, B, C\}$ is \textit{nontransitive} - if, on average, $A$ beats $B$, $B$ beats $C$, and $C$ beats $A$. - In other words, we get a counterintuitive \say{rock - paper - scissors} effect. - - \vspace{2mm} - - Create a set of nontransitive six-sided dice. \par - \hint{All sides should be numbered with positive integers less than 10.} - - \begin{solution} - One possible set can be numbered as follows: - \begin{itemize} - \item Die $A$: $2, 2, 4, 4, 9, 9$ - \item Die $B$: $1, 1, 6, 6, 8, 8$ - \item Die $C$: $3, 3, 5, 5, 7, 7$ - \end{itemize} - - \vspace{4mm} - - Another solution is below: - \begin{itemize} - \item Die $A$: $3, 3, 3, 3, 3, 6$ - \item Die $B$: $2, 2, 2, 5, 5, 5$ - \item Die $C$: $1, 4, 4, 4, 4, 4$ - \end{itemize} - \end{solution} - - \vfill - - \problem{} - Now, consider the set of six-sided dice below: - \begin{itemize} - \item Die $A$: $4, 4, 4, 4, 4, 9$ - \item Die $B$: $3, 3, 3, 3, 8, 8$ - \item Die $C$: $2, 2, 2, 7, 7, 7$ - \item Die $D$: $1, 1, 6, 6, 6, 6$ - \item Die $E$: $0, 5, 5, 5, 5, 5$ - \end{itemize} - On average, which die beats each of the others? Draw a graph. \par - - \begin{solution} - \begin{center} - \begin{tikzpicture}[scale = 0.5] - \begin{scope}[layer = nodes] - \node[main] (a) at (-2, 0.2) {$a$}; - \node[main] (b) at (0, 2) {$b$}; - \node[main] (c) at (2, 0.2) {$c$}; - \node[main] (d) at (1, -2) {$d$}; - \node[main] (e) at (-1, -2) {$e$}; - \end{scope} - - \draw[->] - (a) edge (b) - (b) edge (c) - (c) edge (d) - (d) edge (e) - (e) edge (a) - - (a) edge (c) - (b) edge (d) - (c) edge (e) - (d) edge (a) - (e) edge (b) - ; - \end{tikzpicture} - \end{center} - \end{solution} - - \vfill - - Now, say we roll each die twice. What happens to the graph above? - - \begin{solution} - The direction of each edge is reversed! - \end{solution} - - \vfill - \pagebreak - -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/Odd Dice/main.typ b/src/Warm-Ups/Odd Dice/main.typ new file mode 100644 index 0000000..16197ec --- /dev/null +++ b/src/Warm-Ups/Odd Dice/main.typ @@ -0,0 +1,111 @@ +#import "@local/handout:0.1.0": * +#import "@preview/cetz:0.3.1" + + +#show: handout.with( + title: [Warm-Up: Odd Dice], + by: "Mark", +) + +#problem() +We say a set of dice ${A, B, C}$ is _nontransitive_ +if, on average, $A$ beats $B$, $B$ beats $C$, and $C$ beats $A$. +In other words, we get a counterintuitive "rock - paper - scissors" effect. + +#v(2mm) + +Create a set of nontransitive six-sided dice. \ +#hint([All sides should be numbered with positive integers less than 10.]) + +#solution([ + One possible set can be numbered as follows: + - Die $A$: $2, 2, 4, 4, 9, 9$ + - Die $B$: $1, 1, 6, 6, 8, 8$ + - Die $C$: $3, 3, 5, 5, 7, 7$ + + #v(2mm) + + Another solution is below: + - Die $A$: $3, 3, 3, 3, 3, 6$ + - Die $B$: $2, 2, 2, 5, 5, 5$ + - Die $C$: $1, 4, 4, 4, 4, 4$ + +]) + +#v(1fr) + +#problem() +Now, consider the set of six-sided dice below: +- Die $A$: $4, 4, 4, 4, 4, 9$ +- Die $B$: $3, 3, 3, 3, 8, 8$ +- Die $C$: $2, 2, 2, 7, 7, 7$ +- Die $D$: $1, 1, 6, 6, 6, 6$ +- Die $E$: $0, 5, 5, 5, 5, 5$ +On average, which die beats each of the others? Draw a diagram. + +#solution( + align( + center, + cetz.canvas({ + import cetz.draw: * + + let s = 0.8 // Scale + let t = 13pt * s // text size + let radius = 0.3 * s + + // Points + let a = (-2 * s, 0.2 * s) + let b = (0 * s, 2 * s) + let c = (2 * s, 0.2 * s) + let d = (1.2 * s, -2.1 * s) + let e = (-1.2 * s, -2.1 * s) + + set-style( + stroke: (thickness: 0.6mm * s), + mark: ( + end: ( + symbol: ">", + fill: black, + offset: radius + (0.025 * s), + width: 1.2mm * s, + length: 1.2mm * s, + ), + ), + ) + + line(a, b) + line(b, c) + line(c, d) + line(d, e) + line(e, a) + line(a, c) + line(b, d) + line(c, e) + line(d, a) + line(e, b) + + circle(a, radius: radius, fill: oblue, stroke: none) + circle(b, radius: radius, fill: oblue, stroke: none) + circle(c, radius: radius, fill: oblue, stroke: none) + circle(d, radius: radius, fill: oblue, stroke: none) + circle(e, radius: radius, fill: oblue, stroke: none) + + content(a, text(fill: white, size: t, [*A*])) + content(b, text(fill: white, size: t, [*B*])) + content(c, text(fill: white, size: t, [*C*])) + content(d, text(fill: white, size: t, [*D*])) + content(e, text(fill: white, size: t, [*E*])) + }), + ), +) + +#v(1fr) + +#problem() +Now, say we roll each die twice. What happens to the graph from the previous problem? + +#solution([ + The direction of each edge is reversed! +]) + +#v(1fr) -- 2.47.1 From 48924badeaf69130fc85e70d1dcc940fd89f29e4 Mon Sep 17 00:00:00 2001 From: Mark Date: Thu, 23 Jan 2025 13:14:05 -0800 Subject: [PATCH 10/19] Convert "Gallery" to typst --- src/Warm-Ups/Gallery/main.tex | 121 ---------------------------------- src/Warm-Ups/Gallery/main.typ | 103 +++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 121 deletions(-) delete mode 100755 src/Warm-Ups/Gallery/main.tex create mode 100644 src/Warm-Ups/Gallery/main.typ diff --git a/src/Warm-Ups/Gallery/main.tex b/src/Warm-Ups/Gallery/main.tex deleted file mode 100755 index e4541ac..0000000 --- a/src/Warm-Ups/Gallery/main.tex +++ /dev/null @@ -1,121 +0,0 @@ -\documentclass[ - solutions, - singlenumbering, - nopagenumber -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - - -\makeatletter -\newcommand{\thisone}{ - \if@solutions - {\color{red} $\Leftarrow$ \texttt{this one}} - \else\fi -} - -\title{Warm-Up: The Gallery} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today} - -\begin{document} - - \maketitle - - A museum curator is arranging seven photographs on a gallery wall in accordance with the photographer's requirements. - They are titled as follows: Fence, Gardenias, Hibiscus, Irises, Katydid, Lotus, and Magnolia. - - The photograph's requirements are as follows: - \begin{itemize} - \item Gardenias must be immediately before Katydid. - \item Hibiscus must be somewhere before Katydid but cannot be the first photograph. - \item Irises and Lotus must be next to one another. - \item Magnolia must be one of the first three photographs. - \item Fence must be either first or seventh. - \end{itemize} - - \problem{} - Which of the below could be a valid ordering? \par - \note[Note]{We denote each painting by the first letter of its title.} - \begin{itemize} - \item \texttt{FHGMKIL} - \item \texttt{HMGKILF} - \item \texttt{ILMHGKF} \thisone{} - \item \texttt{LMIHGKF} - \item \texttt{MFHGKLI} - \end{itemize} - \vfill - - \problem{} - If Irises is immediately before Gardenias, which of the following could be true? - \begin{itemize} - \item Gardenias is fourth - \item Hibiscus is fourth - \item Irises is third - \item Lotus is second - \item Magnolia is third \thisone{} - \end{itemize} - \vfill - - \problem{} - The ordering of the photographs is fully determined if... - \begin{itemize} - \item Gardenias is fourth - \item Hibiscus is second - \item Irises is second - \item Lotus is first \thisone{} - \item Magnolia is third - \end{itemize} - - \vfill - \pagebreak - - \problem{} - If Magnolia is second, what CANNOT be true? - \begin{itemize} - \item Hibiscus is third - \item Hibiscus is fourth \thisone{} - \item Hibiscus is fifth - \item Gardenias is fourth - \item Gardenias is sixth - \end{itemize} - - \vfill - - \problem{} - Katydid cannot be in which position? - \begin{itemize} - \item Third \thisone{} - \item Fourth - \item Fifth - \item Sixth - \item Seventh - \end{itemize} - \vfill - - \problem{} - If Gardenias is fourth, what must be true? - \begin{itemize} - \item Fence is first \thisone{} - \item Hibiscus is third - \item Irises is seventh - \item Magnolia is first - \item Magnolia is second - \end{itemize} - \vfill - - \problem{} - Which one of the following, - if substituted for the second condition, - would have the same effect in determining the - arrangement of the photographs? - - \begin{itemize} - \item If Fence is seventh, Hibiscus is second - \item Gardenias is somewhere after Hibiscus, and either Fence or Magnolia is first - \item Hibiscus must be somewhere between the first and sixth photographs - \item Unless Hibiscus is second, it must be somewhere between Magnolia and Gardenias \thisone{} - \item Katydid is somewhere after Hibiscus, which must be after Fence. - \end{itemize} - \vfill - \pagebreak -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/Gallery/main.typ b/src/Warm-Ups/Gallery/main.typ new file mode 100644 index 0000000..10027b8 --- /dev/null +++ b/src/Warm-Ups/Gallery/main.typ @@ -0,0 +1,103 @@ +#import "@local/handout:0.1.0": * + +#show: handout.with( + title: [Warm-Up: The Gallery], + by: "Mark", +) + +#let thisone = if_solutions( + text(fill: ored, [#sym.arrow.l.double.long `this one`]), +) + +A museum curator is arranging seven photographs on a gallery wall in accordance with the photographer's requirements. +They are titled as follows: Fence, Gardenias, Hibiscus, Irises, Katydid, Lotus, and Magnolia. + +The photograph's requirements are as follows: +#v(2mm) +- Gardenias must be immediately before Katydid. +- Hibiscus must be somewhere before Katydid but cannot be the first photograph. +- Irises and Lotus must be next to one another. +- Magnolia must be one of the first three photographs. +- Fence must be either first or seventh. + + +#problem() +Which of the below could be a valid ordering? \ +#note([We denote each painting by the first letter of its title.], type: "Note") +- `FHGMKIL` +- `HMGKILF` +- `ILMHGKF` #thisone +- `LMIHGKF` +- `MFHGKLI` + +#v(1fr) + +#problem() +If Irises is immediately before Gardenias, which of the following could be true? +- Gardenias is fourth +- Hibiscus is fourth +- Irises is third +- Lotus is second +- Magnolia is third #thisone + +#v(1fr) + +#problem() +The ordering of the photographs is fully determined if... +- Gardenias is fourth +- Hibiscus is second +- Irises is second +- Lotus is first #thisone +- Magnolia is third + + +#v(1fr) +#pagebreak() + + + +#problem() +If Magnolia is second, what CANNOT be true? +- Hibiscus is third +- Hibiscus is fourth #thisone +- Hibiscus is fifth +- Gardenias is fourth +- Gardenias is sixth + + +#v(1fr) + +#problem() +Katydid cannot be in which position? +- Third #thisone +- Fourth +- Fifth +- Sixth +- Seventh + +#v(1fr) + +#problem() +If Gardenias is fourth, what must be true? +- Fence is first #thisone +- Hibiscus is third +- Irises is seventh +- Magnolia is first +- Magnolia is second + +#v(1fr) + +#problem() +Which one of the following, +if substituted for the second condition, +would have the same effect in determining the +arrangement of the photographs? + +- If Fence is seventh, Hibiscus is second +- Gardenias is somewhere after Hibiscus, and either Fence or Magnolia is first +- Hibiscus must be somewhere between the first and sixth photographs +- Unless Hibiscus is second, it must be somewhere between Magnolia and Gardenias \ + #if_solutions(text(fill: ored, [#sym.arrow.t.double `this one`])) +- Katydid is somewhere after Hibiscus, which must be after Fence. + +#v(1fr) -- 2.47.1 From d4a76014b77675c4480067107c4e04c6a2bcdebc Mon Sep 17 00:00:00 2001 From: Mark Date: Thu, 23 Jan 2025 13:31:21 -0800 Subject: [PATCH 11/19] Convert "Zeno's Furniture" to typst --- src/Warm-Ups/Zeno's Furniture/main.tex | 150 ------------------------- src/Warm-Ups/Zeno's Furniture/main.typ | 125 +++++++++++++++++++++ 2 files changed, 125 insertions(+), 150 deletions(-) delete mode 100755 src/Warm-Ups/Zeno's Furniture/main.tex create mode 100644 src/Warm-Ups/Zeno's Furniture/main.typ diff --git a/src/Warm-Ups/Zeno's Furniture/main.tex b/src/Warm-Ups/Zeno's Furniture/main.tex deleted file mode 100755 index 5b696d4..0000000 --- a/src/Warm-Ups/Zeno's Furniture/main.tex +++ /dev/null @@ -1,150 +0,0 @@ -\documentclass[ - solutions, - singlenumbering, - nopagenumber -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - - -\makeatletter -\newcommand{\thisone}{ - \if@solutions - {\color{red} $\Leftarrow$ \texttt{this one}} - \else\fi -} - -\title{Zeno's Furniture} -\uptitlel{Warm Ups} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today} - -\begin{document} - - \maketitle - - Zeno Furniture sells exactly five types of furniture: - \begin{itemize} - \item Footstools - \item Hutches - \item Sideboards - \item Tables - \item Vanities - \end{itemize} - Irene buys four items, each of a different type, - and each made of exactly one kind of wood: - \begin{itemize} - \item Maple - \item Oak - \item Pine - \item Rosewood - \end{itemize} - - The following conditions govern Irene's purchases: - \begin{itemize} - \item Any vanity she buys is Maple. - \item Any rosewood item she buys is a sideboard. - \item If she buys a vanity, she does not buy a footstool. - \item If she buys a footstool, she also buys a table made of the same material. - \item Irene does not buy an oak table. - \item Exactly two of the items she buys are made of the same kind of wood. - \end{itemize} - - - - - \problem{} - Which one of the following could be an accurate - list of the items Irene buys? \par - \begin{itemize} - \item maple footstool, maple hutch, rosewood sideboard, maple table - \item oak hutch, rosewood sideboard, pine table, oak vanity - \item rosewood hutch, maple sideboard, oak table, maple vanity - \item pine footstool, rosewood sideboard, pine table, maple vanity - \item maple footstool, pine hutch, oak sideboard, maple table \thisone{} - \end{itemize} - \vfill - - - \problem{} - If Irene buys one item made of rosewood and two items made - of maple, then which one of the following pairs could be two - of the items she buys? - \begin{itemize} - \item a rosewood sideboard and an oak footstool - \item an oak hutch and a pine sideboard - \item an oak hutch and a maple table \thisone{} - \item a maple sideboard and a maple vanity - \item a maple hutch and a maple table - \end{itemize} - \vfill - \pagebreak - - - \problem{} - Which one of the following is a complete and accurate list - of all the woods any footstool that Irene buys could be made of? - \begin{itemize} - \item maple, oak - \item maple, pine \thisone{} - \item maple, rosewood - \item maple, oak, pine - \item maple, oak, pine, rosewood - \end{itemize} - \vfill - - - \problem{} - Suppose Irene buys a footstool. Then which one of the following - is a complete and accurate list of items and any one of which she - could buy in maple? - \begin{itemize} - \item footstool, hutch, sideboard, table, vanity - \item footstool, hutch, sideboard, table \thisone{} - \item footstool, hutch, sideboard - \item footstool, hutch - \item footstool - \end{itemize} - \vfill - - \problem{} - Which one of the following cannot be the two items Irene - buys that are made of the same wood as each other? - \begin{itemize} - \item footstool, hutch \thisone{} - \item hutch, sideboard - \item hutch, table - \item sideboard, vanity - \item table, vanity - \end{itemize} - \vfill - \pagebreak - - \problem{} - If Irene does not buy an item made of maple, then each of the - following must be true except... - \begin{itemize} - \item Irene buys a footstool - \item Irene buys a pine hutch \thisone{} - \item Irene buys a rosewood sideboard - \item Irene buys exactly one item made of oak - \item Irene buys exactly two items made of pine - \end{itemize} - \vfill - - - \problem{} - Suppose the condition that Irene does not buy an oak table is - replaced with the condition that she does not buy a pine table. - If all the other conditions hold as originally given, which of the - following cannot be true? - \begin{itemize} - \item Irene buys an oak footstool. - \item Irene buys a hutch and a table made of the same wood. - \item Irene buys a vanity, but she does not buy an oak table. - \item Irene buys a maple table and an oak hutch. - \item Irene buys a rosewood sideboard and exactly two items made of pine. \thisone{} - \end{itemize} - \vfill - \pagebreak - -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/Zeno's Furniture/main.typ b/src/Warm-Ups/Zeno's Furniture/main.typ new file mode 100644 index 0000000..3d47d2b --- /dev/null +++ b/src/Warm-Ups/Zeno's Furniture/main.typ @@ -0,0 +1,125 @@ +#import "@local/handout:0.1.0": * + +#show: handout.with( + title: [Warm-Up: Zeno's Furniture], + by: "Mark", +) + +#let thisone = if_solutions( + text(fill: ored, [#sym.arrow.l.double.long `this one`]), +) + + +Zeno's Furniture sells exactly five types of furniture: \ +Footstools, Hutches, Sideboards, Tables, and Vanities. + +#v(3mm) + +Each can be made of exactly one kind of wood: \ +Maple, Oak, Pine, or Rosewood + +#v(3mm) + +Irene buys four items, each of a different type. \ +The following conditions govern Irene's purchases: +- Any vanity she buys is Maple. +- Any rosewood item she buys is a sideboard. +- If she buys a vanity, she does not buy a footstool. +- If she buys a footstool, she also buys a table made of the same material. +- Irene does not buy an oak table. +- Exactly two of the items she buys are made of the same kind of wood. + + + +#v(5mm) + + +#problem() +Which one of the following could be an accurate +list of the items Irene buys? \ +- maple footstool, maple hutch, rosewood sideboard, maple table +- oak hutch, rosewood sideboard, pine table, oak vanity +- rosewood hutch, maple sideboard, oak table, maple vanity +- pine footstool, rosewood sideboard, pine table, maple vanity +- maple footstool, pine hutch, oak sideboard, maple table #thisone + +#v(1fr) + + +#problem() +If Irene buys one item made of rosewood and two items made +of maple, then which one of the following pairs could be two +of the items she buys? +- a rosewood sideboard and an oak footstool +- an oak hutch and a pine sideboard +- an oak hutch and a maple table #thisone +- a maple sideboard and a maple vanity +- a maple hutch and a maple table + +#v(1fr) +#pagebreak() + + +#problem() +Which one of the following is a complete and accurate list +of all the woods any footstool that Irene buys could be made of? +- maple, oak +- maple, pine #thisone +- maple, rosewood +- maple, oak, pine +- maple, oak, pine, rosewood + +#v(1fr) + + +#problem() +Suppose Irene buys a footstool. Then which one of the following +is a complete and accurate list of items and any one of which she +could buy in maple? +- footstool, hutch, sideboard, table, vanity +- footstool, hutch, sideboard, table #thisone +- footstool, hutch, sideboard +- footstool, hutch +- footstool + +#v(1fr) + +#problem() +Which one of the following cannot be the two items Irene +buys that are made of the same wood as each other? +- footstool, hutch #thisone +- hutch, sideboard +- hutch, table +- sideboard, vanity +- table, vanity + +#v(1fr) +#pagebreak() + + + + +#problem() +If Irene does not buy an item made of maple, then each of the +following must be true except... +- Irene buys a footstool +- Irene buys a pine hutch #thisone +- Irene buys a rosewood sideboard +- Irene buys exactly one item made of oak +- Irene buys exactly two items made of pine + +#v(1fr) + + +#problem() +Suppose the condition that Irene does not buy an oak table is +replaced with the condition that she does not buy a pine table. +If all the other conditions hold as originally given, which of the +following cannot be true? +- Irene buys an oak footstool. +- Irene buys a hutch and a table made of the same wood. +- Irene buys a vanity, but she does not buy an oak table. +- Irene buys a maple table and an oak hutch. +- Irene buys a rosewood sideboard and exactly two items made of pine. #thisone + +#v(1fr) -- 2.47.1 From 255081c189907017d8755fee777f43b272457842 Mon Sep 17 00:00:00 2001 From: Mark Date: Thu, 23 Jan 2025 13:34:46 -0800 Subject: [PATCH 12/19] Convert "Passing Balls" to typst --- src/Warm-Ups/Passing Balls/main.tex | 47 ------ src/Warm-Ups/Passing Balls/main.typ | 192 ++++++++++++++++++++++++ src/Warm-Ups/Passing Balls/pass-sol.png | Bin 47753 -> 0 bytes 3 files changed, 192 insertions(+), 47 deletions(-) delete mode 100755 src/Warm-Ups/Passing Balls/main.tex create mode 100644 src/Warm-Ups/Passing Balls/main.typ delete mode 100644 src/Warm-Ups/Passing Balls/pass-sol.png diff --git a/src/Warm-Ups/Passing Balls/main.tex b/src/Warm-Ups/Passing Balls/main.tex deleted file mode 100755 index 4a57dc1..0000000 --- a/src/Warm-Ups/Passing Balls/main.tex +++ /dev/null @@ -1,47 +0,0 @@ -\documentclass[ - solutions, - singlenumbering, - nopagenumber -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - -\usepackage{graphicx} - -\title{Warm-Up: Passing Balls} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today} - -\begin{document} - - \maketitle - - \problem{} - - Twelve people are standing in a circle. Each is assigned a number between 1 and 12. \par - Participants numbered 1, 2, 3, and 4 hold red, green, yellow, and black balls, respectively. \par - Everyone else is empty-handed. - - \vspace{2mm} - - Each participant can pass their ball to any student that is exactly 5 positions away. \par - Balls cannot be passed to someone who has one in hand. - - \vspace{2mm} - - After a number of passes, the first four participants again hold all the balls. \par - Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4? - - \begin{solution} - \begin{itemize} - \item the graph of possible moves is isomorphic to a circle (since 5 and 12 are coprime), - \item but the balls get passed around, so swapping the place of any two balls is not allowed. \\ - Therefore, the balls will stay in their initial (cyclic) order: - \end{itemize} - - \begin{center} - \includegraphics[width=\textwidth]{pass-sol.png} - \end{center} - \end{solution} - - -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/Passing Balls/main.typ b/src/Warm-Ups/Passing Balls/main.typ new file mode 100644 index 0000000..b8420a8 --- /dev/null +++ b/src/Warm-Ups/Passing Balls/main.typ @@ -0,0 +1,192 @@ +#import "@local/handout:0.1.0": * +#import "@preview/cetz:0.3.1" + +#show: handout.with( + title: [Warm-Up: Passing Balls], + by: "Mark", +) + +#problem() +Twelve people are standing in a circle. Each is assigned a number between 1 and 12. \ +Participants numbered 1, 2, 3, and 4 hold red, green, yellow, and black balls, respectively. \ +Everyone else is empty-handed. + +#v(2mm) + +Each participant can pass their ball to any student that is exactly 5 positions away. \ +Balls cannot be passed to someone who has one in hand. + +#v(2mm) + +After a number of passes, the first four participants again hold all the balls. \ +Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4? + +#solution([ + The graph of possible moves is isomorphic to a circle (since 5 and 12 are coprime), \ + so the order of the balls cannot be changed as they are passed around. + + #v(2mm) + + Therefore, the balls will stay in their initial (cyclic) order: + + #v(2mm) + + #{ + let s = 0.7 // scale + let t = 12pt * s // text size + let radius = 0.35 + + let pts = ( + (0 * s, 3 * s), + (1 * s, 2 * s), + (2 * s, 1 * s), + (3 * s, 0 * s), + (2 * s, -1 * s), + (1 * s, -2 * s), + (0 * s, -3 * s), + (-1 * s, -2 * s), + (-2 * s, -1 * s), + (-3 * s, 0 * s), + (-2 * s, 1 * s), + (-1 * s, 2 * s), + ) + + let pts_shuf = ( + (0 * s, 3 * s), // 1 + (1 * s, -2 * s), // 6 + (-2 * s, 1 * s), // 11 + (3 * s, 0 * s), // 4 + (-2 * s, -1 * s), // 9 + (1 * s, 2 * s), // 2 + (0 * s, -3 * s), // 7 + (-1 * s, 2 * s), // 12 + (2 * s, -1 * s), // 5 + (-3 * s, 0 * s), // 10 + (2 * s, 1 * s), // 3 + (-1 * s, -2 * s), // 8 + ) + + table( + stroke: none, + align: center, + columns: (1fr, 1fr, 1fr), + cetz.canvas({ + import cetz.draw: * + + set-style(stroke: (thickness: 0.4mm, paint: black)) + line(..pts_shuf, close: true) + + let i = 1 + for p in pts { + circle( + p, + radius: radius * s, + fill: if i == 1 { + ored + } else if i == 2 { + ogreen + } else if i == 3 { + oorange + } else if i == 4 { + oblue + } else { white }, + ) + + content( + p, + text( + fill: if i <= 4 { + white + } else { + black + }, + size: t, + [*#i*], + ), + ) + i = i + 1 + } + }), + cetz.canvas({ + import cetz.draw: * + + set-style(stroke: (thickness: 0.4mm, paint: black)) + line(..pts, close: true) + + let i = 1 + for p in pts { + let l = calc.rem(((i - 1) * 5), 12) + 1 + + + circle( + p, + radius: radius * s, + fill: if l == 1 { + ored + } else if l == 2 { + ogreen + } else if l == 3 { + oorange + } else if l == 4 { + oblue + } else { white }, + ) + + content( + p, + text( + fill: if l <= 4 { + white + } else { + black + }, + size: t, + [*#l*], + ), + ) + i = i + 1 + } + }), + cetz.canvas({ + import cetz.draw: * + + set-style(stroke: (thickness: 0.4mm, paint: black)) + line(..pts, close: true) + + let i = 1 + for p in pts { + let l = calc.rem(((i - 1) * 5), 12) + 1 + + + circle( + p, + radius: radius * s, + fill: if l == 1 { + oblue + } else if l == 2 { + oorange + } else if l == 3 { + ored + } else if l == 4 { + ogreen + } else { white }, + ) + + content( + p, + text( + fill: if l <= 4 { + white + } else { + black + }, + size: t, + [*#l*], + ), + ) + i = i + 1 + } + }), + ) + } +]) diff --git a/src/Warm-Ups/Passing Balls/pass-sol.png b/src/Warm-Ups/Passing Balls/pass-sol.png deleted file mode 100644 index b052142aa90877f1b1d2153de59d8cfed13848e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47753 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 QWD9)GDQn=emCSwq3tBUxUH||9 -- 2.47.1 From a7d9103d512656bdd0cde9c07f109b15ff208c5c Mon Sep 17 00:00:00 2001 From: Mark Date: Thu, 23 Jan 2025 20:17:06 -0800 Subject: [PATCH 13/19] Convert "Big-Tac-Toe" to typst --- src/Warm-Ups/Big-Tac-Toe/main.tex | 187 ------------------------------ src/Warm-Ups/Big-Tac-Toe/main.typ | 90 ++++++++++++++ 2 files changed, 90 insertions(+), 187 deletions(-) delete mode 100755 src/Warm-Ups/Big-Tac-Toe/main.tex create mode 100644 src/Warm-Ups/Big-Tac-Toe/main.typ diff --git a/src/Warm-Ups/Big-Tac-Toe/main.tex b/src/Warm-Ups/Big-Tac-Toe/main.tex deleted file mode 100755 index 8f735f5..0000000 --- a/src/Warm-Ups/Big-Tac-Toe/main.tex +++ /dev/null @@ -1,187 +0,0 @@ -\documentclass[ - solutions, - hidewarning, - singlenumbering, - nopagenumber -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - -% x,y,scale,style -\def\ttt#1#2#3#4{ - \draw[#4] (#1, #2+#3) -- (#1+#3+#3+#3, #2+#3); - \draw[#4] (#1, #2+#3+#3) -- (#1+#3+#3+#3, #2+#3+#3); - \draw[#4] (#1+#3, #2) -- (#1+#3, #2+#3+#3+#3); - \draw[#4] (#1+#3+#3, #2) -- (#1+#3+#3, #2+#3+#3+#3); -} - - -\geometry{ - paper = letterpaper, - top = 25mm, - bottom = 30mm, - left = 20mm, - right = 20mm, - headheight = 75mm, - footskip = 15mm -} - - -% misere ttt - -% Numerical Tic Tac Toe is a variation invented by the mathematician Ronald Graham. -% The numbers 1 to 9 are used in this game. The first player plays with the odd numbers, -% the second player plays with the even numbers. All numbers can be used only once. -% The player who puts down 15 points in a line wins (sum of 3 numbers). -% This game can be generalized to a n × n board. - - -% In Treblecross, both players play with the same symbol. -% The game is played on a 1-by-n board with k equal to 3. -% The player who makes a three in a row of Xs (or black chips) wins the game - -\title{Warm-Up: Big-Tac-Toe} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today.} - -\begin{document} - - \maketitle - - - - We have large tic-tac-toe grid, each cell of which contains another. - On each turn, one player puts their glyph into a cell of a small grid. When the next player goes, - they must make their move in the small grid in the same position as the previous player's move. - \begin{itemize} - \item The first player to move may pick any small grid to start in. - \item If a player is directed to a grid that is \textit{full}, that player may go anywhere. \par - A sub-grid that is \say{won} but not full may still be played in. - \end{itemize} - - \vspace{2mm} - - The first player to complete a line of three \say{won} subgrids wins the game. - - \vfill\null\hfill - \begin{minipage}{0.48\textwidth} - \begin{center} - \begin{tikzpicture}[scale=0.65] - \ttt{0}{0}{4}{line width=0.5mm} - \ttt{0.5}{0.5}{1}{line width=0.25mm} - \ttt{0.5}{4.5}{1}{line width=0.25mm} - \ttt{0.5}{8.5}{1}{line width=0.25mm} - \ttt{4.5}{0.5}{1}{line width=0.25mm} - \ttt{4.5}{4.5}{1}{line width=0.25mm} - \ttt{4.5}{8.5}{1}{line width=0.25mm} - \ttt{8.5}{0.5}{1}{line width=0.25mm} - \ttt{8.5}{4.5}{1}{line width=0.25mm} - \ttt{8.5}{8.5}{1}{line width=0.25mm} - \end{tikzpicture} - \end{center} - \end{minipage} - \hfill - \begin{minipage}{0.48\textwidth} - \begin{center} - \begin{tikzpicture}[scale=0.65] - \ttt{0}{0}{4}{line width=0.5mm} - \ttt{0.5}{0.5}{1}{line width=0.25mm} - \ttt{0.5}{4.5}{1}{line width=0.25mm} - \ttt{0.5}{8.5}{1}{line width=0.25mm} - \ttt{4.5}{0.5}{1}{line width=0.25mm} - \ttt{4.5}{4.5}{1}{line width=0.25mm} - \ttt{4.5}{8.5}{1}{line width=0.25mm} - \ttt{8.5}{0.5}{1}{line width=0.25mm} - \ttt{8.5}{4.5}{1}{line width=0.25mm} - \ttt{8.5}{8.5}{1}{line width=0.25mm} - \end{tikzpicture} - \end{center} - \end{minipage} - \hfill\null\vfill - - \problem{} - Play a few rounds of this game with someone nearby. \par - Can either player force a win? - - \vfill - - \problem{} - Modify the rules of this game to disallow play in won subgrids. \par - How does your strategy change? - - \vfill - \pagebreak - - - \null\vfill\null\hfill - \begin{minipage}{0.48\textwidth} - \begin{center} - \begin{tikzpicture}[scale=0.65] - \ttt{0}{0}{4}{line width=0.5mm} - \ttt{0.5}{0.5}{1}{line width=0.25mm} - \ttt{0.5}{4.5}{1}{line width=0.25mm} - \ttt{0.5}{8.5}{1}{line width=0.25mm} - \ttt{4.5}{0.5}{1}{line width=0.25mm} - \ttt{4.5}{4.5}{1}{line width=0.25mm} - \ttt{4.5}{8.5}{1}{line width=0.25mm} - \ttt{8.5}{0.5}{1}{line width=0.25mm} - \ttt{8.5}{4.5}{1}{line width=0.25mm} - \ttt{8.5}{8.5}{1}{line width=0.25mm} - \end{tikzpicture} - \end{center} - \end{minipage} - \hfill - \begin{minipage}{0.48\textwidth} - \begin{center} - \begin{tikzpicture}[scale=0.65] - \ttt{0}{0}{4}{line width=0.5mm} - \ttt{0.5}{0.5}{1}{line width=0.25mm} - \ttt{0.5}{4.5}{1}{line width=0.25mm} - \ttt{0.5}{8.5}{1}{line width=0.25mm} - \ttt{4.5}{0.5}{1}{line width=0.25mm} - \ttt{4.5}{4.5}{1}{line width=0.25mm} - \ttt{4.5}{8.5}{1}{line width=0.25mm} - \ttt{8.5}{0.5}{1}{line width=0.25mm} - \ttt{8.5}{4.5}{1}{line width=0.25mm} - \ttt{8.5}{8.5}{1}{line width=0.25mm} - \end{tikzpicture} - \end{center} - \end{minipage} - \hfill\null\vfill - - \vfill\null\hfill - \begin{minipage}{0.48\textwidth} - \begin{center} - \begin{tikzpicture}[scale=0.65] - \ttt{0}{0}{4}{line width=0.5mm} - \ttt{0.5}{0.5}{1}{line width=0.25mm} - \ttt{0.5}{4.5}{1}{line width=0.25mm} - \ttt{0.5}{8.5}{1}{line width=0.25mm} - \ttt{4.5}{0.5}{1}{line width=0.25mm} - \ttt{4.5}{4.5}{1}{line width=0.25mm} - \ttt{4.5}{8.5}{1}{line width=0.25mm} - \ttt{8.5}{0.5}{1}{line width=0.25mm} - \ttt{8.5}{4.5}{1}{line width=0.25mm} - \ttt{8.5}{8.5}{1}{line width=0.25mm} - \end{tikzpicture} - \end{center} - \end{minipage} - \hfill - \begin{minipage}{0.48\textwidth} - \begin{center} - \begin{tikzpicture}[scale=0.65] - \ttt{0}{0}{4}{line width=0.5mm} - \ttt{0.5}{0.5}{1}{line width=0.25mm} - \ttt{0.5}{4.5}{1}{line width=0.25mm} - \ttt{0.5}{8.5}{1}{line width=0.25mm} - \ttt{4.5}{0.5}{1}{line width=0.25mm} - \ttt{4.5}{4.5}{1}{line width=0.25mm} - \ttt{4.5}{8.5}{1}{line width=0.25mm} - \ttt{8.5}{0.5}{1}{line width=0.25mm} - \ttt{8.5}{4.5}{1}{line width=0.25mm} - \ttt{8.5}{8.5}{1}{line width=0.25mm} - \end{tikzpicture} - \end{center} - \end{minipage} - \hfill\null\vfill - -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/Big-Tac-Toe/main.typ b/src/Warm-Ups/Big-Tac-Toe/main.typ new file mode 100644 index 0000000..c2e38fb --- /dev/null +++ b/src/Warm-Ups/Big-Tac-Toe/main.typ @@ -0,0 +1,90 @@ +#import "@local/handout:0.1.0": * +#import "@preview/cetz:0.3.1" + +#show: handout.with( + title: [Warm-Up: Big-Tac-Toe], + by: "Mark", +) + +#let extra_boards = false; + +#let ttt(s, p) = { + // s: scale, + // p: position + let x = p.at(0) * s + let y = p.at(1) * s + + cetz.draw.line((-1 * s + x, 3 * s + y), (-1 * s + x, -3 * s + y)) + cetz.draw.line((1 * s + x, 3 * s + y), (1 * s + x, -3 * s + y)) + cetz.draw.line((3 * s + x, -1 * s + y), (-3 * s + x, -1 * s + y)) + cetz.draw.line((3 * s + x, 1 * s + y), (-3 * s + x, 1 * s + y)) +} + +#let btt(s) = cetz.canvas({ + import cetz.draw: * + + set-style(stroke: (thickness: 0.5mm * s)) + + ttt(s, (-7, -7)) + ttt(s, (-7, 0)) + ttt(s, (-7, 7)) + ttt(s, (0, -7)) + ttt(s, (0, 0)) + ttt(s, (0, 7)) + ttt(s, (7, -7)) + ttt(s, (7, 0)) + ttt(s, (7, 7)) + + set-style(stroke: (thickness: 2mm * s)) + ttt(s * 3.5, (0, 0)) +}) + + +#problem() +Consider a large tic-tac-toe grid, each cell of which contains another. +On each turn, one player puts their glyph into a cell of a small grid. When the next player goes, +they must make their move in the small grid in the same position as the previous player's move. +- The first player to move may pick any small grid to start in. +- If a player is directed to a grid that is _full_, that player may go anywhere. \ + A sub-grid that is "won" but not full may still be played in. + +#v(2mm) + +The first player to complete a line of three "won" subgrids wins the game. + +#v(2mm) + +#problem() +Play a few rounds of this game with someone nearby. \ +Can either player force a win? + +#table( + stroke: none, + align: center, + columns: (1fr, 1fr), + btt(0.35), btt(0.35), +); + +#problem() +Modify the rules of this game to disallow play in won subgrids. \ +How does your strategy change? \ +#if extra_boards { note([Additional boards are available on the next page.]) } + +#v(1fr) + +#if extra_boards { + pagebreak() + + align( + center, + grid( + stroke: none, + align: center, + columns: (1fr, 1fr), + rows: (1fr, 1fr, 1fr), + btt(0.35), btt(0.35), + btt(0.35), btt(0.35), + btt(0.35), btt(0.35), + ), + ) +} -- 2.47.1 From 2eeb655e3b00b5b0f9274246faeefd961b304992 Mon Sep 17 00:00:00 2001 From: Mark Date: Thu, 23 Jan 2025 20:20:43 -0800 Subject: [PATCH 14/19] Convert "Wild Tic-Tac-Toe" to typst --- src/Warm-Ups/Wild Tic-Tac-Toe/main.tex | 66 -------------------------- src/Warm-Ups/Wild Tic-Tac-Toe/main.typ | 47 ++++++++++++++++++ 2 files changed, 47 insertions(+), 66 deletions(-) delete mode 100755 src/Warm-Ups/Wild Tic-Tac-Toe/main.tex create mode 100644 src/Warm-Ups/Wild Tic-Tac-Toe/main.typ diff --git a/src/Warm-Ups/Wild Tic-Tac-Toe/main.tex b/src/Warm-Ups/Wild Tic-Tac-Toe/main.tex deleted file mode 100755 index b006ae0..0000000 --- a/src/Warm-Ups/Wild Tic-Tac-Toe/main.tex +++ /dev/null @@ -1,66 +0,0 @@ -\documentclass[ - solutions, - hidewarning, - singlenumbering, - nopagenumber -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - -% x,y,scale,style -\def\ttt#1#2#3#4{ - \draw[#4] (#1, #2+#3) -- (#1+#3+#3+#3, #2+#3); - \draw[#4] (#1, #2+#3+#3) -- (#1+#3+#3+#3, #2+#3+#3); - \draw[#4] (#1+#3, #2) -- (#1+#3, #2+#3+#3+#3); - \draw[#4] (#1+#3+#3, #2) -- (#1+#3+#3, #2+#3+#3+#3); -} - - -\title{Warm-Up: Wild Tic-Tac-Toe} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today.} - -\begin{document} - - \maketitle - - - \problem{} - In wild tic-tac-toe, players may place either an X or O on each move. The player that first completes a - row of any three symbols wins. Show that the first player always has a winning strategy. - - \vfill - \begin{center} - \begin{tikzpicture}[scale=0.60] - \ttt{0}{0}{2}{line width=0.3mm} - \ttt{7}{0}{2}{line width=0.3mm} - \ttt{14}{0}{2}{line width=0.3mm} - - \ttt{0}{7}{2}{line width=0.3mm} - \ttt{7}{7}{2}{line width=0.3mm} - \ttt{14}{7}{2}{line width=0.3mm} - \end{tikzpicture} - \end{center} - - \vfill - - \problem{} - Now, say the first player to complete a row loses. Who has a winning strategy now? - - \vfill - \begin{center} - \begin{tikzpicture}[scale=0.60] - \ttt{0}{0}{2}{line width=0.3mm} - \ttt{7}{0}{2}{line width=0.3mm} - \ttt{14}{0}{2}{line width=0.3mm} - - \ttt{0}{7}{2}{line width=0.3mm} - \ttt{7}{7}{2}{line width=0.3mm} - \ttt{14}{7}{2}{line width=0.3mm} - \end{tikzpicture} - \end{center} - - - \vfill - \pagebreak - -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/Wild Tic-Tac-Toe/main.typ b/src/Warm-Ups/Wild Tic-Tac-Toe/main.typ new file mode 100644 index 0000000..16dbc0d --- /dev/null +++ b/src/Warm-Ups/Wild Tic-Tac-Toe/main.typ @@ -0,0 +1,47 @@ +#import "@local/handout:0.1.0": * +#import "@preview/cetz:0.3.1" + +#show: handout.with( + title: [Warm-Up: Wild Tic-Tac-Toe], + by: "Mark", +) + +#let ttt = align( + center, + cetz.canvas({ + import cetz.draw: * + let s = 0.7 // scale + + set-style(stroke: (thickness: 0.5mm * s)) + line((-1 * s, 3 * s), (-1 * s, -3 * s)) + line((1 * s, 3 * s), (1 * s, -3 * s)) + line((3 * s, -1 * s), (-3 * s, -1 * s)) + line((3 * s, 1 * s), (-3 * s, 1 * s)) + }), +) + + +#problem() +In wild tic-tac-toe, players may place either an X or O on each move. The player that first completes a +row of any three symbols wins. Show that the first player always has a winning strategy. +#v(4mm) + +#table( + stroke: none, + align: center, + columns: (1fr, 1fr, 1fr), + ttt, ttt, ttt, +); +#v(1fr) + +#problem() +Now, say the first player to complete a row loses. Who has a winning strategy now? +#v(4mm) + +#table( + stroke: none, + align: center, + columns: (1fr, 1fr, 1fr), + ttt, ttt, ttt, +); +#v(1fr) -- 2.47.1 From 497c85338ee61bf09cc7d7b09779035f532bc822 Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 24 Jan 2025 17:55:36 -0800 Subject: [PATCH 15/19] Convert "Adders" to typst --- src/Warm-Ups/Adders/main.tex | 93 ------------------------------------ src/Warm-Ups/Adders/main.typ | 85 ++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 93 deletions(-) delete mode 100755 src/Warm-Ups/Adders/main.tex create mode 100644 src/Warm-Ups/Adders/main.typ diff --git a/src/Warm-Ups/Adders/main.tex b/src/Warm-Ups/Adders/main.tex deleted file mode 100755 index ab4f1cf..0000000 --- a/src/Warm-Ups/Adders/main.tex +++ /dev/null @@ -1,93 +0,0 @@ -\documentclass[ - nosolutions, - singlenumbering, - nopagenumber -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - - -\title{Warm-Up: Adders} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today} - -\begin{document} - - \maketitle - - \problem{} - Fill the following binary addition table. \par - \hint{s is \say{sum,} c is \say{carry}} - - \begin{center} - \begin{tabular}{ c c || c c } - $a$ & $b$ & s & c \\ - \hline - 0 & 0 & ? & ? \\ - 0 & 1 & ? & ? \\ - 1 & 0 & ? & ? \\ - 1 & 1 & ? & ? - \end{tabular} - \end{center} - - \vfill - - \problem{} - Draw a logic circuit that atisfies the above table. \par - This is called a \textit{half adder}. \par - \hint{You should need exactly two gates.} - - \begin{solution} - $s = a \texttt{ xor } b$ \par - $c = a \texttt{ and } b$ - \end{solution} - - \vfill - - \definition{} - A \textit{full adder} is similar to a half adder, but it has an extra input: \par - a full adder takes $a$, $b$, and $c_\text{in}$, and produces $s$ and $c_\text{out}$. \par - \hint{$c_\text{in}$ is \say{carry in}} - - \problem{} - Use two half adders to construct a full adder. - - \begin{solution} - $s_1, c_1 = \texttt{HA}(a, b)$ \par - $s_2, c_2 = \texttt{HA}(s_1, c_\text{in})$ \par - $s_\text{out} = s_2$ \par - $c_\text{out} = \texttt{OR}(c_1, c_2)$ - - \vspace{2mm} - - Of course, the class should just draw the circuit. - \end{solution} - - - \vfill - \pagebreak - - \problem{} - How can we add two four-bit binary numbers using the full adder? \par - We want a four-bit output sum and a one-bit $c_\text{out}$. - - \vfill - - \problem{} - Say that all basic logic gates need $1u$ of time to fully switch states. \par - \note[Note]{This is called \textit{gate delay}} - - \vspace{2mm} - - How much time does a full adder need to fully switch states? \par - How about your circuit from \ref{rippleadder}? - - \vfill - - \problem{Bonus} - Design a faster solution to \ref{rippleadder}. - - - \vfill - \pagebreak - -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/Adders/main.typ b/src/Warm-Ups/Adders/main.typ new file mode 100644 index 0000000..5bfce18 --- /dev/null +++ b/src/Warm-Ups/Adders/main.typ @@ -0,0 +1,85 @@ +#import "@local/handout:0.1.0": * + +#show: handout.with( + title: [Warm-Up: Adders], + by: "Mark", +) + +#problem() +Fill the following binary addition table. \ +#hint([s is "sum," c is "carry"]) + +#align( + center, + table( + columns: (9mm, 9mm, 9mm, 9mm), + align: center, + $a$, $b$, $s$, $c$, + [0], [0], [?], [?], + [0], [1], [?], [?], + [1], [0], [?], [?], + [1], [1], [?], [?], + ), +) + +#v(1fr) + +#problem() +Draw a logic circuit that atisfies the above table. \ +This is called a _half adder_. \ +#hint([You should need exactly two gates.]) + +#solution([ + $s = a #text([`xor`]) b$ \ + $c = a #text([`and`]) b$ +]) + +#v(1fr) + +#definition() +A _full adder_ is similar to a half adder, but it has an extra input: \ +a full adder takes $a$, $b$, and $c_"in"$, and produces $s$ and $c_"out"$. \ +#hint([$c_"in"$ is "carry in"]) + +#problem() +Use two half adders to construct a full adder. + +#solution([ + $ + s_1, c_1 &= "HA"(a, b) \ + s_2, c_2 &= "HA"(s_1, c_"in") \ + s_"out" &= s_2 \ + c_"out" &= "OR"(c_1, c_2) + $ + + #v(2mm) + + Of course, the class should just draw the circuit. +]) + + +#v(1fr) +#pagebreak() + + + +#problem(label: "ripple-adder") +How can we add two four-bit binary numbers using the full adder? \ +We want a four-bit output sum and a one-bit $c_"out"$. +#v(1fr) + +#problem() +Say that all basic logic gates need $1u$ of time to fully switch states. \ +#note([This is called _gate delay_], type: "Note") + +#v(2mm) + +How much time does a full adder need to fully switch states? \ +How about your circuit from @ripple-adder? + +#v(1fr) + +#problem("Bonus") +Design a faster solution to @ripple-adder. + +#v(1fr) -- 2.47.1 From 3267f00838eab8c0ccc8314204bd31832a1b179c Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 24 Jan 2025 22:09:28 -0800 Subject: [PATCH 16/19] Convert "What's an AST?" to typst --- src/Warm-Ups/What's an AST/main.tex | 43 ----------------- src/Warm-Ups/What's an AST/main.typ | 74 +++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 43 deletions(-) delete mode 100755 src/Warm-Ups/What's an AST/main.tex create mode 100644 src/Warm-Ups/What's an AST/main.typ diff --git a/src/Warm-Ups/What's an AST/main.tex b/src/Warm-Ups/What's an AST/main.tex deleted file mode 100755 index 39dd677..0000000 --- a/src/Warm-Ups/What's an AST/main.tex +++ /dev/null @@ -1,43 +0,0 @@ -\documentclass[ - solutions, - hidewarning, - singlenumbering, - nopagenumber -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - - -\usepackage[linguistics]{forest} - - - -\title{Warm-Up: What's an AST?} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today. \\ Based on a true story.} - -\begin{document} - - \maketitle - - Say you have a valid string of simple arithmetic that contains no unary operators (like $3!$ or $-4$) and no parenthesis: - $$ - 3 + 9 \times 8 \div 5 \land 6 - $$ - - You may assume that all numbers and operators in this string consist of exactly one character. \\ - - Devise an algorithm that turns this string into a tree (as shown below), respecting the order of operations $[\land, \times, \div, +, -]$. - - \begin{center} - \begin{forest} - [$+$ - [3] - [$\div$ - [$\times$[9][8]] - [$\land$[5][6]] - ] - ] - \end{forest} - \end{center} - -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/What's an AST/main.typ b/src/Warm-Ups/What's an AST/main.typ new file mode 100644 index 0000000..6c32b92 --- /dev/null +++ b/src/Warm-Ups/What's an AST/main.typ @@ -0,0 +1,74 @@ +#import "@local/handout:0.1.0": * +#import "@preview/cetz:0.3.1" + +#show: handout.with( + title: [Warm-Up: What's an AST?], + by: "Mark", + subtitle: "Based on a true story.", +) + +#problem() +Say we have a valid string of simple arithmetic that contains \ +no unary operators (like $3!$ or $-4$) and no parenthesis: + +#v(2mm) +$ + 3 + 9 times 8 div 5 and 6 +$ +#v(2mm) + +You may assume that all numbers and operators in this string consist of exactly one character. \ + +Devise an algorithm that turns such strings into a tree (as shown below), \ +respecting the order of operations $[and, times, div, +, -]$. + +#v(2mm) + +#align( + center, + cetz.canvas({ + import cetz.draw: * + + // spell:off + content((0, 0), $+$, name: "r") + content((-0.5, -1), $3$, name: "a") + content((0.5, -1), $div$, name: "b") + content((-0.3, -2), $times$, name: "ba") + content((1.3, -2), $and$, name: "bb") + content((-0.8, -3), $9$, name: "baa") + content((0.2, -3), $8$, name: "bab") + content((0.8, -3), $5$, name: "bba") + content((1.8, -3), $6$, name: "bbb") + // spell:on + + // Zero-sized arrows are a hack for offset. + set-style( + stroke: (thickness: 0.3mm), + mark: ( + start: ( + symbol: "|", + offset: 0.25, + width: 0mm, + length: 0mm, + ), + end: ( + symbol: "|", + offset: 0.25, + width: 0mm, + length: 0mm, + ), + ), + ) + + // spell:off + line("r", "a") + line("r", "b") + line("b", "ba") + line("b", "bb") + line("ba", "baa") + line("ba", "bab") + line("bb", "bba") + line("bb", "bbb") + // spell:on + }), +) -- 2.47.1 From 7c0f811414c28bf309f4d572c005710350a655b0 Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 24 Jan 2025 22:20:14 -0800 Subject: [PATCH 17/19] Convert "Painting" to typst --- src/Warm-Ups/Painting/main.tex | 80 --------------------------------- src/Warm-Ups/Painting/main.typ | 82 ++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 80 deletions(-) delete mode 100755 src/Warm-Ups/Painting/main.tex create mode 100644 src/Warm-Ups/Painting/main.typ diff --git a/src/Warm-Ups/Painting/main.tex b/src/Warm-Ups/Painting/main.tex deleted file mode 100755 index 93f0bd4..0000000 --- a/src/Warm-Ups/Painting/main.tex +++ /dev/null @@ -1,80 +0,0 @@ -\documentclass[ - solutions, - singlenumbering, - nopagenumber -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - -\title{Warm-Up: The Painting} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today.} - -\begin{document} - - \maketitle - - \problem{} - You have a painting on a string. \par - Hang the painting on two nails so that if either is removed, the painting falls. \par - - \vspace{2mm} - You may detach the string as you hang the painting, but it must be re-attached once you're done. - - \note{The solution to this problem isn't a \say{think outside the box} trick, it's a clever wrapping of the string.} - - - \begin{center} - \begin{tikzpicture}[scale=2.0] - \draw[line width = 0.5mm] - (0, 1) -- - (2, 1) -- - (2, 0) -- - (0, 0) -- - cycle - ; - - \draw[line width = 0.5mm, dotted] - (0.1, 1) -- - (1, 1.5) -- - (1.9, 1) - ; - - \fill (1, 1.5) circle[radius = 0.25mm]; - - - \draw[line width = 0.2mm] - (0.66, 0.66) -- - (0.66, 0.35) -- - (0.60, 0.1) - (0.72, 0.1)--(0.66, 0.35) - ; - - \draw[line width = 0.2mm] - (0.66, 0.575) -- - (0.6, 0.475) -- - (0.525, 0.575) - (0.66, 0.575) -- - (0.72, 0.475) -- - (0.795, 0.575) - ; - - \fill[color=white] (0.66, 0.66) circle[radius = 0.8mm]; - \draw (0.66, 0.66) circle[radius = 0.8mm]; - \end{tikzpicture} - \end{center} - - - \begin{solution} - - Say we have a left nail and a right nail. The path of the string is as follows: - \begin{itemize} - \item Start on the left - \item Move over both nails, wrap right nail cw - \item Wrap left nail ccw - \item Wrap right nail ccw - \item Exit downwards, in between both nails - \end{itemize} - - \end{solution} - -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/Painting/main.typ b/src/Warm-Ups/Painting/main.typ new file mode 100644 index 0000000..83461b1 --- /dev/null +++ b/src/Warm-Ups/Painting/main.typ @@ -0,0 +1,82 @@ +#import "@local/handout:0.1.0": * +#import "@preview/cetz:0.3.1" + +#show: handout.with( + title: [Warm-Up: What's an AST?], + by: "Mark", + subtitle: "Based on a true story.", +) + +#problem() +Say we have a painting on a string. \ +Hang the painting on two nails so that if either is removed, the painting falls. \ + +#v(2mm) +You may detach the string as you hang the painting, but it must be re-attached once you're done. \ +#hint[The solution to this problem isn't a "think outside the box" trick, it's a clever wrapping of the string.] + + +#v(2mm) + +#align( + center, + cetz.canvas({ + import cetz.draw: * + let s = 2.5 + + + line( + (0 * s, 1 * s), + (2 * s, 1 * s), + (2 * s, 0 * s), + (0 * s, 0 * s), + close: true, + stroke: (thickness: 0.8mm), + ) + + line( + (0.1 * s, 1 * s), + (0.5 * s, 1.5 * s), + (1.5 * s, 1.5 * s), + (1.9 * s, 1 * s), + stroke: (thickness: 0.5mm, dash: "dotted"), + ) + + circle((0.5 * s, 1.5 * s), radius: 0.04 * s, fill: black, stroke: none) + circle((1.5 * s, 1.5 * s), radius: 0.04 * s, fill: black, stroke: none) + + line( + (0.66 * s, 0.66 * s), + (0.66 * s, 0.35 * s), + (0.60 * s, 0.1 * s), + ) + + line( + (0.72 * s, 0.1 * s), + (0.66 * s, 0.35 * s), + ) + + line( + (0.66 * s, 0.575 * s), + (0.6 * s, 0.475 * s), + (0.525 * s, 0.575 * s), + ) + + line( + (0.66 * s, 0.575 * s), + (0.72 * s, 0.475 * s), + (0.795 * s, 0.575 * s), + ) + + circle((0.66 * s, 0.66 * s), radius: 0.07 * s, fill: white) + }), +) + +#solution([ + Say we have a left nail and a right nail. The path of the string is as follows: + - Start on the left + - Move over both nails, wrap right nail cw + - Wrap left nail ccw + - Wrap right nail ccw + - Exit downwards, in between both nails +]) -- 2.47.1 From 781cb86e8c42263d404ef4759e315ffcdaeb641d Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 24 Jan 2025 22:26:03 -0800 Subject: [PATCH 18/19] Convert "Sysadmin" to typst --- src/Warm-Ups/Sysadmin/main.tex | 89 ---------------------------------- src/Warm-Ups/Sysadmin/main.typ | 35 +++++++++++++ 2 files changed, 35 insertions(+), 89 deletions(-) delete mode 100755 src/Warm-Ups/Sysadmin/main.tex create mode 100644 src/Warm-Ups/Sysadmin/main.typ diff --git a/src/Warm-Ups/Sysadmin/main.tex b/src/Warm-Ups/Sysadmin/main.tex deleted file mode 100755 index 850ff53..0000000 --- a/src/Warm-Ups/Sysadmin/main.tex +++ /dev/null @@ -1,89 +0,0 @@ -\documentclass[ - solutions, - hidewarning, - singlenumbering, - nopagenumber -]{../../../lib/tex/ormc_handout} -\usepackage{../../../lib/tex/macros} - - - -\usepackage{tikz} - - -\title{The Sysadmin's Warm-Up} -\uptitler{\smallurl{}} -\subtitle{Prepared by Mark on \today} - - -\begin{document} - - \maketitle - - - Most of you have seen a hard drive. Many have touched one, and a lucky few have poked around inside one. These devices have two interesting properties: - - \begin{enumerate} - \item They hold valuable data - \item They eventually fail - \end{enumerate} - - Needless to say, this is a problem. \par - We need to design a system that allows hard drives to fail without data loss. - - \definition{} - You can think of a hard drive as a long string of bits. \par - Assume all hard drives can store 1 TiB of data. - - \begin{center} - \begin{tikzpicture} - - \node[above] at (1/2, 0) {Drive A}; - \draw (0cm, 0cm) -- (0cm, -3cm); - \draw (1cm, 0cm) -- (1cm, -3cm); - \foreach \i in {0,...,-6} { - \draw (0cm,\i cm / 2) -- (1cm ,\i cm / 2); - } - - \node at (1/2, - 1 / 4) {1}; - \node at (1/2, - 3 / 4) {1}; - \node at (1/2, - 5 / 4) {0}; - \node at (1/2, - 7 / 4) {...}; - \node at (1/2, - 9 / 4) {1}; - \node at (1/2, -11 / 4) {0}; - - - \node[above] at (5/2, 0) {Drive B}; - \draw (2cm, 0cm) -- (2cm, -3cm); - \draw (3cm, 0cm) -- (3cm, -3cm); - \foreach \i in {0,...,-6} { - \draw (2cm,\i cm / 2) -- (3cm ,\i cm / 2); - } - - \node at (5/2, - 1 / 4) {0}; - \node at (5/2, - 3 / 4) {1}; - \node at (5/2, - 5 / 4) {0}; - \node at (5/2, - 7 / 4) {...}; - \node at (5/2, - 9 / 4) {0}; - \node at (5/2, -11 / 4) {1}; - \end{tikzpicture} - \end{center} - - \problem{} - Suppose we have two hard drives. How can we arrange our data so that... - \begin{enumerate} - \item We get 1 TiB of usable storage - \item We lose no data if any one drive fails - \end{enumerate} - - \vfill - - \problem{} - Suppose we have three hard drives. How can we arrange our data so that... - \begin{enumerate} - \item We get 2 TiB of usable storage - \item We lose no data if any one drive fails - \end{enumerate} - - \vfill -\end{document} \ No newline at end of file diff --git a/src/Warm-Ups/Sysadmin/main.typ b/src/Warm-Ups/Sysadmin/main.typ new file mode 100644 index 0000000..0ba4726 --- /dev/null +++ b/src/Warm-Ups/Sysadmin/main.typ @@ -0,0 +1,35 @@ +#import "@local/handout:0.1.0": * + +#show: handout.with( + title: [The Sysadmin's Warm-Up], + by: "Mark", +) + +Most of you have seen a hard drive. \ +Many have touched one, and a lucky few have taken one apart. \ +These devices have two interesting properties: +- They hold valuable data +- They inevitably fail + +Needless to say, this is a problem. \ +We would like to design a system that tolerates hard drive failures without data loss. + +#definition() +You can think of a hard drive as a long string of bits. \ +Assume all hard drives in the following problems have the same size. \ +If a hard drive "fails", all data on it is instantly lost. + +#problem() +Suppose we have two hard drives. How can we arrange our data so that... +- We get 1 TiB of usable storage +- We lose no data if any one drive fails + +#v(1fr) + +#problem() +Suppose we have three hard drives. How can we arrange our data so that... +- We get 2 TiB of usable storage +- We lose no data if any one drive fails + +#v(1fr) + -- 2.47.1 From 7ce1aaa26b44b2d1b35514abe2125ab19088f8ff Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 24 Jan 2025 22:26:07 -0800 Subject: [PATCH 19/19] Link should be in texttt --- lib/typst/local/handout/0.1.0/lib.typ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/typst/local/handout/0.1.0/lib.typ b/lib/typst/local/handout/0.1.0/lib.typ index d9f0e32..06eddc9 100755 --- a/lib/typst/local/handout/0.1.0/lib.typ +++ b/lib/typst/local/handout/0.1.0/lib.typ @@ -91,7 +91,7 @@ let url = link( "https://betalupi.com/handouts", - "betalupi.com/handouts", + `betalupi.com/handouts`, ) make_header( -- 2.47.1