From db3d51ddc421dad68abddb95d01ffdab440197d6 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 19 Mar 2023 03:24:43 +0900 Subject: feat(content): specify heading id --- .../index.html | 64 +++++++++++----------- 1 file changed, 32 insertions(+), 32 deletions(-) (limited to 'public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line') diff --git a/public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html b/public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html index 23028a3..c0ae51e 100644 --- a/public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html +++ b/public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html @@ -56,15 +56,15 @@ -
-

記事の構成について

+
+

記事の構成について

この記事は、普通の fizzbuzz を徐々に変形して最終形にしていく、という構成で書かれている。最終形を見てどのような仕組みで動いているのか解読してから解説を読みたい、というかたがいれば、 このページ にソースコードがあるので、そちらを先に見てほしい。

-
-

レギュレーション

+
+

レギュレーション

PHP で、次のような制約の下に fizzbuzz を書いた。

@@ -110,8 +110,8 @@

-
-

主な障害

+
+

主な障害

1行あたりの文字数など、適当に改行を挟めばいいだけではないのか?

@@ -232,7 +232,7 @@ c\
  • - 標準的なインストール構成の PHP で実現できること (デフォルトで有効になっていない拡張等を使わないこと) + 標準的なインストール構成の PHP で実現できること (デフォルトで有効になっていない拡張等を使わないこと)
@@ -259,10 +259,10 @@ a'

-
-

解説

-
-

普通の (?) fizzbuzz

+
+

解説

+
+

普通の (?) fizzbuzz

まずは普通に書くとしよう。

@@ -278,8 +278,8 @@ a'

-
-

for の排除

+
+

for の排除

for は、3文字もある長いキーワードである。こんなものは使えない。array_ 系の関数を使って、適当に置き換えるとしよう。

@@ -288,9 +288,9 @@ a' $s = range(1, 100); array_walk( - $s, - fn($i) => - printf((($i % 3 ? '' : 'Fizz') . ($i % 5 ? '' : 'Buzz') ?: $i) . "\n"), +$s, +fn($i) => +printf((($i % 3 ? '' : 'Fizz') . ($i % 5 ? '' : 'Buzz') ?: $i) . "\n"), );

@@ -298,8 +298,8 @@ a'

-
-

関数呼び出しの短縮

+
+

関数呼び出しの短縮

rangearray_walkprintf は長すぎるのでどうにかせねばならない。ここで、PHP の可変関数を使う。可変関数とは、関数名が文字列として入った変数を経由して、関数を呼び出す機能である。

@@ -312,9 +312,9 @@ a' $s = $r(1, 100); $w( - $s, - fn($i) => - $p((($i % 3 ? '' : 'Fizz') . ($i % 5 ? '' : 'Buzz') ?: $i) . "\n"), +$s, +fn($i) => +$p((($i % 3 ? '' : 'Fizz') . ($i % 5 ? '' : 'Buzz') ?: $i) . "\n"), );

@@ -322,8 +322,8 @@ a'

-
-

余談: PHP 8.x で動作しなくてもいいなら

+
+

余談: PHP 8.x で動作しなくてもいいなら

今回使ったテクニックを説明する前に、余談として、文字列リテラルの短縮法として今回採用しなかったものを紹介する。

@@ -366,8 +366,8 @@ F.

-
-

文字列リテラルの短縮

+
+

文字列リテラルの短縮

実際に使った手法の説明に移る。

@@ -382,7 +382,7 @@ F. // $a ^ $b は次のコードと同じ $result = ''; for ($i = 0; $i < min(strlen($a), strlen($b)); $i++) { - $result .= $a[$i] ^ $b[$i]; +$result .= $a[$i] ^ $b[$i]; } echo $result; @@ -447,8 +447,8 @@ o'
-
-

完成系

+
+

完成系

完成したものがこちら。

@@ -604,8 +604,8 @@ _! );
-
-

感想など

+
+

感想など

PHP は、スクリプト言語の中だとシンタックスシュガーが少ない (体感)。この挑戦は不可能に思われたが、PHP マニュアルとにらめっこしていたらなんとかなった。

@@ -615,8 +615,8 @@ _!

-
-

余談2: 別解

+
+

余談2: 別解

PHP では、バッククォートを使ってシェルを呼び出せる。これは shell_exec 関数と等価である。さて、PHP ではバックスラッシュによる行継続が使えないと書いたが、シェルでは使える (当然だが、呼び出されるシェルに依存する。Bash なら大丈夫だろう。知らんけど)。

-- cgit v1.2.3-70-g09d2