From 0766039bd9e6b9f5e6334e84666f5be698d41fc3 Mon Sep 17 00:00:00 2001
From: nsfisis
<?php
+ <?php
-$π = $argv[1] ?? null;
-if ($π === null) {
-exit('No input.');
+$π = $argv[1] ?? null;
+if ($π === null) {
+exit('No input.');
}
-$π = trim($π);
-if (!is_numeric($π)) {
-exit('Invalid input.');
+$π = trim($π);
+if (!is_numeric($π)) {
+exit('Invalid input.');
}
-$s = implode(array_map(chr(...), str_split($π, 2)));
+$s = implode(array_map(chr(...), str_split($π, 2)));
-preg_match('/(\x23.+?) /', $s, $m);
-$t = $m[1] ?? '';
+preg_match('/(\x23.+?) /', $s, $m);
+$t = $m[1] ?? '';
-if (md5($t) === '056e831a4146bf123e8ea16613303d2e') {
-echo "Token: {$t}\n";
-} else {
-echo "Failed.\n";
+if (md5($t) === '056e831a4146bf123e8ea16613303d2e') {
+echo "Token: {$t}\n";
+} else {
+echo "Failed.\n";
}
@@ -107,14 +107,14 @@ echo "Failed.\n";
ソースを見るとわかるとおり、$argv[1]を参照している。それを$πなる変数に代入しているので、円周率を渡してみる。
- $ php Q.php 3.14
+ $ php Q.php 3.14
Failed.
失敗してしまった。精度を上げてみる。
- $ php Q.php 3.1415
+ $ php Q.php 3.1415
Failed.
@@ -125,7 +125,7 @@ Failed.
最初にトークンが得られるのは、小数点以下 16 桁目まで入力したときで、こうなる。
- $ php Q.php 3.1415926535897932
+ $ php Q.php 3.1415926535897932
Token: #YO
@@ -139,20 +139,20 @@ Token: #YO
短いので頭から追っていく。
- $π = $argv[1] ?? null;
- if ($π === null) {
- exit('No input.');
+ $π = $argv[1] ?? null;
+ if ($π === null) {
+ exit('No input.');
}
- $π = trim($π);
- if (!is_numeric($π)) {
- exit('Invalid 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) している。
@@ -162,13 +162,13 @@ Token: #YO
例えば、$πが'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 におけるトークンである。
@@ -178,10 +178,10 @@ $t = $m[1] ?? '';
なお、#を直接書いていないのは、/#.+?) /と書くと、#.+?)という意図せぬトークンが登録されてしまうからである。
- 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