@Allexio
Программист-путешественник.

Нормально ли сделал тестовое задание на PHP (числа Фибоначчи)?

Привет,

Работал почти всегда на себе, нет опыта в тестовых заданиях. Вот работодатель скинул три задания, сделал одно для интереса, попинайте.. как в общем с оформлением/алгоритмом, в таком ключе нормально будет?

Скажу сразу, алогоритм сам написал, да есть в сети тыщи вариантом, в том числе через рекурсию, но уж очень наворочено как-то.. да красиво, но не совсем понятно )

Короче вот задание (я его изменил немного):

Дан массив [3279, 920, 4181, 8, 1, 4360, 407, 9950, 2098, 8579, 4914, 7204, 8875]. В нем нужно найти числа Фибоначчи ( 1, 1, 2, 3, 5, 8, 13, 21...), затем вычислить сумму.


Вот что получилось:
<?php

// PHP Version 7.4.11

// Функция, формирующая массив чисел Фибоначчи
function getFibonacci($number, $fibonacciNumbers)
{
    $countNumbers = count($fibonacciNumbers);
    $number1 = $fibonacciNumbers[$countNumbers - 2];
    $number2 = $fibonacciNumbers[$countNumbers - 1];
    if ($number1 + $number2 == $number) {
        $fibonacciNumbers[] = $number;
    }
    return $fibonacciNumbers;
}

// Исходный массив
$inputNumbers = [3279, 920, 4181, 8, 337, 13, 918, 4923, 1,
    4448, 8, 4756, 4012, 7467, 89, 21, 9238, 2326, 6453, 89, 4606,
    3413, 3, 9950, 2098, 8579, 4914, 7204, 8875
];

// Инициализируем массив с первыми тремя числами Фибоначчи
$fibonacciNumbers = array(0, 1, 1);

// Формируем канонический ряд Фибоначчи от нуля до максимального значения, 
// находящегося в исходном массиве
sort($inputNumbers);
$lastFibonacciNumber = $inputNumbers[count($inputNumbers) - 1];
for ($i = 0; $i <= $lastFibonacciNumber; $i++) {
    $fibonacciNumbers = getFibonacci($i, $fibonacciNumbers);
}

// Находим смежные значения в исходном массиве и массиве с числами Фибоначчи,
// обнуляя индексы
$resultFibonacci = array_values(array_intersect($fibonacciNumbers, $inputNumbers));

?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Сумма чисел Фибоначчи из иходного массива</title>
</head>
<body>
<strong>Числа Фибоначчи из иходного массива:</strong>
<?php
for ($i = 0; $i <= count($resultFibonacci) - 1; $i++) {
    ?>
    <span><?= $resultFibonacci[$i] ?></span>
    <?php
}
?>
<br/>
<strong>Сумма чисел Фибоначчи из иходного массива:</strong> <?= array_sum($resultFibonacci) ?>
</body>
</html>
  • Вопрос задан
  • 511 просмотров
Пригласить эксперта
Ответы на вопрос 4
Stalker_RED
@Stalker_RED
А если во входящих данных будет число на несколько тысяч знаков длинной, то ваш скрипт по таймауту отвалится, по переполнению памяти, или за пару лет справится с задачей подсчета всех промежуточных чисел?

// немного кода из википедии

// A utility function that 
// returns true if x is  
// perfect square 
function isPerfectSquare($x) 
{ 
    $s = (int)(sqrt($x)); 
    return ($s * $s == $x); 
} 
  
// Returns true if n is a 
// Fibinacci Number, else false 
function isFibonacci($n) 
{ 
    // n is Fibinacci if one of  
    // 5*n*n + 4 or 5*n*n - 4 or  
    // both is a perferct square 
    return isPerfectSquare(5 * $n * $n + 4) ||  
           isPerfectSquare(5 * $n * $n - 4); 
}


Осталось перебрать и сложить.
$sum = array_reduce($input, function($acc, $n) {
	return isFibonacci($n) ? $acc + $n : $acc;
}, 0);
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Неверно.
$inputNumbers = [3279, 920, 4181, 8, 1, 4360, 407, 9950, 2098, 8579, 4914, 7204, 8875];
$max = max($inputNumbers);
$fib = [];
$f1 = 0;
$f2 = 1;
do {
  $fN = $f1 + $f2;
  $f1 = $f2;
  $f2 = $fN;
  $fib[] = $fN;
} while ($fN < $max);
$sum = array_sum(array_intersect($inputNumbers, $fib));
print $sum;
Ответ написан
AleksandrB
@AleksandrB
Совсем недавно вывел "Hello world"
Я свои пять копеек вставлю не с точки зрения алгоритма, а с точки зрения чистокододрочера:

Это что вообще за дичь? Вы на джуниор битрикс фронтендера устраиваетесь? Вы вообще про ООП слышали? Или что, если для тестового, то можно и по процедурить? Зачем тут вообще html? Это было задание? Ваш код нарушает все принципы современной разработки. Я бы кандидату с таким кодом даже не перезвонил.
Зачем тут комментарии? Вы думаете человек, который будет ревьюить код не поймет что он делает? Или вы обезьяне этот код показываете так что нужно объяснить такую строку
// Инициализируем массив с первыми тремя числами Фибоначчи
$fibonacciNumbers = array(0, 1, 1);

И вы что в нулевых остались? Почему массив создается уродливым array(), а не []?

Ну и да, алгоритм очень плохой. Можно написать короче и симпатичнее.

Моя оценка кода для джуниор php разработчика - 3/10.
Ответ написан
@FirststepsRu
$inputNumbers = [3279, 920, 4181, 8, 337, 13, 918, 4923, 1,
    4448, 8, 4756, 4012, 7467, 89, 21, 9238, 2326, 6453, 89, 4606,
    3413, 3, 9950, 2098, 8579, 4914, 7204, 8875
];
$max_val = max($inputNumbers);
$result_sum = 0;
$fib_prev_prev = 0;
$fib_prev = 1;
$fib_temp = $fib_prev_prev + $fib_prev;
for ($i = 0; $fib_temp <= $max_val; $i++) {
	$found = 0;
	$fib_temp = $fib_prev_prev + $fib_prev;
	$fib_prev_prev = $fib_prev;
	$fib_prev = $fib_temp;
	if (array_search($fib_temp, $inputNumbers)) {
		$found = 1;
		$result_sum += $fib_temp;
	}
	echo $i," - ",$fib_temp, ($found==1 ? " found":""),"\n";
}
echo "Result sum ", $result_sum, "\n";

Сначала я хотел сказать, что реализовали не айс. Подумал, что если в исходном массиве сделать очень большое число, то генерируемый массив сожрет всю память :) Но потом долго смеялся, что уже на 90 числе было переполнение 64-бит и тип стал float. Ведь по большому счету Фибоначчи почти что степень двойки. Никакого такого супер массива сгенерить не получится. Ваш код работает, и мой тоже. Даже не берусь оценивать чей лучше. Хотелось бы увидеть мнение общественности. Мне кажется у меня подход проще.
0 - 1 found
1 - 2
2 - 3 found
3 - 5
4 - 8 found
5 - 13 found
6 - 21 found
7 - 34
8 - 55
9 - 89 found
10 - 144
11 - 233
12 - 377
13 - 610
14 - 987
15 - 1597
16 - 2584
17 - 4181 found
18 - 6765
19 - 10946
Result sum 4316

Возможно по заданию надо это все затолкнуть в массив ? Но чето сформулировано не очень конкретно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