1
1

コードゴルフ大会開催のために、コードが合っているかを判定する処理を作成する

Last updated at Posted at 2024-05-04

はじめに

こんにちは、エンジニアの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()で保存した出力結果を取得することができます。

課題

今回は仲間内でやるのでセキュリティのことは特に考えないで作成してしまったのですが、課題としてしっかりとセキュリティについて考えなくてはいけないと思います。

おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました!

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1