пятница, 30 сентября 2011 г.

Ужас PHP, летящий на крыльях ночи

Всех с наступающей ночью )

Только что чуть еще не добавил себе седых волос по причине программирования на PHP. В общем, ситуация. Имеется большой по размеру PHP-файл, где-то в середине которого присутствует регулярка вот такого вида:
===
...'#(<(?:img|a).*?(?:src|href)\s*=\s*["\']\s*)(.*?)(\s*["\'].*?>)#i'...
===
Всё нормально работает. Я потихоньку себе что-то там удаляю, добавляю комментарии, провожу изменения в коде и на каком-то этапе замечаю (вдруг!), что мой скрипт перестает выполняться вообще. PHP сообщает, что, мол, присутствует "unexpected $end" и указывает куда-то на последнюю строку скрипта.

В общем, методом проб и ошибок нашел я то место, из-за которого весь сыр-бор приключился. Разумеется, тут не обошлось без регулярки выше (а иначе зачем бы я её приводил, верно ? :) В общем, когда я эту строку закомментировал вот так:
==
// ... '#(<(?:img|a).*?(?:src|href)\s*=\s*["\']\s*)(.*?)(\s*["\'].*?>)#i'...
==
, то произошло страшное следующее. Как я понимаю, интепретатор PHP попытался проигнорировать всё, что дальше '//', включая кавычки, и не воспринимая сам литерал регулярки как строчную переменную, которую не нужно парсить. И в этой строке он обнаруживает последовательность "?>", которая говорит ему, что код PHP закончился. Ну и понятно, что это послужило причиной того, что его перекосило, если можно так сказать.
В общем, закомментировал я эту строку через /* и */, и всё заработало.
Но было весело )

вторник, 13 сентября 2011 г.

Решение задачи о подсчете количества подчисел числа, на которые оно делится без остатка

Снова на Хабре проскочила статья-конкурс, посвященная Дню Программиста, который отмечается сегодня (кстати, с праздником всех причастных к сему событию :) В статье приводится самая простая задача, собственное решение которой на Хаскеле я и хочу привести ниже.
Итак, условие задачи:
==
Напишите код, который находит количество подчисел числа n, на которые это число делится без остатка. Для числа n, подчисло — это такое число, запись которого является подстрокой записи числа n. К примеру, если n равняется 1938, то его подчислами будут являться: 1, 9, 3, 8, 19, 93, 38, 193 и 938. Без остатка 1938 делится на четыре из этих подчисел: 1, 3, 19 и 38. Соответственно, результатом работы программы должно быть число 4. Если подчисла повторяются, каждое из них считается. Например, 101 делится без остатка на 1, 1 и 01, значит, ответ — 3.
==

Мое решение, не претендующее на какую-либо оптимальность:

вторник, 6 сентября 2011 г.

Решение головоломки с хабра на Haskell

На днях на хабре проскочила заметка с одной простой, но изящной головоломкой.
Суть вкратце такова. Имеется автомат с пятью барабанами, где каждый барабан может принимать значение одной из карточных мастей (то есть, всего 4 положения). Каждый барабан руками можно вращать только в одну сторону на один шаг, при этом автоматически также могут вращаться остальные 4 барабана. Матрица таких вращений-сдвигов представлена ниже:
===
     1  2  3  4  5
    --------------
1:  +1 -1 +1  0  0
2:  +1 +1  0  0 -1
3:   0 -1 +1 -1  0
4:  -1  0  0 +1 +1
5:   0  0 -1 +1 +1
===
То есть, например, при вращении барабана N1 на один шаг (примем это направление за положительное), барабан N2 автоматически будет повернут на 1 шаг в обратном направлении, барабан N3 - так же как и барабан N1 - будет повернут на 1 шаг вперед, а положения барабанов N4 и N5 не изменятся.

Задача в следующем. Имеется начальное положение всех барабанов - 0 2 0 3 1, то есть, первый барабан в положении 0, второй - в 2, третий - в 0 и т.д.
Требуется найти такую последовательность поворотов барабанов, чтобы в итоге их положения приняли значения 0 0 2 0 0. Мы эту задачу чуть усложним и будем искать не просто последовательность, а последовательность минимальной длины.

Для решения будем использовать Haskell.

понедельник, 29 августа 2011 г.

Особенности GET-запросов в IE6

Давеча чуть было не тронулся рассудком ) Написал на javascript с использованием jQuery некий простой фрагмент кода, который работал в Firefox 6, но категорически не работал в IE6. Собственно, вот рабочий пример:
$(document).ready(function(){
     alert(1);
     $.getJSON('/test.php', function(d) {
	alert(2);	
     });
 });
Так вот, первый алерт в IE6 срабатывает, а второй - нет, хотя файл test.php исправно лежит в корне сайта и честно выдает корректный json на выход. То есть, такое впечатление, что просто не срабатывает вызов getJSON(). Думал, уже поседею )
Короче, в чем суть. IE6 каким-то образом (в отличие от других браузеров) по дефолту кэширует такого рода запросы. Возможно, это и всем известная вещь, но как-то я её совсем упустил из вида. В общем, радикальный способ решения проблемы следующий: указать для всех ajax-запросов из jQuery отключение кэширования на стороне клиента, например, вот так:
$.ajaxSetup ({ cache: false});
После этого всё работает (вроде бы :).

ps. Важное дополнение. Для IE6 имеет также большое значение правильное указание кодировки для возвращаемых данных. В случае, если данные в JSON находятся в utf-8, то в test.php следует прописать нечто типа такого перед выводом самих данных:
header('Content-Type: text/html;charset=utf-8');

воскресенье, 31 июля 2011 г.

Решение еще некоторых задач на Haskell

Недавно на free-lance.ru в одном из заказов обнаружил вот такое тестовое задание на определение базовых навыков в области программирования:

1) Find the largest palindrome (a palindrome is a number that reads the same in either direction, e.g. 1221) formed by the product of two three-digit numbers.
{Correct answer: 906609}

2) Find the sum of the digits in the number 100! (i.e. 100 factorial)
{Correct answer: 648}

3) Given a list of pairs of numbers e.g. [(1,4), (2,5), (7,3), (4,6), (7,7)] find the longest sub-list that has the pairs sorted by the first entry in ascending order by the second in descending order, [(2,5), (7,3)].

пятница, 1 июля 2011 г.

Решение задачи J финальной части конкурса ACM ICPC 2011

Всем привет. Давно не брал я в руки шашек (в смысле, не писал ничего полезно-тематического). Сегодня мы с вами попробуем решить одну из задач, представленных в финальной части чемпионата мира по программированию среди студентов ACM ICPC 2011. С условиями задач вы можете ознакомиться здесь http://cm.baylor.edu/digital/icpc2011.pdf

Решать будем задачу J (problem J), потому как она мне сразу понравилась своей простотой )) В качестве языка программирования будем использовать Haskell (вообще, насколько я понял, на конкурсе принимались решения только на C++ или Java, но так как мы с вами в конкурсе не участвуем, позволим себе такую вольность).

понедельник, 9 мая 2011 г.

С Днем Победы!

Всем привет.
Давно вообще ничего не писал, но вот сегодня появился повод, святой, как минимум, для каждого жителя бывшего Советского Союза. Именно в этот день 66 лет назад наша страна одержала победу в Великой Отечественной войне.

От всей души поздравляю сегодня всех ветеранов, которых с каждым днем, к сожалению, остается всё меньше. Хочется пожелать вам здоровья, мирного неба над головой.
И низко вам поклониться до самой земли.