Рубрика «haskell» - 21

Поиск скрывающегося Доктора X среди пациентов — решение более сложных логических задачВ сентябре на традиционном конкурсе по функциональному программированию, проводимому под эгидой ФП(ФП), была выставлена задача, продолжающая тему адекватности душевного состояния различных субъектов. Но если в августе конкурсанты решали более или менее простую логическую задачу, то на этот раз в условиях было вставлено немного случайности — среди здоровых и психически больных людей затерялся субъект, который «играл» с исследователями, а потому истинность его суждений могла принимать значение как 1, так и 0. В общем, условия задачи были таковы:

Давненько санитарам первой городской больницы уездного города N не приваливало столько работы. Подумать только — город-здравница; город, в который приезжали лечиться со всех концов необъятной страны; город, известный чистотой воздуха, прозрачностью воды; и вдруг — массовое пищевое отравление, причём настолько массовое, что пришлось разворачивать целый палаточный городок, чтобы разместить всех пациентов — 435 человек.

Главный врач был первым, кто заметил неладное — уже к вечеру второго дня. Странные взгляды, которые бросали некоторые пациенты, непонятные смешки, волнами перекатывающиеся по больничному комплексу. На третье утро врачи обнаружили, что ночью часть пациентов оказалась обрита на лысо с выбритым на затылке символом. К обеду пришли известия о том, что среди пострадавших от отравления отдыхающих оказалось и более двух сотен человек, проходивших лечение в различных психиатрических стационарах страны и собранных в городе N в ходе полузасекреченного эксперимента «В здоровом теле — здоровый дух».

Поскольку в ходе госпитализации были допущены некоторые нарушения, то отличить психически здоровых людей от психически нездоровых по документам оказалось невозможно. Единственно доступной информацией является информация, полученная путём опроса пациентов — каждый из них составил список из нескольких человек, в психическом состоянии которых он уверен. Ситуация осложняется тем, что среди пациентов находится и таинственный Доктор X — идеолог и основоположник проекта «В здоровом теле — здоровый дух». Доктор Х, являясь мастером человеческой психики, может гениально изображать любое поведение так, что и нормальные и психически нездоровые пациенты не способны дать ему адекватную оценку, они будут видеть только то, что Доктор Х хочет чтобы они видели. В данном случае Доктор X развлекается и для общения с любым человеком бросает монетку. Точно такой же способ Доктор Х использовал и для заполнения своего листа опросника.

В ходе заполнения этих опросников был обнаружен и дневник Доктора Х, из которого стало ясно что художественно обрил часть пациентов именно он, но о причинах можно только догадываться. Текст, который удалось разобрать гласит — «Сначала здоровые в алфавитном порядке, а потом мои драгоценные пациенты в обратном, построить в 31 колонну по 14 рядов».

Необходимо отметить, что данную задачу и задачу на проверку общности алгоритма разработал, а сам конкурс организовал наш добрый коллега Михаил Байков, который подвизался на поприще коммерческой разработки информационных систем на языке программирования Haskell. Далее представлены его решения для генерации задания и для поиска ответа.

Далее в этой заметке мы рассмотрим модули для генерации задания, для поиска решения, а также два вспомогательных модуля.

Читать полностью »

Японский кроссворд — головоломка, в которой по набору чисел нужно воссоздать исходное черно-белое изображение. Каждой строке и каждому столбцу пикселей соответствует свой набор, каждое число в котором, в свою очередь, соответствует длине блока подряд идущих черных пикселей. Между такими блоками должен быть хотя бы один белый пиксель, но точное их число неизвестно. Журналы, целиком посвященные этим головоломкам, есть в большинстве газетных киосков, так что, думаю, почти все с ними хоть раз да встречались, и потому более подробное описание здесь можно не приводить.

В какой-то момент мне захотелось «научить компьютер» решать японские кроссворды так, как решаю их я сам. Никакой высокой цели, just for fun. Потом уже были добавлены способы, которые сам я применять не могу в силу ограниченных возможностей человеческого мозга, но, справедливости ради, со всеми кроссвордами из журналов программа справляется и без них.

Итак, задача простая: решить кроссворд, а если решений много, то найти их все. Решение написано на Haskell'е, и, хотя код достаточно существенно дополняет словесное описание, даже без знания языка общую суть понять можно. Если хочется пощупать результат вживую, на странице пректа можно скачать исходники (бинарных сборок не выкладывал). Решения экспортируются в Binary PBM, из него же можно извлекать условия.

Решение японских кроссвордов на Haskell

Несмотря на то, что я пытался писать максимально понятно, это не в полной мере мне удалось. Под катом очень много букв и кода и почти нет картинок.
Читать полностью »

Легкая прогулка от функтора через монаду к стрелке
Давайте совершим прогулку по цепочке Pointed, Functor, Applicative Functor, Monad, Category, Arrow, в процессе которой я попытаюсь показать что все это придумано не для того что бы взорвать мозг, а для решения вполне реальных проблем, притом существующих не только в haskell. Большая часть кода написана на C#, но думаю и без его знания можно будет понять что к чему.
Читать полностью »

Бинаризация как более адекватная техника прогнозирования сводных значенийСего дня мы продолжим рассмотрение техник научного менеджмента в применении к управлению проектами. В частности, данная заметка будет продолжением моего описания алгоритма построения графика распределения вероятности для объектов воздействия рисков. Для этого мы рассмотрим, что такое процесс бинаризации, как его применить для более адекватной оценки прогнозных сводных значений, а также посмотрим на реализацию данного алгоритма на прекраснейшем языке программирования Haskell.

