Компания
1 056,71
рейтинг
3 октября 2014 в 16:25

Разработка → Golf от Moscow.pm для всех



Всех с пятницей! По итогам недавно прошедшей встречи Moscow.pm я хочу предложить всем желающим посоревноваться в решении задачки.

Гольф (англ. golf) — спортивная игра, в которой отдельные участники или команды соревнуются, загоняя маленький мячик в специальные лунки ударами клюшек, пытаясь пройти отведённую дистанцию за минимальное число ударов.
Wikipedia

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

Задача «Домино»: на Github

Домино́ — игра, в процессе которой выстраивается цепь костяшек («костей», «камней»), соприкасающихся половинками с одинаковым числом очков. Таким образом каждая костяшка характеризуется парой чисел, не важно в каком порядке.
Wikipedia

Задача. Найти максимально длинное кольцо, которое можно составить из списка предложенных вам костяшек или вывести 0, если их нельзя закольцевать.

Входные данные: Строка из пар чисел от 0 до 6, разделенных пробелом. Каждая пара — одна костяшка.
Пример: 01 11 12 22 31 32
Данные подаются на STDIN: cat data | golf.pl
Пример ответа: 11 12 22 23 31

Проверить работоспособность решения можно приложенным набором тестов, пока только для perl (присылайте свои пул-реквесты):
prove test.pl

Размер решения можно посчитать с помощью скрипта golfcount.pl:
perl golfcount.pl golf.pl

Решения присылайте на dzirtik@gmail.com с темой «Golf 1410». Крайний срок приема решений 31 октября 2014 23.59. Решение может быть на любом языке программирования. Для лучших решений у нас заготовлены призы.
Автор: @Dzirtik

