執筆者: ごま
最終更新: 2025/04/26
おひさしぶりです、ごまです。 この記事ではRust製の組版システムであるTypstを使ってFizzBuzzを実装してみます。 Typstって?という方は以前私が書いたこちらの記事を読んでいただけると概略がつかめるかもしれません。
FizzBuzzとは、プログラミングの基礎的な練習問題の1つで、次のようなルールに従って数列を出力する課題です。
【ルール】 1から順に整数を出力していくが、
3の倍数のときは数の代わりに "Fi zz" を出力
5の倍数のときは数の代わりに "Buzz" を出力
3と5の両方の倍数(=15の倍数)のときは "FizzBuzz" を出力
それ以外の数はそのまま出力
今回はこのような挙動をTypstで実装してみます。
今回はtypst 0.13.1
を使用します。
今回主に使用するTypstの機能は
for
文calc
モジュールです。
Typstではfor
文を用いて配列や文字などを反復処理することができます。
#for i in (1, 2, 3, 4, 5) {
[#i ]
}
このようにfor文を使用すると次のように表示されます。見やすさのために若干スペースを空けています。
数字で構成される配列を準備するには、次のようなrange
関数を使用することもできます。
#range(5)\
#range(1, 7)\
#range(2, step: 3, 20)
このようにすると、次のように表示されます。
range
関数は、指定した範囲の整数を生成するための便利な関数です。ほとんどPythonなどと同じような使い方ができるので、特に難しいことはないと思います。
Typstではif
文を用いて条件分岐を行うことができます。
#let x = 3
#let y = 5
#if x == y {
"xとyは等しい"
} else if x < y {
"xはyより小さい"
} else {
"xはyより大きい"
}
このようにすると、次のように表示されます。
こちらもクセのない記法なのでかなり書きやすい印象です。
Typstではcalc
モジュールを用いて数値の計算と処理を行うことができます。
絶対値や平方根などはもちろん、逆三角関数のような関数の計算までできるようですが、ここでは除算における余りを求めるrem
関数を使用します。rem(x,y)
の形で使用すると、x
をy
で割った余り(符号はx
に従う)を返します。
#let x = 10
#let y = 3
#let z = calc.rem(x, y)
xをyで割った余りは#z です。
このようにすると、次のように表示されます。
これとif文を組み合わせるとx
がy
で割り切れるかどうかを判定することができます。
#let x = 10
#let y = 3
#if calc.rem(x, y) == 0 {
"xはyで割り切れる"
} else {
"xはyで割り切れない"
}
このようにすると、次のように表示されます。
これらの機能を組み合わせてFizzBuzzを実装していきます。
#for i in range(1, 101) {
if ((calc.rem(i, 3) == 0) and (calc.rem(i, 5) == 0 )){
[FizzBuzz#h(1em)]
} else if calc.rem(i, 3) == 0 {
[Fizz#h(1em)]
} else if calc.rem(i, 5) == 0 {
[Buzz#h(1em)]
} else {
[#i#h(1em)]
}
}
このようにすると、次のように表示されます。
これだけです。簡単ですね。
Q. えっ.......それだけ?
A. これだけです。
この記事がクソ記事である所以がこれです
組版システムでFizzBuzzを実装するということでもっと時間がかかるかと思いきや、Typst側の機能が強力だったためほとんど一瞬で終わってしまいました...。何か誤りなどがあれば教えていただけると幸いです。 また、今回作成したコードはGitHubのリポジトリに置いてあるので、興味のある方はぜひご覧ください。
この人が書いた記事