Хотелось бы сразу предупредить, что в статье есть немного «матана», так что для её чтения желательно иметь базовые представления о теории вероятности. В частности, необходимо понимание формул для умножения и сложения вероятностей для независимых событий. Более серьёзные темы из теории вероятностей здесь не рассматриваются.

Читать полностью »

Решение (несложных) криптографических задач на языке HaskellВторая инкарнация вводного курса по криптографии на Coursera порадовала тем, что в ней для решения задач можно было пользоваться произвольным языком программирования. Ну и поскольку мои познания в криптографии ограничивались тем, что я прочитал в рассказах «Золотой жук» Эдгара По и «Пляшущие человечки» Артура Конан-Дойля, то я с удовольствием прослушал все лекции, порешал задачи и поучаствовал в жизни тамошнего форума.

За шесть недель курса почтенным слушателям было предложено шесть задач на программирования по следующим темам:

  1. Поточные шифры.
  2. Блочные шифры.
  3. Аутентификация сообщений.
  4. Аутентификация шифровок.
  5. Обмен ключами.
  6. Шифрование при помощи открытых ключей.

Все представленные программные задачи были мной решены при помощи прекрасного языка функционального программирования Haskell. Для этих целей пришлось накодировать несколько вспомогательных модулей, а также две задачи были решены в полуавтоматизированном режиме (режим «автоматизированного криптоанализа»). Далее в этой заметке я приведу сначала описание вспомогательных модулей, а потом описание функций для решения задач. Самих ответов я приводить не буду, чтобы не нарушать так называемый «Кодекс чести». И если вы планируете самостоятельно проходить этот курс, то рекомендую вам не читать дальнейший текст.

Читать полностью »

Решение логических задач на языке Haskell: в своём ли уме Валет?Сегодня я хотел бы подвести итоги под результатами августовского конкурса по функциональному программированию, который ежемесячно проводится под эгидой ФП(ФП). На этот раз в качестве задачи участникам была предложена несколько переформулированная задача из книги Р. М. Смаллиана «Алиса в стране смекалки»:

Тройка думает, что Туз не в своём уме. Четвёрка думает, что Тройка и Двойка обе не могут быть не в своём уме. Пятёрка думает, что Туз и Четвёрка либо оба не в своём уме, либо оба в своём уме. Шестёрка думает, что Туз и Двойка оба в своём уме. Семёрка думает, что Пятёрка не в своём уме. Валет думает, что Шестёрка и Семёрка обе не могут быть не в своём уме. В своём ли уме Валет?

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

Читать полностью »

Управление лифтами: решение на языке HaskellТрадиционный конкурс по функциональному программированию состоялся в июле. Судя по количеству участников, большинство апологетов программирования на этот раз убыли на отдых, либо не стали участвовать в конкурсе, экономя силы и готовясь к ICFPC, который в этом году состоялся через неделю после моего мероприятия. Тем не менее, в конкурсе на этот раз приняли участие девять человек, из которых семеро дали в той или иной степени правильные ответы. Распределение по языкам программирования: Haskell — 4 решения, из которых 2 некорректные; C++, Clean, F#, Java и Perl — по одному решению.

Задача на этот раз была из области автоматического управления. Конечно, она всё также сводилась к поиску на графе, для чего всяко можно использовать алгоритм A*. Тем не менее, большинство участников выбрали реализацию ad hoc, в том числе и победитель. Вот примерное условие:

На улице генерала Белова стоит четырнадцатиэтажный дом.

На первом этаже живет Митя. На втором — Петя, Тёма и Саша. На третьем — Витя, а на четвёртом — Маша и Паша. Кто живёт выше — никто не знает.

Митя и Витя собираются в гости к своему однокласснику Тёме. Паша позвонил Пете и попросил его вернуть конспект по ОБЖ. Сашина кошка снова улизнула из квартиры и наверняка греется у батареи на третьем этаже. Саша полон решимости вернуть её домой. Маша, тем временем, хочет сходить в магазин за новым велосипедным звонком.

В начальный момент времени лифт находится на первом этаже. Одновременно в лифте может находится не более двух человек, а пользоваться лестницей нельзя из-за ремонта. «Шагом» считается перемещение лифта между парой соседних этажей. В начале каждого шага ученики могут свободно перемещаться между лифтом и лестничной площадкой.

Необходимо было написать программу, которая составляет программу для лифта. Само собой разумеется, поощрялось обобщённое программирование, то есть создание изначально наиболее общей программы — под произвольное количество этажей и лифтов. Не все это восприняли, но тем не менее. Ну а далее в этой статье будет представлена авторская интерпретация решения этой задачи.

Читать полностью »

На хабре уже были статьи про продолжения и монаду ContT. Я решил поделиться своим пониманием этого вопроса и снабдить его соответствующими иллюстрациями. В отличие от приведенной выше статьи, мне бы хотелось больше внимания уделить внутреннему устройству монады ContT и разобраться, как же она работает.
Читать полностью »

Haskell один из быстроразвивающихся функциональных языков программирования. Возможно это один из тех функциональных языков которому вы хотите отдать предпочтение практического использования в ближайшее время.

Этот топик для тех, кто хотел бы опробовать Haskell на деле, но имеет горы полезного C и C++ кода с которым требуется считаться.Читать полностью »

Приветствую.

Уж не знаю, как так вышло, но игрался я на досуге с лямбда-выражениями в С++11 (о которых, к слову, я уже писал статью, снискавшую пару лет назад на удивление достаточно неплохую популярность), и под наркотическим воздействием впечатлением от языка Haskell начал разбираться с такими понятиями, как частичное применение и каррирование в контексте языка С++. И для начала, пожалуй, неплохо бы нам определиться с этими терминами.

Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js