Вдохновленный предыдущим вопросом .
Самоописывающая последовательность Голомба g (n) - это последовательность, в которой любое натуральное число n
повторяется в последовательности g (n) раз.
Первые несколько чисел в последовательности:
n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
g(n) 1 2 2 3 3 4 4 4 5 5 5 6 6 6 6 7 7 7 7 8
Вы можете видеть, что g (4) = 3, и что «4» повторяется 3 раза в последовательности.
Учитывая вход n
, выход g(n)
.
Ограничения: n <100000.
Наименьший код выигрывает.
n
а не2 - n % 1
. Есть ли у вас основания ожидать, что ответы будут существенно отличаться?golomb=1:2:2:concat(zipWith replicate(drop 2 golomb)[3..])
Ответы:
GolfScript (31 символ)
демонстрация
источник
Желе , неконкурентоспособное
10 байт. Этот ответ не является конкурирующим, поскольку задача предшествует созданию желе.
При этом используется рекурсивная формула a (1) = 1, a (n + 1) = 1 + a (n + 1 - a (a (n))) со страницы OEIS.
Попробуйте онлайн!
Как это работает
источник
PHP - 63 символа
Быстро И коротко.Я, кажется, имел в виду неправильную последовательность. Derp.
Это правильно, быстро и коротко.
Точность может пострадать за отметку в 100 000 баллов, но я на самом деле соответствовал этой отметке.
источник
PHP
Эта рекурсивная версия короче (60), но вычислительно неэффективна:
Это намного быстрее, но дольше (78):
Гораздо быстрее, но на 89 символов будет:
Который есть O (n)
источник
Haskell,
3027 символовисточник
Оазис , 7 байтов (неконкурирующий)
Код:
Попробуйте онлайн!
Оазис - это язык, разработанный Аднаном, который специализируется на последовательностях.
В настоящее время этот язык может делать рекурсию и закрытую форму.
В
T
конце это сокращение для10
, которое указывает, чтоa(0) = 0
иa(1) = 1
. Чтобы добавить больше тестовых случаев, просто добавьте в список в конце.Теперь мы по сути рассчитали
a(n-a(a(n-1))+1
.источник
Perl, 48 символов
Вход на стандартный вывод, вывод на стандартный вывод. Требуется Perl 5.10+ и
-M5.010
для включения этойsay
функции. Занимает около O ( n 2 ) времени из-за неэффективного манипулирования массивом, но все еще достаточно быстро, чтобы легко вычислить до 100 000-го члена.источник
Юлия - 28
По рекурсивным образом:
Выход:
источник
Python - 64 символа
источник
[i]*g[i-1]
будет делать, поэтому я наклонился назад, чтобы сделать это по-другому; Я думал, что это будет вести себя как умножение матрицы на скаляр по какой-то причине ...Javascript, 93 символа
источник
J, 43 знака
Определяет функцию, используя асимптотическое выражение, указанное на странице википедии.
Досадно, что используются 9 символов, просто округляя до ближайшего целого числа.
источник
Прелюдия ,
695554 байтаЕсли используется стандартный совместимый интерпретатор, он принимает входные и выходные данные как байтовые значения . Чтобы фактически использовать десятичные числа в STDIN / STDOUT, вам понадобится интерпретатор Python с
NUMERIC_OUTPUT = True
дополнительной опциейNUMERIC_INPUT = True
.объяснение
Скелет программы
Мы читаем ввод
N
в первый голос и уменьшаем его, чтобы получитьN-1
. Мы также инициализируем второй голос1
. Затем мыN-1
выполняем цикл один раз, каждая итерация которого получает следующее значение последовательности во втором стеке. В конце мы печатаемN
номер.Идея программы состоит в том, чтобы поместить каждый элемент последовательности в очередь на третий голос и уменьшить заголовок этой очереди в каждой итерации. Когда голова достигает
0
, мы увеличиваем значение последовательности и удаляем это0
.Теперь проблема в том, что Prelude использует стеки, а не очереди. Поэтому нам нужно немного переместиться вокруг этого стека, чтобы использовать его как очередь.
Это копирует текущее значение последовательности в первый голос (как временная копия), помещает a
0
во второй голос (чтобы отметить конец очереди). И затем выполняет цикл для смещения (и, таким образом, обращения) третьего стека на второй. После цикла мы помещаем копию текущего значения последовательности поверх второго стека (который является хвостом нашей очереди).Это выглядит немного уродливо, но по сути это цикл, который сдвигает стек обратно на третий голос. Поскольку
)
столбец находится в том же столбце, что и инструкции по сдвигу,0
второй голос , который мы добавили ранее, также окажется в третьем голосе, поэтому нам нужно удалить его другим#
. Затем уменьшите начало 3-го голоса, то есть главы очереди.Теперь это немного раздражает - мы хотим запустить некоторый код, когда это значение
0
, но единственная управляющая структура Prelude (цикл) реагирует только на ненулевые значения.Обратите внимание, что верхняя часть второго голоса является правдивой (поскольку последовательность Голомба не содержит никаких
0
s). Таким образом, рабочая нагрузка переходит в этот голос (последняя пара скобок). Нам просто нужно предотвратить это, если глава очереди0
еще не существует. Итак, сначала у нас есть «петля» на третьем голосе, которая выдвигает0
на второй голос, если заголовок очереди все еще не равен нулю. Мы также добавили0
третий голос, чтобы сразу выйти из цикла.#
На третий голос затем либо удаляет это0
, или удаляет главу очереди , если что уже ноль. Теперь этот второй цикл вводится только в том случае, если заголовок очереди равен нулю (а0
на второй голос никогда не давил). В этом случае мы увеличиваем текущее значение последовательности и нажимаем a,0
чтобы выйти из цикла. Наконец, всегда будет0
верхняя часть стека, которую мы должны отбросить.Я говорил вам, что логическое отрицание раздражает в Prelude ...
источник
Mathematica, 27 байт
Еще одно рекурсивное решение.
источник
CJam, 14 байтов
CJam намного моложе этой задачи, поэтому этот ответ не имеет права на зеленую галочку. Тем не менее, довольно редко вы можете использовать
j
это красиво, поэтому я все равно хотел опубликовать его.Проверьте это здесь.
объяснение
j
в основном "запомнившийся оператор рекурсии". Требуется целое числоN
, массив и блокF
. Массив используется для инициализации запоминания: для элементаi
возвращается индексF(i)
.j
затем вычисляетF(N)
, либо просматривая его, либо выполняя блок (соn
стеком), если значение еще не было запомнено. Отличная особенность заключается в том, что внутри блокаj
принимает только целое числоi
и вызываетF(i)
рекурсивно. Итак, вот код:источник
J, 16 байт
Это решение в значительной степени основано на алгоритмическом решении аналогичной проблемы. Вы можете найти некоторое объяснение об этом методе там.
J, 33 байта
В этом подходе я строю последовательность
h(k)
со значениями первых индексов,i
гдеg(i)=k
такh = 1 2 4 6 9 12 16...
. Мы можем получитьh(k)
довольно просто изh(1..k-1)
выражения,({:+1+[:+/#<:])
где вводh(1..k-1)
.Вычислить вывод из
h
очень просто.h ([:+/]>:[) input
источник
Brachylog , 13 байт (не конкурирует)
Попробуйте онлайн!
объяснение
источник
Питон - 76 символов
источник
None
s. Кажется, «правильный» размерNone
s Тхо :)None
тип. Я просто использовал понимание вложенного списка для создания вложенного цикла. Единственная цель понимания списка здесь состоит в том, чтобы заставить код зацикливаться правильное число раз - они отбрасывают значенияJavaScript - 48 символов
Создает 1-индексированный массив,
g
содержащий значения последовательности.Редактировать - JavaScript - 46 символов
Создает 1-индексированный массив,
v
содержащий значения последовательности.Редактировать 2 - ECMAScript 6 - 27 символов
Первые два довольно быстрые, третий очень медленный
источник
Haskell, 63 байта
Это наивный подход, я не знал об очень коротком повторении, когда писал это, но я думал, что выложу его в любом случае, даже если это дольше, чем все другие реализации Haskell, как, например,
Вычислить n-й член последовательности самоописания Голомба
и
/codegolf//a/23979/24877
источник