Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Расчет шансов (спорный вопрос)

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
4online
Отправлено: 21 Октября, 2015 - 08:07:32
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




Приветствую.

Сразу прошу прощения если не в ту ветку вопрос, сделайте скидку на то, что это первое мое сообщение на этом форуме

Находясь в поисках работы решил отправить повторно резюме в одну компанию, куда в феврале уже обращался. В тот раз как и в этот мне прислали тестовое задание из 4 задач. И как и в первый раз так и во второй, мне кажется, что программист, проверяющий решение, меня "прокатил". Что бы разобраться, прошу глянуть на код задание и код.

Задача:
Цитата:
Дан массив:
array (
'a' => 1/3,
'b' => 1/6,
'c' => 1/2
);

Необходимо написать класс или функцию, реализующую следующие требования:
- на вход подается массив указанного формата,
- на выход обязательно возвращается один ключ переданного массива,
- при многократном вызове функции ключи массива должны возвращаться с пропорциями,
указанными в значениях.

Пример:
На вход подается массив a=>1/8, b=>1/2, при запуске функции большое количество раз, в 20%
случаев должен вернуться ключ a, в остальных – b.


Код:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. $Array = array(
  3.         'a' => 1/2,
  4.         'b' => 1/8,
  5. );
  6.  
  7. $Chances = new Chances($Array);
  8. $Result = array();
  9. for ($i = 0; $i < 1001; $i++){
  10.         $index = $Chances->call();
  11.         if (!isset($Result[$index])){
  12.                 $Result[$index] = 0;
  13.         }
  14.         $Result[$index]++;
  15. }
  16.  
  17. echo '<pre>';
  18. var_dump($Result);
  19. echo '</pre>';
  20.  
  21. class Chances{
  22.  
  23.         private $__Data;
  24.  
  25.         private $__calls = 0;
  26.  
  27.         public function __construct($Data){
  28.                 if (empty($Data)){
  29.                         throw new Exception('Передан пустой массив');
  30.                 }
  31.  
  32.                 $sum = array_sum($Data);
  33.                 foreach ($Data as $key => $chance){
  34.                         $this->__Data[$key] = array(
  35.                                 'chance' => $chance,
  36.                                 'calls' => 0,
  37.                                 'percent' => $chance/$sum*100,
  38.                         );
  39.                 }
  40.         }
  41.  
  42.         public function call(){
  43.                 $this->__calls++;
  44.                 foreach ($this->__Data as $key => $Data){
  45.                         if ($Data['calls'] < $this->__calls/100*$Data['percent']){
  46.                                 $Result[] = $key;
  47.                         }
  48.                 }
  49.  
  50.                 $index = $Result[rand(0, count($Result)-1)];
  51.                 $this->__Data[$index]['calls']++;
  52.                 return $index;
  53.         }
  54. }
  55. ?>


Ответ проверяющего программиста:
Цитата:
Задание решено неверно. Подход к решению содержит логическую ошибку, приводящую к тому, что единичный вызов даст на выходе массив, а не конкретный вариант. Большая серия вызовов с сохранением результатов в массив скрывает эту ошибку.


Правильное ли замечание он сделал? Я проверял с разными значениями массива, с разным количеством вызовов. Все работало идеально. Где я допустил ошибку?

В прошлый раз было задание по поиску в массиве. И после проверки программист ответил, что надо использовать array_diff, хотя я в комментариях написал, что такой подход работает медленнее, чем мой, на том же Стековерфлоу этот способ рассматривался неоднократно. Вот теперь пытаюсь понять - либо я действительно недопонимаю, либо программист проверяет тестовые задания "на пофиг"
 
 Top
Stierus Супермодератор
Отправлено: 21 Октября, 2015 - 10:21:41
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Требование 1
- на вход подается массив указанного формата,

У тебя на вход в функцию ничего не передается.

ТЗ не выполнено, это задание не засчитал бы и я Улыбка

Что хотели от тебя: Что бы в одной функции, на основании переданной вероятности было принято решение, какой элемент массива вернуть (другими словами, составить функцию, которая бы с помощью генератора случайных чисел и полученных коэффициентов, отдала бы 1 ключ из тех, что получила) Ее можно вызвать 1 раз, 100 или 1000 000 - она работала бы одинаково, у тебя же хранится состояние (количество вызовов), от которого меняется вероятность выпадения того или иного ключа, а этого быть не должно
 
My status
 Top
4online
Отправлено: 21 Октября, 2015 - 10:33:08
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




1) Меня смутило вот это в ответе
Цитата:
что единичный вызов даст на выходе массив, а не конкретный вариант

не представляю в каком случае вернется массив

2)
Stierus пишет:

- на вход подается массив указанного формата,

У тебя на вход в функцию ничего не передается.


Аргумент передается в конструктор класса.

3)
Stierus пишет:
Что хотели от тебя: Что бы в одной функции, на основании переданной вероятности было принято решение, какой элемент массива вернуть (другими словами, составить функцию, которая бы с помощью генератора случайных чисел и полученных коэффициентов, отдала бы 1 ключ из тех, что получила) Ее можно вызвать 1 раз, 100 или 1000 000 - она работала бы одинаково, у тебя же хранится состояние (количество вызовов), от которого меняется вероятность выпадения того или иного ключа, а этого быть не должно


