From 0766039bd9e6b9f5e6334e84666f5be698d41fc3 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Fri, 17 Mar 2023 01:35:04 +0900 Subject: feat(nuldoc): implement syntax highlight --- .../phperkaigi-2023-unused-token-quiz-1/index.html | 70 +++++++++++----------- 1 file changed, 35 insertions(+), 35 deletions(-) (limited to 'public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html') diff --git a/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html b/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html index d7f71aa..10ef763 100644 --- a/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html +++ b/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html @@ -10,7 +10,7 @@ PHPerKaigi 2023: ボツになったトークン問題 その 1 | REPL: Rest-Eat-Program Loop - +
@@ -78,26 +78,26 @@ 注意: これはボツ問なので、得られたトークンを PHPerKaigi で入力してもポイントにはならない。

-
<?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'だったとすると、656667に対応した'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