Update cetz & ci

This commit is contained in:
2025-09-23 23:29:06 -07:00
parent 121780df6c
commit e5b0053465
17 changed files with 393 additions and 483 deletions

View File

@ -26,7 +26,7 @@ jobs:
- name: "Download Typstyle" - name: "Download Typstyle"
run: | run: |
wget -q "https://github.com/Enter-tainer/typstyle/releases/download/v0.12.14/typstyle-x86_64-unknown-linux-musl" wget -q "https://github.com/Enter-tainer/typstyle/releases/download/v0.13.17/typstyle-x86_64-unknown-linux-musl"
chmod +x typstyle-x86_64-unknown-linux-musl chmod +x typstyle-x86_64-unknown-linux-musl
- name: Check typst formatting - name: Check typst formatting
@ -62,7 +62,7 @@ jobs:
# more control anyway. # more control anyway.
- name: "Download Typst" - name: "Download Typst"
run: | run: |
wget -q "https://github.com/typst/typst/releases/download/v0.12.0/typst-x86_64-unknown-linux-musl.tar.xz" wget -q "https://github.com/typst/typst/releases/download/v0.13.1/typst-x86_64-unknown-linux-musl.tar.xz"
tar -xf "typst-x86_64-unknown-linux-musl.tar.xz" tar -xf "typst-x86_64-unknown-linux-musl.tar.xz"
mv "typst-x86_64-unknown-linux-musl/typst" . mv "typst-x86_64-unknown-linux-musl/typst" .
rm "typst-x86_64-unknown-linux-musl.tar.xz" rm "typst-x86_64-unknown-linux-musl.tar.xz"

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
= Floats = Floats
#definition() #definition()
@ -33,11 +33,7 @@ Another way we can interpret a bit string is as a _signed floating-point decimal
Floats represent a subset of the real numbers, and are interpreted as follows: \ Floats represent a subset of the real numbers, and are interpreted as follows: \
#note([The following only applies to floats that consist of 32 bits. We won't encounter any others today.]) #note([The following only applies to floats that consist of 32 bits. We won't encounter any others today.])
#align( #align(center, box(inset: 2mm, cetz.canvas({
center,
box(
inset: 2mm,
cetz.canvas({
import cetz.draw: * import cetz.draw: *
let chars = ( let chars = (
@ -96,9 +92,7 @@ Floats represent a subset of the real numbers, and are interpreted as follows: \
line((3.10, y), (9.4, y)) line((3.10, y), (9.4, y))
content((6.3, y - 0.2), [fraction]) content((6.3, y - 0.2), [fraction])
}), })))
),
)
- The first bit denotes the sign of the float's value - The first bit denotes the sign of the float's value
We'll label it $s$. \ We'll label it $s$. \

View File

