Euler/euler24.php

62 lines
1.5 KiB
PHP
Raw Normal View History

2015-11-22 20:02:12 +01:00
<?php
/*
* Gnieark's anwser to euler problem 24
* https://projecteuler.net/problem=24
*/
/*
0,1,2,3,4,5,6,7,8,9
0,1,2,3,4,5,6,7,9,8
0,1,2,3,4,5,6,8,7,9
0,1,2,3,4,5,6,8,9,7
0,1,2,3,4,5,6,9,7,8
0,1,2,3,4,5,6,9,8,7
0,1,2,3,4,5,7,6,8,9
*/
$arrayToPermut=array(0,1,2,3,4,5,6,7,8,9);
for($i=1;$i<1000000;$i++){
$arrayToPermut=lexicographic_permut($arrayToPermut);
}
echo implode("",$arrayToPermut)."\n";
function permut($index1,$index2,$arr){
$temp=$arr[$index1];
$arr[$index1]=$arr[$index2];
$arr[$index2]=$temp;
return $arr;
}
function lexicographic_permut($arr){
// dans le sens unités (rang 9) -> dizaines (rang 8) -> centaines (rang 7) ....
// trouver la première position où le chiffre de rang n est supérieur à celui de rang n-1
$index1=count($arr) -2;
while($arr[$index1] >= $arr[$index1+1]){
$index1--;
if($index1 == -1){
//l'array est déja totalement inversé (1,2,3) => (3,2,1)
return false;
}
}
//trouver un nombre plus grand que celui trouvé avant : $arr[$index1]
for($index2 = count($arr) - 1 ; $arr[$index2] <= $arr[$index1]; $index2--){}
//les permutter
$arr=permut($index1,$index2,$arr);
//mettre ce qui suit $index1 dans l'ordre
$partOfArr=array();
for($i = $index1+1; $i < count($arr); $i++){
$partOfArr[]=$arr[$i];
}
sort($partOfArr);
$j=0;
for($i = $index1+1; $i < count($arr); $i++){
$arr[$i]=$partOfArr[$j];
$j++;
}
return $arr;
}