| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Интересные и занимательные задачи по программированию > PHP |
| Автор: Рыжий 22.6.2005, 00:22 | ||||||||||
| И снова продолжаю тему Интерестных задач по программированию, на этот раз, PHP! Помним правила: сюда можно, даже нужно, постить только задачки, прочий флейм неуместен. Удачи! Задачка №1
Задача №2
Дальше решил запостить задания по регулярным выражениям: Задача №3
Задача №4
Задача №5
|
| Автор: Irokez 22.6.2005, 00:33 |
| извините конечно... но чем они интересные |
| Автор: Рыжий 22.6.2005, 00:45 |
| Irokez Ну во первых это не для тебя задачи А во вторых - просто собираю коллекцию различных по тематике задач, чтобы расширить свой кругозор PS с тебя штраф - 5 задач. |
| Автор: Irokez 22.6.2005, 01:25 | ||||||||||||
Задача №1 - Транзакция
Задача №2 - Шифрование текста
Задача №3 - Защита картинок
Задача №4 - Сравнение картинок
Задача №5 - Генератор регулярных выражений
ЗЫ если я дал эти задачи - это не значит что я знаю как их решить |
| Автор: mr.Anderson 29.6.2005, 16:55 | ||
| Ну, давайте начнем. Но: на таких сайтах обычно выводится картиночка с циферками. Если надо так же, то я не знаю решения. А если просто генерация цифр (4 цифры), то пожалуйста:
Я код не проверял, написал только сейчас, с лету, так что могут быть ошибки. Но скрипт мне нравится. Красивый. |
| Автор: Irokez 29.6.2005, 17:09 | ||
странная генерация =) число будет иметь от 0 до 20 знаков и зачем нужны пустые строки? |
| Автор: mr.Anderson 29.6.2005, 17:15 | ||
Млин, в самом деле, чего это я? Надо эту строчку во так подправить:
А пустые строки - а как вы предлагаете написать четыре раза подряд mt_rand? Что, безо всяких пробелов? Вот я и сделал пустые строки. Тип переменной будет string, как я понимаю... |
| Автор: Mal Hack 29.6.2005, 17:21 | ||
И так строкой будет,
|
| Автор: Irokez 29.6.2005, 17:28 | ||
лучше было бы:
|
| Автор: mr.Anderson 29.6.2005, 17:37 |
| Mal Hack, понял. Irokez, а код не объясните? Что за strpad? И потом, почему лучше? Так получится в две строки, а у меня в одну. Добавлено @ 17:38 В общем, код, мной написанный 4 поста назад, я подправил. С учетом строчки у Mal Hack. |
| Автор: Mal Hack 29.6.2005, 20:23 |
| Irokez ну имхо, это изврат... Тогда уж проще сделать mt_rand( 10000 , 999999 ); Добавлено @ 20:24 PS:: str_pad(); http://php.net/str_pad |
| Автор: Irokez 29.6.2005, 20:33 | ||||
да нет, совсем не изврат. mt_rand( 10000 , 999999 ); - получим число от 10000 до 999999, в моем коде - то что и требовалось - число от 0 до 9999 с ведущими нулями
генерируем случайное число от 0 до 9999, если число получилось не 4-х значное (<1000) дополняем недостающие нули функцией str_pad() |
| Автор: mr.Anderson 1.7.2005, 20:40 | ||
| Что-то тут тихо... А нельзя ли задать задачки попроще? А то я тут вообще ничего не могу выполнить... Добавлено @ 20:43 Да, и еще: функция str_pad пишется через подчеркивание, а не вместе!
|
| Автор: Bikutoru 6.7.2005, 14:34 | ||
Irokez, помнится, ты сам грозился эту задачу решить... Как успехи? |
| Автор: Irokez 6.7.2005, 15:57 | ||
угу помню |
| Автор: Bikutoru 6.7.2005, 18:51 | ||
Irokez, значит я дальше продвинулся - для строк с разными длинами у меня что-то получается
оно пока не генерит |
| Автор: AztEK 19.5.2006, 13:02 |
| Хе-хе. Вот вам интересная задача. Определите число и название файлов в директории, не прибегая к функциям для работы с директориями. Решение задачи основано на том факте, что PHP обладает несколькими видами кавычек, каждый из которых обладает своими свойствами. Добавлено @ 13:04 Хотел запостить ссылку на сайт с такими задачами, но вспомнил, что там есть решение этой |
| Автор: Сумасшедший 16.7.2006, 10:18 | ||||||||
| Irokez, Задача №3 - Защита картинок два варианта: один с дивами, другой таблицей: первый:
Второй:
Картинка была: Первый генерит 1 232 330 Второй: 559 997 байт только кода "рисунка" Нормально отображается под ИЕ6СП2, Опера9 и ФайрФокс1.5.0.4 Есс-но ни о какой валидности для w3 я не думал.. я просто забыл про неё подумать, т.к. не было этого в условии ЗЫ: Есть еще мысли во втором варианте подключить css, тогда можно будет вроде сократить строку
до строки
Но это потом проверю |
| Автор: skyboy 16.7.2006, 11:07 |
| teplik, ты размер картинки не уменьшал? В смысле, если именно этого размера картинку тыобрабатывал скриптами? |
| Автор: Сумасшедший 16.7.2006, 19:12 |
| Именно этого размера размера, именно эту картинку и брал для тестов. Для второго варианта как раз примерно так и должно получиться: strlen('<TD width=1 height=1 bgcolor="#9b9b9b"></TD>') == 44; strlen("<TR></TR>") == 9; Размер кода одной строки L_STR_ONE=strlen("<TR>")+W*strlen("<TD width=1 height=1 bgcolor="#9b9b9b"></TD>")+strlen("</TR>") Размер кода всех строк: L_WH=L_STR_ONE*H Полный код: SIZE=strlen("<TABLE border=0 cellspacing=0 cellpadding=0>")+L_WH+strlen("</TABLE>"); Подставляем значения: L_STR_ONE=4+100*44+5==4409 L_WH=4409*127==559943 SIZE=44+559943+8==559995 Хм.. рядовой Код, за вами замечен косяк.. - появилось два лишних байта.. Можно списать на символ окончания файла) Есть варианты с меньшим объемом html?) |
| Автор: skyboy 16.7.2006, 23:25 |
стопудова Оптимизация, как на меня, возможна двумя путями: с привлечением мощностей клиента и без. Без привлечения - это такая разбивка на полосы разной ширины и разного цвета. Тут, опять же, два пути: слои(размер уменьшится за счет возможности наложения слоёв друг на друга при помощи позиционирования, но увеличится за счёт указания этого самого позиционирования - например, синий прямоугольник с красным крестом рисуется трёмя слоями - одним синим большим и двумя узкими красными) или таблицы(размер уменьшается только при подряд идущих горизонтально пикселях(или ячейки можно группировать и по строкам?)). И алгоритмов находжения оптимального наложения может быть несколько. Кроме этого, можно привлечь javascript и передавать каким-либо образом кодированную и сжатую информацию. Хотя бы тот же jpeg А потом восстанавливать в последовательность div'ов. При этом уже не надо будет искать "наложения слоёв с минимальным размером" - ведь на размер передаваемой информации это не повлияет... Хотя, нет, повлияет... Потому код надо будет хоть как-то сжимать... Кста, вот утвердят на уровне стандарта объект canvas, реализованный(насколько мне известно) в firefox - и не надо будет огород с div'ами или таблицами воротить.... Как идеи? |
| Автор: skyboy 17.7.2006, 11:12 |
| ещё идея: проиндексировать цвета, используя классы для стилей. Если цвет всетрчается чаще одного раза, есть смысл описать класс и накладывать на ячейки/слои. Если же цвет встречается только единожды, то лучше задать явно... |
| Автор: Сумасшедший 17.7.2006, 19:41 |
| Мысль: Передать JavaScript рисунок как бинарник, на стороне JavaScript выполнить преобразование со сжатием в дивы, и вывести эту штуку на экран Комментарии к мысли: Слишком большая нагрузка на клиентский компьютер: и поиск дивов, и их вывод.. А если прийдется выводить изображение, которое в jpg весит около метра.. Сначала загрузка, потом обработка, потом вывод... слишком долго.. Что-то вроде on-line Xnview=) Мысль: Выполнить преобразование изображения в формат дивов на стороне сервера Сжать преобразованный массив данных Записать сжатый массив данных в файл При выводе изображения PHP передает файл в JavaScript, который уже выполняет распаковку и и прорисовку дивов на стороне клиента. Кстати.. гкхм Комментарии к мысли: Шифрование... в-принципе можно, вот только пока мое мнение, что это бессмысленно, ибо расшифровывающая функция будет доступна клиенту, а уж переделать ее в любом другом языке для вывода в тот-же canvas слишком просто Хотя и по этому поводу мысли есть: можно шифровать файл преобраованного рисунка, потом перед передачей его в JavaScript выполнять дешифровку. А то вдруг кто скачает файлик преобразованно-сжатого дивовского формата, разожмет его, и напишет программку, которая будет читать такой формат и выполнять обратное преобразование. Плюс создать несколько разных форматов файлов, и соответственно им – различных функций на JavaScript, которые будут соответственно распаковывать по-разному сжатые файлы. Чтобы снизить вероятность отлавливания функции, и ее преобразования в что-то рисующее Мысль зародилась.. теперь нуно не дать ей умереть!) В первую очередь ее носителю с голода Думаем дальше.. Сначала будем думать без сжатия файла:-) Для упрощения жизни Создаем свой формат файла для того, чтобы можно было читать оттуда дивы. Например: 00000 00800 08880 00800 00000 (0 - зеленый 8-черный) x y width height color через табуляцию 0\t0\t5\t5\n00FF00\n 2\t1\t1\t3\t000000\n 1\t2\t3\t1\t000000 Правда с прозрачностью такой фокус не пройдет=( Прийдется делать иначе. Например построчно: 0\t0\t5\t1\t00FF00\n 0\t1\t2\t1\t00FF00\n 3\t1\t2\t1\t00FF00\n 0\t2\t1\t1\t00FF00\n 4\t2\t1\t1\t00FF00\n 0\t3\t2\t1\t00FF00\n 3\t3\t2\t1\t00FF00\n 0\t4\t5\t1\t00FF00 Добавлено @ 19:45 Про классы.. Можно для немногоцветных рисунков! А то если в рисунке много градиентных линий, например по 2 пиксела, то смысл описывать класс для каждых двух пикселов будет теряться. Стоит подумать еще |
| Автор: Сумасшедший 17.7.2006, 21:12 | ||||
| Реализация чтения простого формата ver3.php
ver3.div
Добавлено @ 21:22 Это чтобы потом не забыть:-) Теперь можно думать и про реализацию сжатия:-) Есть вопрос: можно сжимать при выводе страницы, а можно каждое изображение только по одному разу. Второй вариант ихмо лучше - не будет сильной нагрузки на сервер + более высокая скорость показа изображения. Но тогда возникает вопрос, а не стоит ли использовать какой-либо другой язык программирования для выполнения сжатия? |
| Автор: Сумасшедший 17.7.2006, 22:37 | ||||||
К примеру цветовая гамма
неправильно выше написал: к примеру диагональные линии различных цветов.
Правильно Будем мучать PHP) |
| Автор: skyboy 18.7.2006, 08:41 |
будут много занимать. Ты про это? А какие есть ещё идеи по уменьшению размера? |
| Автор: rMaveric 9.8.2006, 19:59 |
| 2 Модераторы Давайте, ребята, чистить тему. И выкладывать суда только задачи. Или еще лучше для каждой задачи по топику. 2 Irokez Твои задачи немного интересней, но не на много |
| Автор: euginewm 1.10.2006, 18:23 | ||||||
| Решение второй задачи (PHP-Script) страница с формой
страница проверки формы:
И собственно генерация самого изображения
Вот |
| Автор: gta4kv 19.1.2008, 16:59 | ||
Совсем простая задача:
Что должно быть в $string? ;) Умников попрошу - помолчать. |
| Автор: WildField 24.2.2008, 16:14 | ||
| Задача про шифрофку: P.S. подскажите как сгенерировать сам алфавит функцией
|
| Автор: linuxoid 20.12.2008, 17:29 | ||
Задача
|
| Автор: linuxoid 26.9.2010, 17:54 |
| Еще интересная задача (которая сгодится для решения на любом языке): Пересекаются ли 2 линии? Вы задаете 2 точки, которые определяют линию на плоскости и 2 точки, которые определяют 2-ую линию. Нужно вывести на экран "Линии пересекаются", если они пересекаются. Я делал это на Java (т.к. можно наглядно нарисовать линию + там есть встроенная функция, чтобы узнать о пересечении линий, т.е. я сравнивал показания встроенной со своими - все сходится при различных вариантах расположения линий). В общем не знаю на сколько быстро вы эту задачу решите, но я мучился с ней целый день (хотя с самого начала написал на бумаге правильный алгоритм, в котором всего около 3-х шагов, но на деле - код не так уж очевиден). Так что друзья советую вам размять мозг и написать такую прогу. При этом, разумеется, не подсматривая в готовые решения. По идее все что вам нужно - знать все координаты, а рисовать линии не обязательно. |
| Автор: Elerond 20.10.2010, 23:01 |
| linuxoid, думаю задача решается очень просто. Две первые точки определяют вектор a{xa, ya} вторая пара точек вектор b{xb, yb} ... векторы параллельны если a=cb или a=-cb где c - вещественное число. Значит просто достаточно найти с: c=xb/xa и посмотреть равенство c=yb/ya или -с=yb/ya PS: решение заняло 5 минут |
| Автор: awerny 15.2.2012, 02:35 |
| Еще одна задачка (сам придумал, публикуеться впервые): Условие: Кондуктор в начале смены на пачке с талончиками отметила порядковый номер текущего билета как 219007 К концу смены, номер билета в пачке был 219625. Задача: 1. Создать инструмент для кондукторов в виде файла с формой из 2-х полей и кнопкой. 2. Циклом должны выводиться все номера билетов проданых кондуктором, красным цветом подсветить счастливые билеты. 3. Принимать диапазон чисел по маске хххххх с разницой между числами в 5000. 4. В конце вывести процент счастливых билетов проданых пассажирам, номера счастлывых билетов. Все вывести в диве с прокруткой. Задачка простенькая, но очень занимательная для тех, кто только начал учить РНР. Как то давно сам делал, билетов счастливых получаеться около 4%, у кого есть желание попробуйте. ЗЫ: Анекдот в догонку: В больницу был доставлен кондуктор с острым отравлением счасливыми билетиками! |