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 :: Вопрос к программистам - 2 [2]

 PHP.SU

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


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

> Описание: Продолжение
armancho7777777 Супермодератор
Отправлено: 23 Декабря, 2013 - 14:05:45
Post Id



Активный участник


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


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




EuGen
armancho7777777 пишет:
Если количество участников нечётное, то один остаётся без подарка.

(Добавление)
IllusionMH, нет.
Так получится, либо один подарит 2 подарка, либо получит 2 подарка, либо подарят друг другу (что тоже вариант).

(Отредактировано автором: 23 Декабря, 2013 - 14:09:17)

 
 Top
EuGen Администратор
Отправлено: 23 Декабря, 2013 - 14:12:00
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




armancho7777777
Тогда так. Случай 1, четыре участника:
1 -> 2 -> 3 -> 4 -> 1
Случай 2, пять участников:
1 -> 2 -> 3 -> 4 -> 5-> 1

То есть - в чём разница?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
armancho7777777 Супермодератор
Отправлено: 23 Декабря, 2013 - 14:12:08
Post Id



Активный участник


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


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




___

(Отредактировано автором: 23 Декабря, 2013 - 14:20:14)

 
 Top
IllusionMH
Отправлено: 23 Декабря, 2013 - 14:16:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


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




armancho7777777, почему?
Если бы нужно было ваш код допилить напильником, тогда просто делается кольцо как и с другими вариантами, но не большое.
CODE (htmlphp):
скопировать код в буфер обмена
  1. $последняя_пара[0] -> $последяя_пара[1] -> $forever_alone /*лишний/нечетный*/ -> $последняя_пара[0]


Но проще и надежнее сразу делать одно большое кольцо. Вероятно, даже честнее.

(Отредактировано автором: 23 Декабря, 2013 - 14:19:58)

 
 Top
armancho7777777 Супермодератор
Отправлено: 23 Декабря, 2013 - 14:20:29
Post Id



Активный участник


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


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




Вру. Все подарят и все получат, но -
задачу, именно как она поставлена, с нечётным количеством участников не выйдет.
(Добавление)
IllusionMH пишет:
Но проще и надежнее сразу делать одно большое кольцо.

Да. Но противоречит задаче.
 
 Top
IllusionMH
Отправлено: 23 Декабря, 2013 - 14:21:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


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




DlTA пишет:
нужна разработать генератор выдающий случайную связку, Кто и Кому будет дарить,

связка - любой набор из всех, а про пары ничего не сказано.

Я не вижу противоречий.

(Отредактировано автором: 23 Декабря, 2013 - 14:22:12)

 
 Top
armancho7777777 Супермодератор
Отправлено: 23 Декабря, 2013 - 14:25:00
Post Id



Активный участник


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


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




DlTA пишет:
и так чтоб нельзя было угадать остальные связки
 
 Top
Panoptik
Отправлено: 23 Декабря, 2013 - 14:30:05
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




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

исходя из этого следует что последовательность меняется в первом случае - это abc
во втором acb
в третьем abc

EuGen пишет:
PHP:
скопировать код в буфер обмена
  1. var_dump($data);//пусть будет ['b', 'c', 'a']
  2. $data = getShuffle($data, 20);
  3. var_dump($data);//пусть будет ['a', 'c', 'b']
  4. $data = getShuffle($data, 20);
  5. var_dump($data);//пусть будет ['c', 'a', 'b']


я конечно понимаю что такое псевдослучайная последовательность, но тут что-то не так


-----
Just do it
 
 Top
armancho7777777 Супермодератор
Отправлено: 23 Декабря, 2013 - 14:31:21
Post Id



Активный участник


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


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




Вот, вроде так:

