У меня серьезная проблема. У меня есть несколько текстовых файлов, в которых я храню свои очень важные номера - все важные! И двойки, и тройки ..
Эти числа были настолько важны, что я не мог доверить их этим новомодным десятичным или двоичным системам счисления. Я сохранил каждое число в одинарном виде, так:
+--+
| |
+---+ +----+ |
| | | |
+---+ +-------+
~/two.txt
Просто и надежно: два ASCII-цикла для числа 2. К сожалению, эти вещи, как правило, запутываются со временем, и теперь мне сложно выяснить, сколько циклов в каждом файле. Вот несколько примеров, которые я разработал вручную:
Один:
+---+
| |
+--+ |
| |
+--+ |
| |
| |
| |
+--+ +--+
| |
+---------+
Три:
+---------+
| +-----+ |
| | +-+ | |
| | | | | |
| | +-+ | |
| +-----+ |
+---------+
Четыре:
+--------------+
| +--+ +--+ |
| | | | | |
+-|-----|-----|----+
| | | | | | | |
| +--+ +--+ +--+ |
+------------------+
+------------+
| |
+-----+ +-----+ |
| | | |
+-----|-----------+ | |
| | +--+ | | | |
+-+ +--|--|--+ +---------+
| | +-+ | | |
+------+ | | | |
+-------+ | |
|| | |
|+-----+
| |
+---+
5:
+--------+ +--------+ +--------+
| | | | | |
| +--|-----+ +--|-----+ |
| | | | | | | | | |
+-----|--+ +-----|--+ +--------+
| | | |
+--------+ +--------+
Можете ли вы помочь мне сосчитать мои петли?
Вот правила:
- Так как я храню все в ASCII-кодированном формате, для меня очень важна эффективность использования пространства. Поэтому это код гольф. Победит самая маленькая программа в байтах.
- Петли нарисованы с символами +, -, |. Каждый угол в цикле рисуется однозначно: ровно один из символов выше и ниже + будет |, а ровно один справа или слева - -. Два знака + никогда не соседствуют.
- Пряди могут проходить друг над другом. Когда нити пересекаются, вы сможете сразу увидеть нить «под» с обеих сторон нити «над».
- Ваша программа должна взять строковое представление цикла (либо из stdin, либо в качестве параметра функции) и создать число (либо в stdout, либо в качестве возвращаемого значения).
- Длина линий может быть неодинаковой на чертеже петли, и в каждой строке могут быть пробелы.
- Вы можете предположить, что на входе есть хотя бы один цикл.
Я рассчитываю на вас!
+
?Ответы:
SnakeEx - 98 байт с Javascript, 44 без
Это выглядело как хорошая проблема, чтобы попробовать мой язык из Fortnightly Challenge :
Лучшее место, чтобы попробовать это - мой переводчик онлайн .
SnakeEx сопоставляет шаблоны в тексте с помощью «змей», которые перемещаются по тексту в соответствии с регулярными выражениями. Код читается как регулярное выражение, кроме:
<T>
Инструкция. Это команда направления, которая разветвляет змею влево и вправо от ее текущего направления.{e<>PE}
это как вызов подпрограммы. Это то, что порождает змею с определением,e
продвигающимся вперед (<>
) и с параметрамиP
(автожелезнодорожные перевозки - порождающая змея следует за новой змеей) иE
(эксклюзивно - не соответствует ничего, что уже было найдено). Эта эксклюзивная проверка - единственное, что мешает змее бесконечно зацикливаться.`
в конце указывает, что последующее должно быть сопоставлено только в том случае, если оно уже сопоставлено, что мы можем использовать для принудительного закрытия цикла.Поскольку SnakeEx подобен регулярному выражению и технически не выводит результаты сами по себе, я думаю, нам нужно обернуть его в некоторый Javascript, вызывающий интерпретатор:
Редактировать : исправлено это для работы с дополнительными тестовыми случаями blutorange
источник
[^ ]
с[|\-]
;)C # - 338
388433байтаСохранено несколько байтов путем замены на одномерный массив.
Сначала он читает на входе и делает его красивым и прямоугольным с границей "", поэтому нам не нужно выполнять проверку границ по горизонтали (дешевле делать проверку по вертикали, чем вставлять дополнительную строку) , Затем он оглядывается через прямоугольник, поэтому всегда попадает в правый нижний угол. Когда он попадает в одну из них, он направляет себя вверх, следуя любым + s, с которыми встречается, и сбрасывая их по ходу (с пробелом). Он перестает следовать, когда встречает пробел. Проверено на пяти приведенных примерах.
источник
Slip ,
5141 + 2 = 43 байта(Теперь обновлено для работы с тестовым примером @ blutorange по большей цене)
Поскольку @BMac использовал SnakeEx для этой задачи, я подумал, что я попытаюсь использовать свое представление языка сопоставления с образцом 2D , Slip. Но поскольку у Slip не было функций, необходимых для решения этой проблемы, я добавлял их в течение последних нескольких дней. Другими словами, это представление не имеет права на победу .
Запуск с
n
флагом для количества совпадений, напримерПопробуйте онлайн .
объяснение
Из-за множества новых функций в этом материале, это хорошая возможность продемонстрировать их.
Slip пытается найти совпадение, начиная с каждой позиции, и возвращает только уникальные совпадения. Обратите внимание, что мы используем
[^ +]
- хотя использование[-|]
теоретически сохранит два байта, неэкранированный-
в начале / конце классов символов еще не реализован в Slip.источник
three
также есть+
s, которые не являются одним-
, одним|
и двумя пробелами, поэтому я предполагаю, что это не ошибкаРубин 295
Попробуйте на сайте: http://ideone.com/kIKELi ( я добавил
#to_a
вызов на первой линии, потому что ideone.com использует Руби 1.9.3, который не поддерживает#size
дляEnumerable
х В Ruby 2.1.5+ код работает ОК. . )Подход заключается в следующем:
+
знаков на входе и рассмотреть каждый из них отличную форму+
знака и объединяют их формы в одинВот более читаемая версия:
источник
JavaScript (ES6) 190
197 202 215 235 289 570Редактировать массив одного измерения вместо 2 измерений, максимальный размер строки 999 символов (но может быть больше без затрат, например, 1e5 вместо 999)
Редактировать Добавлен анимированный фрагмент кода, см. Ниже
Ungolfed первая попытка
Анимированный фрагмент
Показать фрагмент кода
Тест в консоли Firefox / FireBug
источник
Рубин, 178
187199212Лучшая рубиновая версия, создает функцию F. Теперь с более вкусными предупреждениями переводчика постоянно.
Проверьте это онлайн: ideone
По сути, функция
b
запускается с любого+
, рекурсивно проходит через цикл, устанавливая все+
вu
. Таким образом, один цикл удаляется каждый раз, когдаb
вызывается. ФункцияF
просто пытается определить, как часто нам нужно вызывать,b
пока не останется никаких циклов.источник
Python 2 - 390
Принимает строку с символами новой строки из stdin. Это довольно простой метод игры в гольф, но я уверен, что не так много, как можно было бы подумать, как долго это будет продолжаться.
источник
Python 2 - 346 байт
Реализуется как функция,
c
которая принимает данные файла в качестве входных данных и возвращает количество циклов.Во-первых, функция разбивает данные на отображение местоположений элементов цикла на тип элемента в этом месте (например
{(0,0): '+'}
). Затем он использует две взаимно-рекурсивные внутренние функции. Первый удаляет сегмент цикла из сопоставления и решает, какие места проверять для последующего сегмента. Второй проверяет, какой тип элемента цикла находится в выбранных местах, и, если он совместим с ожидаемым, вызывает первый, чтобы удалить вновь найденный раздел.источник