при описанном тобой подходе, когда не сохраняется состояние, вероятность возврата рандомна. Тоесть по сути а может выпасть не в 20% случаев, а при каждом вызове, особенно если значения очень близки (49% и 51%, например). В моем же случае во всех тестах результат был требуемый в задании, я запустил 1000 раз метод call и мне ключ a вернулся 200, а ключ b 800 раз. Тестировал на разных массивах. При этом значения шли в разброс (a,a,b,a,b,b....), но когда а превышало свой лимит, возвращалось b
 
 Top
Stierus Супермодератор
Отправлено: 21 Октября, 2015 - 10:43:33
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Цитата:
не представляю в каком случае вернется массив
Он и не вернется, просто увидев логическую ошибку,программист не стал копаться в твоем коде

Цитата:
Аргумент передается в конструктор класса.
А это важно? Я не вижу ни слово про конструкторы в тз

Цитата:
при описанном тобой подходе, когда не сохраняется состояние, вероятность возврата рандомна.
Когда работаешь с вероятностями (а в коэффициентах именно она), странно жаловаться на не абсолютные значения. При единичном запуске твоя функция ведет себя совсем не по тз
 
My status
 Top
Faraon-san
Отправлено: 21 Октября, 2015 - 12:31:28
Post Id



Посетитель


Покинул форум
Сообщений всего: 318
Дата рег-ции: Сент. 2013  


Помог: 8 раз(а)




А я считаю, что парень справился с задачей.
А результат проверки работодателя, не верен, единичный вызов даст на выходе один ключ.
И придраться можно ко всему, от одинарных или двойных кавычек до заглавных букв в названии переменных.
 
 Top
MiksIr
Отправлено: 21 Октября, 2015 - 13:08:19
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Stierus пишет:
А это важно? Я не вижу ни слово про конструкторы в тз

А я не вижу фразу "подается на вход функции" в ТЗ
(Добавление)
Faraon-san пишет:
И придраться можно ко всему, от одинарных или двойных кавычек до заглавных букв в названии переменных.

Не только можно, но и нужно.


-----
self-banned
 
 Top
Faraon-san
Отправлено: 21 Октября, 2015 - 14:02:33
Post Id



Посетитель


Покинул форум
Сообщений всего: 318
Дата рег-ции: Сент. 2013  


Помог: 8 раз(а)




MiksIr пишет:
Не только можно, но и нужно.

В каждой команде есть свои правила оформления кода, тестовых заданий это не должно касаться. Это тест на знание кода и формирование логики претендента.
 
 Top
MiksIr
Отправлено: 21 Октября, 2015 - 14:13:23
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Faraon-san пишет:
MiksIr пишет:
Не только можно, но и нужно.

В каждой команде есть свои правила оформления кода, тестовых заданий это не должно касаться. Это тест на знание кода и формирование логики претендента.


На что тест - знает только работодатель и не вам ему указывать Улыбка Раздрай в оформлении кода часто гораздо более важный показатель, чем алгоритм, ибо это потенциальный рассадник ошибок. Важно не то, какой стиль, а его наличие. Хотя в моих глазах использование PSR - преимущество.


-----
self-banned
 
 Top
Stierus Супермодератор
Отправлено: 21 Октября, 2015 - 14:19:16
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Ребят, вы это серьезно? Надеюсь, вы сейчас дико тролите или просто прикалываетесь. Задача выполнена не та, что ставилась, да и то, что сделано - работает с ошибками ... какие придирки, какой синтаксис?
 
My status
 Top
MiksIr
Отправлено: 21 Октября, 2015 - 14:20:49
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


С какими ошибками?


-----
self-banned
 
 Top
Stierus Супермодератор
Отправлено: 21 Октября, 2015 - 14:25:10
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




MiksIr, при одиночном вызове отдаваться будет рандомный ключ, не смотря на то, какой коэффициент у него выставлен

PHP:
скопировать код в буфер обмена
  1.  
  2. $Array = array(
  3.     'a' => 1/100,
  4.     'b' => 99/100,
  5. );
  6.  
  7. $Result = array();
  8. for ($i = 0; $i < 1001; $i++){
  9.     $Chances = new Chances($Array);
  10.     $index = $Chances->call();
  11.     if (!isset($Result[$index])){
  12.         $Result[$index] = 0;
  13.     }
  14.     $Result[$index]++;
  15. }
  16.  
  17. echo '<pre>';
  18. var_dump($Result);
  19. echo '</pre>';
  20.  
 
My status
 Top
MiksIr
Отправлено: 21 Октября, 2015 - 14:28:43
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]




-----
self-banned
 
 Top
Stierus Супермодератор
Отправлено: 21 Октября, 2015 - 14:31:59
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Без каких-либо "хотя". В алгоритм изначально заложено, что при одиночном вызове коэффициент не учитывается, а запускается тупой rand()
 
My status
 Top
MiksIr
Отправлено: 21 Октября, 2015 - 14:35:31
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Формально в ТЗ требование получения результата при многократном запуске.


-----
self-banned
 
 Top
Stierus Супермодератор
Отправлено: 21 Октября, 2015 - 14:37:57
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Значит все сделано правильно, а программист докопался. На том и разойдемся Улыбка
 
My status
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB