Compare commits

..

1 Commits

Author SHA1 Message Date
095d85d4ef
DRAFT 2025-01-23 12:54:47 -08:00
55 changed files with 1742 additions and 1785 deletions

3
authors.toml Normal file
View File

@ -0,0 +1,3 @@
[authors."mark"]
email = "mark@betalupi.com"
webpage = "betalupi.com"

View File

@ -0,0 +1,282 @@
/// Typst handout library, used for all documents in this repository.
/// If false, hide instructor info.
///
/// Compile with the following command to hide solutions:
/// `typst compile main.typ --input show_solutions=false`
///
/// Solutions are shown by default. This behavior
/// is less surprising than hiding content by default.
#let show_solutions = {
if "show_solutions" in sys.inputs {
// Show solutions unless they're explicitly disabled
not (
sys.inputs.show_solutions == "false" or sys.inputs.show_solutions == "no"
)
} else {
// Show solutions by default
true
}
}
// Colors
#let ored = rgb("D62121")
#let ogrape = rgb("9C36B5")
#let ocyan = rgb("2288BF")
#let oteal = rgb("12B886")
#let ogreen = rgb("37B26D")
#let oblue = rgb("1C7ED6")
//
// MARK: header
//
#let make_title(
group,
quarter,
title,
subtitle,
) = {
align(
center,
block(
width: 60%,
height: auto,
breakable: false,
align(
center,
stack(
spacing: 7pt,
(
text(size: 10pt, group) + h(1fr) + text(size: 10pt, quarter)
),
line(length: 100%, stroke: 0.2mm),
(
text(size: 20pt, title) + linebreak() + text(size: 10pt, subtitle)
),
line(length: 100%, stroke: 0.2mm),
),
),
),
)
}
#let warn = {
set text(ored)
align(
center,
block(
width: 60%,
height: auto,
breakable: false,
fill: rgb(255, 255, 255),
stroke: ored + 2pt,
inset: 3mm,
(
align(center, text(weight: "bold", size: 12pt, [Instructor's Handout]))
+ parbreak()
+ align(
left,
text(
size: 10pt,
[This handout contains solutions and notes.]
+ linebreak()
+ [Recompile without solutions before distributing.],
),
)
),
),
)
}
#let preparedby(name) = (
text(
size: 10pt,
[Prepared by ]
+ name
+ [ on ]
+ datetime
.today()
.display("[month repr:long] [day padding:none], [year]"),
)
)
//
// MARK: Solutions
//
#let solution(content) = {
if show_solutions {
align(
center,
stack(
block(
width: 100%,
breakable: false,
fill: ored,
stroke: ored + 2pt,
inset: 1.5mm,
(
align(left, text(fill: white, weight: "bold", [Solution:]))
),
),
block(
width: 100%,
height: auto,
breakable: false,
fill: ored.lighten(80%).desaturate(10%),
stroke: ored + 2pt,
inset: 3mm,
align(left, content),
),
),
)
}
}
#let notsolution(content) = {
if not show_solutions { content }
}
//
// MARK: Sections
//
#let generic(t) = block(
above: 8mm,
below: 2mm,
text(weight: "bold", t),
)
#let _generic_base(kind, ..args) = {
counter("obj").step()
if args.pos().len() == 0 {
generic([
#kind
#context counter("obj").display():
])
} else {
generic(
[
#kind
#context counter("obj").display():
]
+ " "
+ args.pos().at(0),
)
}
}
#let problem(..args) = _generic_base("Problem", ..args)
#let definition(..args) = _generic_base("Definition", ..args)
#let theorem(..args) = _generic_base("Theorem", ..args)
//
// MARK: Misc
//
#let hint(content) = {
text(fill: rgb(100, 100, 100), style: "oblique", "Hint: ")
text(fill: rgb(100, 100, 100), content)
}
#let note(content) = {
text(fill: rgb(100, 100, 100), content)
}
#let examplesolution(content) = {
let c = oblue
align(
center,
stack(
block(
width: 100%,
breakable: false,
fill: c,
stroke: c + 2pt,
inset: 1.5mm,
(
align(left, text(fill: white, weight: "bold", [Example solution:]))
),
),
block(
width: 100%,
height: auto,
breakable: false,
fill: c.lighten(80%).desaturate(10%),
stroke: c + 2pt,
inset: 3mm,
align(left, content),
),
),
)
}
//
// MARK: wrapper
//
#let handout(
doc,
group: none,
quarter: none,
title: none,
by: none,
subtitle: none,
) = {
set par(leading: 0.55em, first-line-indent: 0mm, justify: true)
set text(font: "New Computer Modern")
set par(spacing: 0.5em)
show list: set block(spacing: 0.5em, below: 1em)
set heading(numbering: (..nums) => nums.pos().at(0))
set page(
margin: 20mm,
width: 8in,
height: 11.5in,
footer: align(
center,
context counter(page).display(),
),
footer-descent: 5mm,
)
set list(
tight: false,
indent: 5mm,
spacing: 3mm,
)
show heading.where(level: 1): it => {
set align(center)
set text(weight: "bold")
block[
Section #counter(heading).display(): #text(it.body)
]
}
make_title(
group,
quarter,
title,
{
if by == none { none } else { [#preparedby(by)\ ] }
if subtitle == none { none } else { subtitle }
},
)
if show_solutions {
warn
}
doc
}

View File

@ -1,71 +0,0 @@
#import "misc.typ": ored
#let solution_warning() = {
set text(ored)
align(
center,
block(
width: 60%,
height: auto,
breakable: false,
fill: rgb(255, 255, 255),
stroke: ored + 2pt,
inset: 3mm,
(
align(center, text(weight: "bold", size: 12pt, [Instructor's Handout]))
+ parbreak()
+ align(
left,
text(
size: 10pt,
[
This handout contains solutions and notes. \
Recompile without solutions before distributing.
],
),
)
),
),
)
}
#let make_header(
title,
subtitle: none,
by: none,
top_left: "",
top_right: "",
) = {
let date = datetime
.today()
.display("[month repr:long] [day padding:none], [year]")
if (by != none) {
by = text(size: 10pt, [Prepared by #by on #date])
}
// Main title
align(
center,
block(
width: 60%,
height: auto,
breakable: false,
align(
center,
stack(
spacing: 7pt,
// Top
text(size: 10pt, top_left) + h(1fr) + text(size: 10pt, top_right),
line(length: 100%, stroke: 0.2mm),
// Title
text(size: 20pt, title),
// Subtitle
if (by != none) { text(size: 10pt, by) },
if (subtitle != none) { text(size: 10pt, subtitle) },
line(length: 100%, stroke: 0.2mm),
),
),
),
)
}

View File

@ -1,113 +0,0 @@
/// Typst handout library, used for all documents in this repository.
// Re-exports
// All functions that maybe used by client code are listed here
#import "misc.typ": *
#import "object.typ": problem, definition, theorem
#import "solution.typ": if_solutions, if_no_solutions, solution
/// Main handout wrapper.
/// Use this as follows:
///
/// ```
/// #show: handout.with(
/// group: "Advanced 2",
/// title: [Handout Title],
/// by: "author",
/// subtitle: "optional",
/// )
///
/// <rest of document>
/// ```
#let handout(
doc,
group: none,
title: none,
by: none,
subtitle: none,
) = {
set page(
margin: 20mm,
width: 8.5in,
height: 11in,
footer: align(
center,
context counter(page).display(),
),
footer-descent: 5mm,
)
//
// Text style
set text(font: "New Computer Modern")
set par(
leading: 0.55em,
first-line-indent: 0mm,
justify: true,
spacing: 0.5em,
)
//
// List style
show list: set block(spacing: 0.5em, below: 1em)
set list(
tight: false,
indent: 5mm,
spacing: 3mm,
)
//
// Heading style
set heading(numbering: (..nums) => nums.pos().at(0))
show heading.where(level: 1): it => {
set align(center)
set text(weight: "bold")
block[
Section #counter(heading).display(): #text(it.body)
]
}
//
// Hack for custom references
show ref: it => {
import "object.typ": ref_obj
let x = ref_obj(it) // Custom impl for object references
if (x != none) { return x }
return it // Use default `ref` implementation otherwise
}
//
// Begin content
//
// Make handout title
{
import "header.typ": make_header, solution_warning
import "solution.typ": show_solutions
let url = link(
"https://betalupi.com/handouts",
`betalupi.com/handouts`,
)
make_header(
title,
subtitle: subtitle,
by: by,
top_left: group,
top_right: url,
)
if show_solutions {
solution_warning()
}
}
// Include rest of document
doc
}

View File

@ -1,49 +0,0 @@
/// Miscellaneous utilities
#let ored = rgb("D62121")
#let oorange = rgb("#ffaa3b")
#let ogrape = rgb("9C36B5")
#let ocyan = rgb("2288BF")
#let oteal = rgb("12B886")
#let ogreen = rgb("37B26D")
#let oblue = rgb("1C7ED6")
#let note(content, type: none) = {
set text(fill: rgb(100, 100, 100))
if type != none {
text(style: "oblique", [#type: ])
}
text(content)
}
#let hint = note.with(type: "Hint")
#let examplesolution(content) = {
let c = oblue
align(
center,
stack(
block(
width: 100%,
breakable: false,
fill: c,
stroke: c + 2pt,
inset: 1.5mm,
(
align(left, text(fill: white, weight: "bold", [Example solution:]))
),
),
block(
width: 100%,
height: auto,
breakable: false,
fill: c.lighten(80%).desaturate(10%),
stroke: c + 2pt,
inset: 3mm,
align(left, content),
),
),
)
}

View File

@ -1,100 +0,0 @@
/// This module defines all handout "objects"
/// (problems, theorems, definitions, etc)
/// Core render code for all objects (problems, theorems, etc)
/// This should never be used directly by client code.
///
/// Args:
/// - kind: the kind of object to make ("Problem", "Definition", etc)
/// - label_name: a string. If provided, generate metadata for this object
/// under the given label. Labels must be unique.
/// This label can then be used to reference this object.
///
/// For example:
/// ```
/// #problem(label: "problem1")
/// This is @problem1
/// ```
#let _obj_base(kind, ..args, label_name: none) = {
counter("obj").step()
let n = context counter("obj").get().first()
// The complete title text of this object,
// like "Problem 5:" or "Theorem: "
let obj_content = if args.pos().len() == 0 {
[#kind #n:]
} else {
[#kind #n: #args.pos().at(0)]
}
// Render the object
block(
above: 8mm,
below: 2mm,
text(weight: "bold", obj_content),
)
// Generate labeled metadata for this object.
//
// This can be viewed directly with `#context query(<label>).first().value`,
// Or referenced with `@label` (we define a custom renderer for this metadata later)
if label_name != none {
let meta = (
"obj_meta_ref_kind": kind,
// "obj_content": obj_content,
"label": label(label_name),
"counter": counter("obj"),
)
[ #metadata(meta) #label(label_name) ]
}
}
// `ref` implementation for object meta-references.
// Returns `none` if `it` is not object metadata.
#let ref_obj(it) = {
let magic_key = "obj_meta_ref_kind"
if not (
it.element != none
and it.element.has("value")
and type(it.element.value) == "dictionary"
and it.element.value.keys().contains(magic_key)
) {
// This label is not attached to object metadata
return none
}
let v = it.element.value
let obj_type = v.at(magic_key)
// The value of this object's counter at its label
let obj_count = v.counter.at(v.label).first()
// Produces text like "Problem 2",
// which takes you to the referenced object when clicked.
return link(v.label, [#obj_type #obj_count])
}
/// Factory function for objects.
/// Provided for convenience, lets us define objects in one line.
#let _mkobj(kind) = {
let out(..args, label: none) = _obj_base(
kind,
..args,
label_name: label,
)
return out
}
//
// MARK: export
//
// Functions for client code are defined below
#let problem = _mkobj("Problem")
#let definition = _mkobj("Definition")
#let theorem = _mkobj("Theorem")
#let example = _mkobj("Example")
#let remark = _mkobj("Remark")

View File

@ -1,56 +0,0 @@
#import "misc.typ": ored
/// If false, hide instructor info.
///
/// Compile with the following command to hide solutions:
/// `typst compile main.typ --input show_solutions=false`
///
/// Solutions are shown by default. This behavior
/// is less surprising than hiding content by default.
#let show_solutions = {
if "show_solutions" in sys.inputs {
// Show solutions unless they're explicitly disabled
not (
sys.inputs.show_solutions == "false" or sys.inputs.show_solutions == "no"
)
} else {
// Show solutions by default
true
}
}
#let if_solutions(content) = {
if show_solutions { content }
}
#let if_no_solutions(content) = {
if not show_solutions { content }
}
#let solution(content) = {
if_solutions(
align(
center,
stack(
block(
width: 100%,
breakable: false,
fill: ored,
stroke: ored + 2pt,
inset: 1.5mm,
align(left, text(fill: white, weight: "bold", [Solution:])),
),
block(
width: 100%,
height: auto,
breakable: false,
fill: ored.lighten(80%).desaturate(10%),
stroke: ored + 2pt,
inset: 3mm,
align(left, content),
),
),
),
)
}

View File

@ -1,12 +1,6 @@
[package]
name = "handout"
description = "A library for math circle handouts"
version = "0.1.0"
entrypoint = "lib.typ"
homepage = "https://betalupi.com/handouts"
repository = "https://git.betalupi.com/Mark/handouts"
authors = ["Mark <mark@betalupi.com>"]
license = "GPL-3.0-only "
disciplines = ["education", "mathematics"]
categories = ["layout", "components"]
entrypoint = "handout.typ"
authors = []
license = "GPL"

View File

@ -1,6 +1,13 @@
#import "@local/handout:0.1.0": *
#show: handout.with(
#show: doc => handout(
doc,
group: "Advanced 2",
quarter: link(
"https://betalupi.com/handouts",
"betalupi.com/handouts",
),
title: [Tropical Polynomials],
by: "Mark",
subtitle: "Based on a handout by Bryant Mathews",

View File

@ -3,5 +3,5 @@ title = "Tropical Polynomials"
[publish]
handout = false
handout = true
solutions = true

View File

@ -104,7 +104,7 @@ Is there a tropical multiplicative identity? \
Do tropical multiplicative inverses always exist? \
#note([
For every $x != #sym.infinity$, does there exist an inverse $y$ so that $x #tm y = i$, \
where $i$ is the multiplicative identity?
where $i$ is the additive identity?
])
#solution([Yes, it is $-x$. For $x != 0$, $x #tm (-x) = 0$])
@ -126,7 +126,7 @@ Fill the following tropical addition and multiplication tables
#let col = 10mm
#if_no_solutions(
#notsolution(
table(
columns: (1fr, 1fr),
align: center,

View File

@ -63,7 +63,7 @@ where all exponents represent repeated tropical multiplication.
Draw a graph of the tropical polynomial $f(x) = x^2 #tp 1x #tp 4$. \
#hint([$1x$ is not equal to $x$.])
#if_no_solutions(graphgrid(none))
#notsolution(graphgrid(none))
#solution([
$f(x) = min(2x , 1+x, 4)$, which looks like:
@ -132,7 +132,7 @@ How can we use the graph to determine these roots?
Graph $f(x) = -2x^2 #tp x #tp 8$. \
#hint([Use half scale. 1 box = 2 units.])
#if_no_solutions(graphgrid(none))
#notsolution(graphgrid(none))
#solution([
#graphgrid({
@ -140,7 +140,7 @@ Graph $f(x) = -2x^2 #tp x #tp 8$. \
let step = 0.75
dotline((0, 0), (8 * step, 8 * step))
dotline((0.5 * step, 0), (4.5 * step, 8 * step))
dotline((0.5 * step, 0), (4 * step, 8 * step))
dotline((0, 4 * step), (8 * step, 4 * step))
line(
@ -210,7 +210,7 @@ and always produces $7$ for sufficiently large inputs.
#problem()
Graph $f(x) = 1x^2 #tp 3x #tp 5$.
#if_no_solutions(graphgrid(none))
#notsolution(graphgrid(none))
#solution([
The graphs of all three terms intersect at the same point:
@ -261,7 +261,7 @@ How are the roots of $f$ related to its coefficients?
#problem()
Graph $f(x) = 2x^2 #tp 4x #tp 4$.
#if_no_solutions(graphgrid(none))
#notsolution(graphgrid(none))
#solution(
graphgrid({

View File

@ -5,12 +5,12 @@
= Tropical Cubic Polynomials
#problem()
Consider the polynomial $f(x) = x^3 #tp 1x^2 #tp 3x #tp 6$. \
Consider the polynomial $f(x) = x^3 #tp x^2 #tp 3x #tp 6$. \
- sketch a graph of this polynomial
- use this graph to find the roots of $f$
- write (and expand) a product of linear factors with the same graph as $f$.
#if_no_solutions(graphgrid(none))
#notsolution(graphgrid(none))
#solution([
- Roots are 1, 2, and 3.
@ -43,12 +43,12 @@ Consider the polynomial $f(x) = x^3 #tp 1x^2 #tp 3x #tp 6$. \
#pagebreak() // MARK: page
#problem()
Consider the polynomial $f(x) = x^3 #tp 1x^2 #tp 6x #tp 6$. \
Consider the polynomial $f(x) = x^3 #tp x^2 #tp 6x #tp 6$. \
- sketch a graph of this polynomial
- use this graph to find the roots of $f$
- write (and expand) a product of linear factors with the same graph as $f$.
#if_no_solutions(graphgrid(none))
#notsolution(graphgrid(none))
#solution([
- Roots are 1, 2.5, and 2.5.
@ -82,7 +82,7 @@ Consider the polynomial $f(x) = x^3 #tp 6x^2 #tp 6x #tp 6$. \
- use this graph to find the roots of $f$
- write (and expand) a product of linear factors with the same graph as $f$.
#if_no_solutions(graphgrid(none))
#notsolution(graphgrid(none))
#solution([
- Roots are 2, 2, and 2.
@ -118,10 +118,10 @@ Using the last three problems, find formulas for $B$ and $C$ in terms of $a$, $b
#solution([
$
B = min(b, (a+c)/2, (2a+d)/3)
B = min(b, (a+c)/2, (2a+d)/2)
$
$
C = min(c, (b+d)/2, (a+2d)/3)
C = min(c, (b+d)/2, (a+2d)/2)
$
])
@ -153,7 +153,7 @@ What are the roots of the following polynomial?
#v(1fr)
#pagebreak() // MARK: page
#problem(label: "findci")
#problem()
If
$
f(x) = c_0 #tp c_1 x #tp c_2 x^2 #tp ... #tp c_n x^n
@ -183,7 +183,7 @@ Find a formula for each $C_i$ in terms of $c_0, c_1, ..., c_n$.
#problem()
With the same setup as @findci, \
With the same setup as the previous problem, \
find formulas for the roots $r_1, r_2, ..., r_n$.
#solution([

View File

@ -0,0 +1,35 @@
\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{}<one>
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}

View File

@ -1,33 +0,0 @@
#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)

93
src/Warm-Ups/Adders/main.tex Executable file
View File

@ -0,0 +1,93 @@
\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{}<rippleadder>
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}

