Выведите N-й член последовательности Ван Эка.
Последовательность Ван Экка определяется как:
- Начинается с 0.
- Если последний член является первым вхождением этого термина, следующий член равен 0.
- Если последний термин встречался ранее, следующий - сколько шагов назад было самым последним.
https://www.youtube.com/watch?v=etMJxB-igrc
https://www.youtube.com/watch?v=8VrnqRU7BVU
Последовательность: 0,0,1,0,2,0,2,2,1,6,0,5,0,2, ...
тесты:
Вход | Выход
- 1 | 0
- 8 | 2
- 19 | 5
- 27 | 9
- 52 | 42
- 64 | 0
РЕДАКТИРОВАТЬ
1 индексированный является предпочтительным, 0 индексированный является приемлемым; это может изменить некоторые из уже представленных решений.
Просто N-й срок, пожалуйста.
То же самое (за исключением того, что он видел уже опубликованную часть), кажется, что игроки в кодовый код и наблюдатели с номерами имеют приличное совпадение.
n
сроки?Ответы:
JavaScript (ES6),
46 4137 байтПопробуйте онлайн!
Как?
Нам не нужно хранить полную последовательность. Нам нужно только отслеживать последнюю позицию каждого целого числа, которое появляется в последовательности. Для этой цели мы используем базовый объект рекурсивной функцииg .
Для данного членаp нам не нужно также устанавливать g[p] в его фактическую абсолютную позицию в последовательности, потому что нас интересует только расстояние с текущей позицией. Вот почему мы можем просто сохранить текущее значение входного n , который используется в качестве уменьшающего счетчика в коде.
Следовательно, расстояние определяется какg[p]−n . Удобно, что это оценивает NaN, если это первое вхождение p , которое может быть легко превращено в ожидаемый 0 .
комментарии
источник
Python 3 ,
696362 байтаПопробуйте онлайн!
Примечание: как отметил Эрик Outgolfer, этот код прекрасно работает и в Python 2.
0-индексированный (хотя, чтобы быть совершенно извращенным, вы можете сделать его -1-индексированным, изменив
if n
наif~n
: P)Использует великолепный «звездный оператор» Python для рекурсивного построения ряда, пока не
n
достигнет нуля.Функция строит ряды в обратном порядке, чтобы избежать необходимости переворачивать их для поиска. Кроме того, он на самом деле хранит отрицания всех элементов, потому что преобразование их обратно в конце было бесплатным (иначе
-
это был бы пробел), и он экономил нам байт по пути, используя~s.index(l)
вместо-~s.index(l)
.Может быть 51 байт, если кортежи Python имеют одинаковые
find
функции, что и строки функций (возвращает -1, если не найден, вместо сообщения об ошибке), но не такая удача ...источник
s
для рекурсивного вызова?def func(f, *args): f(*args)
; распаковка внутри вызовов функций действительна py2. Что PY3-только распаковка внутри списка / Dict постижений (т.е.[1, 2, *s]
) или распаковка переменные:a, *b = [1,2,3,4]
.R , 62 байта
Попробуйте онлайн!
Строит список в обратном порядке;
match
возвращает первый индексF[1]
(предыдущее значение) вF[-1]
(остаток списка), возвращая,0
если совпадение не найдено.F
инициализируетсяFALSE
и приводится к0
первому проходуwhile
цикла.источник
match
эта проблема, когда вы ее так строите. Действительно чистый.F
к тому,0
когдаn==1
еще это вернетсяFALSE
.Perl 6 ,
4742 байта-5 байт благодаря nwellnhof
Попробуйте онлайн!
Анонимный кодовый блок, который выводит 0-индексированный элемент в последовательности.
Объяснение:
источник
Bourne shell, 102 байта
попробуйте это онлайн
источник
Stax ,
109 байтЗапустите и отладьте его
Если индексация на основе 0 разрешена:
Stax , 8 байт
Запустите и отладьте его
источник
J ,
2923 байтаПопробуйте онлайн!
Реальная работа выполняется в глаголе итерации степенного глагола
^:
, который повторяет столько раз, сколько аргумент[
, начиная итерацию с константного значения 0&0
...(#|1+}.i.{.)
Это то, что повторяется. Разбивая это ...}.i.{.
Найти индексi.
заголовка списка{.
в хвосте списка}.
. Это вернет индекс, основанный на 0, поэтому, если текущий элемент найден равным 1, он вернет 0. Если он не найден, он вернет длину списка, то есть длину хвоста.1+
Добавьте единицу к значению, чтобы исправить индексирование на основе 0, так как «насколько далеко назад» Вен Эка основано на 1. Обратите внимание, что если он не был найден, значением будет длина полного списка.#|
Возвращает остаток от значения, рассчитанного на предыдущем шаге, при делении на длину полного списка. Обратите внимание, что это превращает «not found» в 0, но оставляет все остальные значения без изменений.,~
Добавьте новое значение в начало списка. Мы используем фронт, а не последний только для удобства.1{
вернуть 2-й элемент в списке, так как мы вычислили один слишком много раз, потому что таким образом он короче.источник
Python , 51 байт
Попробуйте онлайн!
Выходы
False
для0
. Реализует спецификацию в буквальном смысле, ища младшее натуральное число,i
такое чтоf(n-1)==f(n-i-1)
. Если такой поиск приводит кi>=n
, что предыдущий элемент не появился раньше, и мы производим0
.Вместо того, чтобы делать что-то разумное, например сохранять более ранние значения в списке, функция просто рекурсивно пересчитывает их с нуля всякий раз, когда они нужны, а иногда, когда они не нужны. Это заставляет функцию работать очень медленно для входов выше 10 или около того.
источник
APL (Dyalog Unicode) ,
1917 байтов SBCSБольшое спасибо ngn, Adám, Richard Park и H.PWiz за помощь в написании и игре в гольф этого ответа в The APL Orchard , отличном месте для изучения APL и получения помощи APL.
Изменить: -2 байта от Адама.
Попробуйте онлайн!
объяснение
источник
Wolfram Language (Mathematica) , 48 байтов
Попробуйте онлайн!
Ненулевые значения возвращаются в виде одноэлементных списков .
источник
05AB1E , 8 байтов
Объяснение:
источник
F¯Rćk
? ;)Ява,
968076 байтНе запутано:
источник
int[]
вint
объявлении, а также использовать<1
вместо==0
. Пример:int f(int n){int l[]=new int[n],i=0,j,v=0;while(++i<n){j=l[v];l[v]=i;v=j<1?0:i-j;}return v;}
n->{int l[]=new int[n],i=0,j,v=0;for(;++i<n;l[v]=i,v=j<1?0:i-j)j=l[v];return v;}
Древесный уголь , 23 байта
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Установите первый член на 0.
Цикл
n-1
раз. (Если 0-индексация приемлема, ее⊖
можно удалить для 1-байтового сохранения.)Следующий термин - это увеличенный индекс текущего термина в обратном списке предыдущих терминов.
Добавить текущий термин в список предыдущих.
Установите текущий срок на следующий срок.
Вывести текущий термин в конце цикла.
источник
Желе , 7 байт
Попробуйте онлайн!
0 индексированные.
источник
Желе , 8 байт
Монадическая ссылка, принимающая положительное целое число,N , что дает Nт ч термин последовательности Ван Экка.
Попробуйте онлайн!
Как?
Обратите внимание, что без финала
Ḣ
мы на самом деле собрали[a(n), a(n-1), ..., a(2), a(1), n]
источник
C (gcc) , 63 байта
Попробуйте онлайн!
0 индексированные.
источник
Хаскелл ,
68 6766 байтДовольно простая реализация (с использованием индексации на основе 0).
Попробуйте онлайн!
источник
Haskell, 61 байт
Индексирование на основе 0.
Попробуйте онлайн!
источник
Japt
-h
, 11 байтПопытайся
источник
C # (интерактивный компилятор Visual C #) , 77 байт
Попробуйте онлайн!
На данный момент довольно много ответа от Java.
источник
Python 3 ,
12811411110299 байт102 -> 99 байт, благодаря Джонатану Фреху
Попробуйте онлайн!
источник
-
вместо того,!=
чтобы сохранить байт.Perl 5 (
-p
), 42 байтаПопробуйте онлайн!
источник
Python 3 , 112 байт
Попробуйте онлайн!
-3 байта благодаря mypetlion
источник
for _ in a*int(input()):k=a[-1];a+=k in a[:-1]and[a[::-1].index(k)+~a[-2::-1].index(k)]or[0]
сэкономить 3 байта.Красный ,
10695 байтПопробуйте онлайн!
источник
CJam (15 байт)
Онлайн демо . Это полная программа с 0 индексами.
рассечение
источник
Clojure, 69 байт
К сожалению, более функциональный подход кажется более длительным.
источник
DC,
949190 байтВход берется во время программы. Сохраните это в файл и затем выполните «dc» для запуска. Определенно не самый короткий, но я получаю удовольствие от таких задач в DC. Входные данные основаны на индексе 1, как предпочитается.
источник
C ++ (лязг) ,
241235234219197189 байт197 -> 189 байт, благодаря функциюcatcat
Попробуйте онлайн!
источник
Pyth , 18 байт
Попробуйте онлайн!
Создает последовательность в обратном порядке и печатает первый элемент (последний член последовательности).
источник