From de13d68cddef5bb321469bcffb868f27ddd5390e Mon Sep 17 00:00:00 2001
From: nsfisis
+
<?php
declare(strict_types=0O1);
@@ -165,7 +165,7 @@
なお、brainf*ck プログラムを普通の書き方で書くと、次のようになる。
-
+
+ + + + + + + + + +
[
> + + +
@@ -271,7 +271,7 @@
ソースコードのライセンスを示したこの部分だが、
-
+
https://creativecommons.org/publicdomain/zero/1.0/
@@ -286,7 +286,7 @@
ソースコード中に、ほとんど数値リテラルが書かれていないことにお気づきだろうか。 PHP では、型変換を利用することで任意の整数を作り出すことができる。
-
+
assert(0 === +!![]);
assert(1 === +![]);
assert(2 === ![]+![]);
@@ -333,7 +333,7 @@ assert(10 === +(![].+!![]));
ソースコードはこちら。実行には PHP 8.0 以上が必要なので注意。
-
+
<?php
/*********************************************************
@@ -384,7 +384,7 @@ assert(10 === +(![].+!![]));
まずはソースコードを読んでいく。
-
+
$token = [
// 略
];
@@ -394,7 +394,7 @@ assert(10 === +(![].+!![]));
数値からなる$tokenがあり、各要素をループしている。
-
+
$x = $x ^ N;
@@ -402,7 +402,7 @@ assert(10 === +(![].+!![]));
まずは排他的論理和 (xor) を取り、
-
+
$x = sprintf('%025b', $x);
@@ -410,7 +410,7 @@ assert(10 === +(![].+!![]));
二進数に変換して、
-
+
$x = str_replace(search: ['0', '1'], replace: [' ', '#'], subject: $x);
@@ -418,7 +418,7 @@ assert(10 === +(![].+!![]));
0 を空白に、1 を#にし、
-
+
$x = implode("\n", str_split($x, length: 5));
@@ -474,7 +474,7 @@ assert(10 === +(![].+!![]));
Nは高々
-
+
assert(0 <= N && N <= 0b11111_11111_11111_11111_11111);
@@ -482,7 +482,7 @@ assert(10 === +(![].+!![]));
なのでブルートフォースしてもよいが、ここではブルートフォースしない方法を紹介する。
-
+
<?php
$x = 0x14B499C;
@@ -505,7 +505,7 @@ assert(10 === +(![].+!![]));
この一連の変換に対する逆変換を考えると、次のようになる。
-
+
<?php
$x =
@@ -536,7 +536,7 @@ echo "N = $n\n";
ソースコードはこちら。
-
+
<?php
// License: https://creativecommons.org/publicdomain/zero/1.0/
@@ -572,7 +572,7 @@ echo "N = $n\n";
コメントにもあるとおり、次のようにして実行すれば答えがでてくる。
-
+
$ php toquine.php | php | php | php | ...
--
cgit v1.2.3-70-g09d2