diff options
| author | nsfisis <nsfisis@gmail.com> | 2023-03-19 03:24:43 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2023-03-19 03:24:43 +0900 |
| commit | db3d51ddc421dad68abddb95d01ffdab440197d6 (patch) | |
| tree | 35a6b45bb964b22fa74486596f4e640db82fb0ac /public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html | |
| parent | cb5a2a0afdf822651db035904cd8c1307a7b7743 (diff) | |
| download | blog.nsfisis.dev-db3d51ddc421dad68abddb95d01ffdab440197d6.tar.gz blog.nsfisis.dev-db3d51ddc421dad68abddb95d01ffdab440197d6.tar.zst blog.nsfisis.dev-db3d51ddc421dad68abddb95d01ffdab440197d6.zip | |
feat(content): specify heading id
Diffstat (limited to 'public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html')
| -rw-r--r-- | public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html | 64 |
1 files changed, 32 insertions, 32 deletions
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 @@ </li> </ol> </section> - <section id="section--_記事の構成について"> - <h2><a href="#section--_記事の構成について">記事の構成について</a></h2> + <section id="section--intro"> + <h2><a href="#section--intro">記事の構成について</a></h2> <p> この記事は、普通の fizzbuzz を徐々に変形して最終形にしていく、という構成で書かれている。最終形を見てどのような仕組みで動いているのか解読してから解説を読みたい、というかたがいれば、 <a href="https://gist.github.com/nsfisis/04c227d5a419867472a0b23a83ad2919#file-fizzbuzz-php-2-letters-per-line-and-supports-php-8-x-without-warnings">このページ</a> にソースコードがあるので、そちらを先に見てほしい。 </p> </section> - <section id="section--_レギュレーション"> - <h2><a href="#section--_レギュレーション">レギュレーション</a></h2> + <section id="section--regulations"> + <h2><a href="#section--regulations">レギュレーション</a></h2> <p> PHP で、次のような制約の下に fizzbuzz を書いた。 </p> @@ -110,8 +110,8 @@ </p> </section> - <section id="section--_主な障害"> - <h2><a href="#section--_主な障害">主な障害</a></h2> + <section id="section--problems"> + <h2><a href="#section--problems">主な障害</a></h2> <p> 1行あたりの文字数など、適当に改行を挟めばいいだけではないのか? </p> @@ -232,7 +232,7 @@ c\ <blockquote> <ul> <li> - 標準的なインストール構成の PHP で実現できること (デフォルトで有効になっていない拡張等を使わないこと) + 標準的なインストール構成の PHP で実現できること (デフォルトで有効になっていない拡張等を使わないこと) </li> </ul> </blockquote> @@ -259,10 +259,10 @@ a'</span> </p> </section> - <section id="section--_解説"> - <h2><a href="#section--_解説">解説</a></h2> - <section id="section--_普通の_fizzbuzz"> - <h3><a href="#section--_普通の_fizzbuzz">普通の (?) fizzbuzz</a></h3> + <section id="section--commentary"> + <h2><a href="#section--commentary">解説</a></h2> + <section id="section--commentary--normal-fizzbuzz"> + <h3><a href="#section--commentary--normal-fizzbuzz">普通の (?) fizzbuzz</a></h3> <p> まずは普通に書くとしよう。 </p> @@ -278,8 +278,8 @@ a'</span> </p> </section> - <section id="section--_for_の排除"> - <h3><a href="#section--_for_の排除"><code>for</code> の排除</a></h3> + <section id="section--commentary--remove-keywords"> + <h3><a href="#section--commentary--remove-keywords"><code>for</code> の排除</a></h3> <p> <code>for</code> は、3文字もある長いキーワードである。こんなものは使えない。<code>array_</code> 系の関数を使って、適当に置き換えるとしよう。 </p> @@ -288,9 +288,9 @@ a'</span> <span class="hljs-variable">$s</span> = <span class="hljs-title function_ invoke__">range</span>(<span class="hljs-number">1</span>, <span class="hljs-number">100</span>); <span class="hljs-title function_ invoke__">array_walk</span>( - <span class="hljs-variable">$s</span>, - fn(<span class="hljs-variable">$i</span>) => - <span class="hljs-title function_ invoke__">printf</span>(((<span class="hljs-variable">$i</span> % <span class="hljs-number">3</span> ? <span class="hljs-string">''</span> : <span class="hljs-string">'Fizz'</span>) . (<span class="hljs-variable">$i</span> % <span class="hljs-number">5</span> ? <span class="hljs-string">''</span> : <span class="hljs-string">'Buzz'</span>) ?: <span class="hljs-variable">$i</span>) . <span class="hljs-string">"\n"</span>), +<span class="hljs-variable">$s</span>, +fn(<span class="hljs-variable">$i</span>) => +<span class="hljs-title function_ invoke__">printf</span>(((<span class="hljs-variable">$i</span> % <span class="hljs-number">3</span> ? <span class="hljs-string">''</span> : <span class="hljs-string">'Fizz'</span>) . (<span class="hljs-variable">$i</span> % <span class="hljs-number">5</span> ? <span class="hljs-string">''</span> : <span class="hljs-string">'Buzz'</span>) ?: <span class="hljs-variable">$i</span>) . <span class="hljs-string">"\n"</span>), );</code></pre> <p> @@ -298,8 +298,8 @@ a'</span> </p> </section> - <section id="section--_関数呼び出しの短縮"> - <h3><a href="#section--_関数呼び出しの短縮">関数呼び出しの短縮</a></h3> + <section id="section--commentary--shorten-function-invocation"> + <h3><a href="#section--commentary--shorten-function-invocation">関数呼び出しの短縮</a></h3> <p> <code>range</code>、<code>array_walk</code>、<code>printf</code> は長すぎるのでどうにかせねばならない。ここで、PHP の可変関数を使う。可変関数とは、関数名が文字列として入った変数を経由して、関数を呼び出す機能である。 </p> @@ -312,9 +312,9 @@ a'</span> <span class="hljs-variable">$s</span> = <span class="hljs-variable">$r</span>(<span class="hljs-number">1</span>, <span class="hljs-number">100</span>); <span class="hljs-variable">$w</span>( - <span class="hljs-variable">$s</span>, - <span class="hljs-function"><span class="hljs-keyword">fn</span>(<span class="hljs-params"><span class="hljs-variable">$i</span></span>) =></span> - <span class="hljs-variable">$p</span>(((<span class="hljs-variable">$i</span> % <span class="hljs-number">3</span> ? <span class="hljs-string">''</span> : <span class="hljs-string">'Fizz'</span>) . (<span class="hljs-variable">$i</span> % <span class="hljs-number">5</span> ? <span class="hljs-string">''</span> : <span class="hljs-string">'Buzz'</span>) ?: <span class="hljs-variable">$i</span>) . <span class="hljs-string">"\n"</span>), +<span class="hljs-variable">$s</span>, +<span class="hljs-function"><span class="hljs-keyword">fn</span>(<span class="hljs-params"><span class="hljs-variable">$i</span></span>) =></span> +<span class="hljs-variable">$p</span>(((<span class="hljs-variable">$i</span> % <span class="hljs-number">3</span> ? <span class="hljs-string">''</span> : <span class="hljs-string">'Fizz'</span>) . (<span class="hljs-variable">$i</span> % <span class="hljs-number">5</span> ? <span class="hljs-string">''</span> : <span class="hljs-string">'Buzz'</span>) ?: <span class="hljs-variable">$i</span>) . <span class="hljs-string">"\n"</span>), );</code></pre> <p> @@ -322,8 +322,8 @@ a'</span> </p> </section> - <section id="section--_余談_php_8_x_で動作しなくてもいいなら"> - <h3><a href="#section--_余談_php_8_x_で動作しなくてもいいなら">余談: PHP 8.x で動作しなくてもいいなら</a></h3> + <section id="section--commentary--incompatible-solution"> + <h3><a href="#section--commentary--incompatible-solution">余談: PHP 8.x で動作しなくてもいいなら</a></h3> <p> 今回使ったテクニックを説明する前に、余談として、文字列リテラルの短縮法として今回採用しなかったものを紹介する。 </p> @@ -366,8 +366,8 @@ F. </p> </section> - <section id="section--_文字列リテラルの短縮"> - <h3><a href="#section--_文字列リテラルの短縮">文字列リテラルの短縮</a></h3> + <section id="section--commentary--shorten-string-literals"> + <h3><a href="#section--commentary--shorten-string-literals">文字列リテラルの短縮</a></h3> <p> 実際に使った手法の説明に移る。 </p> @@ -382,7 +382,7 @@ F. <span class="hljs-comment">// $a ^ $b は次のコードと同じ</span> <span class="hljs-variable">$result</span> = <span class="hljs-string">''</span>; <span class="hljs-keyword">for</span> (<span class="hljs-variable">$i</span> = <span class="hljs-number">0</span>; <span class="hljs-variable">$i</span> < <span class="hljs-title function_ invoke__">min</span>(<span class="hljs-title function_ invoke__">strlen</span>(<span class="hljs-variable">$a</span>), <span class="hljs-title function_ invoke__">strlen</span>(<span class="hljs-variable">$b</span>)); <span class="hljs-variable">$i</span>++) { - <span class="hljs-variable">$result</span> .= <span class="hljs-variable">$a</span>[<span class="hljs-variable">$i</span>] ^ <span class="hljs-variable">$b</span>[<span class="hljs-variable">$i</span>]; +<span class="hljs-variable">$result</span> .= <span class="hljs-variable">$a</span>[<span class="hljs-variable">$i</span>] ^ <span class="hljs-variable">$b</span>[<span class="hljs-variable">$i</span>]; } <span class="hljs-keyword">echo</span> <span class="hljs-variable">$result</span>; @@ -447,8 +447,8 @@ o'</span> </section> </section> - <section id="section--_完成系"> - <h2><a href="#section--_完成系">完成系</a></h2> + <section id="section--stretched-fizzbuzz"> + <h2><a href="#section--stretched-fizzbuzz">完成系</a></h2> <p> 完成したものがこちら。 </p> @@ -604,8 +604,8 @@ _! );</code></pre> </section> - <section id="section--_感想など"> - <h2><a href="#section--_感想など">感想など</a></h2> + <section id="section--outro"> + <h2><a href="#section--outro">感想など</a></h2> <p> PHP は、スクリプト言語の中だとシンタックスシュガーが少ない (体感)。この挑戦は不可能に思われたが、PHP マニュアルとにらめっこしていたらなんとかなった。 </p> @@ -615,8 +615,8 @@ _! </p> </section> - <section id="section--_余談2_別解"> - <h2><a href="#section--_余談2_別解">余談2: 別解</a></h2> + <section id="section--alternative-solution"> + <h2><a href="#section--alternative-solution">余談2: 別解</a></h2> <p> PHP では、バッククォートを使ってシェルを呼び出せる。これは <code>shell_exec</code> 関数と等価である。さて、PHP ではバックスラッシュによる行継続が使えないと書いたが、シェルでは使える (当然だが、呼び出されるシェルに依存する。Bash なら大丈夫だろう。知らんけど)。 </p> |
