Предположим, у нас есть массив длины с указателями, указывающими на какое-то место в массиве: процесс « прыжка с указателем » установит каждый указатель на то место, на которое указывает указатель.
Для этой задачи указатель - это (основанный на нуле) индекс элемента массива, это означает, что каждый элемент в массиве будет больше или равен и меньше, чем . Используя эту запись, процесс можно сформулировать следующим образом:
for i = 0..(n-1) {
ps[i] = ps[ps[i]]
}
Это означает (для этой задачи), что указатели обновляются на месте в последовательном порядке (т. Е. Сначала более низкие индексы).
пример
Давайте рассмотрим пример, :
Итак, после одной итерации « прыжка с указателем » мы получаем массив .
Вызов
Учитывая массив с индексами, выведите массив, полученный итерацией вышеописанного прыжка указателя, пока массив больше не изменится.
правила
Ваша программа / функция будет принимать и возвращать / выводить один и тот же тип, список / вектор / массив и т. Д., Которые
- гарантированно будет не пустым и
- гарантированно содержит только записи .
Варианты: вы можете выбрать
- использовать индексирование на основе 1 или
- использовать фактические указатели,
однако вы должны упомянуть об этом в своем представлении.
Контрольные примеры
[0] → [0]
[1,0] → [0,0]
[1,2,3,4,0] → [2,2,2,2,2]
[0,1,1,1,0,3] → [0,1,1,1,0,1]
[4,1,3,0,3,2] → [3,1,3,3,3,3]
[5,1,2,0,4,5,6] → [5,1,2,5,4,5,6]
[9,9,9,2,5,4,4,5,8,1,0,0] → [1,1,1,1,4,4,4,4,8,1,1,1]
n
качестве дополнительного ввода?#[[#]]&~FixedPoint~#&
.Ответы:
JavaScript, 36 байт
Изменяет исходный входной массив.
Попробуйте онлайн
источник
Haskell, 56 байт
Haskell и обновления на месте - плохое совпадение.
Попробуйте онлайн!
источник
Python 2 , 53 байта
Попробуйте онлайн!
-6 благодаря ГиперНейтрино .
Изменяет
l
результат на месте.источник
C ++ 14 (gcc) , 61 байт
В качестве неназванной родовой лямбды. Требуются последовательные контейнеры типа
std::vector
.Попробуйте онлайн!
источник
Swift ,
6853 байтаПопробуйте онлайн!
-15 благодаря BMO
источник
f=
). Наслаждайтесь вашим пребыванием здесь!map
вместо того,forEach
чтобы сделать его короче?JavaScript (ES6), 41 байт
Попробуйте онлайн!
источник
05AB1E (наследие) , 8 байтов
Попробуйте онлайн!
объяснение
05AB1E , 14 байтов
Попробуйте онлайн!
источник
Japt,
15137 байтИзменяет исходный входной массив.
Попробуйте (дополнительные байты для записи измененного ввода в консоль)
источник
Java 8,
10554 байтаИзменяет массив ввода вместо того, чтобы возвращать новый для сохранения байтов.
Попробуйте онлайн.
Объяснение:
источник
Japt , 17 байт
Попробуйте все тестовые случаи
Такое ощущение, что это должно быть короче, но, к сожалению, моя первоначальная мысль
UmgU
не работает, потому что каждыйg
обращается к оригиналу,U
а не изменяет его на каждом шаге. Сохранение различных компонентов также стоит несколько байтов.Объяснение:
источник
C (лязг) , 32 бита,
4944 байтаПопробуйте онлайн!
Использует указатели.
5045 байтов с целыми числами:Попробуйте онлайн!
источник
Рубин ,
3734 байтаПопробуйте онлайн!
Возвращает путем изменения входного массива на месте.
источник
Красный , 63 байта
Попробуйте онлайн!
Изменяет массив на месте
источник
R ,
6058 байт-2 байта спасибо @digEmAll за чтение правил.
Попробуйте онлайн!
1-индексироваться.
n
длина входного массиваrep(1:n,n)
повторяет1:n
n
время (напримерn=3 => 1,2,3,1,2,3,1,2,3
)Цикл по массиву
n
раз. К тому времени устойчивое состояние будет достигнуто наверняка, на самом деле к концу 1-го раза, я думаю. Доказательство оставлено читателю.источник
+1
и просто взять ввод, основанный на 1, сообщение гласит: вы можете выбрать индексирование на основе 1scan()
на вход. Я всегда чувствую, что моиscan()
решения неоптимальны, поэтому следите за более коротким способом назначенияx
иn
вместе:n=length(x<-scan());for(i in rep(1:n,n))x[i]=x[x[i]];x
попробуйте это онлайн!Common Lisp,
5958 байтПопробуйте онлайн!
источник
Чисто , 80 байт
Попробуйте онлайн!
источник
Clojure , 136 байт
Попробуйте онлайн!
источник
loop [
не может статьloop[
?Perl 5,
353426 байтиспользуя тот факт, что сходимость достигается не более для размера числа итераций
26 байт
34 байта
35 байт
источник
Clojure , 88 байт
Попробуйте онлайн!
источник
Древесный уголь , 16 байт
Попробуйте онлайн! Ссылка на подробную версию кода. К сожалению, все обычные функции отображения работают только с копией массива, в результате чего они просто переставляют элементы, а не перепрыгивают их, поэтому код должен делать все вручную. Объяснение:
Повторите внутренний цикл один раз для каждого элемента. Это просто гарантирует, что результат стабилизируется.
Цикл по индексам массива.
Получите элемент массива по текущему индексу, используйте его для индексации массива и замените текущий элемент этим значением.
Приведите элементы к строке и неявно напечатайте каждый на отдельной строке.
источник
F #,
7473 байтаНичего особенного. Использует идею модуля в других ответах.
источник
К, 27 байт
{..}/
применяет лямбду {..} к аргументу arg (до схождения)внутри внешней лямбды:
{..}/[x;y]
применяет лямбду итеративно к x (обновляется на каждой итерации) и элементу y (y - список значений и использует элемент на каждой итерации). В этом случае arg y равно!#x
(до количества x, то есть индексов массива)@[x;y;:;x x y]
изменить массив x (по индексу y назначить x [x [y]])источник
APL (Dyalog Unicode) , 26 байтов SBCS
требует
⎕IO←0
Попробуйте онлайн!
источник