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

 PHP.SU

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


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

> Описание: Продолжение
RomAndry Администратор
Отправлено: 26 Сентября, 2013 - 11:27:41
Post Id



Частый посетитель


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


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




Продолжение темы "Вопрос к программистам".
 
My status
 Top
armancho7777777 Супермодератор
Отправлено: 26 Сентября, 2013 - 11:27:56
Post Id



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


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


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




Спасибо EuGen за интересную статью!
 
 Top
EuGen Администратор
Отправлено: 29 Сентября, 2013 - 17:17:22
Post Id


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


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


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




Задача из реального приложения.
Есть текстовый файл - достаточно большого размера, для того, чтобы его нельзя было поместить в RAM. На текущей партиции ФС недостаточно места для создания копии файла. Пример:
- Размер файла 200Mb
- Максимум памяти для скрипта 30Mb (и изменить нельзя)
- Свободное место в текущей партиции на диске 100Mb

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

мой вариант (Отобразить)


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


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


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


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




Предположим, что есть массив строк, который нужно перемешать в случайном порядке. Требуется реализовать такое перемешивание, чтобы оно удовлетворяло требованиям псевдослучайности, то есть реализацией должна быть некоторая функция, например, "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. // и т.п.

- и не важно, сколько раз был запущен скрипт, порядок на каждом шаге должен оставаться одинаковым, хотя и неизвестным заранее.
вариант (Отобразить)


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



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


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


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




Задачка, актуальная под новый год)

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

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


Частый гость


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


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




"Возможное решение" (Отобразить)

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

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

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


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


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


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




Примерно то же самое, только не очень ясно ограничение в 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. }


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


Частый гость


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


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




EuGen, так если 2 человека, то можно угадать, кто кому дарит, а это противоречит условию задачи. Улыбка
 
 Top
armancho7777777 Супермодератор
Отправлено: 23 Декабря, 2013 - 13:16:22
Post Id



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


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


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




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. }

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

 
 Top
DlTA
Отправлено: 23 Декабря, 2013 - 13:36:19
Post Id



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


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


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




VenZell пишет:
так если 2 человека, то можно угадать, кто кому дарит, а это противоречит условию задачи.
вообще то при 3х человеках как не крути но тоже сразу понятно кто и кому дарит.
но это скорее исключительные ситуации
(Добавление)
armancho7777777, ваш код не выполняет задачу, у вас как минимум половина людей из группы остается без подарка
 
 Top
armancho7777777 Супермодератор
Отправлено: 23 Декабря, 2013 - 13:41:10
Post Id



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


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


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




А, точно.
У меня же там в одном направлении.

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

 
 Top
IllusionMH
Отправлено: 23 Декабря, 2013 - 13:44:07
Post Id



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


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


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




DlTA, думаю, подразумевается, что люди дарят друг другу.
Но нужно отдельно разобрать случай когда остается 1.
Тогда нужно сделать тройку и чтобы они дарили "по кругу".

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

upd. Неправильно думал. Но вариант то рабочий и удовлетворяет условиям, если внести доработку.

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

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



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


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


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




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

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. }

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

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


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


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


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




armancho7777777 пишет:
А как же быть в том случае, если количество участников нечётное ?

Собственно, какая разница? Если это круговая связь, то последний замыкается на первого, таким образом, достаточно лишь обеспечить случайность выборки, что достигается через shuffle


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



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


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


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




armancho7777777, если собирать пары которые дарят друг другу, тогда вручную собрать лишний и последнюю пару, объединив их в кольцо.
 
 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