Разработка на коленке

"тут должна быть красивая цитата о программировании"

Nim как lisp

2015-06-23 10:00

Совсем недавно поднялся непонятный хайп вокруг языка Nim. И мне тоже стало интересно, что ж за зверь такой. Пока что чтение мануала - это чистый фан. Выяснил вот, что на Nim можно писать как на lisp.

var i: float

proc halfmul(i, j: int): float =
    return (`/` ((`*` (i, j)), 2))

i = (halfmul (10, (`+` (1, 2))))

echo($i)

Какой улыбчивый код может получиться )))

Решение задач на checkio.org

2015-05-06 15:40
Чайка

Сегодня решил последнюю задачу в разделе Home на checkio. Самой интересной была задача про лабиринт. По сути, именно она заставила меня поменять подход к решению задач.

Начало

Зарегистрировавшись там два года назад, я успешно забыл о ресурсе, с головой уйдя только в работу над проектами. Несколько месяцев назад мне снова стало интересно заниматься решением задач по программированию. Первым делом перерешал всё, что нашёл в Elementary, потом взялся за Home. Первые задачи решал одну за одной, просто потому, что они были очень простыми. В Home делал всё ровно тоже самое, пока не взялся за задачу с пирамидой. Не скажу, что она была сложной, но она мне понравилась. Потом был лабиринт. И вот на этой задаче я остановился надолго.

Другой подход

Начав заниматься на checkio, я никогда не ставил себе цель обогнать всех или перерешать все задачи в кратчайшие сроки. Моими целями были развлечение и самообразование. Решать задачи одну за одной, не ковыряясь с ними, было не очень весело, а самообразованием это тоже сложно назвать. Поэтому, взявшись за лабиринт, я не стал искать сравнение алгоритмов поиска в графе и выбирать один из них, чтобы затем быстро его реализовать. Вместо этого взял с полки "Искусственный интеллект" Питера Норвига и стал не спеша читать главу про неинформированный поиск. Потом уже выбрал двунаправленный поиск, просто потому что мне он показался интересным и достаточно оптимальным (хотя о какой оптимальности можно говорить при лабиринте 10 на 10 клеток). Но и тут я не стал сразу же писать код. Где-то 4 дня (все майские праздники) просто в свободное время делал в блокноте наброске о способе обхода дерева, прикидывал, как хранить переферию и в какие структуры данных положить граф. Набрал 4 разных способа реализации. Было интересно. Ну а вчера вечером уже доделал решение в коде, а сегодня, перечитав его, опубликовал. Вот это было интересно. Когда только прочёл задание, то просто хотел взять A* и по-быстрому накидать решение, хорошо, что сделал иначе.

Решение

Решение доступно только тем, кто сам уже решил эту задачу. Мой код доступен по ссылке - Open Labyrinth.

Забыл похвастаться

2014-03-02 02:00

Как-то заработался, да и забыл похвастаться. Мой фикс вошёл в pyglet. Там патч-то на одну строку, точнее на плюс одну константу в строке, однако пофиксило багу с геймпадом в линуксе.

Вот такой маленький diff:

...
185     185         elif control._event_type == EV_ABS and control._event_code == ABS_Y:
186     186             have_y = True
187     187         elif control._event_type == EV_KEY and \
188         -            control._event_code == BTN_JOYSTICK:
188         +            control._event_code in (BTN_JOYSTICK, BTN_GAMEPAD):
189     189             have_button = True
190     190     if not (have_x and have_y and have_button):
191     191         return

Итак - зал славы :).

Как я выбирал между re и grep

2014-02-28 18:00

Было время, когда задачи решались первым же (и самое главное "гениальным") способом, пришедшим в голову. Теперь всё несколько иначе. Возникла у меня задача: человеку показывают в веб-интерфейсе список файлов, человек вводит в поле ввода фразу, и нужно найти, в каких файлах эта фраза есть. Я не знаю, как бы я решал эту задачу раньше, но сейчас было примерно так:

  • нужно найти фразу... хм;
  • можно сделать через in в каждой строке, можно сделать через регулярки (import re), а можно вызвать grep из питоновского кода;
  • многострочный поиск не нужен, в задаче от него толку немного, значит re со своим re.MULTILINE избыточен;
  • in недостаточен, потому что нужна возможность вводить простейшие регулярки
  • значит re vs grep;
  • вызывать внешний процесс боязно, вдруг отработает что-то не так и исключение не поймаем?
  • а вдруг кто захочет обойти питоновское экранирование и ввести rm -rf?
  • не, хакеров у нас нет, доступ к функции приложения у нескольких человек, да и питон не под рутом;
  • а если регулярка сложная и re, который работает как НКА, будет долго жужжать?
  • а если re съест много памяти? grep же всю память освободит, как только завершится;
  • ещё у grep ДКА, т.е. скорость поиска зависит только от величины текста;
  • а если вывод grep будет большой и много памяти уйдёт на это? ведь вывод нужно не просто отдать, как есть а ещё и переформатировать;
  • но ровно столько же вывода отдаст и re;
  • т.е у grep преимущество, потому что ДКА и память точно освободится, но недостаток в том, что процесс внешний;
  • а как будут передаваться регулярки со спецсимволами, например \w+? нормально будут передаваться, только синтаксис греповский \w\+;
  • преимущества grep в данном случае важнее, чем недостатки, а если требования изменятся, то перепишу;
  • берём subprocess.Popen(['grep', '-rin', what, where]).

После этого пишу 15 строк кода, над которыми дольше думал, чем писал их.

Пара игр на python + pygame

2013-09-02 23:00
Игра про sparkling tail (python-версия)

Сделал пару игр на python + pygame ради развлечения. Это было интересно. При разработке мне было важно сделать управление с геймпада, просто потому что хотелось поиграть не только на клавиатуре, но и отодвинувшись от ноутбука (беспроводной геймпад - это очень удобная штука).

Сначала сделал простую леталку в космосе (pyspaceship), не особо заморачиваясь красотой рисунков и корректностью в реализации, мне просто важно получить что-то работающее на основе pygame.

Потом сделал платформер (sparklingtail), в котором нужно управлять непонятной зверушкой со светящимся хвостом и поедать ядовитого цвета грибы. Тут цели были уже немного другими:

  • использовать внешний файл для хранения уровней (tmx);
  • создать уровень в тайловом редакторе;
  • все кадры анимации положить в один файл;
  • сделать меню и экран победы;
  • сделать графику более привлекательной;
  • в комментариях и readme использовать английский язык, каким бы корявым он ни был.

Исходный код выложил на bitbucket: