Paiza のスキルチェック

Paiza は、プログラマ向けの転職サイトで、スキルチェック のサービスを行っています。

プログラマのレベルは割と数値化しにくいと感じます。

しかし、これに対して、ざっくりレベルであっても、客観的な指標を得られることはありがたいです。

また、純粋に面白い問題が多数あり、良い力試しになります。

スキルチェックのポイント

Paiza スキルチェックのポイントはいくつかあります。

まず、入出力は 標準入力、標準出力 に限られます。

コード提出後

  • コードの実行(標準入力による値の取得、計算処理)
  • 標準出力
  • 正誤の判定

が行われますが、標準出力でフォーマットがずれていたりすると正答になりません。

また、評価のポイントは

  • 複数テストケースの正答率
  • コードの記述時間
  • 実行速度
  • メモリ消費量

であると明記されています。

コードの中身自体の評価の対象外 であるため、なんの工夫のないコードであっても、出力値が正解であれば加点されます。


スキルチェックのリリース当初は 「コードのロジック」まで評価していた記憶があるのですが、変わったのでしょう。
レビューはコストが掛かりますからね。

値取得、出力のサンプルコード

前出の通り、 Paiza スキルチェックは標準入力、標準出力が基本であり、ここでコケてしまうと何にもできません。

そのため、言語別に 値取得、出力のサンプルコード が提供されています。

Paiza
プログラミングスキルチェックとは(練習問題) > 値取得、出力のサンプルコード
https://paiza.jp/guide/samplecode

今回はこちらの PHP について解説をしてみます。


はじめに、乳力、出力、サンプルコードを上記ページよりそれぞれ引用いたします。

入力される値

12
22 5
33 4

期待する出力

1hello = 2 , world = 5
2hello = 3 , world = 4

PHP コード

1<?php
2$input_line = trim(fgets(STDIN));
3for ($i = 0; $i < $input_line; $i++) {
4  $s = trim(fgets(STDIN));
5  $s = str_replace(array("\r\n","\r","\n"), '', $s);
6  $s = explode(" ", $s);
7  echo "hello = ".$s[0]." , world = ".$s[1]."\n";
8}
9?>

この記事では、このプログラムコードを paiza_io_sample.php という名前で保存しました。

入出力を攻略する

コマンドラインから PHP を実行する

PHP は Web のプログラミング言語ですが、コマンドラインから実行することもできます。

Web サーバを通差ないと動かない、というわけではないのですね。

コマンドライン

  • macOS ならターミナル
  • Windows なら PowerShell

などを起動し

1php -f [PHPファイル名]

とすることで、PHP ファイルをコマンドライン実行することができます。

キーを入力してみる

はじめに、保存した「値取得、出力のサンプルコード」を、コマンドラインから実行します。

1$ php -f paiza_io_sample.php

実行すると、ターミナルは「入力待ち」となります。


「入力される値」は次でした。

12
22 5
33 4

これは具体的には、PHP を実行後に

12 [Enter]
22 5 [Enter]
33 4 [Enter]

といったキー入力を期待しています。

[Enter] は改行するタイミングを示しており、実際にこうタイプするわけではありません。


ではターミナルに値を入力してみましょう。

1 行目 2 を入力します。

12

とすると、このときは何も出力されません。

続けて 2 行目 2 5 を入力します。

12 5

すると、

1hello = 2 , world = 5

というように、 hello = 2 , world = 5 が、プログラムから出力されます。

最後に 3 行目 3 4 を入力します。

13 4

すると、

1hello = 3 , world = 4

というように、 hello = 3 , world = 4 が、プログラムから出力されます。


起動から入力完了まで、ターミナルでは次のような表示になると思います。

1$ php -f paiza_io_sample.php [Enter]
22 [Enter]
32 5 [Enter]
4hello = 2 , world = 5
53 4 [Enter]
6hello = 3 , world = 4

プログラムの解説

標準入力からの入力待ち

「値取得、出力のサンプルコード」を再掲します。

1<?php
2$input_line = trim(fgets(STDIN));
3for ($i = 0; $i < $input_line; $i++) {
4  $s = trim(fgets(STDIN));
5  $s = str_replace(array("\r\n","\r","\n"), '', $s);
6  $s = explode(" ", $s);
7  echo "hello = ".$s[0]." , world = ".$s[1]."\n";
8}
9?>

このサンプルコードのうち、入力待ちを実現しているのは次のコードです。

1$input_line = trim(fgets(STDIN));

STDIN は標準入力のストリームで、 fgets() と組み合わせることで、 Enter キーが押されるまで入力を待つ という挙動となります。


入力まちは、 2 行目、 4 行目の2回書かれていますね。

2 行目は

1$input_line = trim(fgets(STDIN));

です。

受け取った値を

1for ($i = 0; $i < $input_line; $i++) {

というように for の条件に与えていて、「何回ループを実行するか」を決めるために用いられます。

4 行目は

1  $s = trim(fgets(STDIN));

です。

1  $s = trim(fgets(STDIN));
2  $s = str_replace(array("\r\n","\r","\n"), '', $s);
3  $s = explode(" ", $s);
4  echo "hello = ".$s[0]." , world = ".$s[1]."\n";

というように、 2 53 4 のようにな文字を受け取り、

空白で分割し、

分割した値を、メッセージの雛形に流し込み出力、

という処理になっています。

また、 7 行目の echo が、標準出力になっています。


Paiza
プログラミングスキルチェックとは(練習問題) > 値取得、出力のサンプルコード
https://paiza.jp/guide/samplecode

のサンプルコードを丁寧目に解説してみました。

標準入力をまとめて実行する

さて、実際にプログラムを入力、テストする場合、何度も入力、Enter を繰り返すのは手間です。

次のように、標準入力で入力する予定の値を、実行コマンドにまとめる事ができます。

1$ echo $'2\n2 5\n3 4\n' | php -f paiza_io_sample.php

実行すると、次の結果が得られ、標準入力から期待通りに受け取れることを確認することができます。

1$ echo $'2\n2 5\n3 4\n' | php -f paiza_io_sample.php
2hello = 2 , world = 5
3hello = 3 , world = 4

バリバリコードを書いて、ドンドンスキルアップしてください!