From c0c73379890f1a4ee6ee07b1aee188c33ef66ab0 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 2 Apr 2025 00:11:46 +0900 Subject: feat(blog/nuldoc): dynamically join nested section ids --- .../posts/2022-04-09/phperkaigi-2022-tokens.ndoc | 34 +++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'vhosts/blog/content/posts/2022-04-09') diff --git a/vhosts/blog/content/posts/2022-04-09/phperkaigi-2022-tokens.ndoc b/vhosts/blog/content/posts/2022-04-09/phperkaigi-2022-tokens.ndoc index 68ef7dd2..c0540482 100644 --- a/vhosts/blog/content/posts/2022-04-09/phperkaigi-2022-tokens.ndoc +++ b/vhosts/blog/content/posts/2022-04-09/phperkaigi-2022-tokens.ndoc @@ -111,16 +111,16 @@ remark = "2問目、3問目の解説を追加、1問目に加筆"

この問題は、単に適切なバージョンの PHP で動かせばトークンが得られる。

-
+
解説 -
+
絵文字

まず目につくのは大量の絵文字だろう。 PHP は識別子に使用できる文字の範囲が広く、絵文字も使うことができる。

-
+
プログラム全体

Brainf*ck のインタプリタとプログラムになっている。 Brainf*ck @@ -182,7 +182,7 @@ remark = "2問目、3問目の解説を追加、1問目に加筆" なお、$🐘 はいわゆる main 関数であり、プログラムの実行部分である。

-
+
絵文字の選択

おおよそ意味に合致するよう選んでいるが、$🤡$🎪 @@ -190,7 +190,7 @@ remark = "2問目、3問目の解説を追加、1問目に加筆" のマスコットの象に由来する。

-
+
strict_types

declare 文の strict_types に指定できるのは、01 @@ -198,7 +198,7 @@ remark = "2問目、3問目の解説を追加、1問目に加筆" 8.1 から追加された、0O または 0o から始まる八進数リテラルを使った。

-
+
URL

ソースコードのライセンスを示したこの部分だが、 @@ -213,7 +213,7 @@ remark = "2問目、3問目の解説を追加、1問目に加筆" 以降は行コメントになっている。

-
+
リテラルなしで数値を生成する

ソースコード中に、ほとんど数値リテラルが書かれていないことにお気づきだろうか。 @@ -242,7 +242,7 @@ remark = "2問目、3問目の解説を追加、1問目に加筆" にし、さらにビット反転して -1 にしている。

-
+
if 文なしで条件分岐

三項演算子ないし match 式を使うことで、if @@ -251,7 +251,7 @@ remark = "2問目、3問目の解説を追加、1問目に加筆" のような形で分岐することもできる。

-
+
whilefor 文なしでループ

不動点コンビネータを使って無名再帰する @@ -321,7 +321,7 @@ remark = "2問目、3問目の解説を追加、1問目に加筆"

ここでは、私の想定解を解説する。

-
+
読解

まずはソースコードを読んでいく。 @@ -369,7 +369,7 @@ remark = "2問目、3問目の解説を追加、1問目に加筆" 5文字ごとに区切ったあと、改行で結合している。

-
+
ヒント

次に、ソースコードに書いてあるヒントを読んでいく。 @@ -387,7 +387,7 @@ remark = "2問目、3問目の解説を追加、1問目に加筆" ファイルに追加ヒントとして書かれている)。

-
+
解く

ここまでわかれば、あと一歩で解ける。すなわち、0x14B499C# @@ -501,9 +501,9 @@ remark = "2問目、3問目の解説を追加、1問目に加筆"

実際にはもう少しパイプで繋げなければならない。

-
+
解説 -
+
プログラム全体

コメントにもあるとおり、これは quine (風) のプログラムになっている。 @@ -515,14 +515,14 @@ remark = "2問目、3問目の解説を追加、1問目に加筆" 異なるのはトークンになっている部分のみである。

-
+
トークン

$xs がトークンに対応している。変換のロジックは riddle.php とほぼ同じなので省略する。

-
+
状態保持

トークンの何文字目まで出力したかを、ソースコードを変えずに (quine @@ -531,7 +531,7 @@ remark = "2問目、3問目の解説を追加、1問目に加筆" から情報を取得している。

-
+
ROT 13

Quine は、素朴に書くとプログラムの一部が 2回記述されてしまう。 -- cgit v1.2.3-70-g09d2