View File

@ -1,85 +0,0 @@
#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)

187
src/Warm-Ups/Big-Tac-Toe/main.tex Executable file
View File

@ -0,0 +1,187 @@
\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}

View File

@ -1,90 +0,0 @@
#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),
),
)
}

View File

@ -0,0 +1,31 @@
\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}

View File

@ -1,15 +0,0 @@
#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?

121
src/Warm-Ups/Gallery/main.tex Executable file
View File

@ -0,0 +1,121 @@
\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}

View File

@ -1,103 +0,0 @@
#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)

View File

@ -0,0 +1,54 @@
\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}

View File

@ -1,35 +0,0 @@
#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.
])

132
src/Warm-Ups/Odd Dice/main.tex Executable file
View File

@ -0,0 +1,132 @@
\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}

View File

@ -1,111 +0,0 @@
#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)

View File

@ -4,3 +4,8 @@ title = "Odd Dice"
[publish]
handout = true
solutions = true
[[attribution]]
who = "mark"
when = 2024-02-13
what = "Initial version of handout"

80
src/Warm-Ups/Painting/main.tex Executable file
View File

@ -0,0 +1,80 @@
\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}

View File

@ -1,82 +0,0 @@
#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
])

View File

@ -0,0 +1,57 @@
\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}

View File

