はじめに
こんにちは、エンジニアのkeitaMaxです。
今回は仲間内でコードゴルフ大会を開催しようと思い、そのために書いたコードがあっているかどうかを判定する処理を書こうと思います。
今回はPHPで実施する予定で、コードを送信するフロンタ側はNext.js、判定する処理を作成するAPI側はLaravelで書く予定です。
コードゴルフとは
コードゴルフはコンピュータプログラミング・コンテストの一種。参加者は与えられたアルゴリズムを、可能な限りもっとも短いソースコードで記述することを競う[1]。バイナリサイズではなく、ソースコードの文字数がスコアとなる。「Perl golf」など、トーナメントで使用されるプログラミング言語の名前がつけられることもある。ショートコーディング、コードパズル等とも呼ばれる[2]。
(引用:https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B4%E3%83%AB%E3%83%95)
Wikipediaでは上記のように書かれています。
あるお題に対して、どれだけ短いソースコードで実装できるかを競い合う遊びです。
可読性や保守性を度外視してとにかく短くするものとなっています。
実装
function codeExecutionOutput($code){
ob_start();
eval($code);
$output = ob_get_clean();
return $output;
}
こんな感じで実装しました。
'echo("hello")'をこの関数にいれると、hello
と返ってきます。
$code = 'echo("hello")';
$result = codeExecutionOutput($code);
echo($result);
// hello と出力される
参考記事
解説
ob_start()
出力のバッファリングを有効にする
この関数は出力のバッファリングをオンにします。 出力のバッファリングを有効にすると、 (ヘッダ以外の) スクリプトからの出力は実際には行われず、 代わりに内部バッファに保存されます。
(引用:https://www.php.net/manual/ja/function.ob-start.php)
echo
などで出力した結果を内部で保存することができます。
eval($code)
文字列を PHP コードとして評価する
(引用:https://www.php.net/manual/ja/function.eval.php)
文字列をPHPのコードとして実行することができます。
ob_get_clean()
アクティブな出力バッファの内容を取得し、そのバッファをオフにする
(引用:https://www.php.net/manual/ja/function.ob-get-clean.php)
ob_start()で保存した出力結果を取得することができます。
課題
今回は仲間内でやるのでセキュリティのことは特に考えないで作成してしまったのですが、課題としてしっかりとセキュリティについて考えなくてはいけないと思います。
おわりに
この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。
最後まで読んでいただきありがとうございました!