http://qiita.com/Nabetani/items/7c46e8409c456e8fabd1
http://nabetani.sakura.ne.jp/hena/ord9nummake/
与えられたカードから4桁の順列を作る問題です。
解く方法は、カードから順列を作成する方法と、全数探査のふたつにおおまかにわけられるでしょう。
Rubyだとpermutationなどという反則メソッドがありますが、何故かPHPにはありません。
全数探査で解いてみます。
今回は全数が9000個しかなかったので手っ取り早くforeachで回してます。
これが今度は6桁7桁の順列を作る、とかになったらカードから順列を作成する方法を取らないといけなくなるでしょう。
かかった時間は2時間程度。
最初カードから順列で作ろうとしてめんどくさいことになり、全数探査で作り直したら30分で終わったとかいう。
「オフラインリアルタイムどう書く」の一覧
http://nabetani.sakura.ne.jp/hena/ord9nummake/
与えられたカードから4桁の順列を作る問題です。
解く方法は、カードから順列を作成する方法と、全数探査のふたつにおおまかにわけられるでしょう。
Rubyだとpermutationなどという反則メソッドがありますが、何故かPHPにはありません。
全数探査で解いてみます。
<?php class NUMMAKE{ /** * 4桁の数を作って指定番目の値を返す * @param String 「13:01167」みたいな文字列 * @return String 1109 (01167で作れる数のうち13番目)、無しの場合は「-」 */ public function get($input){ $nowCount = 0; // 入力を分解 list($count, $tmp) = explode(':', $input); $tmp = str_replace('9', '6', $tmp); $nums = array_fill(0, 9, 0); for($i=0; $i<strlen($tmp); $i++){ $nums[$tmp[$i]]++; } foreach(range('1000', '9999') as $int){ $numbers = $nums; $str = str_replace('9', '6', $int); // 適合しなければ次に進む for($i=0; $i<strlen($str); $i++){ if($numbers[$str[$i]]-- <= 0){ continue 2; } } if(++$nowCount >= $count){ // 規定番目がみつかった return (string)$int; } } // 見つからなかった return '-'; } } // テスト $test = [ ['13:01167', '1109'], /* 省略 */ ]; $num = new NUMMAKE(); foreach($test as $key=>$data){ $answer = $num->get($data[0]); if($answer !== $data[1]){ print('えらー'); } }
今回は全数が9000個しかなかったので手っ取り早くforeachで回してます。
これが今度は6桁7桁の順列を作る、とかになったらカードから順列を作成する方法を取らないといけなくなるでしょう。
かかった時間は2時間程度。
最初カードから順列で作ろうとしてめんどくさいことになり、全数探査で作り直したら30分で終わったとかいう。
「オフラインリアルタイムどう書く」の一覧
PR