После вашей катастрофической поездки на каноэ вы в конечном итоге упали с водопада в конце речных порогов. Ваше каноэ взорвалось, но вам удалось пережить взрыв. Тем не менее, ваше речное путешествие полностью исчезло с карты - вы теперь потерялись посреди леса. К счастью, у вас все еще есть свои навыки программирования, поэтому вы решили вырезать программу в стороне дерева, чтобы помочь вам найти свой путь через лес. Однако на дереве не так много поверхности, поэтому вы должны сделать вашу программу максимально короткой.
Лес может быть описан как с n
помощью n
( n > 5
) квадратом символов, который будет состоять только из строчных букв a-z
. Пример леса:
anehcienwlndm
baneiryeivown
bnabncmxlriru
anhahirrnrauc
riwuafuvocvnc
riwnbaueibnxz
hyirorairener
ruwiiwuauawoe
qnnvcizdaiehr
iefyioeorauvi
quoeuroenraib
cuivoaisdfuae
efoiebnxmcsua
Возможно, вы заметили, что в этом лесу есть диагональная линия a
символов, проходящих через него из верхнего левого угла в нижний правый угол. Это «путь» через лес, который приведет вас куда-нибудь, если вы пойдете по нему. Ваша задача - написать программу, которая найдет единственный путь. Сейчас я более конкретно опишу, что означает «путь» в этом вызове.
«Путь» в этой задаче определяется как линия, аналогичная линии, которая могла бы быть сгенерирована с помощью алгоритма Брезенхэма , но с дополнительными требованиями, которые:
- Строка должна содержать не менее 6 символов
- Каждая коллинеарная (полностью смежная) группа символов в строке должна быть одинаковой длины .
- Это начнется на одном краю леса и закончится на противоположном краю (см. Мой комментарий здесь для уточнения)
Чтобы объяснить второе требование более четко, рассмотрим следующую строку:
aaa
aaa
aaa
aaa
aaa
Эта строка состоит из коллинеарных «сегментов» символов, каждый из которых имеет длину ровно три символа. Это квалифицируется как путь. Теперь рассмотрим эту строку:
a
aa
a
aa
a
aa
Эта строка состоит из коллинеарных «сегментов», которые не имеют одинаковую длину символов (некоторые из них имеют длину 1 символ, а некоторые - 2). Таким образом, этот не квалифицируется как путь.
Ваша программа, учитывая карту леса, идентифицирует символы, используемые в пути. Ввод в любой удобный (например, аргумент командной строки, STDIN prompt()
и т. Д.). Его нельзя предварительно инициализировать в переменную. Первая часть ввода представляет собой одно целое число, n
представляющее размер леса (лес всегда является квадратом). После этого пробел, а затем весь лес в виде одной строки. Например, пример леса будет представлен как входные данные, например:
13 anehcienwlndmbaneiryeivownbnabncmxlriruanhahirrnraucriwuafuvocvncriwnbaueibnxzhyirorairenerruwiiwuauawoeqnnvcizdaiehriefyioeorauviquoeuroenraibcuivoaisdfuaeefoiebnxmcsua
Выход для этого будет:
a
потому что путь формируется с помощью буквы a
. В лесу будет только один путь. Это код гольф, поэтому выигрывает меньшее количество персонажей. Если у вас есть вопросы, задавайте в комментариях.
Ответы:
APL (Dyalog 14) (70)
Объяснение:
⎕ML←3
: setML
to3
, смысл⊂
имеет значение APL2.I←⍞
: прочитать строку с клавиатуры и сохранить ее вI
I⊂⍨' '≠I
: разделитьI
на пространства{
...}/
: применить эту функцию к двум полученным строкам:2/⍎⍺
: оценить левый аргумент и повторить его дважды, задав размер матрицы⍵⍴⍨
: форматировать правильный аргумент, используя этот размерF←⊃
: распаковать его и сохранить вF
.{(⍳≢⍵)⌷¨↓⍵}¨(⊂F),⊂⌽F
: получить диагонали: из каждой строки в иF
и⌽F
(вертикально отразитьF
) получить значение в столбце X, где X - номер строки(↓⍉F),(↓F),
: получить строки и столбцыF
Z←∪¨
: найдите уникальные значения в каждой строке, столбце и диагонали и сохраните их вZ
.Поскольку «лес» является прямоугольным, если существует допустимый путь, это означает, что один из них будет состоять только из одного символа, который является символом пути, поэтому:
Z/⍨1=≢¨Z
: возьмите те подмассивы, уZ
которых есть только один элемент.Это отобразит символы для всех допустимых путей, но так как должен быть только один, который не имеет значения.
источник
Lua -
506380 - байтМне было немного жаль, что вы не получили никакого представления для вашей хорошо продуманной задачи, поэтому я бросил все это вместе. Было довольно забавно предположить, какими минимальными различимыми свойствами должен обладать путь из предоставленной вами информации. Надеюсь, я правильно понял ... И правильно его реализовал.
Это может быть проверено с:
Если появится дикий претендент, я поищу в своем коде гольф, чтобы узнать, чего он стоит.Обновление : игра в гольф в честь тех, кто поднимется над нами. Пока я занимался этим, мне пришлось исправить свой код по распознанному пути, идущему справа налево. К сожалению.
источник
MATLAB - 270 знаков
Далее определяется функция,
x
которая принимает строку леса в качестве аргумента и возвращает символ, представляющий действительный «путь» через лес в соответствии с заданными правилами.Не минимизированная версия
Основная предпосылка состоит в том, чтобы создать логическую маску для каждого возможного допустимого пути и вернуть любой символ, индексная функция которого в матрице покрывает любую маску. Для этого создаются только вертикальные или сверху вниз маски обратной косой черты, но матрица леса сравнивается во всех четырех ориентациях: идентичность, перевернутая, повернутая на 90 °, перевернутая повернутая на 90 °.
Функция работает для любого
n
. Пример того, что он вызывается из командной строки:источник
Питон -
384325275Этот алгоритм в основном проверяет первую и последнюю строки матрицы на соответствие символов, а затем вычисляет длину каждого отрезка строки
В приведенном выше примере:
V в первой строке находится в индексе 2, V в последней строке в индексе 4.
Таким образом, длина каждого сегмента линии будет n / (4-2) +1 = 2 с n = 6 ,
Затем он проверяет, является ли строка действительной.
Чтобы найти путь слева направо, он меняет строки на столбцы и снова делает то же самое.
Редактировать: Не могу добраться до 270 (Будь ты проклят, Питон и твое проклятое отступление !!)
источник