@ -1,41 +0,0 @@
#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.
])

View File

@ -0,0 +1,47 @@
\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}

View File

@ -1,192 +0,0 @@
#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
}
}),
)
}
])

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View File

@ -0,0 +1,34 @@
\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}

View File

@ -1,23 +0,0 @@
#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)

153
src/Warm-Ups/Regex/main.tex Normal file
View File

@ -0,0 +1,153 @@
\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{}<regex>
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}

View File

@ -1,135 +0,0 @@
#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`.

View File

@ -1,75 +0,0 @@
#import "@local/handout:0.1.0": *
#show: handout.with(
title: [Somewhat Random Numbers],
by: "Mark",
)
#problem()
Alice generates 100 random numbers uniformly from $[0,1]$. \
Bob generates 101 random numbers from $[0, 1]$, but deletes the lowest result.
#v(2mm)
Say we have both of the resulting arrays, but do not know who generated each one. \
We would like to guess which of the two was generated by Bob. \
What is the optimal strategy, and what is its probability of guessing correctly?
#solution([
Looking at the mean seems like a good idea, but there's a better way: \
Assign the array with the smaller _minimum_ to Alice.
#v(3mm)
To compute the probability, generate 201 numbers. \
Assign the first 100 to Alice and the rest to Bob. \
Look at the lowest two numbers (of these 201, *before* Bob drops his lowest).
#v(8mm)
We'll use the following notation: \
`AB` means the lowest was owned by Alice, and the second-lowest, by Bob.
#v(2mm)
Probabilities are as follows: \
- `AA`: $100\/201 times 99\/200 approx 0.246$
- `AB`: $100\/201 times 101\/200 approx 0.251$
- `BA`: $101\/201 times 100\/200 approx 0.251$ // spell:disable-line
- `BB`: $101\/201 times 100\/200 approx 0.251$
#v(4mm)
Now, Bob drops his lowest number. \
We'll cross out the number he drops and box the new lowest number (i.e, the one we observe):
- #{
(
box(`A`, stroke: ored, inset: 1pt)
+ box(`A`, inset: 1pt)
+ box([: $approx 0.246$], inset: (top: 1pt, bottom: 1pt))
)
}
- #{
(
box(`A`, stroke: ored, inset: 1pt)
+ box(strike(`B`), inset: 1pt)
+ box([: $approx 0.251$], inset: (top: 1pt, bottom: 1pt))
)
}
- #{
(
box(strike(`B`), inset: 1pt)
+ box(`A`, stroke: ored, inset: 1pt)
+ box([: $approx 0.251$], inset: (top: 1pt, bottom: 1pt))
)
}
- #{
(
box(strike(`B`), inset: 1pt)
+ box(`B`, stroke: ored, inset: 1pt)
+ box([: $approx 0.251$], inset: (top: 1pt, bottom: 1pt))
)
}
#v(8mm)
Alice has the smallest number in 3 of 4 cases, which have a total probability of $approx 0.749$.
])

