From a84908b7e8a0e2423afd6b836eccf27a420270b4 Mon Sep 17 00:00:00 2001
From: nsfisis
<?php
+ <?php
declare(strict_types=0O1);
@@ -176,7 +176,7 @@ $🐘([
なお、brainf*ck プログラムを普通の書き方で書くと、次のようになる。
- + + + + + + + + + +
+ + + + + + + + + + +
[
> + + +
> + + + + +
@@ -266,7 +266,7 @@ $🐘([
ソースコードのライセンスを示したこの部分だが、
- https://creativecommons.org/publicdomain/zero/1.0/
+ https://creativecommons.org/publicdomain/zero/1.0/
完全に合法な PHP のコードである。 https: 部分はラベル、// 以降は行コメントになっている。
@@ -279,7 +279,7 @@ $🐘([
ソースコード中に、ほとんど数値リテラルが書かれていないことにお気づきだろうか。 PHP では、型変換を利用することで任意の整数を作り出すことができる。
- assert(0 === +!![]);
+ assert(0 === +!![]);
assert(1 === +![]);
assert(2 === ![]+![]);
assert(3 === ![]+![]+![]);
@@ -324,7 +324,7 @@ $🐘([
ソースコードはこちら。実行には PHP 8.0 以上が必要なので注意。
- <?php
+ <?php
/*********************************************************
* This program displays a PHPer token. *
@@ -373,7 +373,7 @@ $🐘([
まずはソースコードを読んでいく。
- $token = [
+ $token = [
// 略
];
@@ -381,25 +381,25 @@ $🐘([
数値からなる $token があり、各要素をループしている。
- $x = $x ^ N;
+ $x = $x ^ N;
まずは排他的論理和 (xor) を取り、
- $x = sprintf('%025b', $x);
+ $x = sprintf('%025b', $x);
二進数に変換して、
- $x = str_replace(search: ['0', '1'], replace: [' ', '#'], subject: $x);
+ $x = str_replace(search: ['0', '1'], replace: [' ', '#'], subject: $x);
0 を空白に、1 を # にし、
- $x = implode("\n", str_split($x, length: 5));
+ $x = implode("\n", str_split($x, length: 5));
5文字ごとに区切ったあと、改行で結合している。
@@ -445,13 +445,13 @@ $🐘([
N は高々
- assert(0 <= N && N <= 0b11111_11111_11111_11111_11111);
+ assert(0 <= N && N <= 0b11111_11111_11111_11111_11111);
なのでブルートフォースしてもよいが、ここではブルートフォースしない方法を紹介する。
- <?php
+ <?php
$x = 0x14B499C;
@@ -472,7 +472,7 @@ $🐘([
この一連の変換に対する逆変換を考えると、次のようになる。
- <?php
+ <?php
$x =
" # # \n" .
@@ -501,7 +501,7 @@ $🐘([
ソースコードはこちら。
- <?php
+ <?php
// License: https://creativecommons.org/publicdomain/zero/1.0/
// This is a quine-like program to generate a PHPer token.
@@ -535,7 +535,7 @@ Q;
コメントにもあるとおり、次のようにして実行すれば答えがでてくる。
- $ php toquine.php | php | php | php | ...
+ $ php toquine.php | php | php | php | ...
実際にはもう少しパイプで繋げなければならない。
@@ -564,7 +564,7 @@ Q;
状態保持
- トークンの何文字目まで出力したかを、ソースコードを変えずに (quine なので) 覚えておく必要がある。 このプログラムでは、トークンが出力されるとソースコードがだんだんと長くなっていくのを利用して、LINE から情報を取得している。
+ トークンの何文字目まで出力したかを、ソースコードを変えずに (quine なので) 覚えておく必要がある。 このプログラムでは、トークンが出力されるとソースコードがだんだんと長くなっていくのを利用して、__LINE__ から情報を取得している。
--
cgit v1.2.3-70-g09d2