Недавно было несколько испытаний ASCII для домашних змей (например, здесь )
0 0
0 0 0 000
00 0 00 000 0 0
000 0 0 0 00
0 000
Эта задача состоит в том, чтобы взять случайно сгенерированную горизонтальную змею-питомца (высота 5 строк, длина 30) и убедиться, что
- В каждом столбце есть только один
0
- Каждый из
0
них «связан» с0
до и после него (с вертикальным интервалом только в 0 или 1 строку)
Окончательный вывод может быть true
или 1
если змея действительна, или false
или 0
если змея недействительна
Edit-Разъяснение
Предположим, вход:
- Это строка
- Содержит только '', '0' и '\ n'
- Точно 30 символов в каждой строке
- Имеет ровно 5 строк
Т.е. проверить, подключена ли змея, и нет ли случайных символов. Не нужно проверять «холст», на котором напечатана змея.
code-golf
ascii-art
decision-problem
Mirror318
источник
источник
truthy/falsey
а неtrue/false
?Ответы:
JavaScript (ES2018),
6254 байтаВвод представляет собой одну строку:
Флаг
s
означает точку, совпадающую с чем угодно (включая '\ n'). Эта функция в настоящее время поддерживается Chrome 63+, Opera 50+, Safari 11.1+ на основе таблицы сравнения . Вы можете проверить эту функцию с помощью этих поддерживаемых браузеров. При загрузке страницы вы получите исключение, если ваш браузер не поддерживает эту функцию.Как это работает:
0
:/( .{30}){4} /
0
s в одном столбце:/0.{30}(.{31})*0/
0
не подключаться к соседям/0.{60}(.{31})*0/
,/0.{62}(.{31})*0/
Объедините все эти регулярные выражения, и вы, наконец, получите это.
Показать фрагмент кода
Благодаря Мартину Эндеру, отметим, что выполнение одного
!
оператора может сэкономить 8 байт.источник
SnakeEx , 51 байт
Это, очевидно, правильный язык для задачи. : ^ D
Соответствует всему вводу, если это допустимая змея; не соответствует, если это не так. Попробуй это здесь!
объяснение
SnakeEx - это двумерный язык сопоставления с образцом . Программа состоит из списка определений «змей», которые ползут по вводимым совпадающим символам, меняют направления и порождают других змей. В нашей программе мы определяем двух змей,
s
иc
.Начнем с
c
того, что проще. Это определение0 *$
, которое должно быть вполне читабельным, если вы знаете регулярное выражение: match0
, за которым следует ноль или более пробелов, за которыми следует край сетки. Основной улов здесь: это сопоставление может продолжаться в любом направлении. Мы будем использоватьc
как змею вверх, так и вниз, чтобы убедиться, что0
в каждом столбце нет лишних s.Теперь для главной змеи,
s
. Он принимает форму(...)%{30}
, что означает «сопоставить содержимое скобок 30 раз» - один раз для каждого0
в змее. Все идет нормально. Что входит в круглые скобки?Это порождает новый
c
змею, повернутую влево на 90 градусов. Направление относительно направленияs
змеи, поэтому новая змея движется к вершине сетки (главная змея движется вправо). Вc
змее проверяет , что текущая ячейка сетки представляет собой0
и что каждая клетка над ним пространство. Если это не удается, весь матч не удается. Если это удастся, мы продолжим скоторый делает то же самое, только повернул направо (к нижней части сетки).
Обратите внимание, что эти порождения не влияют на положение указателя совпадения в главной змее. Они немного похожи на взглядов в регулярных выражениях. (Может быть, здесь мы могли бы назвать их «lookb Кроме»?) Итак, после проверки, что мы указываем на
0
а остальная часть столбца содержит только пробелы, нам нужно на самом деле соответствовать0
:Теперь указатель совпадения находится на символе справа от
0
. Нам нужно проверить три разных варианта: змея наклонена вниз, змея наклонена вверх, или змея идет прямо. Для этого мы можем использовать выражение OR:Внутри нашего OR у нас есть три возможности:
Поверните направо, найдите пробел и снова поверните налево (углы змеи вниз).
Поверните налево, найдите пробел и снова поверните направо (змея наклонена вверх).
Совпадение ноль или подчеркивание. Поскольку на входе нет подчеркиваний, это всегда будет пустое совпадение (змея идет прямо).
После сопоставления с одним из трех приведенных выше вариантов указатель совпадения должен указывать на
0
следующий столбец, готовый снова сопоставить выражение в скобках.источник
CJam ,
3534 байтаПопробуйте онлайн! Ввод представляет собой прямоугольный массив массивов символов. Предполагается, что вход содержит только
и
0
.Объяснение:
источник
05AB1E , 18 байт
Попробуйте онлайн!
объяснение
источник
Шелуха , 12 байт
В зависимости от разъяснений правил, может быть 11 байтов или 13 байтов .
Попробуйте онлайн!
Ввод - это список строк, содержащий только пробелы и 0; если требуется одна строка,
¶
разделите программу на строки. Ссылка TIO уже делает это для ясности. Выход 0 или 1; если любые ложные и правдивые значения в порядке, их±
можно удалить.объяснение
Идея состоит в том,
×≈
чтобы гарантировать, что (а) все столбцы содержат ровно один 0, и (б) их позиции отличаются не более чем на один. В качестве примера рассмотрим 8-колоночный вводСначала
mηfT
преобразует его в список списков индексов.Потом
Ẋ×≈
даетКаждый
1
соответствует паре индексов, которые отличаются не более чем на 1, и каждый0
соответствует паре, которая не имеет. Каждый результат равен[1]
точно, когда оба списка имеют один индекс, и индексы отличаются не более чем на 1.источник
Python 2 , 71 байт
Попробуйте онлайн!
Принимает ввод в виде многострочной строки. Тестовый кейс от Bubbler .
Первый столбец извлекается как
s[::31]
и второй какs[1::31]
, и они проверяются на достоверность. Мы находимся наs
первый символ, что приведет к проверке последовательных пар столбцов.Проверка для двух столбцов использует цепочку сравнения Python для
in
объединения нескольких проверок:'0'in s[::31]
проверяет, что в первом столбце есть хотя бы один0
s[::31]in' %s '%s[1::31]
проверяет, что первый столбец является подстрокой сэндвичей второго столбца между двумя пробелами, что обеспечивает0
смещение позиции не более чем на один пробел' %s '%s[1::31]in'%6s'%0*2
проверяет, что второй столбец содержит не более одного0
.Окончание
*f(s[1:])
также заставляет рекурсивный случай быть верным.источник
C (gcc) ,
246245232215212 байтПопробуйте онлайн!
Подумал, что я возьму свой любимый язык к этому (хотя, как я вижу по многим другим, более мелким записям, это, вероятно, далеко не идеально для такого рода задач) и C, что я мог бы сделать. Программный подход к проблеме относительно прост, только с большим количеством байтов-зажима; он принимает змею в stdin и дает свой результат в возвращаемом значении main (таким образом, код выхода;
в соответствии с запросом в задаче 0 указывает недопустимую змею, а 1 действителен, хотя для кода выхода это страннокак правило, для кодов выхода 0 - допустимая змея, а 1 - недопустимая змея). С расширенными макросами и небольшим пробелом это выглядит примерно так:Строки ввода считываются в первую строку буфера, следующие пять предназначены для отслеживания того, какие места должны (читай: должны) иметь нули в строке после каждого текущего, а последняя - для отслеживания того, был ли уже ноль. был прочитан в данном столбце, в любой строке. Программа обрабатывает каждую строку по очереди.
Это совсем не надёжно (
gets()
это только начало), и входные данные должны содержать все соответствующие пробелы (например, без остаточного пробела), и gcc выдает предупреждения и заметки о неявно объявленной функциональности stdlib и так далее, но, C жизнь.Предполагается также, что голова змеи не обязательно должна находиться в центральном ряду, и что у действительной змеи должен быть хотя бы один ноль в каждой строке (т. Е. Не должно быть ни одной строки из всех пробелов в 5 входных строках). Если последнее не является обязательным требованием, его можно сделать немного короче - все, что связано с программой
k
иl
в ней, может быть сокращено или заменено меньшим количеством байтов кода в этом случае.Спасибо пользователю 202729 за ок. 26 байтов сохранено.
источник
#define F
и)
для -1 байта.\n
(10),<space>
(32) и0
(48), вы можете проверить==48
с помощью>47
(-1 байт). / Вы можете удалить={0}
инициализацию,b
если переменная является глобальной. Аналогичным образом создайтеk
глобальный иi
(нетипизированный ->int
) параметрmain
(вместоargc
которого есть1
).i
какargc
гений). Первые проекты этого были более 400 байтов; Мне потребовалось достаточно много времени, чтобы перетащить его к моим личным целям - 300, а затем - 256, так что, может быть, есть и другие способы уменьшить это, что я пропустил.k
,j
иl
все глобальные перемены сэкономить на наличии отдельныхint
объявлений, потом понял, что настройки по умолчанию позволят мне сойти с рук, полностью исключив тип. Еще раз спасибо!MATL ,
1817 байтВвод представляет собой двумерный массив символов. Любой непробельный символ может быть использован для змеи.
Попробуйте онлайн!
объяснение
источник
un30=
чтобы проверить, что все индексы столбцов разные, и ни один из 30 столбцов не пуст. Может быть, я могу проверить это более напрямую, но я не понимаю, какСлип , 28 байт
Проверьте это здесь.
источник
Желе , 19 байт
Попробуйте онлайн!
-2 байта благодаря мистеру Xcoder
объяснение
Ввод в виде списка строк
источник
Желе , (14? *) 13 байт
Монадическая ссылка, содержащая список из пяти строк *, каждая длиной 30, состоящая из пробелов и любых других символов (например,
0
s), и возвращающая целое число (1, если змея определена, 0 в противном случае)* Если входные данные должны быть единственной строкой (список символов), тогда добавьте a,
Ỵ
чтобы разделить строку в переводе строки.Попробуйте онлайн!
Как?
источник
Stax , 20 байтов CP437
24 байта в распакованном виде,
Запускать и отлаживать онлайн!
Возможно, не самый лучший в гольфе, но я думаю, что метод новый и интересный.
объяснение
источник
J ,
38, 3730 байт-8 байт благодаря FrownyFrog
Попробуйте онлайн!
источник
[:(-:*)2-/\
, проверьте, все ли различия -1, 0 или 1.[:(#@{.=[:(-:*)2-/\])@:I.'0'=|:
[:($e.~[:(-:*)2-/\])@:I.'0'=|:
Желе , 16 байт
Попробуйте онлайн!
Предполагается, что входная строка всегда будет содержать только пробелы и нули. Принимает input как список строк (каждая представляет строку) и выводит 1, если truey, 0 противном случае.
объяснение
источник
Python 2 , 141 байт
Попробуйте онлайн!
Ввод представляет собой сетку символов.
источник
Python 2 и Python 3 ,
122120119 байтовПопробуйте онлайн!
Формат ввода - одна строка длиной 154 (5 х 30 символов, 4 перевода строки):
Если голова не должна быть в центре ряда
Требование к центру центральной строки было в первоначальной задаче, но я обнаружил, что здесь это не так (по крайней мере, это явно не упоминается).
Python 2 и Python 3 ,
124123 байтаПопробуйте онлайн!
Редактировать:
==
) на неравенства для каждого кода.all()
трюк бессмысленным в Py3, поэтому объединил обе версии.источник
Excel (VBA), 68 байт
Использование Immediate Window в
Cell[A6]
качестве вывода.источник
Улитки , 18 байт
Попробуйте онлайн!
источник
Grime ,
302623 байтаСпасибо Zgarb за сохранение 7 байтов и указание на ошибку.
Попробуйте онлайн!
источник
Рубин , 93 байта
Попробуйте онлайн!
источник
JavaScript (Node.js) ,
128126 байтовОтредактировано после уточнения ввода с указанием, что ввод является «строкой».
Попробуйте онлайн!
источник
Питон 3 ,
197185 байтВ командной строке do
verify.py<snake.txt
или в bash docat snake.txt | python verify.py
. гдеsnake.txt
находится файл, содержащий змею для проверки.Если змея верна, ничего не будет выведено. Если это не правильно, Python выдаст ошибку индекса.
источник