Напишите функцию, которая принимает два параметра: положительное целое число n и список слов.
Учитывая куб из n- by- n -by- n единиц, назначьте случайную букву (AZ) каждой единице поверхности. (Для куба 3x3x3 было бы 9 поверхностных единиц на каждой грани.)
Затем определите, возможно ли муравью, идущему по поверхности (с возможностью пересекать грани), произносить каждое из поставленных слов по буквам. Предположим, что для написания слова буквы должны быть соседними вверх / вниз или слева / справа, но не обязательно на одном лице. [ Править, для ясности: муравей может изменить свой путь и использовать буквы более одного раза. Каждая поверхностная единица считается одним символом, поэтому для написания слова с повторяющимися буквами (например, «видеть») муравей должен посетить три смежные единицы.]
Функция должна выводить две вещи:
1) Каждая из букв на каждом лице, таким образом, что топология может быть выведена. Например, для куба 2x2x2 приемлемый результат будет выглядеть следующим образом:
QW
ER
TY OP UI
DF JK XC
AS
GH
LZ
VB
2) Каждое из слов, наряду с логическим значением, представляющим, может ли муравей произносить слово по буквам, проходя по поверхности куба. Например:
1 ask
0 practical
1 pure
0 full
Бонусное задание (не будет учитываться при оценке, просто для удовольствия): вместо n, представляющего только размер куба, пусть n также представляет размерность фигуры. Таким образом, n 2 даст квадрат 2x2; п из 3 дало бы 3x3x3 куб; и n = 4 даст тессеракт 4x4x4x4.
qwq
илиqq
в примере куб?Ответы:
Рубин, 272 байта
Два ненужных символа новой строки добавляются в код по обе стороны от вложенной функции
g
для улучшения читабельности. Они исключены из оценки. Символы,f=
которые присваивают анонимную функцию переменной, также исключаются.Выходной формат
0
или1
на вопрос вместо родногоtrue
и Rubyfalse
. Новая строка (а не пробел) используется для разделения логического и слова. Насколько я понимаю, это приемлемая интерпретация выходных требований, но если нет, то влияние на количество байтов будет незначительным.Вывод
После примерно 50 звонков вот так:
Я наконец получил следующий вывод с 2 хитами.
ANT
в правом нижнем углу идет вверх, иAN
является общимCAN
, сC
округлением до левого верхнего угла.объяснение
Конкретное развертывание выбранного куба было выбрано отчасти из-за его простоты рисования, но главным образом из-за простоты поиска.
Неалфавитные символы (точки плюс новая строка в конце каждой строки) являются важной частью поля, где муравей может быть найден идущим.
Поиск выполняется рекурсивной функцией
g
, которая вложена в функциюf
. Если переданное слово является пустой строкой, поиск завершен и$r
имеет значение 1. Если муравей находится на буквенном квадрате, соответствующем первой букве слова, поиск продолжается во всех четырех направлениях: функция вызывается снова с сокращением слова, удалив его первую букву. В этом случае параметр направления игнорируется. Перемещение выполняется путем рекурсивного вызова с индексом ячейки, измененным значениями вx.
. Результат сложения берется по модулю размера сетки плюс лишняя половина строки. Это означает, что нижняя линия округляется до вершины и наоборот с правильным горизонтальным смещением.Если муравей находится на небуквенном квадрате, он должен зигзагообразно двигаться по лестнице, пока не найдет квадрат с буквой. Она будет двигаться в юго-восточном или северо-западном направлении. Это моделируется рекурсивными вызовами с
d
параметром, который XORed с 1 каждый раз, чтобы отслеживать ее движение. До тех пор, пока она не достигнет следующего квадратного буквы, входное слово не сокращается. Удобно, что это может быть сделано той же рекурсией, которая используется, когда мы ищем в области буквы. Разница в том, что рекурсия имеет только одну ветвь, когда муравей находится в области пробелов, в отличие от 4 в области букв.Код комментария
источник