From db3d51ddc421dad68abddb95d01ffdab440197d6 Mon Sep 17 00:00:00 2001
From: nsfisis
ソースコードはこちら。実行には PHP 8.1 以上が必要なので注意。
@@ -153,17 +153,17 @@ $🐘([ この問題は、単に適切なバージョンの PHP で動かせばトークンが得られる。 -まず目につくのは大量の絵文字だろう。 PHP は識別子に使用できる文字の範囲が広く、絵文字も使うことができる。
Brainf*ck のインタプリタとプログラムになっている。 Brainf*ck とは、難解プログラミング言語のひとつであり、ここで説明するよりも Wikipedia の該当ページを読んだ方がよい。
@@ -246,22 +246,22 @@ $🐘([
おおよそ意味に合致するよう選んでいるが、$🤡 と $🎪 は弊社デジタルサーカスにちなんでいる。 また、$🐘 は PHP のマスコットの象に由来する。
declare 文の strict_types に指定できるのは、0 か 1 の数値リテラルだが、 0x0 や 0b1 のような値も受け付ける。 今回は、PHP 8.1 から追加された、0O または 0o から始まる八進数リテラルを使った。
ソースコードのライセンスを示したこの部分だが、
@@ -273,8 +273,8 @@ $🐘([ソースコード中に、ほとんど数値リテラルが書かれていないことにお気づきだろうか。 PHP では、型変換を利用することで任意の整数を作り出すことができる。
@@ -294,15 +294,15 @@ $🐘([if 文なしで条件分岐if 文なしで条件分岐
三項演算子ないし match 式を使うことで、if を一切書かずに条件分岐ができる。 また、&& / || も使えることがある。 遅延評価が不要なケースでは、[$t, $f][$cond] のような形で分岐することもできる。
while、for 文なしでループwhile、for 文なしでループ
不動点コンビネータを使って無名再帰する (詳しい説明は省略する。これらの単語で検索してほしい)。 ここでは、一般に Z コンビネータとして知られるものを使った ($z)。
ソースコードはこちら。実行には PHP 8.0 以上が必要なので注意。
@@ -367,8 +367,8 @@ $🐘([ ここでは、私の想定解を解説する。 -まずはソースコードを読んでいく。
@@ -406,8 +406,8 @@ $🐘([次に、ソースコードに書いてあるヒントを読んでいく。
@@ -435,8 +435,8 @@ $🐘([
ここまでわかれば、あと一歩で解ける。すなわち、0x14B499C が # に変換されるような N を見つければよい。
ソースコードはこちら。
@@ -541,10 +541,10 @@ Q; 実際にはもう少しパイプで繋げなければならない。 -コメントにもあるとおり、これは quine (風) のプログラムになっている。 Quine とは、自分のソースコードをそっくりそのまま出力するようなプログラムのことである。
@@ -554,22 +554,22 @@ Q;
$xs がトークンに対応している。変換のロジックは riddle.php とほぼ同じなので省略する。
トークンの何文字目まで出力したかを、ソースコードを変えずに (quine なので) 覚えておく必要がある。 このプログラムでは、トークンが出力されるとソースコードがだんだんと長くなっていくのを利用して、LINE から情報を取得している。
Quine は、素朴に書くとプログラムの一部が 2回記述されてしまう。 これがあまり美しくないので、toquine.php では、ROT 13 変換を使って難読化した。