View File

@ -1,6 +0,0 @@
[metadata]
title = "Somewhat Random Numbers"
[publish]
handout = true
solutions = true

89
src/Warm-Ups/Sysadmin/main.tex Executable file
View File

@ -0,0 +1,89 @@
\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}

View File

@ -1,35 +0,0 @@
#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)

View File

@ -0,0 +1,30 @@
\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}

View File

@ -1,20 +0,0 @@
#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.
])

View File

@ -1,26 +0,0 @@
#import "@local/handout:0.1.0": *
#show: handout.with(
title: [Warm-Up: Tuesday],
by: "Mark",
)
#problem()
Charlie has two children. \
One of them is a boy born on a Tuesday. \
What is the probability that Charlie has two boys?
#solution([
$13 / 27$, which notably isn't $1/2$.
#v(2mm)
Draw a $14 times 14$ square, highlight the possible cases, and you'll see it. \
#v(2mm)
Order is very important in this problem. \
If we knew that the _first_ child was a boy born on Tuesday,
the probability of two boys would be $1/2$. \
Also consider a smaller case where a week has two days.
])

View File

@ -1,6 +0,0 @@
[metadata]
title = "Tuesday"
[publish]
handout = true
solutions = true

View File

@ -0,0 +1,43 @@
\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}

View File

@ -1,74 +0,0 @@
#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
}),
)

View File

@ -0,0 +1,66 @@
\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}

View File

@ -1,47 +0,0 @@
#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)

View File

@ -0,0 +1,150 @@
\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}

View File

@ -1,125 +0,0 @@
#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)

22
src/Warm-Ups/fmod/main.tex Executable file
View File

@ -0,0 +1,22 @@
\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}

View File

@ -1,10 +0,0 @@
#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).