Added solution for ProjectEuler/025: php, ruby
This commit is contained in:
@ -5,7 +5,8 @@ desc: |
|
||||
A permutation is an ordered arrangement of objects. For example, 3124 is one possible permutation of the digits 1, 2, 3 and 4. If all of the permutations are listed numerically or alphabetically, we call it lexicographic order. The lexicographic permutations of 0, 1 and 2 are:
|
||||
012 021 102 120 201 210
|
||||
What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9?
|
||||
todo: Improve algorithm -
|
||||
solution: Bruteforce
|
||||
|
||||
solutions:
|
||||
solutions:
|
||||
solve.php:
|
||||
desc: Basic Solution
|
||||
language: php
|
@ -1,25 +1,26 @@
|
||||
<?php
|
||||
function fac($number) {
|
||||
if($number == 1)
|
||||
return 1;
|
||||
return $number * fac($number-1);
|
||||
}
|
||||
$result = array(0,0,0,0,0,0,0,0,0,0);
|
||||
define('NUM_PERMUTATION',1000000);
|
||||
define('DIGITS',9);
|
||||
$target = NUM_PERMUTATION - 1;
|
||||
|
||||
$endsteps = 1000000;
|
||||
$cstep = 0;
|
||||
$cdigit = 9;
|
||||
while($cdigit != 0) {
|
||||
|
||||
do{
|
||||
$result[9-$cdigit]++;
|
||||
$cstep += fac($cdigit);
|
||||
} while ($cstep < $endsteps) ;
|
||||
|
||||
echo "Done with $cdigit - steps:$cstep\n";
|
||||
$cdigit--;
|
||||
$digits = range(0, 9);
|
||||
$permus = array(1 => 1);
|
||||
for ($i = 2; $i <= 9; $i++) {
|
||||
$permus[$i] = $permus[$i - 1] * $i;
|
||||
}
|
||||
echo "DONE!";
|
||||
print_r($result);
|
||||
echo " - ".$cstep ."\n";
|
||||
echo "Result: 2783915460";
|
||||
$permus = array_reverse($permus);
|
||||
$values = array();
|
||||
|
||||
foreach ($permus as $n) {
|
||||
$values[] = floor($target / $n);
|
||||
$target = $target%$n;
|
||||
}
|
||||
|
||||
$result = "";
|
||||
foreach ($values as $val) {
|
||||
$result .= $digits[$val];
|
||||
unset($digits[$val]);
|
||||
sort($digits);
|
||||
}
|
||||
$result .= $digits[0];
|
||||
echo $result;
|
||||
|
30
ProjectEuler/025/desc.yml
Normal file
30
ProjectEuler/025/desc.yml
Normal file
@ -0,0 +1,30 @@
|
||||
title: What is the first term in the Fibonacci sequence to contain 1000 digits?
|
||||
url: http://projecteuler.net/problem=25
|
||||
|
||||
desc: |
|
||||
The Fibonacci sequence is defined by the recurrence relation:
|
||||
|
||||
Fn = Fn1 + Fn2, where F1 = 1 and F2 = 1.
|
||||
Hence the first 12 terms will be:
|
||||
|
||||
F1 = 1
|
||||
F2 = 1
|
||||
F3 = 2
|
||||
F4 = 3
|
||||
F5 = 5
|
||||
F6 = 8
|
||||
F7 = 13
|
||||
F8 = 21
|
||||
F9 = 34
|
||||
F10 = 55
|
||||
F11 = 89
|
||||
F12 = 144
|
||||
The 12th term, F12, is the first term to contain three digits.
|
||||
|
||||
What is the first term in the Fibonacci sequence to contain 1000 digits?
|
||||
solution: Bruteforce
|
||||
|
||||
solutions:
|
||||
solve.php:
|
||||
desc: Basic Solution
|
||||
language: php
|
13
ProjectEuler/025/solve.php
Normal file
13
ProjectEuler/025/solve.php
Normal file
@ -0,0 +1,13 @@
|
||||
<?php
|
||||
define('DIGITS',1000);
|
||||
|
||||
$current = 1;
|
||||
$prev = 1;
|
||||
$term = 2;
|
||||
while(strlen($current) < DIGITS) {
|
||||
$term++;
|
||||
$next = bcadd($current,$prev);
|
||||
$prev = $current;
|
||||
$current = $next;
|
||||
}
|
||||
echo $term;
|
13
ProjectEuler/025/solve.rb
Normal file
13
ProjectEuler/025/solve.rb
Normal file
@ -0,0 +1,13 @@
|
||||
DIGITS = 1000
|
||||
|
||||
max = 10 ** (DIGITS-1)
|
||||
fcurrent = 1
|
||||
fprev = 1
|
||||
term = 2
|
||||
while fcurrent < max do
|
||||
term = term + 1
|
||||
fnext = fcurrent + fprev
|
||||
fprev = fcurrent;
|
||||
fcurrent = fnext;
|
||||
end
|
||||
puts term
|
Reference in New Issue
Block a user