/* IPv4 の正常パターン 1. 「.」が3つ ***DONE!!! 2. 各「.」と「.」の間の数字は、1桁〜3桁 3. 数字の最大数は、「255」 4. 1文字ずつ分割したときに、最大の文字数は、「15文字」 */ $n = trim(fgets(STDIN)); $arr = []; $arrAns = []; // ture, or false を格納する配列 for($i = 0; $i < $n; $i++) { $arrOneRow[] = trim(fgets(STDIN)); $arr[] = str_split($arrOneRow[$i]); } // 2. , 3. の条件 function checkDotFormat($array) { $parts = explode(".", $array); // dot 区切りで配列化 // $i < 4 の理由:IPv4 は、数字は、4セットだから。かつ、 // 既にif文で, dot は3つに制限されているから,$parts の index番号も 0~3 に制限されている。 for($i = 0; $i < 4; $i++) { $partsStr = strval($parts[$i]); // 文字化 // 1桁以上3桁以下、かつ、各数字は、255 以下 if (strlen($partsStr) >= 1 && strlen($partsStr) <=3 && $parts[$i] <= 255) { return true; } else { return false; } } } $i = 0; while($i < $n) { // 1., 4. の条件 if ( count($arr[$i]) <= 15 && // IPv4 は、最大15文字 substr_count($arrOneRow[$i], '.') === 3 && // dot は、3文字 checkDotFormat($arrOneRow[$i])) { foreach ($arr[$i] as $k => $v) { // $k は、値のキーを指す(index番号)。 if ($k === 0 && $v === '.') { // 先頭が、dot ならfalse $arrAns[] = "False"; break; } } $arrAns[] = "True"; } else { $arrAns[] = "False"; } $i++; } foreach ($arrAns as $v) { echo $v . PHP_EOL; }