aboutsummaryrefslogtreecommitdiffhomepage
path: root/public/posts/2022-04-09
diff options
context:
space:
mode:
Diffstat (limited to 'public/posts/2022-04-09')
-rw-r--r--public/posts/2022-04-09/phperkaigi-2022-tokens/index.html80
1 files changed, 40 insertions, 40 deletions
diff --git a/public/posts/2022-04-09/phperkaigi-2022-tokens/index.html b/public/posts/2022-04-09/phperkaigi-2022-tokens/index.html
index d834bb8..518e744 100644
--- a/public/posts/2022-04-09/phperkaigi-2022-tokens/index.html
+++ b/public/posts/2022-04-09/phperkaigi-2022-tokens/index.html
@@ -73,8 +73,8 @@
</p>
</section>
- <section id="section--_第1問_brainf_ck_php">
- <h2><a href="#section--_第1問_brainf_ck_php">第1問 brainf_ck.php</a></h2>
+ <section id="section--q1-brainfuck">
+ <h2><a href="#section--q1-brainfuck">第1問 brainf_ck.php</a></h2>
<p>
ソースコードはこちら。実行には PHP 8.1 以上が必要なので注意。
</p>
@@ -153,17 +153,17 @@ $🐘([
この問題は、単に適切なバージョンの PHP で動かせばトークンが得られる。
</p>
- <section id="section--_解説">
- <h3><a href="#section--_解説">解説</a></h3>
- <section id="section--_絵文字">
- <h4><a href="#section--_絵文字">絵文字</a></h4>
+ <section id="section--q1-brainfuck--commentary">
+ <h3><a href="#section--q1-brainfuck--commentary">解説</a></h3>
+ <section id="section--q1-brainfuck--commentary--emoji">
+ <h4><a href="#section--q1-brainfuck--commentary--emoji">絵文字</a></h4>
<p>
まず目につくのは大量の絵文字だろう。 PHP は識別子に使用できる文字の範囲が広く、絵文字も使うことができる。
</p>
</section>
- <section id="section--_プログラム全体">
- <h4><a href="#section--_プログラム全体">プログラム全体</a></h4>
+ <section id="section--q1-brainfuck--commentary--brainfuck">
+ <h4><a href="#section--q1-brainfuck--commentary--brainfuck">プログラム全体</a></h4>
<p>
Brainf*ck のインタプリタとプログラムになっている。 Brainf*ck とは、難解プログラミング言語のひとつであり、ここで説明するよりも Wikipedia の該当ページを読んだ方がよい。
</p>
@@ -246,22 +246,22 @@ $🐘([
</p>
</section>
- <section id="section--_絵文字の選択">
- <h4><a href="#section--_絵文字の選択">絵文字の選択</a></h4>
+ <section id="section--q1-brainfuck--commentary--emoji-selection">
+ <h4><a href="#section--q1-brainfuck--commentary--emoji-selection">絵文字の選択</a></h4>
<p>
おおよそ意味に合致するよう選んでいるが、<code>$🤡</code> と <code>$🎪</code> は弊社デジタルサーカスにちなんでいる。 また、<code>$🐘</code> は PHP のマスコットの象に由来する。
</p>
</section>
- <section id="section--_strict_types">
- <h4><a href="#section--_strict_types">strict_types</a></h4>
+ <section id="section--q1-brainfuck--commentary--strict-types">
+ <h4><a href="#section--q1-brainfuck--commentary--strict-types">strict_types</a></h4>
<p>
<code>declare</code> 文の <code>strict_types</code> に指定できるのは、<code>0</code> か <code>1</code> の数値リテラルだが、 <code>0x0</code> や <code>0b1</code> のような値も受け付ける。 今回は、PHP 8.1 から追加された、<code>0O</code> または <code>0o</code> から始まる八進数リテラルを使った。
</p>
</section>
- <section id="section--_url">
- <h4><a href="#section--_url">URL</a></h4>
+ <section id="section--q1-brainfuck--commentary--url">
+ <h4><a href="#section--q1-brainfuck--commentary--url">URL</a></h4>
<p>
ソースコードのライセンスを示したこの部分だが、
</p>
@@ -273,8 +273,8 @@ $🐘([
</p>
</section>
- <section id="section--_リテラルなしで数値を生成する">
- <h4><a href="#section--_リテラルなしで数値を生成する">リテラルなしで数値を生成する</a></h4>
+ <section id="section--q1-brainfuck--commentary--numbers">
+ <h4><a href="#section--q1-brainfuck--commentary--numbers">リテラルなしで数値を生成する</a></h4>
<p>
ソースコード中に、ほとんど数値リテラルが書かれていないことにお気づきだろうか。 PHP では、型変換を利用することで任意の整数を作り出すことができる。
</p>
@@ -294,15 +294,15 @@ $🐘([
</p>
</section>
- <section id="section--_if_文なしで条件分岐">
- <h4><a href="#section--_if_文なしで条件分岐"><code>if</code> 文なしで条件分岐</a></h4>
+ <section id="section--q1-brainfuck--commentary--conditionals">
+ <h4><a href="#section--q1-brainfuck--commentary--conditionals"><code>if</code> 文なしで条件分岐</a></h4>
<p>
三項演算子ないし <code>match</code> 式を使うことで、<code>if</code> を一切書かずに条件分岐ができる。 また、<code>&amp;&amp;</code> / <code>||</code> も使えることがある。 遅延評価が不要なケースでは、<code>[$t, $f][$cond]</code> のような形で分岐することもできる。
</p>
</section>
- <section id="section--_whilefor_文なしでループ">
- <h4><a href="#section--_whilefor_文なしでループ"><code>while</code>、<code>for</code> 文なしでループ</a></h4>
+ <section id="section--q1-brainfuck--commentary--loops">
+ <h4><a href="#section--q1-brainfuck--commentary--loops"><code>while</code>、<code>for</code> 文なしでループ</a></h4>
<p>
不動点コンビネータを使って無名再帰する (詳しい説明は省略する。これらの単語で検索してほしい)。 ここでは、一般に Z コンビネータとして知られるものを使った (<code>$z</code>)。
</p>
@@ -318,8 +318,8 @@ $🐘([
</section>
</section>
- <section id="section--_第2問_riddle_php">
- <h2><a href="#section--_第2問_riddle_php">第2問 riddle.php</a></h2>
+ <section id="section--q2-riddle">
+ <h2><a href="#section--q2-riddle">第2問 riddle.php</a></h2>
<p>
ソースコードはこちら。実行には PHP 8.0 以上が必要なので注意。
</p>
@@ -367,8 +367,8 @@ $🐘([
ここでは、私の想定解を解説する。
</p>
- <section id="section--_読解">
- <h3><a href="#section--_読解">読解</a></h3>
+ <section id="section--q2-riddle--code-reading">
+ <h3><a href="#section--q2-riddle--code-reading">読解</a></h3>
<p>
まずはソースコードを読んでいく。
</p>
@@ -406,8 +406,8 @@ $🐘([
</p>
</section>
- <section id="section--_ヒント">
- <h3><a href="#section--_ヒント">ヒント</a></h3>
+ <section id="section--q2-riddle--hint">
+ <h3><a href="#section--q2-riddle--hint">ヒント</a></h3>
<p>
次に、ソースコードに書いてあるヒントを読んでいく。
</p>
@@ -435,8 +435,8 @@ $🐘([
</p>
</section>
- <section id="section--_解く">
- <h3><a href="#section--_解く">解く</a></h3>
+ <section id="section--q2-riddle--solve">
+ <h3><a href="#section--q2-riddle--solve">解く</a></h3>
<p>
ここまでわかれば、あと一歩で解ける。すなわち、<code>0x14B499C</code> が <code>#</code> に変換されるような <code>N</code> を見つければよい。
</p>
@@ -495,8 +495,8 @@ $🐘([
</section>
</section>
- <section id="section--_第3問_toquine_php">
- <h2><a href="#section--_第3問_toquine_php">第3問 toquine.php</a></h2>
+ <section id="section--q3-toquine">
+ <h2><a href="#section--q3-toquine">第3問 toquine.php</a></h2>
<p>
ソースコードはこちら。
</p>
@@ -541,10 +541,10 @@ Q;
実際にはもう少しパイプで繋げなければならない。
</p>
- <section id="section--_解説_2">
- <h3><a href="#section--_解説_2">解説</a></h3>
- <section id="section--_プログラム全体_2">
- <h4><a href="#section--_プログラム全体_2">プログラム全体</a></h4>
+ <section id="section--q3-toquine--commentary">
+ <h3><a href="#section--q3-toquine--commentary">解説</a></h3>
+ <section id="section--q3-toquine--commentary--quine">
+ <h4><a href="#section--q3-toquine--commentary--quine">プログラム全体</a></h4>
<p>
コメントにもあるとおり、これは quine (風) のプログラムになっている。 Quine とは、自分のソースコードをそっくりそのまま出力するようなプログラムのことである。
</p>
@@ -554,22 +554,22 @@ Q;
</p>
</section>
- <section id="section--_トークン">
- <h4><a href="#section--_トークン">トークン</a></h4>
+ <section id="section--q3-toquine--commentary--tokens">
+ <h4><a href="#section--q3-toquine--commentary--tokens">トークン</a></h4>
<p>
<code>$xs</code> がトークンに対応している。変換のロジックは <code>riddle.php</code> とほぼ同じなので省略する。
</p>
</section>
- <section id="section--_状態保持">
- <h4><a href="#section--_状態保持">状態保持</a></h4>
+ <section id="section--q3-toquine--commentary--states">
+ <h4><a href="#section--q3-toquine--commentary--states">状態保持</a></h4>
<p>
トークンの何文字目まで出力したかを、ソースコードを変えずに (quine なので) 覚えておく必要がある。 このプログラムでは、トークンが出力されるとソースコードがだんだんと長くなっていくのを利用して、<code><em>LINE</em></code> から情報を取得している。
</p>
</section>
- <section id="section--_rot_13">
- <h4><a href="#section--_rot_13">ROT 13</a></h4>
+ <section id="section--q3-toquine--commentary--rot-13">
+ <h4><a href="#section--q3-toquine--commentary--rot-13">ROT 13</a></h4>
<p>
Quine は、素朴に書くとプログラムの一部が 2回記述されてしまう。 これがあまり美しくないので、<code>toquine.php</code> では、ROT 13 変換を使って難読化した。
</p>