From db3d51ddc421dad68abddb95d01ffdab440197d6 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 19 Mar 2023 03:24:43 +0900 Subject: feat(content): specify heading id --- .../posts/2022-04-09/phperkaigi-2022-tokens.xml | 40 +++++++++++----------- 1 file changed, 20 insertions(+), 20 deletions(-) (limited to 'content/posts/2022-04-09') diff --git a/content/posts/2022-04-09/phperkaigi-2022-tokens.xml b/content/posts/2022-04-09/phperkaigi-2022-tokens.xml index e3d9c45..352eba0 100644 --- a/content/posts/2022-04-09/phperkaigi-2022-tokens.xml +++ b/content/posts/2022-04-09/phperkaigi-2022-tokens.xml @@ -33,7 +33,7 @@ リポジトリはこちら: https://github.com/nsfisis/PHPerKaigi2022-tokens -
+
第1問 brainf_ck.php ソースコードはこちら。実行には PHP 8.1 以上が必要なので注意。 @@ -114,16 +114,16 @@ この問題は、単に適切なバージョンの PHP で動かせばトークンが得られる。 -
+
解説 -
+
絵文字 まず目につくのは大量の絵文字だろう。 PHP は識別子に使用できる文字の範囲が広く、絵文字も使うことができる。
-
+
プログラム全体 Brainf*ck のインタプリタとプログラムになっている。 Brainf*ck @@ -185,7 +185,7 @@ なお、$🐘 はいわゆる main 関数であり、プログラムの実行部分である。
-
+
絵文字の選択 おおよそ意味に合致するよう選んでいるが、$🤡$🎪 @@ -193,7 +193,7 @@ のマスコットの象に由来する。
-
+
strict_types declare 文の strict_types に指定できるのは、01 @@ -201,7 +201,7 @@ 8.1 から追加された、0O または 0o から始まる八進数リテラルを使った。
-
+
URL ソースコードのライセンスを示したこの部分だが、 @@ -216,7 +216,7 @@ 以降は行コメントになっている。
-
+
リテラルなしで数値を生成する ソースコード中に、ほとんど数値リテラルが書かれていないことにお気づきだろうか。 @@ -245,7 +245,7 @@ にし、さらにビット反転して -1 にしている。
-
+
<literal>if</literal> 文なしで条件分岐 三項演算子ないし match 式を使うことで、if @@ -254,7 +254,7 @@ のような形で分岐することもできる。
-
+
<literal>while</literal>、<literal>for</literal> 文なしでループ 不動点コンビネータを使って無名再帰する @@ -273,7 +273,7 @@
-
+
第2問 riddle.php ソースコードはこちら。実行には PHP 8.0 以上が必要なので注意。 @@ -324,7 +324,7 @@ ここでは、私の想定解を解説する。 -
+
読解 まずはソースコードを読んでいく。 @@ -372,7 +372,7 @@ 5文字ごとに区切ったあと、改行で結合している。
-
+
ヒント 次に、ソースコードに書いてあるヒントを読んでいく。 @@ -390,7 +390,7 @@ ファイルに追加ヒントとして書かれている)。
-
+
解く ここまでわかれば、あと一歩で解ける。すなわち、0x14B499C# @@ -455,7 +455,7 @@
-
+
第3問 toquine.php ソースコードはこちら。 @@ -504,9 +504,9 @@ 実際にはもう少しパイプで繋げなければならない。 -
+
解説 -
+
プログラム全体 コメントにもあるとおり、これは quine (風) のプログラムになっている。 @@ -518,14 +518,14 @@ 異なるのはトークンになっている部分のみである。
-
+
トークン $xs がトークンに対応している。変換のロジックは riddle.php とほぼ同じなので省略する。
-
+
状態保持 トークンの何文字目まで出力したかを、ソースコードを変えずに (quine @@ -534,7 +534,7 @@ から情報を取得している。
-
+
ROT 13 Quine は、素朴に書くとプログラムの一部が 2回記述されてしまう。 -- cgit v1.2.3-70-g09d2