memo-pad’s blog

自分のためのメモをまとめています。ここに書いてある内容については責任は負いません。全て自己責任でお願いします。

phpのcodegolf Tips

先日、身内でCodegolfをやったので、その時に学んだショートコーディングの知識をメモ

Codegolfというのは如何に文字数を少なくコードを記述するかを競う競技です。
コードゴルフ - Wikipedia

それではTipsのメモを書いていきます。

出力に改行を出したいときには\nは使わない

例えばこんなコード

echo "test\n";

こう書けば1文字少なくできます(改行分は1文字扱いのため2文字削減にはならない)

echo "test
";

関数にエイリアスがないかを確認する

例えば配列を結合して文字列にしたいときに下記のようにimplodeを使いますよね?

implode($array);

実はimplodeにはjoinというエイリアスが設定されているので、下記のように変更可能です。

join($array);

これだけで3文字分削減です。

ちなみにphpエイリアスhttp://php.net/manual/ja/aliases.phpに載っています。

foreachのas前後のスペースを削る

例えば通常だと下記のようにforeachを記述すると思います。

foreach($a as $b){}

しかし、実は下記のようにasと$bがくっついていても問題ありません。

foreach($a as$b){}

また、先頭が配列形式だったり、カッコがある場合はこんな風にくっつけても問題ないです。

foreach($a[0]as$b){}
foreach(explode(',',$a)as$b){}

要するにちゃんとパースしてくれそうな形式ならas前後にスペースはいらないということですね。

可変変数を使う

可変変数の詳しい説明はこちらPHP: 可変変数 - Manual

例えばa,b,cという文字が出現する回数を数える場合、普通ならこんな感じにかけます。

for(;$i=fgetc(STDIN);){++$a[$i];}
foreach(str_split("abc")as$v){echo $a[$v];}

ここで可変変数を使うとこうかけたりします。

for(;$i=fgetc(STDIN);){++$$i;}
foreach(str_split("abc")as$v){echo $$v;}

可変変数は使い方によっては結構文字数減らせるので面白いです。

echoする際には""をのぞける場合もある

例えば下記のようなコードは、

echo "test";

このように書き直すことができます。

echo test;

これは、phpの未定義の定数を使用した際の挙動を利用したものです。

詳しくはこちらPHP: 構文 - Manual

可変関数を使う

可変変数の次は可変関数です。

こちらは複数回同じ関数を使う際に有効になります。

可変関数の詳しい説明はこちらPHP: 可変関数 - Manual

例えばこんな感じで同じ関数を使用するとき

echo implode($a);
echo implode($b);
echo implode($c);
echo implode($d);
echo implode($e);

可変関数を使うと結構文字数を削減できます。

$i=implode;
echo $i($a);
echo $i($b);
echo $i($c);
echo $i($d);
echo $i($e);

ただ、実際は同じ関数使う部分は極力一か所にまとめたりするので、可変関数は使う機会が限られるかもしれません。

phpのショートタグを使う

通常php

<?php echo "test";

というコードは、

<?="test";

というように書くことができます。

一番最初にforなどの制御構造が来てしまう場合は使うのは難しいですが、使える状況だと結構削れます。

終わりに

他にも色々あった気がするのですが、今のところぱっと思い出せるのがこれくらいなので、思い出し次第適宜追記していきたいと思います。

codegolfをやってみると、今まで知らなかった言語の仕様なども知れるので、初めて触る言語の勉強にもちょうどいいと思います。

ということで、一緒にcodegolfやりましょう