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 --- .../2022-04-09/phperkaigi-2022-tokens/index.html | 80 +++++++++++----------- 1 file changed, 40 insertions(+), 40 deletions(-) (limited to 'public/posts/2022-04-09/phperkaigi-2022-tokens/index.html') 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 @@

-
-

第1問 brainf_ck.php

+
+

第1問 brainf_ck.php

ソースコードはこちら。実行には PHP 8.1 以上が必要なので注意。

@@ -153,17 +153,17 @@ $🐘([ この問題は、単に適切なバージョンの PHP で動かせばトークンが得られる。

-
-

解説

-
-

絵文字

+
+

解説

+
+

絵文字

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

-
-

プログラム全体

+
+

プログラム全体

Brainf*ck のインタプリタとプログラムになっている。 Brainf*ck とは、難解プログラミング言語のひとつであり、ここで説明するよりも Wikipedia の該当ページを読んだ方がよい。

@@ -246,22 +246,22 @@ $🐘([

-
-

絵文字の選択

+
+

絵文字の選択

おおよそ意味に合致するよう選んでいるが、$🤡$🎪 は弊社デジタルサーカスにちなんでいる。 また、$🐘 は PHP のマスコットの象に由来する。

-
-

strict_types

+
+

strict_types

declare 文の strict_types に指定できるのは、01 の数値リテラルだが、 0x00b1 のような値も受け付ける。 今回は、PHP 8.1 から追加された、0O または 0o から始まる八進数リテラルを使った。

-
-

URL

+
+

URL

ソースコードのライセンスを示したこの部分だが、

@@ -273,8 +273,8 @@ $🐘([

-
-

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

+
+

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

ソースコード中に、ほとんど数値リテラルが書かれていないことにお気づきだろうか。 PHP では、型変換を利用することで任意の整数を作り出すことができる。

@@ -294,15 +294,15 @@ $🐘([

-
-

if 文なしで条件分岐

+
+

if 文なしで条件分岐

三項演算子ないし match 式を使うことで、if を一切書かずに条件分岐ができる。 また、&& / || も使えることがある。 遅延評価が不要なケースでは、[$t, $f][$cond] のような形で分岐することもできる。

-
-

whilefor 文なしでループ

+
+

whilefor 文なしでループ

不動点コンビネータを使って無名再帰する (詳しい説明は省略する。これらの単語で検索してほしい)。 ここでは、一般に Z コンビネータとして知られるものを使った ($z)。

@@ -318,8 +318,8 @@ $🐘([
-
-

第2問 riddle.php

+
+

第2問 riddle.php

ソースコードはこちら。実行には PHP 8.0 以上が必要なので注意。

@@ -367,8 +367,8 @@ $🐘([ ここでは、私の想定解を解説する。

-
-

読解

+
+

読解

まずはソースコードを読んでいく。

@@ -406,8 +406,8 @@ $🐘([

-
-

ヒント

+
+

ヒント

次に、ソースコードに書いてあるヒントを読んでいく。

@@ -435,8 +435,8 @@ $🐘([

-
-

解く

+
+

解く

ここまでわかれば、あと一歩で解ける。すなわち、0x14B499C# に変換されるような N を見つければよい。

@@ -495,8 +495,8 @@ $🐘([
-
-

第3問 toquine.php

+
+

第3問 toquine.php

ソースコードはこちら。

@@ -541,10 +541,10 @@ Q; 実際にはもう少しパイプで繋げなければならない。

-
-

解説

-
-

プログラム全体

+
+

解説

+
+

プログラム全体

コメントにもあるとおり、これは quine (風) のプログラムになっている。 Quine とは、自分のソースコードをそっくりそのまま出力するようなプログラムのことである。

@@ -554,22 +554,22 @@ Q;

-
-

トークン

+
+

トークン

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

-
-

状態保持

+
+

状態保持

トークンの何文字目まで出力したかを、ソースコードを変えずに (quine なので) 覚えておく必要がある。 このプログラムでは、トークンが出力されるとソースコードがだんだんと長くなっていくのを利用して、LINE から情報を取得している。

-
-

ROT 13

+
+

ROT 13

Quine は、素朴に書くとプログラムの一部が 2回記述されてしまう。 これがあまり美しくないので、toquine.php では、ROT 13 変換を使って難読化した。

-- cgit v1.2.3-70-g09d2