пятница, 14 августа 2015 г.

Морзянка на Raspberry PI

Продолжаем эксперименты. В прошлый раз мы просто зажигали и гасили светодиод. Но этого нам мало. Я же вообще себя представил где-то на корабле, вокруг волны бются, качает, чемоданы падают и всё такое. В общем, надо бы как-то пообщаться. Для этого издавна уже используется азбука морзе.

Ну на самом деле код бесхитростный - берём по нашим буквам последовательность точек и тире. Таким образом получаем последовательность, которую можно пускать на светодиод. Почему-то я решил, что неплохо бы ещё заодно и парсить эту последовательность в буквы, взял дерево с википедии и с него же строил карту соответствий точек и тире в буквы. Подробнее можно посмотреть тут. В общем, ничего сверхъестественного, не считая, как я обнаружил совсем недавно, что дерево и таблица в википедии  не совпадают, но это уже проблемы данных.

Итак, вернёмся к нашим точкам и тире. По записям из той же вики. Длина точки это наша единица длины. Тире - это три точки. Между точками и тире пауза в одну точку и между словами пауза в 7 точек. Собственно, это и получилось:

(ql:quickload "gpio-sysfs")
(ql:quickload "morse")

(defparameter *pin* 27)
(defparameter *morse-time* 0.1)

(defun initialize ()
  (gpio:initialize-pin *pin* :out 0)
)


(defun wait (times)
  (sleep (* times *morse-time*))
)


(defun morse-dot ()
  (gpio:write-pin *pin* 1)
  (wait 1)
  (gpio:write-pin *pin* 0)
  (wait 1)
)


(defun morse-tire ()
  (gpio:write-pin *pin* 1)
  (wait 3)
  (gpio:write-pin *pin* 0)
  (wait 1)
)


(defun morse-word-letter (word-letter)
  (if word-letter
    (progn
      (map 'list
        (lambda (morse-letter)
          (ecase morse-letter
            (#\. (morse-dot))
            (#\- (morse-tire))
)
)
        word-letter)
      (wait 3))
    (wait 7)))

(defun morse-say (string)
  (let ((morse-struct (morse:to-morse string)))
    (mapcar
      (lambda (word-letter)
        (morse-word-letter word-letter)
)

      morse-struct
)

    nil
))

(initialize)
(morse-say "sos")
Теперь можно посылать различные сигналы вокруг. Например, писать, "Not enough minerals! Mine more minerals!". Выводы светодиода соединены к 27 пину GPIO. sbcl собран из исходников. Всё это работает на Raspberry PI B вроде бы, что-то древнее, но не самое простое.


вторник, 11 августа 2015 г.

ICFPC-2015: Отчёт об участии (Ктулху фтагн!)

Начало

Собственно, началось всё довольно обыденно. За пару месяцев до начала списались, договорились участвовать бравые лисперы swizard, sectoid  и grep-z. Заранее спланировали время, чтобы освободить ЭТИ дни на трёхсуточный марафон. Кровь бурлила, были настроены выигрывать. :)

Организаторы сразу начали нагнетать. Сначала в анонсе, затем в своём твиттере. Это и про восстание машин, и про квантовые комьпютеры. Да и вообще кучу всего. Уже предвкушал, предвкушал, потом появился странный твит: "R1 O0 P1 Q1 P1 O0 N0 N0 P1 R1 Q1 P1 O0 P1 Q1 R1 P1 N0 N0 Q1 S1 N1 T1 S1 R1 P1 R1 Q1 P1 O0 O0 P1 Q1 R1 P1 N0 N0". Я его не понял совсем, думал, что-то с кубитами. Затем про пчёл, затем про то, что то, что они видел - это вообще страх и ужас какой, да и лого было многообщеающим.

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


Картинка взята у какого-то участника. В общем, как и говорил, правила очень простые - двигать фигуры, расставлять, сжигать ряды, кодить всё это в дополнительные фразы. Вроде, если подумать, скукота. :) И тем обиднее, как плохо выступили.

Соревнования

