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
Форумы портала PHP.SU :: Версия для печати :: Вопрос к программистам
Форумы портала PHP.SU » Разное » Прочее » Вопрос к программистам

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

1. RomAndry - 26 Сентября, 2013 - 11:27:41 - перейти к сообщению
Продолжение темы "Вопрос к программистам".
2. armancho7777777 - 26 Сентября, 2013 - 11:27:56 - перейти к сообщению
Спасибо EuGen за интересную статью!
3. EuGen - 29 Сентября, 2013 - 17:17:22 - перейти к сообщению
Задача из реального приложения.
Есть текстовый файл - достаточно большого размера, для того, чтобы его нельзя было поместить в RAM. На текущей партиции ФС недостаточно места для создания копии файла. Пример:
- Размер файла 200Mb
- Максимум памяти для скрипта 30Mb (и изменить нельзя)
- Свободное место в текущей партиции на диске 100Mb

Вопрос - как записать несколько строк в начало файла? (разумеется, дозаписать).

мой вариант (Отобразить)
4. EuGen - 29 Октября, 2013 - 14:59:23 - перейти к сообщению
Предположим, что есть массив строк, который нужно перемешать в случайном порядке. Требуется реализовать такое перемешивание, чтобы оно удовлетворяло требованиям псевдослучайности, то есть реализацией должна быть некоторая функция, например, "getShuffle", которая будет принимать два параметра - массив и некоторое значение (целое число). Внутри одного значения этого числа порядок внутри массива должен быть одинаковым при последовательном перемешивании, неважно сколько раз применялась функция.
Пример:
PHP:
скопировать код в буфер обмена
  1. $data = ['a', 'b', 'c'];
  2. $data = getShuffle($data, 20); //20 - просто некоторая константа
  3. var_dump($data);//пусть будет ['b', 'c', 'a']
  4. $data = getShuffle($data, 20);
  5. var_dump($data);//пусть будет ['a', 'c', 'b']
  6. $data = getShuffle($data, 20);
  7. var_dump($data);//пусть будет ['c', 'a', 'b']
  8. // и т.п.

- и не важно, сколько раз был запущен скрипт, порядок на каждом шаге должен оставаться одинаковым, хотя и неизвестным заранее.
вариант (Отобразить)
5. DlTA - 22 Декабря, 2013 - 23:31:04 - перейти к сообщению
Задачка, актуальная под новый год)

есть компания и N человек.
так как денег не фонтан, и каждый чел из компании не может сделать по подарку всем остальным, поэтому каждый готовит только по 1му подарку

нужна разработать генератор выдающий случайную связку, Кто и Кому будет дарить,
но нужно учесть, что сам себе не дарим, и так чтоб нельзя было угадать остальные связки, когда знаешь кому даришь ты.
6. VenZell - 23 Декабря, 2013 - 05:16:32 - перейти к сообщению
"Возможное решение" (Отобразить)

CODE (htmlphp):
скопировать код в буфер обмена
  1. (
  2.     [0] => Оксана -- Юля
  3.     [1] => Юля -- Маша
  4.     [2] => Маша -- Ваня
  5.     [3] => Ваня -- Вася
  6.     [4] => Вася -- Петя
  7.     [5] => Петя -- Оксана
  8. )
  9. (
  10.     [0] => Вика -- Света
  11.     [1] => Света -- Серега
  12.     [2] => Серега -- Леха
  13.     [3] => Леха -- Дима
  14.     [4] => Дима -- Денис
  15.     [5] => Денис -- Саша
  16.     [6] => Саша -- Вика
  17. )

http://ideone[dot]com/TO7yeN
7. EuGen - 23 Декабря, 2013 - 10:50:37 - перейти к сообщению
Примерно то же самое, только не очень ясно ограничение в 3
PHP:
скопировать код в буфер обмена
  1. function getPairs(array $data)
  2. {
  3.    if(!($end=count($data)))
  4.    {
  5.        return null;
  6.    }
  7.    shuffle($data);
  8.    $result = [[$data[0], $data[$end-1]]];
  9.    for($i=0; $i<$end-1; $i++)
  10.    {
  11.        $result[] = [$data[$i], $data[$i+1]];
  12.    }
  13.    return $result;
  14. }
8. VenZell - 23 Декабря, 2013 - 10:59:05 - перейти к сообщению
EuGen, так если 2 человека, то можно угадать, кто кому дарит, а это противоречит условию задачи. Улыбка
9. armancho7777777 - 23 Декабря, 2013 - 13:16:22 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $users = array('Петя', 'Вася', 'Ваня', 'Маша', 'Юля', 'Оксана', 'Саша',
  2.                'Денис', 'Дима', 'Леха', 'Серега', 'Света', 'Вика');
  3. shuffle($users);
  4.  
  5. foreach(array_chunk($users, 2) as $us) {
  6.     echo $us[0] . ' => ' . (isset($us[1]) ? $us[1] . '<br>' : 'некому');
  7. }
10. DlTA - 23 Декабря, 2013 - 13:36:19 - перейти к сообщению
VenZell пишет:
так если 2 человека, то можно угадать, кто кому дарит, а это противоречит условию задачи.
вообще то при 3х человеках как не крути но тоже сразу понятно кто и кому дарит.
но это скорее исключительные ситуации
(Добавление)
armancho7777777, ваш код не выполняет задачу, у вас как минимум половина людей из группы остается без подарка
11. armancho7777777 - 23 Декабря, 2013 - 13:41:10 - перейти к сообщению
А, точно.
У меня же там в одном направлении.
12. IllusionMH - 23 Декабря, 2013 - 13:44:07 - перейти к сообщению
DlTA, думаю, подразумевается, что люди дарят друг другу.
Но нужно отдельно разобрать случай когда остается 1.
Тогда нужно сделать тройку и чтобы они дарили "по кругу".

P.S. Сам тоже сделал бы просто shuffle, и каждый, дарит следующему в массиве(или первому), но уже есть 2 таких решения.

upd. Неправильно думал. Но вариант то рабочий и удовлетворяет условиям, если внести доработку.
13. armancho7777777 - 23 Декабря, 2013 - 14:00:47 - перейти к сообщению
Если количество участников нечётное, то один остаётся без подарка.

PHP:
скопировать код в буфер обмена
  1. $users = array('Петя', 'Вася', 'Ваня', 'Маша', 'Юля', 'Оксана', 'Саша',
  2.                'Денис', 'Дима', 'Леха', 'Серега', 'Света', 'Вика');
  3.  
  4. $room1 = array_slice($users, 0, ceil(count($users) / 2));
  5. $room2 = array_slice($users, ceil(count($users) / 2));
  6.  
  7. foreach($room1 as $i => $us) {
  8.     echo $us . ' => ' . (isset($room2[$i]) ? $room2[$i] : 'без подарка') . '<br>';
  9. }
  10.  
  11. shuffle($room2);
  12. foreach($room2 as $i => $us) {
  13.     echo $us . ' => ' . $room1[$i] . '<br>';
  14. }
14. EuGen - 23 Декабря, 2013 - 14:04:29 - перейти к сообщению
armancho7777777 пишет:
А как же быть в том случае, если количество участников нечётное ?

Собственно, какая разница? Если это круговая связь, то последний замыкается на первого, таким образом, достаточно лишь обеспечить случайность выборки, что достигается через shuffle
15. IllusionMH - 23 Декабря, 2013 - 14:05:20 - перейти к сообщению
armancho7777777, если собирать пары которые дарят друг другу, тогда вручную собрать лишний и последнюю пару, объединив их в кольцо.

 

Powered by ExBB FM 1.0 RC1