From 88ba6cfe220216f371f8756921059fac51a21262 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Fri, 23 Dec 2022 23:27:09 +0900 Subject: AsciiDoc to DocBook --- .../php-conference-okinawa-code-golf/index.html | 350 +++++++++------------ 1 file changed, 150 insertions(+), 200 deletions(-) (limited to 'public/posts/2022-08-27') diff --git a/public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html b/public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html index 6d0e261..f35bd10 100644 --- a/public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html +++ b/public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html @@ -4,18 +4,14 @@ - + PHP カンファレンス沖縄で出題されたコードゴルフの問題を解いてみた | REPL: Rest-Eat-Program Loop - - - - - - - + + +
@@ -29,209 +25,163 @@

PHP カンファレンス沖縄で出題されたコードゴルフの問題を解いてみた

+ +
+
+
+

更新履歴

+
    +
  1. + : 公開 +
  2. +
+
+
+

はじめに

+

+ 本日PHP カンファレンス沖縄 2022が開催された (らしい)。 +

+ +

+ カンファレンスには参加できなかったものの、懇親会の LT で出題されたコードゴルフの問題が Twitter に流れてきたので、解いてみた。 +

+ +

+ ツイート:https://twitter.com/m3m0r7/status/1563397620231712772 +
+ スライド:https://speakerdeck.com/memory1994/php-conference-okinawa-2022-extra?slide=3 +

+
-
-
-
-

更新履歴

-
    +
    +

    使用したテクニック

    +
    +

    指数表記

    +

    + 割と多くの言語のゴルフで使えるテクニック。eを用いた指数表記で、大きな数を短く表す。このコードでは10000500020001000を指数表記している。 +

    +
    + +
    +

    foreach や for の中身を1つの文に

    +

    + foreachforifなどの後ろには、通常{を続けて複数の文を連ねるが、中身の文を1つにしてしまえば、{}を省略できる。C言語などでも使える。 +

    +
    + +
    +

    $r に初期値を入れない

    +

    + PHP では、$r[] = …​のような配列の末尾に追加する式を実行したとき、$rが未定義だった場合は$rを勝手に定義して空の配列で初期化してくれる。これを利用すると、$r = [];のような初期化が不要になる。 +

    -
  1. - : 公開 -
  2. +

    + ただし、プログラムに 0 が渡されるとループを一度も回らないので、$rが未定義になってしまい、implode()に渡すところでエラーになる。それを防ぐために$r ?? []を使っている。 +

    -
+

+ もし 0 が渡されたケースを無視するなら、これが不要になるので 4 バイト縮む。 +

+
+ +
+

PHP タグの外に文字列を置く

+

+ PHP では、<?php?>で囲われた部分の外側にある文字列は、そのまま出力される。今回のケースでは、先頭と末尾に必ず[]を出力するので、そのまま書いてやればよい。 +

+
+ + +
+

おわりに

+

+ 最後になりましたが、https://twitter.com/m3m0r7[めもりー] さん、楽しい問題をありがとうございました。 +

-
-

- - はじめに - -

-
-
-

本日 PHP カンファレンス沖縄 2022 -が開催された (らしい)。

-
-
-

カンファレンスには参加できなかったものの、懇親会の LT -で出題されたコードゴルフの問題が Twitter に流れてきたので、解いてみた。

-
- -
-
-
-

- - 解 - -

-
-
-

細かいレギュレーションは不明だったので、勝手に定めた。

-
-
-
    -
  • -

    コマンドライン引数の第1引数で受けとる

    -
  • -
  • -

    結果は標準出力に出す

    -
  • -
  • -

    コンマの直後にはスペースを1つ置く

    -
  • -
  • -

    末尾コンマは禁止

    -
  • -
  • -

    数字でないものは入ってこないものとする

    -
  • -
  • -

    負数は入ってこないものとする

    -
  • -
-
-
-

書いたものがこちら:

-
-
-
-
[<?php $n=$argv[1];foreach([1e4,5e3,2e3,1e3,500,100,50,10,5,1]as$x)for(;$n>=$x;$n-=$x)$r[]=$x;echo implode(', ',$r??[]);?>]
-
-
-
-

しめて 123 バイトとなった (末尾改行を含めずにカウント)。

-
-
-

こちらは改行とスペースを追加したバージョン:

-
-
-
-
[<?php
-
-$n = $argv[1];
-foreach ([1e4, 5e3, 2e3, 1e3, 500, 100, 50, 10, 5, 1] as $x)
-  for (; $n >= $x; $n -= $x)
-    $r[] = $x;
-echo implode(', ', $r ?? []);
-
-?>]
-
-
-
-
-
-

- - 使用したテクニック - -

-
-
-

- - 指数表記 - -

-
-
-

割と多くの言語のゴルフで使えるテクニック。e -を用いた指数表記で、大きな数を短く表す。このコードでは -10000500020001000 を指数表記している。

-
-
-
-
-

- - foreach や for の中身を1つの文に - -

-
-
-

foreachforif などの後ろには、通常 { -を続けて複数の文を連ねるが、中身の文を1つにしてしまえば、{} -を省略できる。C言語などでも使える。

-
-
-
-
-

- - $r に初期値を入れない - -

-
-
-

PHP では、$r[] = …​ -のような配列の末尾に追加する式を実行したとき、$r が未定義だった場合は -$r -を勝手に定義して空の配列で初期化してくれる。これを利用すると、$r = []; -のような初期化が不要になる。

-
-
-

ただし、プログラムに 0 が渡されるとループを一度も回らないので、$r -が未定義になってしまい、implode() -に渡すところでエラーになる。それを防ぐために $r ?? [] を使っている。

-
-
-

もし 0 が渡されたケースを無視するなら、これが不要になるので 4 -バイト縮む。

-
-
-
-
-

- - PHP タグの外に文字列を置く - -

-
-
-

PHP では、<?php ?> -で囲われた部分の外側にある文字列は、そのまま出力される。今回のケースでは、先頭と末尾に必ず -[] を出力するので、そのまま書いてやればよい。

-
-
-
-
-
-
-

- - おわりに - -

-
-
-

最後になりましたが、https://twitter.com/m3m0r7[めもりー] -さん、楽しい問題をありがとうございました。

-
-
-
-