Рассмотрим эти пять ASCII художественных морских существ:
- Стандартная рыба:
><>
или<><
- Быстрая рыба:
>><>
или<><<
- Крепкая рыба:
><>>
или<<><
- Эластичная рыба:
><<<>
или<>>><
- Краб:
,<..>,
Напишите программу, которая принимает произвольную строку символов <>,.
. Если есть способ интерпретировать всю строку как серию непересекающихся морских существ, то строка должна быть перепечатана с одиночными пробелами, вставленными между существами. Если такая интерпретация невозможна, ничего не должно выводиться (программа молча завершается).
Например, строку <><><>
можно интерпретировать как две стандартные рыбы подряд. Соответствующий вывод будет <>< ><>
.
В качестве другого примера, строка ><>><>>
содержит «экземпляры» of ...
(скобки добавляются только в качестве индикаторов)
- пара стандартных рыб:
[><>][><>]>
- быстрая рыба:
><[>><>]>
- крепкая рыба в двух направлениях:
[><>>]<>>
и><>[><>>]
однако только спаривание стандартной рыбы и крепкой рыбы [><>][><>>]
охватывает всю длину струны без каких-либо символов, разделяющих рыбу (без наложений). Таким образом, выходной сигнал , соответствующий ><>><>>
это ><> ><>>
.
Если есть несколько способов интерпретации строки, вы можете напечатать любой из них. (И печатать только один . Из них) , например, <><<<><
может быть истолкована как стандартная рыба и крепкая рыба: [<><][<<><]
или как безотлагательное рыбы и стандартная рыба: [<><<][<><]
. Так что либо <>< <<><
либо <><< <><
будет действительным выводом.
Раки просто для удовольствия. Поскольку они не начинаются и не заканчиваются на <
или >
, их гораздо легче идентифицировать (по крайней мере, визуально). Например, строка
,<..>,><<<>,<..>,><>,<..>,<>>><,<..>,><>>,<..>,<<><,<..>,<><,<..>,>><>
очевидно, будет производить вывод
,<..>, ><<<> ,<..>, ><> ,<..>, <>>>< ,<..>, ><>> ,<..>, <<>< ,<..>, <>< ,<..>, >><>
Вот несколько примеров строк (по одной на строку), которые не выводят:
<><>
,<..>,<..>,
>>><>
><<<<>
,
><><>
,<><>,
<<<><><<<>>><>><>><><><<>>><>><>>><>>><>><>><<><
Последняя строка здесь может быть проанализирована, если вы удалите ведущую <
:
<<>< ><<<> >><> ><> ><> <>< <>>>< >><> >><> >><> ><>> <<><
(Могут быть и другие возможные результаты.)
подробности
- Входная строка будет содержать только символы
<>,.
. - Длина входной строки будет не менее одного символа.
- Принимайте входные данные любым обычным способом (командная строка, стандартный ввод) и выводите в стандартный вывод.
- Самый короткий код в байтах побеждает. ( Удобный счетчик байтов. ) Tiebreaker - более ранний пост.
источник
Ответы:
Pyth,
644850 байтПрецедент.
Версия, которая не берет навсегда ( ) здесь , в 52 байта.
O(9n/3)
Это подход грубой силы, генерирует все последовательности и проверяет, есть ли какая-либо сумма на входе. Диаграммы рыбы сжаты как символы, двоичные представления которых -
>
и<
. Все это заключено в блок try-catch, поэтому при отсутствии результатов вывод не происходит.Это решение.
O(9n)
Некоторые символы разделены выше, потому что используются управляющие символы. Они точно воспроизведены по ссылке выше.
вывод xxd:
источник
><>><>>
занимает 15 секунд на моей машине.Недетерминированная машина Тьюринга, 20 состояний, 52 перехода (может быть 882 байта)
Как вы конвертируете это в байты? Я написал файлы (абсолютно без игры в гольф), чтобы выполнить эту машину с помощью Симулятора машины Тьюринга Алекса Винокура 1 .
wc -c
выводит следующее (исключая файл описания и входные файлы):В любом случае, я готовился к экзамену A-Levels по информатике, поэтому подумал, что это будет хорошим упражнением (я не знаю, о чем думал). Итак, вот определение:
(функция перехода)
Извините за плохое изображение, но я не мог быть обеспокоен перерисовкой этой вещи на компьютере. Если вы действительно хотите расшифровать правила перехода, я рекомендую вам прочитать файл правил, который я связал выше.
Я использовал
X
s вместо пробелов, потому что пробелы здесь трудно визуализировать, а симулятор не принимает пробелы в алфавите.Концепция довольно проста - от q1 до q4 используются для ловли рыбы, обращенной вправо, от q11 до q14 - для ловли рыбы, выходящей на левую сторону, от q15 до q19 - для крабов, а капля от q5 до q10 - просто для вставки пробела и перемещения всех следующие символы один справа.
Если строка интерпретируемая, она принимает строку, а лента содержит строку с вставленными пробелами. В противном случае он отклоняет строку (я думаю, это считается отсутствием выходных данных - очистка ленты будет довольно простой, но потребует большого количества правил перехода, и я не думаю, что это сделает функцию перехода более привлекательной для просмотра).
1 Примечание: это трудно скомпилировать. Я должен был изменить
src/tape.cpp
файл и заменитьLONG_MAX
с ,1<<30
а затем перейти вdemo
каталог, отредактировать Makefile , чтобы заменитьEXE_BASENAME
сturing.exe
и выполнятьmake
. Затем перейдите в каталог с файлами, которые я написал и выполните/path/to/turing/download/src/turing.exe meta
.источник
рыба (да, та рыба), 437 байт
Это кажется мне одной из тех задач программирования, где точно один язык правильный.
Следующая версия по-прежнему самый длинный ответ на вызов,
но так как это было сделано в основном для игры в каламбур (надеюсь, вы извините), то для читателя лучше сделать игру в гольф.
источник
printf 'H4sIADSjKlUCA4VPQW6DMBC89xUj5AOocSSOlV1/BHGgjgMrBUPN0kRRHl/jmEg99WBLszM7M7s4BqMw2hQotNHxNy+QkDYJZU7rTJqED/p4NIdCLdFmVOfVW6bJY04DeQGhVteBLg4cVqfYLQxBkD3jQ6HzJwTHa/BRRmf4ibEtBpRfriefXCxKZ4cJghtB7eNqIW2lnqMu9D9N3T7sGtOssDInJCk+982/MlmOHQ+I6rqKRv5UpRxCntN7XSk7eSYfK0f+eR3EmI23qilH3iFCrjIqdyNO8nzJvJH7alMu7jsnlHZafWw5VluD9r/0/c2vQ95+AYBxAwS2AQAA'|base64 --decode|gzip -d>a;fish a
> <>, 602 байта
Решение в Fish, вероятно, очень пригодное для игры в гольф, но это моя первая> <> программа. Он берет свои данные из стека ввода и запускает онлайн-интерпретатор> <>.
Как это устроено :
Цикл считывает все входные данные и суммирует их, переворачивает и помещает -1 в нижнюю часть, что будет означать, что синтаксический анализ завершен (все символы остаются в стеке до тех пор, пока строка не будет считаться доступной для анализа).
При анализе используется тот факт, что все символы различаются по модулю 5, и все шаблоны являются детерминированными, кроме <> << и> <>>. Разобранные символы помещаются внизу стека.
Когда шаблон завершен, если -1 сверху, все символы печатаются, в противном случае добавляется пробел и программа зацикливается.
Если встречаются <> << или> <>>, регистр увеличивается (0 в начале), и 0 помещается в стек перед последним символом (так что <> <или> <> остается после отката) , Если впоследствии во время синтаксического анализа возникает ошибка, регистр уменьшается, все символы после 0 возвращаются сверху (кроме пробелов благодаря тесту% 8 = 0).
Если ошибка обнаружена, когда регистр равен 0, или внутри краба, программа просто сразу завершается.
источник
Питон 3, 156
Стратегия состоит в том, чтобы генерировать списки рыб и сравнивать их конкатенацию с входной строкой.
Это занимает невероятно много времени. Если вы действительно хотите увидеть вывод, замените
for _ in s
наfor _ in [0]*3
, где 3 - верхняя граница для числа рыб. Это работает, чтобы использовать,s
потому чтоs
содержит не более одной рыбы на символ.Спасибо Sp3000 за исправления ошибок и экономию символов на входе.
Старый 165:
источник
a and b or c
дала неправильное значение, когдаb
могла быть Фолси. Я вернулсяif/else
на 2 символа, но мог бы быть способ заставить троичную работу.*l,s=[],input()
Perl, 81 + 1 байт
Попробуйте этот код онлайн.
Этот код ожидает ввода в
$_
переменную; запустите это с-n
переключателем Perl ( считается +1 байт ), чтобы применить его к каждой строке ввода, например, так:Этот код использует движок регулярных выражений Perl (и, в частности, его встроенную функцию выполнения кода ), чтобы выполнить эффективный поиск в обратном направлении. Найденные отдельные рыбы собираются в
@a
массив, который сортируется и распечатывается в случае успешного совпадения.Этот код также использует Perl 5.10+
say
функцию, и поэтому должен быть запущен с-E
или-M5.010
переключателем (илиuse 5.010;
) , чтобы включить такие современные функции. По традиции, такие переключатели, используемые исключительно для включения определенной версии языка, не включаются в число байтов.Кроме того, вот 87-байтовая версия, которая вообще не требует специальных ключей командной строки. Он читает одну строку из стандартного ввода и выводит результат (если есть) в стандартный вывод без какого-либо завершающего перевода строки:
Ps. Если было разрешено печатать лишний пробел в начале вывода, я мог бы тривиально сохранить еще два байта с помощью:
источник
><(>|<<)>
Python 3,
196186 байтПростая рекурсия.
g
либо возвращает список проанализированных рыб, либо,None
если входная строка не разбирается.источник
Python 2, 234 байта
Сначала я попробовал решение для регулярных выражений Python, но, похоже, нет способа извлечь группы после сопоставления по нескольким шаблонам. Ниже приведен рекурсивный поиск, который, похоже, хорошо подходит для тестовых случаев.
Пример теста:
И негольфированная версия:
источник
if
может быть в одной строке (как вы сделали в другом месте). Также вместо того, чтобыif p<len(t)
я думаю, вы можете сделать,if t[p:]
чтобы сэкономить несколько байтов.C # - 319 байт
Это решение позорно простое, вряд ли что-нибудь для Golf. Это полная программа, которая принимает данные в виде строки из STDIN и выводит результат в STDOUT.
Он просто пытается сопоставить каждую рыбу с первой позицией после пробела (или в начале строки) и сопоставляет с ней каждый тип рыбы. Если рыба подходит, то она рекурсивно вызывает решатель после вставки пробела после рыбы или просто возвращает свой ввод (с \ n для соображений вывода), если несопоставленная строка является буквально рыбой (т.е. мы нашли решение) ,
Я не особо старался дать рыбной струне обычную обработку колмогоров, потому что это не так уж долго, и я не могу найти дешевый способ перевернуть строку в C # (я не думаю, что LINQ заплатит), так что там может быть какая-то возможность, но я в этом несколько сомневаюсь.
источник
Хаскелл (Парсек) - 262
источник
Я немного Noob Python, так что игнорируйте странности: P
источник
m
вместо тогоmsg
,s
вместо тогоstart
, ...) и использовать только 1 место на приращение. И, пожалуйста, добавьте количество символов вашей программы (вы можете посчитать их здесь ).Рубин, 177 байт
Не самый короткий, но первый в рубине:
Здесь попытка рекурсивно расширить регулярное выражение и сопоставить его с входными данными.
Если найдено более длинное совпадение, r () выполнит повторение, если нет, проверит, использует ли последнее совпадение всю входную строку, и только затем выведет его с добавленными пробелами.
источник
CJam,
111 9691 (или 62 байта)Итеративный жадный подход для определения возможных комбинаций рыб во время итерации. На самом деле не в гольф прямо сейчас.
Код содержит некоторые непечатаемые символы, поэтому используйте ссылку ниже для справки.
Обновление Закодировал строку
Добавлю объяснение, как только сделаю игру в гольф
Попробуйте это онлайн здесь
62 байта
Супер медленная версия. Это в основном создает все комбинации и проверки, которые равны входным данным.
Он также содержит непечатаемые символы, поэтому воспользуйтесь ссылкой ниже.
Попробуйте это онлайн здесь
источник
Haskell,
148146 байтТестирование:
$ echo "> <>> <>>" | runhaskell fishes.hs
объяснение
Исходя из моего ранее ответа на аналогичный вопрос. Алгоритм работает в экспоненциальном времени.
Это читается справа налево.
Это не будет печатать строку, которая заканчивается пробелом, даже если такие строки тоже генерируются, потому что ее аналог без пробелов генерируется первым.
источник
JavaScript (ES6), 164
Рекурсивное сканирование в глубину.
Как программа с I / O через всплывающее окно:
В качестве тестируемой функции:
Набор тестов (запускается в консоли Firefox / FireBug)
Выход
Разрушенный только функция k
источник
Хаскелл,
148142здесь используются списки, чтобы перебрать рыбу, выбрать тех, которые соответствуют началу, и продолжить рекурсивно.
источник
Javascript (
122135 байт)Не самый гольф здесь, можно было бы немного раздеться.
Этот основан на регулярных выражениях, и немного трудно понять, что происходит.
Это один вкладыш.
По сути, я проверяю синтаксис, а затем разделяю строку на основе символов и соединяю ее вместе.
Выдает исключение, когда вы даете ему неверный ввод.
Если он не может бросить исключения (
126139 байт):Оба являются однострочниками.
Оба работают одинаково.
Спасибо @ edc65 за то, что обнаружили крайний случай, который не работал должным образом .
Вы можете проверить это здесь (вывод будет записан в документ).
Он основан на версии, которая генерирует исключения, когда вы вводите неверный код.
Показать фрагмент кода
(В настоящее время есть ошибка в фрагментах стека,
Я отправил в на метаЭто уже спрашивали вчера. Для того , чтобы работать, я заменил$
с\x24
, который имеет тот же результат. Вы можете прочитать об ошибке здесь: http://meta.codegolf.stackexchange.com/questions/5043/stack-snippets-messing-with-js )источник
><>><>>
. Я думаю, что это не так легко решить с помощью Regexp, вам нужно немного заглянуть назад или вернуться назад или еще что-Скала, 299 байт
Тестовые случаи
Выход
источник
Java, 288 байт
отформатирован:
источник
Я не собирался за размер, но вот простой способ сделать это в Dart.
источник
Python 3,
166164 байтаРекурсивное решение. Поздно на вечеринку, но я думал, что выложу это в любом случае, так как это лучше, чем у Sp3000
2022 байта без грубого ответа.источник