Комментарии (65)

  • –21
    Написал в рассылке- напишу и тут:

    Иногда поражаюсь, что у людей с клевой квалификацией и опытом нет нормальных дел, чем заняться, кроме написания коммерческого говна в корпорации, а на досуге играть в игры для задротов.

    Свободный Мир ждет полноценную распределенную trustless замену скайпу, почте, ютубу, самому интернету (mesh-сети), вебу, а крутые программеры играют в «гольф». ((:
    • +7
      И отчего «Свободный Мир» ждёт? Свободно может сам написать замену.
    • +5
      На то он и досуг, нет?

      Кроме того, эта так называемая «игра для задротов» очень даже разминает извилины и повышает скилл. И адреналина немного тоже есть, особенно когда видна топ-таблица в лайв-режиме перед окончанием срока приема ответов )
      • +1
        Топ таблицу, планируем!)
    • +1
      Так в чём проблема? Создайте задание и тесты для следующего турнира «Гольфа»: напишите наименьший по размеру распределённый клиент-сервер скайпа ;-)
      • +1
        Увы, не годится — этот клиент будет без проверки валидности данных и его код будет невозможно поддерживать и развивать даже автору.
      • 0
        задание уровня вопроса на codegolf.stackexchange.com/ используется для рекламы… корпоративного стиля жизни ). Смешно, как-то. Неужели стремление поиграть в ребенка-хакатонщика настолько важнее написания серьезных вещей?
        • –4
          неистово плюсую! задача реально настолько простая и лобовая, что и решать особо желания нет. хотя абсолютно уверено что у меня решение бы вместилось в стандартный однострочник( <=80 символов)
          • +3
            Было бы интересно посмотреть на такое короткое решение
      • –2
        я гольфил достаточно долго и много, совершенно разнообразных задач(и прямо тут на хабре даже один раз побеждал), но эта… просто феерически неинтересная.
  • +1
    Давненько я не гольфил, хех… ))

    Когда-то был сайт с регулярными соревнованиями, жаль, забросили его (
    • НЛО прилетело и опубликовало эту надпись здесь
    • +2
      Есть JAGC: jagc.org/
  • +12
    Решение может быть на любом языке программирования.

    Предлагаю беспроигрышный вариант: написать решение на языке программирования "Domino".

    Это такой скриптовый язык программирования, который правда очень ограничен в своей функциональности, синтаксис у него очень простой и содержит только 1 команду "1".

    Собственно программа на этом языке выглядит примерно так:
    1

    Команда 1 выполняет следующее — она берет из STDIN пары чисел и строит из них наиболее длинное кольцо либо возвращает 0 если числа не закольцовываются.

    Если по какой-то причине для проверки решения на этом языке у вас нет компиллятора языка «Domino» — он прилагается к решению.
    • 0
      Это я намекаю что некоторые языки программирования имеют синтаксис, который позволяет писать заведомо более короткие программы, чем на других языках, поэтому стоит все таки ограничить пул языков, тем же самым перлом, например.
      • +1
        Спасибо, за идею, но увидеть такие решения, даже на языке domino было бы очень интересно, и они имеют полное право на участие в таких конкурсах.
        • 0
          Стоит заранее описать условие, что никакими модулями/библиотеками пользоваться нельзя. А то можно специально создать модуль Q, который все делает, и программа получится из 5 символов 'use Q'.
          • 0
            Подробные общие правила Гольфа можно посмотреть, например, здесь: thospel.home.xs4all.nl/golf/rules.html. Как раз п. 5-6 про использование модулей. Самописные модули нельзя использовать никогда, модули из базовой поставки Perl — согласно правилам конкретного соревнования.

            Вообще, в правилах можно много нюансов накопать, если заморочиться. Но, наверное, не так уже это всё важно, главное, чтобы было интересно участникам.
    • +7
      Пф. На Domino 9000 (форке языка Domino) программа вообще не содержит символов :D
      • +3
        Угу, чем и сломали обратную совместимость. Большинство библиотек на d9000 не портированы.
        • +1
          Ну так поэтому оно и форк, потому что части коммьюнити надоело подставлять костыли для обратной совместимости в этом вашем корявом domino :-)
  • 0
    Подскажите, пожалуйста, когда будет выложено видео со вчерашней встречи?
    • 0
      Привет. Видео доступно на странице трансляции, на следующей неделе оно будет выложено на нашем канале в youtube
      • 0
        Спасибо большое!
  • +2
    Важно чтобы люди понимали, на продакшене мы на Perl так не пишем, только развлекаемся в свободное время такими вот штуками :)
  • 0
    Пример: 01 11 12 22 31 32
    Пример ответа: 11 12 22 23 31

    откуда там 23 в ответе?
    • +2
      Фишки Домино можно переворачивать
      • 0
        упс, вопрос отпал — туплю после отпуска…
  • +3
    Оффтоп, но все же:
    «Блог компании Mail.Ru Group», а ниже «Решения присылайте на dzirtik@gmail.com».
    Вам не кажется, что это антиреклама для своих сервисов?
    • +2
      Этой мой древний, любимый ящик, но я им пользуюсь через мейловую мультиавторизацию image
      • 0
        Да не в этом дело, я все понимаю, все пользуются тем чем хотят, к чему привыкли, чем раньше пользовались т.п. Но все таки это ведь публичный корпоративный блог.
        • +2
          Может это был тонкий подход к рекламе мейловой мультиавторизации? Кто-нибудь обратит внимание, на gmail ящик, спросит, а тут ему про такую фичу расскажут! ;-)
        • +2
          Просто конкурс я запускаю не как сотрудник mail.ru, а как лидер Moscow.pm (сообщество perl-программистов). Меня знают под этим ником и с этим email. Mail.ru же, является спонсором проведения наших мероприятий и, в частности, спонсором этого соревнования.
  • 0
    Не указан требуемый порядок костей на выходе. Или, исходя из тестов, он может быть любым?
    • 0
      Любым, удовлетворяющим условию зациклености
  • 0
    Может, я проглядел, но как должны обрабатываться случаи, когда разных последовательностей максимальной длины больше одной?
    • 0
      Выводите любую
    • 0
      См. тесты. Там все максимальные последовательности забиты.
  • +1
    А есть какие-нибудь ограничения по времени, и по размеру входных данных?
    • 0
      +1, и не только в плане эффективности алгоритма. В некоторых «странных» случаях (благо, в гольфе можно много чего придумать), нужно знать ограничение на размер данных, сам по себе.
    • 0
      По времени — нет. Входные данные ограничены одним набором домино, т.е. максимум 28 фишек
  • 0
    Получилось 155 символов. Многовато для гольфа?
    • 0
      Зря написали сколько символов, сейчас будут стараться перебить
      • 0
        Так я уже и сам перебил, другое дело что, по моим ощущениям, код-победитель будет иметь длину символов 70-80
        • 0
          Пока те варианты, что уже были присланы имеют гораздо больше символов
          • 0
            так оно и понятно: самые лучшие варианты все приберегают под конец ;)
        • 0
          причем эти 70-80 символов будет один волшебный регексп )
          у меня лоховские 200 с хвостиком символов, я лох :/
    • 0
      Самое то!)
  • 0
    Под какую версию perl писать?
    • 0
      совместимо с 5.10
  • 0
    переворачивать костяшки обязательно или достаточно выдать правильную последовательность?
    • 0
      Обязательно, последовательность должна очевидным образом являться кольцом
  • 0
    Будут ли тесты улучшаться?
    Удалось сделать решение с багом, который не ловят ваши тесты, оно будет гораздо меньше по размеру чем решение без бага.
    p.s.
    таких багов у меня даже несколько.
    • 0
      Да, тесты будут улучшаться, с удовольствием приму пулреквесты для тестов)
  • 0
    Если на вход поступает — «01 12 31 32», а на выходе «12 32 31», то это будет считаться правильным ответом? У меня просто костяшки на развернуты для удобства чтения человеком.
  • 0
    Текущие результаты периодически обновляются тут:
    docs.google.com/spreadsheets/d/1o16QFFWTfyaFLNlIpOhIithdJJIyne8JG-KIXcnzmws/edit#gid=0
    • 0
      Похоже пора начинать учить Ruby
    • 0
      Это окончательные результаты?
  • +1
    Хорошо бы выложить исходники всех решений на гитхаб.
    • +2
      Привет, ближайшее время так и сделаю, спасибо!

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разработка