@ -1,6 +1,6 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
#import "@preview/cetz-plot:0.1.0": plot, chart #import "@preview/cetz-plot:0.1.2": chart, plot
= Integers and Floats = Integers and Floats
@ -44,19 +44,11 @@ This allows us to improve the average error of our linear approximation:
{ {
let domain = (0, 1) let domain = (0, 1)
plot.add( plot.add(f1, domain: domain, label: $log(1+x)$, style: (
f1, stroke: ogrape,
domain: domain, ))
label: $log(1+x)$,
style: (stroke: ogrape),
)
plot.add( plot.add(f2, domain: domain, label: $x$, style: (stroke: oblue))
f2,
domain: domain,
label: $x$,
style: (stroke: oblue),
)
}, },
) )
}) })
@ -90,19 +82,11 @@ This allows us to improve the average error of our linear approximation:
{ {
let domain = (0, 1) let domain = (0, 1)
plot.add( plot.add(f1, domain: domain, label: $log(1+x)$, style: (
f1, stroke: ogrape,
domain: domain, ))
label: $log(1+x)$,
style: (stroke: ogrape),
)
plot.add( plot.add(f2, domain: domain, label: $x$, style: (stroke: oblue))
f2,
domain: domain,
label: $x$,
style: (stroke: oblue),
)
}, },
) )
}) })
@ -120,16 +104,13 @@ We won't bother with this---we'll simply leave the correction term as an opaque
#v(1fr) #v(1fr)
#note( #note(type: "Note", [
type: "Note",
[
"Average error" above is simply the area of the region between the two graphs: "Average error" above is simply the area of the region between the two graphs:
$ $
integral_0^1 abs(#v(1mm) log(1+x)_2 - (x+epsilon) #v(1mm)) integral_0^1 abs(#v(1mm) log(1+x)_2 - (x+epsilon) #v(1mm))
$ $
Feel free to ignore this note, it isn't a critical part of this handout. Feel free to ignore this note, it isn't a critical part of this handout.
], ])
)
#pagebreak() #pagebreak()
@ -149,8 +130,7 @@ $
Let $E$ and $F$ be the exponent and float bits of $x_f$. \ Let $E$ and $F$ be the exponent and float bits of $x_f$. \
We then have: We then have:
$ $
log_2(x_f) log_2(x_f) & = log_2 ( 2^(E-127) times (1 + (F) / (2^23)) ) \
&= log_2 ( 2^(E-127) times (1 + (F) / (2^23)) ) \
& = E - 127 + log_2(1 + F / (2^23)) \ & = E - 127 + log_2(1 + F / (2^23)) \
& approx E-127 + F / (2^23) + epsilon \ & approx E-127 + F / (2^23) + epsilon \
& = 1 / (2^23)(2^23 E + F) - 127 + epsilon \ & = 1 / (2^23)(2^23 E + F) - 127 + epsilon \

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
// Shorthand, we'll be using these a lot. // Shorthand, we'll be using these a lot.
@ -7,17 +7,15 @@
#let tm = sym.times.circle #let tm = sym.times.circle
#let graphgrid(inner_content) = { #let graphgrid(inner_content) = {
align( align(center, box(inset: 3mm, cetz.canvas({
center,
box(
inset: 3mm,
cetz.canvas({
import cetz.draw: * import cetz.draw: *
let x = 5.25 let x = 5.25
grid( grid(
(0, 0), (x, x), step: 0.75, (0, 0),
stroke: luma(100) + 0.3mm (x, x),
step: 0.75,
stroke: luma(100) + 0.3mm,
) )
if (inner_content != none) { if (inner_content != none) {
@ -33,9 +31,7 @@
(x + 0.25, 0), (x + 0.25, 0),
stroke: 0.75mm + black, stroke: 0.75mm + black,
) )
}), })))
),
)
} }
/// Adds extra padding to an equation. /// Adds extra padding to an equation.
@ -48,23 +44,16 @@
/// Note that there are newlines between the $ and content, /// Note that there are newlines between the $ and content,
/// this gives us display math (which is what we want when using this macro) /// this gives us display math (which is what we want when using this macro)
#let eqnbox(eqn) = { #let eqnbox(eqn) = {
align( align(center, box(
center,
box(
inset: 3mm, inset: 3mm,
eqn, eqn,
), ))
)
} }
#let dotline(a, b) = { #let dotline(a, b) = {
cetz.draw.line( cetz.draw.line(a, b, stroke: (
a,
b,
stroke: (
dash: "dashed", dash: "dashed",
thickness: 0.5mm, thickness: 0.5mm,
paint: ored, paint: ored,
), ))
)
} }

View File

