【poh7】プログラミングで猫耳とメイド服の彼女をつくった(PHP編その2)
安藤 杏さん(アンドロイドらしい)から「猫耳やメイド服をプレゼントしてほしいの!」というメールが今日来たので、お願いを叶えてあげないといけませんね!
前回の
は大分遅れて参加したのですが、
そのおかげで、今回の新アイテム追加のコーディングが久しぶり感がなく出来ました。
このページにいきなり来て、詳細が分からない方は、前回のページを見るとどんな感じか分かるかと思います。
今回もPHPでの解答例なんかを書いていきます。
猫耳セット
文字列中の「cat」の数を数える問題です。
<?php
echo substr_count(fgets(STDIN), 'cat');
?>
解説
さすがPHPです。
痒い所に手が届くレベルの標準関数を提供していますね。
substr_countは文字列の中の文字列の出現回数を数える関数です。
なので、そのままです。
猫セット
文字列の中からcとaとtを見つけて、catが出来るかとかいくつ足りないかとか出力する問題です。(適当)
<?php
$s = fgets(STDIN);
$a = array(substr_count($s, 'c'), substr_count($s, 'a'), substr_count($s, 't'));
$m = max($a);
echo min($a), "\n", $m - $a[0], "\n", $m - $a[1], "\n", $m - $a[2];
?>
解説
猫耳セットの応用編です。
後で生かすために、配列に文字列中の「c」の数、「a」の数、「t」の数を入れておきます。
catという文字列は「c」「a」「t」の中で最低の数分しか出来ないのでmin()で出します。
それぞれの文字が、いくつ足りないかはmax()からそれぞれの文字の個数を引けばよいです。
ちにみに、前回より改善した点はechoの書き方です。
一度文字列として全部結合し、その文字列をechoで出力するよりも、カンマ区切りで書いた方が効率的なので、そうすることにしました。
(echoはカンマ区切りにすると左から順に出力します。)
メイド服セット
睡眠時間を時刻形式で出力する問題です。
<?php
for ($i = trim(fgets(STDIN)); $i > 0 ; $i --) {
$m = 1500 - trim(fgets(STDIN)) / 3;
printf("%02d:%02d\n", intval($m / 60) % 24, $m % 60);
}
?>
解説
一見難しそうな問題ですが、そんなに難しくはありません。
3行目に1500という謎の数字が出てきていますね。
実際のコードでこんな感じで数値を直に書いてはいけません!
define('REFERENCE_MINUTE', 24 * 60 + 60); // 01:00を基準とするための数値 24時間×60分+60分
とでも書いて、REFERENCE_MINUTEを使えばよいでしょう。本来は。
残業を全くしない場合、朝7時の6時間前、つまり、01:00に寝るので、そこが基準の時間となります。
分単位で計算するので、24時×60分+60分の1500(分)が基準値になるわけです。
残業すると基準値1500(分)から残業時間(分)の1/3だけ睡眠時間が前にずれるので、3行目で1500から残業時間の1/3を引いています。
次に寝る時間です。
「時」は単純に60(分)で割って切り捨てると出ます。
ただし、夜中の0時を過ぎたときに、また1からの表記とするため、24で割った余りにします。
25時が1時になる理屈ですね。
「分」の部分は60で割った余りです。
それらをprintfで時間の形式に合わせて出力します。
という長ったらしい説明は4行のコードで終わります。
最後に
こんな感じになりました。
部屋で猫耳を付けて猫を肩に乗せメイド服でニッコリ笑う。
うーん、まさに異常空間。