Приветствую. Находясь в поисках работы решил отправить повторно резюме в одну компанию, куда в феврале уже обращался. В тот раз как и в этот мне прислали тестовое задание из 4 задач. И как и в первый раз так и во второй, мне кажется, что программист, проверяющий решение, меня "прокатил". Что бы разобраться, прошу глянуть на код задание и код. Задача: Код: https://github.com/RomanAngelovskij/Auslogics2015/blob/master/2/array.php Код (Text): <?php $Array = array( 'a' => 1/2, 'b' => 1/8, ); $Chances = new Chances($Array); $Result = array(); for ($i = 0; $i < 1001; $i++){ $index = $Chances->call(); if (!isset($Result[$index])){ $Result[$index] = 0; } $Result[$index]++; } echo '<pre>'; var_dump($Result); echo '</pre>'; class Chances{ private $__Data; private $__calls = 0; public function __construct($Data){ if (empty($Data)){ throw new Exception('Передан пустой массив'); } $sum = array_sum($Data); foreach ($Data as $key => $chance){ $this->__Data[$key] = array( 'chance' => $chance, 'calls' => 0, 'percent' => $chance/$sum*100, ); } } public function call(){ $this->__calls++; foreach ($this->__Data as $key => $Data){ if ($Data['calls'] < $this->__calls/100*$Data['percent']){ $Result[] = $key; } } $index = $Result[rand(0, count($Result)-1)]; $this->__Data[$index]['calls']++; return $index; } } ?> Ответ проверяющего программиста: Правильное ли замечание он сделал? Я проверял с разными значениями массива, с разным количеством вызовов. Все работало идеально. Где я допустил ошибку? В прошлый раз было задание по поиску в массиве. И после проверки программист ответил, что надо использовать array_diff, хотя я в комментариях написал, что такой подход работает медленнее, чем мой, на том же Стековерфлоу этот способ рассматривался неоднократно. Вот теперь пытаюсь понять - либо я действительно недопонимаю, либо программист проверяет тестовые задания "на пофиг"
тут даже в задаче несостыковка. 1/8 это 12,5% процентов случаев 1/2 это 50% процентов случаев итого 62,5 % о каких 20% и 80% оворится в условии мне непонятно. т.е. в 37% случаев запуска вообще ничего не должно выводиться. или я чегото непонял
runcore, если внимательно посмотрите, то значением массива будет не обыкновенная дробь, а десятичная (кавычек нет, будет результат деления). Тоесть 1/8 = 0,125, 1/2 = 0,5. Тоесть 0,625 берем за 100%. С этим разобрались. Я скорее всего неправильно понял задание. Тоесть хранить количество вызова функции не надо, а надо рассчитывать шанс возврата каждого элемента. По-крайней мере мне так объяснили на другом форуме
Тестирующий программист, конечно, ступил. Хотя вам урок - не нужно писать классы и исполняющий код в одном файле. Ну и решение спорное. Ибо требует сохранение состояния между вызовами. Что, вообще-то, теории вероятности не требуется =) Плюс, стиль режет глаз, то переменные с заглавной, то нет. Осильте PSR.
Ну с алгоритмом мы разобрались на другом форуме, я неправильно понял ТЗ. Но вот это уточните, о какой части PSR вы говорите. В частности про именование свойств класса. То, что код класса не в отдельном файле, ничего страшного для тестового задания не вижу (в других задачах этого задания, классы идут отдельными скриптами)
поделитесь плиз. у меня в голове есть решение, но оно не подразумевает использования функций типа rand(), а использует функцию зависимости шанса выпадения отдельного символа исходя из истории выпадения предыдущих раз. т.е. функция должна хранить историю выпадения каждого символа, и просто стремиться найти тот у которого отношение пропорции реального выпадения будет наиболее отличаться от заданного на входе.
1. Приводите все дроби к общему знаменателю 2. Сохраняете в экземпляре класса два массива с вычесленными числителями (исходный и рабочий) 3. При вызове функции берете случайным образом элемент рабочего массива со значением > 0 3.1. Если все значения рабочего массива равны нулю - сбрасываете его значения до исходных и возвращаетесь к п.3 4. отнимаете от его значения 1 в рабочем массиве. 5. Возвращаете индекс элемента массива.