Вдохновлен Мы делаем прыжок в башню и связаны с 2D Maze Minus 1D
Вступление
Ваша задача - найти кратчайший путь для выхода из лабиринта массива, следуя указанным правилам.
Вызов
1D массив a с n элементами можно рассматривать как лабиринт, состоящий из n точек, где точка с индексом k соединена с точками с k + a [ k ] и k - a [ k ] односторонним образом. Другими словами, вы можете прыгать вперед или назад ровно на [ k ] шагов от точки с индексом k . Точки с индексом за пределами массива считаются вне лабиринта.
Чтобы проиллюстрировать это, рассмотрим следующий массив,
[0,8,5,9,4,1,1,1,2,1,2]
Если мы сейчас находимся на 5-м элементе, поскольку элемент равен 4, мы можем перейти на 4 шага вперед к 9-му элементу или 4 шага назад к 1-му элементу. Если мы сделаем последнее, мы получим элемент 0, который указывает, что дальнейшие шаги невозможны. Если мы сделаем первое, так как 9-й элемент равен 2, мы можем выбрать переход к 11-му элементу, который снова равен 2, и затем мы можем снова перейти к «13-му элементу», который выходит за пределы массив и считается выходом в лабиринт.
Поэтому, если мы начнем с элемента посередине, одним из способов выйти из лабиринта будет прыжок на 1 шаг назад, 4 шага вперед, 2 шага вперед и снова 2 шага вперед, что можно выразить в виде массива [-1,4,2,2]
. В качестве альтернативы вы можете выразить это с помощью массива, [4,8,10,12]
который записывает нулевой индекс всех промежуточных и конечных точек (1-индексный индекс также подходит) или только знаки [-1,1,1,1]
.
Выходить из лабиринта с конца с низким индексом тоже нормально.
Использование первой нотации и начиная с одного и того же элемента [1,1,1,2,2]
также является решением, но оно не является оптимальным, поскольку вместо 4 выполняется 5 шагов.
Задача состоит в том, чтобы найти кратчайший путь, чтобы выйти из массива лабиринта и вывести путь. Если существует более одного оптимального пути, вы можете вывести любой или все из них. Если решения не существует, вы должны вывести ложное значение, выбранное вами, которое можно различить по допустимому пути (вообще ничего не выводить - тоже нормально).
Для простоты, количество элементов в массиве всегда нечетное число, и мы всегда начинаем с элемента в середине.
Контрольные примеры
Тестовые случаи иллюстрируют различные формы вывода, но вы не ограничены этим.
Input
Output
[0,8,5,9,4,1,1,1,2,1,2]
[-1,4,2,2]
[2,3,7,1,2,0,2,8,9]
[2,9] (or [2,-5] or [[2,9],[2,-5]])
[0,1,2,2,3,4,4,4,3,2,2,3,0]
[1,-1,1,1]
[0,1,2,2,4,4,6,6,6,6,6,4,2,1,2,2,0]
[]
Спекуляции
Вы можете написать функцию или полную программу.
Массив содержит только неотрицательные целые числа.
Вы можете осуществлять ввод и вывод через любую стандартную форму , но, пожалуйста, укажите в своем ответе, какую форму вы используете.
Это код-гольф , выигрывает наименьшее количество байтов.
Как обычно, здесь применяются лазейки по умолчанию .
источник
[0,8,5,9,4,1,1,1,2,1,2]
вывода[[-1,4,2,2]]
)[1,1,1,-1]
вместо[-1,1,1,1]
?Ответы:
JavaScript (ES6), 117 байт
Возвращает массив 0-индексированных промежуточных и конечных точек или пустой массив, если решения не существует.
Попробуйте онлайн!
комментарии
источник
Шелуха , 22 байта
Возвращает список признаков или пустой список, если решение не существует. Попробуйте онлайн!
объяснение
Это решение грубой силы, которое проверяет списки
-1,0,1
увеличивающейся длины и возвращает первое, которое приводит к выпрыгиванию из массива. Поскольку он имеет минимальную длину, он не будет содержать 0.источник
Python 3 ,
195188179 байтПопробуйте онлайн!
Редактировать:
all(..)and s => all(..)*s
,if u not in x => if{u}-x
первый использует эксплойт
boolean * list == int * list
, последний использует разность наборов (пустой набор также ложный).Формат вывода: вложенный массив всех оптимальных ответов, представленных в виде нулевых индексов промежуточных и конечных точек.
Например:
f([0,8,5,9,4,1,1,1,2,1,2]) == [[4, 8, 10, 12]]
.Алгоритм прост BFS.
s
записывает все возможныеi
длины пути наi
итерации, исключая уже посещенные индексы. Обратите внимание, что расширенная звездная нотация (ab) используется, потому что повторный доступ к массиву дорог. Я обнаружил, что такая запись может также уменьшить пробелы, если используется правильно.Я также сделал рекурсивную (но более длинную) версию из вышеупомянутого решения. И то
s and
и другоеor s
нужно, иначе не получится.Python 3 , 210 байт
Попробуйте онлайн!
источник
Хаскелл ,
207202 байта5 байтов сохранено благодаря BMO .
Попробуйте онлайн!
Это функция, которая принимает список
Int
параметров в качестве параметра и возвращает список путей, где каждый путь представляет собой список относительных переходов, предпринятых для выхода из массива.Негольфированная версия:
источник
C (gcc) , 269 байт
Попробуйте онлайн!
Первоначально попытался рекурсивный поиск в обратном направлении, потому что с помощью
main
для рекурсии всегда весело. В конце концов, хотя простой и нерекурсивный поиск в ширину удалось сделать меньшим, что и является этой версией. Эта программа принимает входной массив в качестве аргументов командной строки без фигурных скобок, например,0 8 5 9 4 1 1 1 2 1 2
для первого предоставленного примера. Программа выводит на стандартный вывод список из 1 проиндексированных индексов массива , разделенных запятыми, в обратном порядке, начиная с конечного индекса out-of-bounds / 'escaped' и возвращаясь к достигнутым промежуточным индексам (она не выводит центр, начальный индекс). Программа не выводит фигурные скобки вокруг массива и оставляет запятую, потому что отдельныйprintf
заявления принимают много символов. Например, вывод, соответствующий первому тестовому примеру, приведенному выше13,11,9,5,
.Если нет пути выхода из массива лабиринта, программа ничего не выводит.
Дегольфед и объяснил это ниже (сильно дегольфед с некоторыми изменениями для удобства чтения):
Как обычно для гольф-кода С, вывод компиляции, конечно, будет включать дружественную стену предупреждений и заметок.
источник
Perl 5 , -a: 73 байта
(старый стиль подсчет: 75 байт,
+1
дляa
и+1
для замены-//
на-/$/
и используя$`
для$'
)Дайте входной массив в виде одной строки на STDIN, например
0 8 5 9 4 1 1 1 2 1 2
печатает посещенные позиции в обратном порядке, включая начальную точку, затем вылетает
Ничего не печатает, если нет решения
Попробуйте онлайн!
источник
Рубин , 102 байта
Попробуйте онлайн!
Принимает входной лабиринт в виде массива, выводит, печатая путь выхода в обратном порядке, от выхода до начальной точки (включительно). Ничего не печатает, если нет выхода.
Этот подход неправильно использует метод map для итерации по временному массиву, хранящему историю путей, которая постоянно расширяется на лету, когда есть еще один возможный шаг.
В принципе, я мог бы сохранить другой байт, используя
return x
вместоbreak p x
, но это означало бы утверждать, что мое ложное значение равно всему чудовищному мусору, хранящемуся вb
. Возможно, это было бы слишком, даже учитывая допустимую гибкость вывода ...Прохождение
источник