0
0

More than 3 years have passed since last update.

【PHP】恐竜コンビネーション(r種類までの組み合わせか、r種類の組み合わせか)

Posted at

1.nCrと再会

懐かしい。
本当に懐かしい。
見ているだけならば。
高校数学の此奴を使う出番があるとは思わなかった。
paizaを解いていくと、コンビネーションが必要になる事がある。
備忘録として、7種類のうち〇〇種類を組み合わせるか、または1から〇〇種類までの
組み合わせが欲しいときについて、まとめることにした。

2.コード

恐竜一覧が表示された後に、プルダウンとラジオボタンで出力項目を選択して「確定ボタン」を押す。

数字の(1,2,3)の中の2つの数字の組み合わせは(12,13,23)になる。
ここで注意したいのが一桁目の数値より大きい数値が後ろにくるように作成すればいいことがわかる。
get_combi1でこの性質を利用して作成している。

combi_php2.php

<!DOCTYPE html>
<html lang="ja">
<meta charset="utf-8">
<title>組み合わせ</title>
<h1>組み合わせ</h1>

<?php   
  $array_dino=['Tyrannosaurus','Velociraptor','Stegosaurus','Indoraptor','IndominusRex','Triceratops','Brachiosaurus'];
 ?>
<form action="combi_php2.php" method="post">


<?php 
  echo "恐竜一覧:<br>";
  for($i=0;$i<count($array_dino);$i++){
    echo $array_dino[$i]."<br>";
  }

 ?>  

<select name="type_num">
  種類:
<?php   
  for($i=1;$i<count($array_dino);$i++){
    echo "<option>".$i."</option>";
  }
 ?>
</select>

<input type="radio" name="radio_d" value="all_combi" checked>総組み合わせ
<input type="radio" name="radio_d" value="combi">組み合わせ
<input type="submit" value="確定" name="btn2">
</form><br>




<?php 

  $dnum=isset($_POST['type_num'])?htmlspecialchars($_POST['type_num']):null;
  $input_num=count($array_dino);
  $flg=0;
  $arr_all_comb=[];
  $arr_comb2=[];
  for($i=0;$i<$input_num;$i++){
    $arr_all_comb[]=$i;
    $arr_comb2[]=$i; 
  }


  for($i=0;$i<$dnum-1;$i++){
    $str_join=join(" ",$arr_comb2);
    $retstr=get_combi1($input_num,$str_join);
    $arr_split=explode(" ",$retstr);
    $arr_comb2=[];
    for($j=0;$j<count($arr_split);$j++){
      //$i+1種類までの組み合わせ
      $arr_all_comb[]=$arr_split[$j];
      //$i+1種類の組み合わせ
      $arr_comb2[]=$arr_split[$j];
      //echo $arr_split[$j]."<br>";
    }
  }

  if(isset($_POST['btn2'])){
    if($_POST['radio_d'] == "all_combi"){
      echo $dnum."種類までの組み合わせを表示<br>";
      for($i=0;$i<count($arr_all_comb);$i++){
        //echo $arr_all_comb[$i]."<br>";
        echo replace_word($arr_all_comb[$i],$array_dino)."<br>";

      }
    }else{
      echo $dnum."種類の組み合わせを表示<br>";

      for($i=0;$i<count($arr_comb2);$i++){
        //echo $arr_comb2[$i]."<br>";
        echo replace_word($arr_comb2[$i],$array_dino)."<br>";
      }
    }  
  }


  function get_combi1($n,$str_j){

    $tmp_ar=[];
    $arr_s=explode(" ",$str_j);

    for($i=0;$i<count($arr_s);$i++){
      //$num=substr($arr_s[$i],strlen($arr_s[$i])-1,1);
      $num_arr=explode(",",$arr_s[$i]);
      //一番最後の要素
      $num0=$num_arr[count($num_arr)-1];
      //echo $num0."<br>";
      for($j=$num0+1;$j<$n;$j++){
        $retstr=$arr_s[$i].",".$j;
        $tmp_ar[]=$retstr;
      }
    }
    $join_str=join(" ",$tmp_ar);
    //echo $join_str."<br>";
    return $join_str;
  }


  function replace_word($str0,$arr_rep){
    $ar_in=explode(",",$str0);
    $tmp_ar=[];
    for($i=0;$i<count($ar_in);$i++){
      for($j=0;$j<count($arr_rep);$j++){
        if($ar_in[$i] == $j){
          $tmp_ar[]=$arr_rep[$j];

          break;
        }
      }
    }  
    return join(",",$tmp_ar);
  }
 ?>  
</html>

実行例

組み合わせ選択時(4種類)

php_paiza_combi.jpg

ある個数までの組み合わせ(総組み合わせ)選択時

php_paiza_combi2.jpg
php_paiza_combi3.jpg

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0