diff options
Diffstat (limited to 'public/posts/2022-04-09')
| -rw-r--r-- | public/posts/2022-04-09/phperkaigi-2022-tokens/index.html | 80 |
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>&&</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> |
