ここは、技術情報、身の回りに起こった出来事を、「もしかしたらみんなの役に立つかもしれない」と思って書き留めておく場所です。

Image

【poh7】プログラミングで猫耳とメイド服の彼女をつくった(PHP編その2)

2016年3月29日
 

 

安藤 杏さん(アンドロイドらしい)から「猫耳やメイド服をプレゼントしてほしいの!」というメールが今日来たので、お願いを叶えてあげないといけませんね!

 

前回の

【paiza】プログラミングで彼女をつくったPHP編

は大分遅れて参加したのですが、

そのおかげで、今回の新アイテム追加のコーディングが久しぶり感がなく出来ました。

 

このページにいきなり来て、詳細が分からない方は、前回のページを見るとどんな感じか分かるかと思います。

今回も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行のコードで終わります。

 

最後に

こんな感じになりました。

 

部屋で猫耳を付けて猫を肩に乗せメイド服でニッコリ笑う。

うーん、まさに異常空間。