PHP:
скопировать код в буфер обмена
  1. $users = array('Петя', 'Вася', 'Ваня', 'Маша', 'Юля', 'Оксана', 'Саша',
  2.                'Денис', 'Дима', 'Леха', 'Серега', 'Света', 'Вика');
  3.  
  4. $room1 = array_slice($users, 0, floor(count($users) / 2));
  5. $room2 = array_slice($users, floor(count($users) / 2));
  6.  
  7. foreach($room1 as $i => $us) {
  8.     echo $us, ' => ', $room2[$i], '<br>';
  9. }
  10.  
  11. if(count($room2) > count($room1))
  12. $room1[] = $room2[0];
  13.  
  14. shuffle($room2);
  15. foreach($room2 as $i => $us) {
  16.     echo $us, ' => ', $room1[$i], '<br>';
  17. }
  18.  

(Отредактировано автором: 23 Декабря, 2013 - 14:38:39)

 
 Top
Panoptik
Отправлено: 23 Декабря, 2013 - 14:36:10
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




или же задача сводится к тому чтобы в зависимости от текущего состояния массива и некоторой константы мы получали псевдо shuffle, который всегда при одних и тех же аргументах будет выдавать один и тот же результат, но на первый взгляд этот результат будет казаться случайным?


-----
Just do it
 
 Top
EuGen Администратор
Отправлено: 23 Декабря, 2013 - 14:37:00
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Panoptik
Последовательность на каждом шаге - то есть, при каждом вызове функции - будет меняться (в этом суть перемешивания). Но когда скрипт будет запущен заново, код выдаст те же последовательности (формально - последовательность последовательностей будет неизменна)

armancho7777777
Кольцо полностью удовлетворяет условию задачи, поскольку происходит перемешивание в начале, и каждый элемент будет связан со случайным (если я не прав, предложите алгоритм восстановления подарившего для того, кому известно лишь то, кому дарил он сам)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
IllusionMH
Отправлено: 23 Декабря, 2013 - 14:41:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


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




armancho7777777, эта задача не имеет решения для 3х человек, как писали выше, но имеет для 4+ человек и без разницы четные или нет.
В остальном - допиленный алгоритм верен, даже если делать кольцо из 3х, т.к. из кольца известны только двое.
Повторюсь, алгоритм рабочий, но не лучший, с нуля я бы делал как указано в первых двух ответах.
 
 Top
DelphinPRO
Отправлено: 23 Декабря, 2013 - 14:43:05
Post Id



Активный участник


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


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





IllusionMH пишет:
Но нужно отдельно разобрать случай когда остается 1.

Он станет "Дедом Морозом" и будет раздавать подарки Голливудская улыбка


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
IllusionMH
Отправлено: 23 Декабря, 2013 - 14:43:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


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




Panoptik, это как инициализация генератора псевдослучайных чисел конкретным значением.
(Добавление)
DelphinPRO, я подразумевал, что когда в конце останется только один(горец) без пары, тогда будем изощряться.
Ну а если совсем один, тогда задача не имеет решения и нужно кидать исключение.
PHP:
скопировать код в буфер обмена
  1. if(1 === count($party_members)) {
  2.   $forever_alone = $party_members[0];
  3.   throw new Exception('So sad :\'(', 1);
  4. }

(Отредактировано автором: 23 Декабря, 2013 - 14:49:38)

 
 Top
Panoptik
Отправлено: 23 Декабря, 2013 - 15:39:23
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




придумал вроде такого велосипеда
PHP:
скопировать код в буфер обмена
  1.  
  2. function getShuffle2(array $input, $seed = null) {
  3.     $seq = md5($seed);
  4.     $l = count($input) + (int)$seed;
  5.     usort($input, function($a, $b) use ($seq, $l) {
  6.         $seqA = md5($a).$seq;
  7.         $seqB = $seq.md5($b);
  8.         if((ord($seqA{$l%64})%3) == (ord($seqB{$l%64})%3))
  9.             return 0;
  10.         return ((ord($seqA{$l%64})%3) > (ord($seqB{$l%64})%3)) ? -1 : 1;
  11.     });
  12.     return $input;
  13. }
  14.  

рандом конечно не как у родного генератора, но для задач с подарками может вполне подойти

(Отредактировано автором: 23 Декабря, 2013 - 15:40:34)



-----
Just do it
 
 Top
Страниц (3): « 1 [2] 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Прочее »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB