From d30dfc89bf1b673b2fdc0638766b930adaec228c Mon Sep 17 00:00:00 2001
From: nsfisis
<?php
-
-$π = $argv[1] ?? null;
-if ($π === null) {
- exit('No input.');
-}
-$π = trim($π);
-if (!is_numeric($π)) {
- exit('Invalid input.');
-}
-
-$s = implode(array_map(chr(...), str_split($π, 2)));
-
-preg_match('/(\x23.+?) /', $s, $m);
-$t = $m[1] ?? '';
-
-if (md5($t) === '056e831a4146bf123e8ea16613303d2e') {
- echo "Token: {$t}\n";
-} else {
- echo "Failed.\n";
-}
+ <?php
+
+$π = $argv[1] ?? null;
+if ($π === null) {
+ exit('No input.');
+}
+$π = trim($π);
+if (!is_numeric($π)) {
+ exit('Invalid input.');
+}
+
+$s = implode(array_map(chr(...), str_split($π, 2)));
+
+preg_match('/(\x23.+?) /', $s, $m);
+$t = $m[1] ?? '';
+
+if (md5($t) === '056e831a4146bf123e8ea16613303d2e') {
+ echo "Token: {$t}\n";
+} else {
+ echo "Failed.\n";
+}
+ $argv[1] を参照している。それを $π なる変数に代入しているので、円周率を渡してみる。
- $ php Q.php 3.14
-Failed.
+ $ php Q.php 3.14
+Failed.
+ 失敗してしまった。精度を上げてみる。
-$ php Q.php 3.1415
-Failed.
+ $ php Q.php 3.1415
+Failed.
+ だめだった。これを成功するまで繰り返す。 @@ -133,8 +138,10 @@ Failed. 最初にトークンが得られるのは、小数点以下 16 桁目まで入力したときで、こうなる。
-$ php Q.php 3.1415926535897932
-Token: #YO
+ $ php Q.php 3.1415926535897932
+Token: #YO
+
めでたくトークン「#YO」が手に入った。
@@ -147,20 +154,24 @@ Token: #YO
短いので頭から追っていく。
$π = $argv[1] ?? null;
-if ($π === null) {
- exit('No input.');
-}
-$π = trim($π);
-if (!is_numeric($π)) {
- exit('Invalid input.');
-}
+ $π = $argv[1] ?? null;
+if ($π === null) {
+ exit('No input.');
+}
+$π = trim($π);
+if (!is_numeric($π)) {
+ exit('Invalid input.');
+}
+ 入力のバリデーション部分。数値のみ受け付ける。
-$s = implode(array_map(chr(...), str_split($π, 2)));
+ $s = implode(array_map(chr(...), str_split($π, 2)));
+
$π を 2 文字ごとに区切り (str_split)、数値を ASCII コードと見做して文字に変換 (chr) して結合 (implode) している。
@@ -170,13 +181,17 @@ $π = trim($π);
例えば、$π が '656667' だったとすると、65、66、67 に対応した 'A'、'B'、'C' へと変換され、'ABC' になる。
$π = '656667';
-$s = implode(array_map(chr(...), str_split($π, 2)));
-echo $s;
-// => ABC
+ $π = '656667';
+$s = implode(array_map(chr(...), str_split($π, 2)));
+echo $s;
+// => ABC
+ preg_match('/(\x23.+?) /', $s, $m);
-$t = $m[1] ?? '';
+ preg_match('/(\x23.+?) /', $s, $m);
+$t = $m[1] ?? '';
+
正規表現でマッチングしている。\x23 は # と同じであることに留意すると、この正規表現は「# から始まる 2 以上の長さ (含 #) の文字列で、最初に現れるスペースまで」にマッチする。つまりこれは、PHPerKaigi におけるトークンである。
@@ -186,11 +201,13 @@ $π = trim($π);
なお、# を直接書いていないのは、/#.+?) / と書くと、#.+?) という意図せぬトークンが登録されてしまうからである。
if (md5($t) === '056e831a4146bf123e8ea16613303d2e') {
- echo "Token: {$t}\n";
-} else {
- echo "Failed.\n";
-}
+ if (md5($t) === '056e831a4146bf123e8ea16613303d2e') {
+ echo "Token: {$t}\n";
+} else {
+ echo "Failed.\n";
+}
+ 最後にトークンのハッシュ値を見て、想定解かどうかを確認する。 -- cgit v1.2.3-70-g09d2