AtCoderをちょっと触ってみる
競技プログラミングがしたいとかではない。むしろ何においても急ぐのは苦手。
しかし「これを成さねば」との課題があった際にどのように解決するか、というのを揉むパズルは好きなので、やってみる。
過去問については自サイト上などで言及しても問題なさそう。
過去問 第一回 A:2 倍チェック
だいぶ撃沈した(された)。
提出 #74178630 - 第一回 アルゴリズム実技検定 過去問
function a($str) {
return (is_int($str)) ? (int) $str * 2 : 'error';
}
提出 #74178723 - 第一回 アルゴリズム実技検定 過去問
$str = trim(fgets(STDIN));
echo (is_numeric($str)) ? (int) $str * 2 : 'error';
他の人のを見て標準入力を使うのだと理解した。
提出 #74178895 - 第一回 アルゴリズム実技検定 過去問
$val = trim(fgets(STDIN));
if (strlen($val) == 3 and is_numeric($val)) {
echo (int) $val * 2;
} else {
echo 'error';
}
ここではまだ何が駄目なのか根本の部位を理解していない。以下で気づく。
提出 #74179063 - 第一回 アルゴリズム実技検定 過去問
<?php
$val = trim(fgets(STDIN));
if (strlen($val) == 3 and is_numeric($val)) {
echo (int) $val * 2;
} else {
echo 'error';
}
PHP宣言がないとそれは全部標準出力でしょということだ。
提出 #74179090 - 第一回 アルゴリズム実技検定 過去問
<?php
$str = trim(fgets(STDIN));
echo (is_numeric($str)) ? (int) $str * 2 : 'error';
これも通った。3文字チェックとかはしていないので要件を満たしてはいない予感。短いけどちゃんとはしていない。
過去問 第二回 A:エレベーター
提出 #74179598 - 第二回 アルゴリズム実技検定 過去問
<?php
$arr = [
'B9' => 0
, 'B8' => 1
, 'B7' => 2
, 'B6' => 3
, 'B5' => 4
, 'B4' => 5
, 'B3' => 6
, 'B2' => 7
, 'B1' => 8
, '1F' => 9
, '2F' => 10
, '3F' => 11
, '4F' => 12
, '5F' => 13
, '6F' => 14
, '7F' => 15
, '8F' => 16
, '9F' => 17
];
[$s, $t] = array_map(null, explode(' ', trim(fgets(STDIN))));
$sec = abs($arr[$s] - $arr[$t]);
echo $sec;
問題文を読みながら愚直に配列を書いた。絶対値で取れば良いだろうの実装。
第一回での失敗を踏まえて、手元のIDEで軽くテストも回した上で提出した。手元でもCLIから叩く環境を作っておいた方が良いのかも知れないが、今回はLaravel上で書いた。
ChatGPTによる評価
[$s, $t] = array_map(null, explode(' ', trim(fgets(STDIN))));
標準入力から複数の変数に入れるのにはこれをコピペすれば良さそう、と思ったがChatGPT には後追いで
[$s, $t] = explode(' ', trim(fgets(STDIN)));
これにしなよと言われた。なるほどこっちの方が知ってる。でも上のを使ってみろと言ってくれたのもお前やで。
第一回のやつでたまたま通ってるけどこれも可愛くはないようだ。
is_numeric($val)
色々余計なものも true で返るのでちゃんとリファレンスを振り返ろう。
数字の文字列のみであるかを見たいならこちらとのこと。
ctype_digit($s)
第二回の問題は B をマイナス、Fをプラスと見做して処理するのも面白いっぽい。0階はないので補正は必要。
とかとか、解説されるとなるほどとは思うけれど、やってる最中には中々思い至らないものだな。
AtCoderをPHPでやる人はそう多くないらしい。Pythonでやるのも良さそうだけれどどうしようかな、慣れるまではPHPで遊ぼう。
それはそうと一度提出してしまうと、ウンコードでもそこに残り続けてしまうのは中々恥ずかしい。