diff options
| author | nsfisis <nsfisis@gmail.com> | 2022-09-29 12:07:44 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2022-09-29 12:07:44 +0900 |
| commit | f33ebae2c80348f9b5d09a5c02a1fb6e3b0dea7d (patch) | |
| tree | ec2db58efe0808a13d7926aef74a14e25efedf5f /content/posts/2022-09-29 | |
| parent | a9da75a3c37595444fd2648cba6bb033b1f64f6b (diff) | |
| download | blog.nsfisis.dev-f33ebae2c80348f9b5d09a5c02a1fb6e3b0dea7d.tar.gz blog.nsfisis.dev-f33ebae2c80348f9b5d09a5c02a1fb6e3b0dea7d.tar.zst blog.nsfisis.dev-f33ebae2c80348f9b5d09a5c02a1fb6e3b0dea7d.zip | |
fix/update post: write-fizzbuzz-in-php-2-letters-per-line
Diffstat (limited to 'content/posts/2022-09-29')
| -rw-r--r-- | content/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line.md | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/content/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line.md b/content/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line.md index 4bfff53..377840d 100644 --- a/content/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line.md +++ b/content/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line.md @@ -6,6 +6,7 @@ summary: | PHP で、fizzbuzz を書いた。ただし、1行あたりに使える文字数は2文字まで。 changelog: 2022-09-28: 公開 + 2022-09-29: 小さな文言の修正・変更 --- # 記事の構成について @@ -118,7 +119,7 @@ c\ さて、PHP ではそもそもバックスラッシュを行継続に使うことができない。これにより、「3文字以上からなるトークンが一切使えない」という制約が課される。例えば、`echo` で出力することや、`for` でループすること、`new` でインスタンスを生成することができない。特に、出力は fizzbuzz をどんなアルゴリズムで実装しようとおこなわなければならないので、できないのは致命的である。 -当然、名前が3文字以上ある関数も使えない。なお、標準 PHP の範囲内において、名前が 2文字未満の関数は以下のとおりである: +当然、名前が3文字以上ある関数も使えない。なお、標準 PHP の範囲内において、名前が 2文字以下の関数は以下のとおりである: * `_`: `gettext` のエイリアス * `dl`: 拡張モジュールをロードする @@ -141,7 +142,7 @@ a' ;; ``` -とすると `$a` は `"\na"` になるのだが、この `$a` に余計な改行が入ってしまう。 +とすると `$a` は `"\na"` になるのだが、余計な改行が入ってしまう。 これらの障害をどのように乗り越えるのか、次節から見ていく。 @@ -174,11 +175,12 @@ for ($i = 1; $i < 100; $i++) { $s = range(1, 100); array_walk( $s, - fn($i) => printf((($i % 3 ? '' : 'Fizz') . ($i % 5 ? '' : 'Buzz') ?: $i) . "\n"), + fn($i) => + printf((($i % 3 ? '' : 'Fizz') . ($i % 5 ? '' : 'Buzz') ?: $i) . "\n"), ); ``` -`array_walk` や `range`、`printf` といった `for` よりも長いトークンが現れてしまったが、これは次節で直すことにする。なお、`echo` は文であり式なので `printf` に置き換えた。 +`array_walk` や `range`、`printf` といった `for` よりも長いトークンが現れてしまったが、これは次節で直すことにする。なお、`echo` は文 (statement) であり式 (expression) ではないので、式である `printf` に置き換えた。 ## 関数呼び出しの短縮 @@ -195,7 +197,8 @@ $p = 'printf'; $s = $r(1, 100); $w( $s, - fn($i) => $p((($i % 3 ? '' : 'Fizz') . ($i % 5 ? '' : 'Buzz') ?: $i) . "\n"), + fn($i) => + $p((($i % 3 ? '' : 'Fizz') . ($i % 5 ? '' : 'Buzz') ?: $i) . "\n"), ); ``` @@ -240,7 +243,7 @@ F. 実際に使った手法の説明に移る。 -ずばり、文字列同士のビット演算を使う。マイナーな機能だが、PHP では、文字列同士でビット演算 (`&`、`|`、`^`) をした場合、文字列の各バイトごとに指定したビット演算がなされ、それを結合したものが演算結果となる。 +ずばり、文字列同士のビット演算を使う。PHP では、文字列同士でビット演算 (`&`、`|`、`^`) をした場合、文字列の各バイトごとに指定したビット演算がなされ、それを結合したものが演算結果となる。 ```php $a = "12345"; @@ -472,7 +475,7 @@ $i # 感想など -PHP は、スクリプト言語の中だとシンタックスシュガーが比較的少ない (体感)。この挑戦は不可能に思われたが、PHP マニュアルとにらめっこしていたらなんとかなった。 +PHP は、スクリプト言語の中だとシンタックスシュガーが少ない (体感)。この挑戦は不可能に思われたが、PHP マニュアルとにらめっこしていたらなんとかなった。 みんなもプログラムを細長くしよう。 @@ -546,7 +549,7 @@ ${ '} ``` -は変数で、中にはスペースとエスケープが入っている。シェルに渡されている文字列は次のようになる。 +は変数で、中にはスペースとエスケープが入っている (`chr(32) . chr(92)`)。シェルに渡されている文字列は次のようになる。 ``` e\ @@ -563,7 +566,7 @@ o\ ということでこれは別解ということにしておく。 -ちなみに、PHP 8.2 からは、この気色の悪い変数の記法で Warning が出るようになるようだ。 +ちなみに、PHP 8.2 からは、この記法で Warning が出るようになるようだ。 ``` ${ |
