Позволяет определить последовательность указателей , чтобы быть любой последовательностью таким образом, что а (п) = а ((п-1) - (а (п-1))) FORALL п больше некоторого конечного числа. Например, если наша последовательность началась с
3 2 1
Наш следующий термин будет 2
, потому что a (n-1) = 1 , (n-1) -1 = 1 , a (1) = 2 (этот пример - нулевой индекс, однако не имеет значения, какой индекс вы используете для расчета всегда быть одинаковым.) Если мы повторим процесс, мы получим бесконечную последовательность
3 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2
задача
Учитывая некоторый начальный массив положительных целых чисел, выведите последовательность указателей, начинающуюся с этого массива.
Типы выхода
Вывод должен быть гибким, если вы решите написать функцию в качестве вашей программы, которую она может вернуть, либо бесконечный список целых чисел, либо функцию, которая индексирует последовательность. Если вы решите написать полную программу, вы можете выводить термины последовательности бесконечно.
Вы также можете выбрать два входа: начальный массив и индекс. Если вы решите сделать это, вам нужно только вывести член последовательности по этому индексу.
Вам никогда не дадут последовательность, которая требует индексации перед началом последовательности. Например 3
, недопустимые входные данные, потому что перед 3
разрешением следующего термина вам потребуются термины .
Это код-гольф, поэтому ваш результат будет равен количеству байтов в вашей программе, а меньший показатель будет лучше.
Тестовые случаи
контрольные примеры для простоты усечены
2 1 -> 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 ...
2 3 1 -> 2 3 1 3 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 ...
3 3 1 -> 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 ...
4 3 1 -> 4 3 1 3 4 4 3 3 4 4 4 3 4 4 4 4 3 4 4 4 4 3 4 4 4 4 3 4 ...
Ответы:
JavaScript (ES6), 25 байт
Анонимная функция, которая при вызове создает функцию,
f
которая дает элемент с заданным индексом в последовательности.Пожалуйста, дайте мне знать, если я что-то неправильно понял ...
источник
f(n)
из вf(n)
. Я не думаю, что это когда-нибудь закончится, но я не знаю JS.n
становится достаточно низким, оноa[n]
возвращает истинное значение, поэтому||
оно закорачивается и предотвращает его бесконечное повторение.n
не становится ниже с каждым звонком. Я уверен, что еслиn
длина больше, чемa
вы, вы никогда не остановитесь.--n
назначитьn
дляn-1
так что следующая ссылка на него будет ссылаться на декрементируетсяn
.--n
уменьшаетn
, что означает тоf(--n-f(n))
же самое, что иf((n-1)-f(n-1))
Шелуха ,
76 байтВозвращает бесконечный список. Попробуйте онлайн! Обратите внимание, что TIO требуется некоторое время, чтобы усечь и напечатать результат.
объяснение
Оператор
¡
имеет несколько значений. Здесь я использую «создание бесконечного списка путем итерации функции, которая вычисляет новый элемент из списка существующих». Учитывая список длины N , новый элемент будет иметь основанный на 1 индекс N + 1 . Все, что нам нужно сделать, это обнулить последний элемент списка (который является предыдущим значением) и проиндексировать список, используя результат.источник
Haskell , 36 байт
Принимает список и возвращает функцию, которая индексирует последовательность
Попробуйте онлайн!
объяснение
Здесь мы определяем функцию,
!
которая принимает списокl
и индексn
. Еслиn
меньше , чем длинаl
индексируемыхl
поn
, в противном случае мы возвращаемl!((n-1)-l!(n-1))
. Это следует рекурсивному определению функции, которую я дал в вопросе.Вот та же программа, разряженная.
Я использую
e<-n-1
вместо иначе , чтобы сохранить байты при назначенииn-1
наe
так что он может быть использован позже.источник
MATL ,
139 байтВыводит начальные термины, за которыми следуют n дополнительных терминов (разрешенных вызовом), где n - положительное целое число, взятое в качестве входных данных.
Попробуйте онлайн!
объяснение
источник
Mathematica, 63 байта
занимает два входа
Попробуйте онлайн!
-3 байта от Мартина Эндера
источник
R , 55 байт
Попробуйте онлайн!
Принимает два входа.
источник
Стандартный ML (MLton) , 58 байт
Попробуйте онлайн! Функция
a
берет начальный список и индекс и возвращает элемент последовательности с этим индексом. Пример использования:a [4,3,1] 5
доходность4
.источник
Желе , 6 байт
Принимает последовательность S и целое число K , и добавляет K термины для S .
Попробуйте онлайн!
Как это устроено
источник
Python 2 , 48 байт
Попробуйте онлайн!
источник
CJam, 10 байтов
Для CJam это очень хорошо (даже лучше, чем 05ab1e!).
Это анонимный блок, который ожидает ввода в виде
i n
в стеке, гдеi
находится индекс в последовательности иn
массив начальных чисел.Причина, по которой это работает так хорошо, заключается в
j
операторе, который обеспечивает запомненную рекурсию из набора начальных значений.Объяснение:
источник
Java (8), 60 байт
Принимает два входа (целочисленный массив
a
и целое числоn
) и выводитn
'-ое значение последовательности.Объяснение:
Попробуй это здесь. (Может занять несколько секунд.)
источник
Perl, 38 +3 (-anl) байтов
Попробуйте онлайн
источник
05AB1E , 20 байтов
Ожидает ввод как разделенную пробелами строку, выводит бесконечно; довольно простая реализация
Пример выполнения:
источник
Java (OpenJDK 8) ,
95939190 байтПопробуйте онлайн!
источник
b[(j-1)-...]
эквивалентноb[~-j-...]
?j>=a.length
доj<a.length
сохранить байты:j<a.length?a[j]:b[~-j-b[j-1]]
. Также мне любопытно: почему вы пошли с циклическим подходом, когда рекурсивный подход, который также объясняется в самом описании задачи, составляет всего 60 байтов?Perl 5 ,
-a
30 байтПопробуйте онлайн!
источник