@ -1,21 +1,18 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "../macros.typ": * #import "../macros.typ": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
= Tropical Polynomials = Tropical Polynomials
#definition() #definition()
A _polynomial_ is an expression formed by adding and multiplying numbers and a variable $x$. \ A _polynomial_ is an expression formed by adding and multiplying numbers and a variable $x$. \
Every polynomial can be written as Every polynomial can be written as
#align( #align(center, box(
center,
box(
inset: 3mm, inset: 3mm,
$ $
c_0 + c_1 x + c_2 x^2 + ... + c_n x^n c_0 + c_1 x + c_2 x^2 + ... + c_n x^n
$, $,
), ))
)
for some nonnegative integer $n$ and coefficients $c_0, c_1, ..., c_n$. \ for some nonnegative integer $n$ and coefficients $c_0, c_1, ..., c_n$. \
The _degree_ of a polynomial is the largest $n$ for which $c_n$ is nonzero. The _degree_ of a polynomial is the largest $n$ for which $c_n$ is nonzero.
@ -43,15 +40,12 @@ In this section, we will analyze tropical polynomials:
#definition() #definition()
A _tropical_ polynomial is a polynomial that uses tropical addition and multiplication. \ A _tropical_ polynomial is a polynomial that uses tropical addition and multiplication. \
In other words, it is an expression of the form In other words, it is an expression of the form
#align( #align(center, box(
center,
box(
inset: 3mm, inset: 3mm,
$ $
c_0 #tp (c_1 #tm x) #tp (c_2 #tm x^2) #tp ... #tp (c_n #tm x^n) c_0 #tp (c_1 #tm x) #tp (c_2 #tm x^2) #tp ... #tp (c_n #tm x^n)
$, $,
), ))
)
where all exponents represent repeated tropical multiplication. where all exponents represent repeated tropical multiplication.
#pagebreak() // MARK: page #pagebreak() // MARK: page
@ -90,15 +84,12 @@ Draw a graph of the tropical polynomial $f(x) = x^2 #tp 1x #tp 4$. \
#problem() #problem()
Now, factor $f(x) = x^2 #tp 1x #tp 4$ into two polynomials with degree 1. \ Now, factor $f(x) = x^2 #tp 1x #tp 4$ into two polynomials with degree 1. \
In other words, find $r$ and $s$ so that In other words, find $r$ and $s$ so that
#align( #align(center, box(
center,
box(
inset: 3mm, inset: 3mm,
$ $
x^2 #tp 1x #tp 4 = (x #tp r)(x #tp s) x^2 #tp 1x #tp 4 = (x #tp r)(x #tp s)
$, $,
), ))
)
we will call $r$ and $s$ the _roots_ of $f$. we will call $r$ and $s$ the _roots_ of $f$.
@ -159,15 +150,19 @@ Find a factorization of $f$ in the form $a(x #tp r)(x#tp s)$.
#solution([ #solution([
We (tropically) factor out $-2$ to get We (tropically) factor out $-2$ to get
#eqnbox($ #eqnbox(
$
f(x) = -2(x^2 #tp 2x #tp 10) f(x) = -2(x^2 #tp 2x #tp 10)
$) $,
)
by the same process as the previous problem, we get by the same process as the previous problem, we get
#eqnbox($ #eqnbox(
$
f(x) = -2(x #tp 2)(x #tp 8) f(x) = -2(x #tp 2)(x #tp 8)
$) $,
)
]) ])
#v(1fr) #v(1fr)
@ -236,11 +231,11 @@ Graph $f(x) = 1x^2 #tp 3x #tp 5$.
#problem() #problem()
Find a factorization of $f$ in the form $a(x #tp r)(x#tp s)$. Find a factorization of $f$ in the form $a(x #tp r)(x#tp s)$.
#solution( #solution(eqnbox(
eqnbox($ $
f(x) = 1x^2 #tp 3 x #tp 5 = 1(x #tp 2)^2 f(x) = 1x^2 #tp 3 x #tp 5 = 1(x #tp 2)^2
$), $,
) ))
#v(1fr) #v(1fr)
@ -263,8 +258,7 @@ Graph $f(x) = 2x^2 #tp 4x #tp 4$.
#if_no_solutions(graphgrid(none)) #if_no_solutions(graphgrid(none))
#solution( #solution(graphgrid({
graphgrid({
import cetz.draw: * import cetz.draw: *
let step = 0.75 let step = 0.75
@ -278,8 +272,7 @@ Graph $f(x) = 2x^2 #tp 4x #tp 4$.
(7.5 * step, 4 * step), (7.5 * step, 4 * step),
stroke: 1mm + oblue, stroke: 1mm + oblue,
) )
}), }))
)
#problem() #problem()
@ -341,8 +334,7 @@ Find a formula for $B$ in terms of $a$, $b$, and $c$. \
*Case 2:* If $b > (a + c #sym.div) 2$, then *Case 2:* If $b > (a + c #sym.div) 2$, then
$ $
accent(f, macron)(x) accent(f, macron)(x) & = a x^2 #tp ((a+c)/2)x #tp c \
&= a x^2 #tp ((a+c)/2)x #tp c \
& = a(x #tp (c-a)/2)^2 & = a(x #tp (c-a)/2)^2
$ $
has the same graph as $f$, and thus $B = (a+c) #sym.div 2$ has the same graph as $f$, and thus $B = (a+c) #sym.div 2$

View File

@ -1,6 +1,6 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "../macros.typ": * #import "../macros.typ": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
= Tropical Cubic Polynomials = Tropical Cubic Polynomials
@ -131,15 +131,12 @@ Using the last three problems, find formulas for $B$ and $C$ in terms of $a$, $b
#problem() #problem()
What are the roots of the following polynomial? What are the roots of the following polynomial?
#align( #align(center, box(
center,
box(
inset: 3mm, inset: 3mm,
$ $
3 x^6 #tp 4 x^5 #tp 2 x^4 #tp x^3 #tp x^2 #tp 4 x #tp 5 3 x^6 #tp 4 x^5 #tp 2 x^4 #tp x^3 #tp x^2 #tp 4 x #tp 5
$, $,
), ))
)
#solution([ #solution([
We have We have
@ -169,8 +166,7 @@ Find a formula for each $C_i$ in terms of $c_0, c_1, ..., c_n$.
#solution([ #solution([
$ $
A_j A_j & = min_(l<=j<k)( (a_l - a_k) / (k-l) (k-j) + a_k ) \
&= min_(l<=j<k)( (a_l - a_k) / (k-l) (k-j) + a_k ) \
& = min_(l<=j<k)( a_l (k-j) / (k-l) + a_k (j-l) / (k-l) ) & = min_(l<=j<k)( a_l (k-j) / (k-l) + a_k (j-l) / (k-l) )
$ $

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
= Wallpaper Symmetries = Wallpaper Symmetries

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
= Mirror Symmetry = Mirror Symmetry

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
= Rotational Symmetry = Rotational Symmetry

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
#let pat(img, sol) = { #let pat(img, sol) = {
problem() problem()

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
= The Signature-Cost Theorem = The Signature-Cost Theorem
@ -7,9 +7,7 @@
First, we'll associate a _cost_ to each type of symmetry in orbifold notation: First, we'll associate a _cost_ to each type of symmetry in orbifold notation:
#v(4mm) #v(4mm)
#align( #align(center, table(
center,
table(
stroke: (1pt, 1pt), stroke: (1pt, 1pt),
align: center, align: center,
columns: (auto, auto, auto, auto), columns: (auto, auto, auto, auto),
@ -22,8 +20,7 @@ First, we'll associate a _cost_ to each type of symmetry in orbifold notation:
[$(n-1) / n$], [$(n-1) / n$],
[#sym.convolve`n`], [#sym.convolve`n`],
[$(n-1) / (2n)$], [$(n-1) / (2n)$],
), ))
)
We then calculate the total "cost" of a signature by adding up the costs of each component. We then calculate the total "cost" of a signature by adding up the costs of each component.

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
#show: handout.with( #show: handout.with(
title: [Warm-Up: Big-Tac-Toe], title: [Warm-Up: Big-Tac-Toe],
@ -75,9 +75,7 @@ How does your strategy change? \
#if extra_boards { #if extra_boards {
pagebreak() pagebreak()
align( align(center, grid(
center,
grid(
stroke: none, stroke: none,
align: center, align: center,
columns: (1fr, 1fr), columns: (1fr, 1fr),
@ -85,6 +83,5 @@ How does your strategy change? \
btt(0.35), btt(0.35), btt(0.35), btt(0.35),
btt(0.35), btt(0.35), btt(0.35), btt(0.35),
btt(0.35), btt(0.35), btt(0.35), btt(0.35),
), ))
)
} }

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
#show: handout.with( #show: handout.with(
@ -43,10 +43,7 @@ Now, consider the set of six-sided dice below:
- Die $E$: $0, 5, 5, 5, 5, 5$ - Die $E$: $0, 5, 5, 5, 5, 5$
On average, which die beats each of the others? Draw a diagram. On average, which die beats each of the others? Draw a diagram.
#solution( #solution(align(center, cetz.canvas({
align(
center,
cetz.canvas({
import cetz.draw: * import cetz.draw: *
let s = 0.8 // Scale let s = 0.8 // Scale
@ -95,9 +92,7 @@ On average, which die beats each of the others? Draw a diagram.
content(c, text(fill: white, size: t, [*C*])) content(c, text(fill: white, size: t, [*C*]))
content(d, text(fill: white, size: t, [*D*])) content(d, text(fill: white, size: t, [*D*]))
content(e, text(fill: white, size: t, [*E*])) content(e, text(fill: white, size: t, [*E*]))
}), })))
),
)
#v(1fr) #v(1fr)

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
#show: handout.with( #show: handout.with(
title: [Warm-Up: What's an AST?], title: [Warm-Up: What's an AST?],
@ -18,9 +18,7 @@ You may detach the string as you hang the painting, but it must be re-attached o
#v(2mm) #v(2mm)
#align( #align(center, cetz.canvas({
center,
cetz.canvas({
import cetz.draw: * import cetz.draw: *
let s = 2.5 let s = 2.5
@ -69,8 +67,7 @@ You may detach the string as you hang the painting, but it must be re-attached o
) )
circle((0.66 * s, 0.66 * s), radius: 0.07 * s, fill: white) circle((0.66 * s, 0.66 * s), radius: 0.07 * s, fill: white)
}), }))
)
#solution([ #solution([
Say we have a left nail and a right nail. The path of the string is as follows: Say we have a left nail and a right nail. The path of the string is as follows:

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
#show: handout.with( #show: handout.with(
title: [Warm-Up: Passing Balls], title: [Warm-Up: Passing Balls],
@ -78,10 +78,7 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
let i = 1 let i = 1
for p in pts { for p in pts {
circle( circle(p, radius: radius * s, fill: if i == 1 {
p,
radius: radius * s,
fill: if i == 1 {
ored ored
} else if i == 2 { } else if i == 2 {
ogreen ogreen
@ -89,12 +86,9 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
oorange oorange
} else if i == 4 { } else if i == 4 {
oblue oblue
} else { white }, } else { white })
)
content( content(p, text(
p,
text(
fill: if i <= 4 { fill: if i <= 4 {
white white
} else { } else {
@ -102,8 +96,7 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
}, },
size: t, size: t,
[*#i*], [*#i*],
), ))
)
i = i + 1 i = i + 1
} }
}), }),
@ -118,10 +111,7 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
let l = calc.rem(((i - 1) * 5), 12) + 1 let l = calc.rem(((i - 1) * 5), 12) + 1
circle( circle(p, radius: radius * s, fill: if l == 1 {
p,
radius: radius * s,
fill: if l == 1 {
ored ored
} else if l == 2 { } else if l == 2 {
ogreen ogreen
@ -129,12 +119,9 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
oorange oorange
} else if l == 4 { } else if l == 4 {
oblue oblue
} else { white }, } else { white })
)
content( content(p, text(
p,
text(
fill: if l <= 4 { fill: if l <= 4 {
white white
} else { } else {
@ -142,8 +129,7 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
}, },
size: t, size: t,
[*#l*], [*#l*],
), ))
)
i = i + 1 i = i + 1
} }
}), }),
@ -158,10 +144,7 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
let l = calc.rem(((i - 1) * 5), 12) + 1 let l = calc.rem(((i - 1) * 5), 12) + 1
circle( circle(p, radius: radius * s, fill: if l == 1 {
p,
radius: radius * s,
fill: if l == 1 {
oblue oblue
} else if l == 2 { } else if l == 2 {
oorange oorange
@ -169,12 +152,9 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
ored ored
} else if l == 4 { } else if l == 4 {
ogreen ogreen
} else { white }, } else { white })
)
content( content(p, text(
p,
text(
fill: if l <= 4 { fill: if l <= 4 {
white white
} else { } else {
@ -182,8 +162,7 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
}, },
size: t, size: t,
[*#l*], [*#l*],
), ))
)
i = i + 1 i = i + 1
} }
}), }),

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
#show: handout.with( #show: handout.with(
title: [Warm-Up: What's an AST?], title: [Warm-Up: What's an AST?],
@ -24,9 +24,7 @@ respecting the order of operations $[and, times, div, +, -]$.
#v(2mm) #v(2mm)
#align( #align(center, cetz.canvas({
center,
cetz.canvas({
import cetz.draw: * import cetz.draw: *
// spell:off // spell:off
@ -70,5 +68,4 @@ respecting the order of operations $[and, times, div, +, -]$.
line("bb", "bba") line("bb", "bba")
line("bb", "bbb") line("bb", "bbb")
// spell:on // spell:on
}), }))
)

View File

@ -1,14 +1,12 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
#show: handout.with( #show: handout.with(
title: [Warm-Up: Wild Tic-Tac-Toe], title: [Warm-Up: Wild Tic-Tac-Toe],
by: "Mark", by: "Mark",
) )
#let ttt = align( #let ttt = align(center, cetz.canvas({
center,
cetz.canvas({
import cetz.draw: * import cetz.draw: *
let s = 0.7 // scale let s = 0.7 // scale
@ -17,8 +15,7 @@
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))
line((3 * s, 1 * s), (-3 * s, 1 * s)) line((3 * s, 1 * s), (-3 * s, 1 * s))
}), }))
)
#problem() #problem()