PHP 本日の課題 「7」がいくつあるか数えてください。PART2

┏━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ ■例題                     ┃
┃ 1からnまで連続する正の整数があります。    ┃
┃ それらの中に「7」がいくつあるか数えてください。┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━┛

秤にかけられたアルバイトのkoda、PART2です。
前回の課題に対して、物言いがはいりました。
目標達成でOKだったのですが、【数を分解してカウントする関数を作る】という話しでもう一度コーディングをしたところ、またまた失敗しました

タイムリミットは1時間

結果

↓ ↓ ↓

所要時間【44:37】

 <?php

 $n=100;
 $delim = "<br />";
 $total_count7=0;

 for($i=1;$i<=$n;$i++){
 $str_i = (string)$i;
 $count7=substr_count2($str_i,"7");
 if($count7!=0){
 print($str_i.":".$count7.$delim);
 }
 
 $total_count7+=$count7;
 
 }

 print("合計:".$total_count7);


 function substr_count2($str_i,$str_tgt){

 $i_len = strlen($str_i); //文字の幅
 $rtn_i = 0; //文字列に任意の文字がいくつ入っているか

 for($i=0;$i<=$i_len-1;$i++){
 if(substr($str_i,$i,1) === $str_tgt){$rtn_i++;}
 }

 return $rtn_i;

 }

結果も前回同様。

灰色の部分は前回と同じ。substr_countという標準の関数を使用せずにsubstr_count2という自作の関数を使用。
目的達成という意味では問題なかったのですが…

結論としては、出題者の意図と違っていて捉えていました。
【数を分解してカウントする関数を作る】
とのことですが、

「これじゃ、標準の関数と速度あまりかわらないんじゃない?」

「…え? そういうことだったんですか(汗)」→勉強のために標準の関数を同様のものを作れということだと勘違い

ということで、もしかしたら次回は高速化された関数が課題に出されるかも…と思っています

お恥ずかしい結果になりましたが、これで気がつかされたのは…どこまでも頭のなかで形作ることはそれほど難しくない。

ところが、それを形に表すときに、どんな関数があるの? なんで動かないの? という部分が大半をしめるのだなぁと。

デバッグ力が必要です

関連してそうなエントリ

koda