Друзья! Вот и подходит к концу 2011 год. В этом году, возможно, не все у нас получалось так, как нам бы хотелось. Что-то мы успели сделать, а что-то так и осталось незавершенным.
Наступает новый 2012 год - год Дракона. Хочется пожелать всем вам, чтобы в новом году вам сопутствовала удача, пожелать вам крепкого здоровья и успехов во всех ваших благих начинаниях. С Новым 2012 годом!
Планирую писать не только о программировании, но и о прочих, иногда не совсем совместимых вещах. Например, о музыке, которую я тоже очень люблю )
суббота, 31 декабря 2011 г.
вторник, 20 декабря 2011 г.
Задача о движущихся точках и её решение на языке Haskell
В блогах на сайте free-lance.ru не так давно один человек разместил задачу, условие которой в чуть облагороженном (мной :) виде звучит следующим образом:
===
===
Попробуем написать решение этой задачи на Haskell.
===
Имеется N вершин, между ними есть ребра (длину ребер мы задаем сами целым числом). По ребрам ездят точки, которые могут ехать в обе стороны. При нахождении двух точек в одной вершине происходит столкновение. Соответственно, если точки едут по одному ребру навстречу друг другу, тоже произойдет столкновение. Движение точек задано списком вершин, через которые они проходят. Скорости точек равны единице. При
достижении конечной вершины точка исчезает. По заданной конфигурации сети и точек
определить, будет ли столкновение.
===
Попробуем написать решение этой задачи на Haskell.
вторник, 6 декабря 2011 г.
Задача о составлении математических выражений на Хаскеле
В ЖЖ Романа Душкина не так давно был проведен конкурс на самое хорошее решение следующей задачи:
==
Даны числа 1, 5, 6 и 7. При помощи произвольного числа арифметических операций и
скобок необходимо составить такое математическое выражение из этих чисел, чтобы его
значение было равным 21. Данные числа можно использовать в выражении только по одному разу. Числа нельзя «склеивать» друг с другом (то есть из 1 и 5 получить 15).
==
Так как на конкурс я опоздал, да и решение у меня получилось наверняка не особо приятное :), опубликую его тут. Итак, в качестве языка выбираем Haskell.
==
Даны числа 1, 5, 6 и 7. При помощи произвольного числа арифметических операций и
скобок необходимо составить такое математическое выражение из этих чисел, чтобы его
значение было равным 21. Данные числа можно использовать в выражении только по одному разу. Числа нельзя «склеивать» друг с другом (то есть из 1 и 5 получить 15).
==
Так как на конкурс я опоздал, да и решение у меня получилось наверняка не особо приятное :), опубликую его тут. Итак, в качестве языка выбираем Haskell.
пятница, 2 декабря 2011 г.
Старый советский фильм "Коммунист"
Недавно пересмотрел старый советский фильм "Коммунист", вышедший в 1957 году. Помню, что в детстве смотрел этот фильм несколько раз. Лет мне тогда было мало, и кульминационную сцену фильма, в которой убивают главного героя - коммуниста Василия Губанова - я вообще смотрел с закрытыми глазами.
Ну так вот. Пересмотрел этот фильм на днях. Смотрится на одном дыхании. Евгений Урбанский был действительно великим актером. Жаль, что он трагически погиб в достаточно молодом возрасте.
Ну так вот. Пересмотрел этот фильм на днях. Смотрится на одном дыхании. Евгений Урбанский был действительно великим актером. Жаль, что он трагически погиб в достаточно молодом возрасте.
понедельник, 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.
==Мое решение, не претендующее на какую-либо оптимальность:
Подписаться на:
Сообщения (Atom)