К сожалению, на старте отвалился grep-z, извинившись за внезапно возникшие проблемы, зато добавился товарищ jtootf. Задания прочитали, всё просто, сразу напряглись, предполагая, что же будет в аддонах. Дополнительно ещё фразы были неизвестны, их предлагалось найти самим в произведениях Лавкрафта, да и в предоставленных медиа. Они, кстати, были на картах.

Ну, нацелились на лайтниг и молниеносно ворвались! Я уже не помню, кто что кодил, но swizard взял на себя основную работу, а мы проверяли, подсказывали, что-то пробовали дополнительное. Sectoid и jtootf, будучи более вовлечёнными в тему Ктулху, искали слова. Я с поиском фраз вообще не участвовал, ибо на этих соревнованиях про Ктулху услышал раз во второй, ну или, максимум, в третий.

Началось всё с ГСЧ. Видать, чтобы строго формализовать всю игру, орги определили алгоритм ГСЧ. По описаниям, он совпадал с системным, а вот по значениям не совпадал. Пришлось быстро налабать свой. Дополнительных проблем доставили соты, но их решили, перейдя на кубические координаты.

В общем, первый день кодили, кодили, кодили, кодили, кодили. Прям как девелоперс. При этом сделали карту, бинарь, переход из одной позиции в другую. Правда, алгоритм расположения был кривоват при поиске конечного места. В общем, к лайтнингу что-то уже было. Туповатое, правда. К лайтнингу сабмитим карты и! Огорчаемся. :( Где-то на картах даёт скор, где-то даёт лишь 0 очков. 0! Боль! Смотрим визуализацию и как печально, но некоторые элементы располагаются в начальной позиции не так, как описано в правилах. Бывают в жизни огорчения. Это находим минут за 5 до конца лайтнинг раунда. В общем, прошли мимо лайтнинга.

Далее добавляем к нашему алгоритму подбор места на основе оценки итогового состояния доски. Всё это работает, правда, медленно. Подбираем коэффициенты, пилим для этого генетический алгоритм, но что-то на него забиваем. Но вспоминаем почти под конец. :) Там же лихорадочно лепим подбор на основе выхода из начального положения рандомно куда-нибудь. Правда, ничего уже подобрать особо не успеваем, ищем фразы, добавляем ещё эвристику, но сабмитим наш старый вариант, потому что получая прирост на одних картах, при этом получаем заметный регресс на других, попутно перетирая пару карт с нулевым результатом. Итог - 57 место. Предварительно. Окончательные результаты в сентябре.

Зов Ктулху

На третий день соревнований я испытал проблемы с инетом. То же было и у swizard'а. Мы переключились на резервный канал. Затем за полчаса до конца соревнований я испытал проблемы и с резервным каналом, но переключился на ещё один резервный. Наверное, это Ктулху звал нас. Но мы не пошли. :)

Дополнительно


Итого

Несмотря на простое задание, было очень весело. Ребята, с которыми я был в команде - вы супер, реально. Спасибо вам за участие. В общем, хорошо провёл эти три сутки, хотя в какие-то периоды можно было вставлять спички в глаза. :) Ну, надо готовиться и брать вершину в следующем году.

Отчёт swizard'а можно прочитать здесь.

пятница, 7 августа 2015 г.

ICFPC-2015, Таки идиш.

Проснулся с утра и новый твит. А там идиш. И позже орги дописали, что да, на идише текст. Имеет ли смысл какой текст или нет - пока не знаю, но явно не просто так он появился. :) Меж тем, перевод, сделанный в гугл транслейт, гласит: "В его доме на R'lyeh смерть kthulhu пшеницы сновидения." Во как, блин!

четверг, 6 августа 2015 г.

ICFPC-2015, Всё фигня, кроме пчёл

Опять потвитали орги. Говорят, обычный вопрос про то, где тыква? Да и ещё привели ссылку на пчёл, сопроводив комментарием: "Чёртов агро-комплекс! Если бы только они знали..."

ICFPC-2015, Аааа! Квантовые вычисления.

Накидали орги твитов. Одна из ссылок ведёт на статейку о компьютере гугла, который построит квантовый компьютер. Думаем, думаем...