Недавно пересмотрел старый советский фильм "Коммунист", вышедший в 1957 году. Помню, что в детстве смотрел этот фильм несколько раз. Лет мне тогда было мало, и кульминационную сцену фильма, в которой убивают главного героя - коммуниста Василия Губанова - я вообще смотрел с закрытыми глазами.
Ну так вот. Пересмотрел этот фильм на днях. Смотрится на одном дыхании. Евгений Урбанский был действительно великим актером. Жаль, что он трагически погиб в достаточно молодом возрасте.
Планирую писать не только о программировании, но и о прочих, иногда не совсем совместимых вещах. Например, о музыке, которую я тоже очень люблю )
пятница, 2 декабря 2011 г.
понедельник, 14 ноября 2011 г.
Интересное об отступах в Haskell
Недавно тут меня в комментах один человек спрашивал на тему ошибки, связанной с неправильными отступами в Haskell. Загуглив на эту тему, нашел кое-что интересное. Haskell нормально проглатывает символы табуляции в исходном коде, но интерпретирует их как пробельные строки длиной 8 символов. Так как у меня в редакторе выставлен размер "таба" в 4 пробельных символа, то это дает некоторые интересные эффекты.
Рассмотрим следующий пример бестолкового кода:
Если отступы внутри тела функции f были получены применением символов табуляции, никакого сообщения об ошибке синтаксиса мы не увидим. Хотя должны были бы, так как строка "x + 1" должна быть сдвинута минимум на 1 символ вправо относительно "g" в предыдущей строке кода. Но так как символы табуляции Хаскелем разворачиваются в строки
пробелов длины 8, у нас "x+1" "уедет" значительно правее, и исходник будет обработан корректно.
Если же отступы в том же исходном тексте были честно получены при помощи пробельных символов, то при попытке его запуска мы получим сообщение "possibly incorrect indentation".
То есть, визуально одинаковый исходный код (при определенных настройках редактора) может быть и ошибочным, и нет. В любом случае, следует быть аккуратным и осторожным :)
Рассмотрим следующий пример бестолкового кода:
f x y =
let g =
x + 1
in g + y
Если отступы внутри тела функции f были получены применением символов табуляции, никакого сообщения об ошибке синтаксиса мы не увидим. Хотя должны были бы, так как строка "x + 1" должна быть сдвинута минимум на 1 символ вправо относительно "g" в предыдущей строке кода. Но так как символы табуляции Хаскелем разворачиваются в строки
пробелов длины 8, у нас "x+1" "уедет" значительно правее, и исходник будет обработан корректно.
Если же отступы в том же исходном тексте были честно получены при помощи пробельных символов, то при попытке его запуска мы получим сообщение "possibly incorrect indentation".
То есть, визуально одинаковый исходный код (при определенных настройках редактора) может быть и ошибочным, и нет. В любом случае, следует быть аккуратным и осторожным :)
пятница, 30 сентября 2011 г.
Ужас PHP, летящий на крыльях ночи
Всех с наступающей ночью )
Только что чуть еще не добавил себе седых волос по причине программированияна PHP. В общем, ситуация. Имеется большой по размеру PHP-файл, где-то в середине которого присутствует регулярка вот такого вида:
===
Всё нормально работает. Я потихоньку себе что-то там удаляю, добавляю комментарии, провожу изменения в коде и на каком-то этапе замечаю (вдруг!), что мой скрипт перестает выполняться вообще. PHP сообщает, что, мол, присутствует "unexpected $end" и указывает куда-то на последнюю строку скрипта.
В общем, методом проб и ошибок нашел я то место, из-за которого весь сыр-бор приключился. Разумеется, тут не обошлось без регулярки выше (а иначе зачем бы я её приводил, верно ? :) В общем, когда я эту строку закомментировал вот так:
==
, то произошлострашное следующее. Как я понимаю, интепретатор PHP попытался проигнорировать всё, что дальше '//', включая кавычки, и не воспринимая сам литерал регулярки как строчную переменную, которую не нужно парсить. И в этой строке он обнаруживает последовательность "?>", которая говорит ему, что код PHP закончился. Ну и понятно, что это послужило причиной того, что его перекосило, если можно так сказать.
В общем, закомментировал я эту строку через /* и */, и всё заработало.
Но было весело )
Только что чуть еще не добавил себе седых волос по причине программирования
===
...'#(<(?:img|a).*?(?:src|href)\s*=\s*["\']\s*)(.*?)(\s*["\'].*?>)#i'...
===Всё нормально работает. Я потихоньку себе что-то там удаляю, добавляю комментарии, провожу изменения в коде и на каком-то этапе замечаю (вдруг!), что мой скрипт перестает выполняться вообще. PHP сообщает, что, мол, присутствует "unexpected $end" и указывает куда-то на последнюю строку скрипта.
В общем, методом проб и ошибок нашел я то место, из-за которого весь сыр-бор приключился. Разумеется, тут не обошлось без регулярки выше (а иначе зачем бы я её приводил, верно ? :) В общем, когда я эту строку закомментировал вот так:
==
// ... '#(<(?:img|a).*?(?:src|href)\s*=\s*["\']\s*)(.*?)(\s*["\'].*?>)#i'...
== , то произошло
В общем, закомментировал я эту строку через /* и */, и всё заработало.
Но было весело )
вторник, 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 барабана. Матрица таких вращений-сдвигов представлена ниже:
===
То есть, например, при вращении барабана N1 на один шаг (примем это направление за положительное), барабан N2 автоматически будет повернут на 1 шаг в обратном направлении, барабан N3 - так же как и барабан N1 - будет повернут на 1 шаг вперед, а положения барабанов N4 и N5 не изменятся.
Задача в следующем. Имеется начальное положение всех барабанов - 0 2 0 3 1, то есть, первый барабан в положении 0, второй - в 2, третий - в 0 и т.д.
Требуется найти такую последовательность поворотов барабанов, чтобы в итоге их положения приняли значения 0 0 2 0 0. Мы эту задачу чуть усложним и будем искать не просто последовательность, а последовательность минимальной длины.
Для решения будем использовать 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. Собственно, вот рабочий пример:
Короче, в чем суть. IE6 каким-то образом (в отличие от других браузеров) по дефолту кэширует такого рода запросы. Возможно, это и всем известная вещь, но как-то я её совсем упустил из вида. В общем, радикальный способ решения проблемы следующий: указать для всех ajax-запросов из jQuery отключение кэширования на стороне клиента, например, вот так:
ps. Важное дополнение. Для IE6 имеет также большое значение правильное указание кодировки для возвращаемых данных. В случае, если данные в JSON находятся в utf-8, то в test.php следует прописать нечто типа такого перед выводом самих данных:
$(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) 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)].
Подписаться на:
Сообщения (Atom)