Определение
a(0) = 0
a(n) = n-a(a(a(n-1)))
для целого числаn > 0
задача
Учитывая неотрицательное целое число n
, выведите a(n)
.
Testcases
n a(n)
0 0
1 1
2 1
3 2
4 3
5 4
6 4
7 5
8 5
9 6
10 7
11 7
12 8
13 9
14 10
15 10
16 11
17 12
18 13
19 13
20 14
10000 6823
Ссылки
code-golf
sequence
number-theory
recursion
Дрянная Монахиня
источник
источник
Ответы:
Haskell,
2322 байтаПросто использует определение последовательности.
f(f$f$n-1)
эквивалентноf (f (f (n-1)))
.Тестовое задание:
Спасибо Anders Kaseorg за байт!
источник
(f$f$f$n-1)
=f(f$f$n-1)
сохраняет байт.Желе , 8 байт
Попробуйте онлайн! или проверьте меньшие контрольные примеры .
Как это устроено
источник
Mathematica, 20 байтов
Число байтов предполагает кодирование ISO 8859-1 (или совместимое) и
$CharacterEncoding
устанавливает соответствующее значение, как в Windows по умолчаниюWindowsANSI
.Это определяет унарный оператор
±
.источник
PlusMinus
. Смотрите этот пост для деталей.@
или[ ]
тоже.J,
1412 байтСохранено 2 байта благодаря @ Leaky Nun .
Вычисляет результат путем рекурсивного вызова самого себя, когда n > 0 три раза по n -1, и вычитания этого результата из n . Существует другая ситуация для базового случая, когда n = 0. Там он вычисляет n - n, что равно 0.
Попробуй это здесь.
объяснение
источник
Юлия, 16 байт
Попробуйте онлайн!
Как это устроено
Мы переопределяем унарный оператор
!
для наших целей.Если n = 0 , сравнение
n>0
возвращает ложь и так же!
.В противном случае код после
&&
выполняется.~-n
эквивалентно(n-1)
дополнению до двух,!!!
рекурсивно вызывает!
трижды на n - 1 , и полученное значение вычитается из n .источник
-!!~-
.!
это просто имя функции.Python, 31 байт
Ограничение рекурсии и временные ограничения делают вышеупомянутую функцию непрактичной, но теоретически она должна работать (и работает для малых n).
источник
JavaScript (ES6), 52 байта
Я мог бы быть скучным и написать рекурсивную версию, но эта версия намного быстрее (легко справляется с последним тестовым примером), а также использует,
reduce
так что это плюс!источник
Retina ,
4943 байтаПопробуйте онлайн!
источник
CJam,
1312 байтСпасибо Деннису за сохранение 1 байта.
Проверьте это здесь.
источник
a
.Р,
42 42байтаИспользование:
Этот рекурсивный подход не подходит для больших значений
n
.источник
n<1
. Поскольку это последовательность, она все равно действительно определена только для неотрицательных целых чисел.a=function(n)"if"(n,n-a(a(a(n-1))),0)
будет работать на несколько байтов.Оазис , 6 байт
Код:
Расширенная версия:
Код:
Попробуйте онлайн!
источник
Sesos ,
5855 байтХорошо обрабатывает ввод до 400 , но после этого время выполнения значительно увеличивается.
Попробуйте онлайн! Проверьте Debug, чтобы увидеть сгенерированный код SBIN.
Сесос сборка
Бинарный файл выше был сгенерирован путем сборки следующего кода SASM.
источник
LISP, 61 байт
Вероятно, не оптимальное решение, но оно работает.
источник
Java 7, 42 байта
Ungolfed и тестовые случаи:
Попробуй это здесь.
Выход:
источник
Рубин, 27 байт
Очевидная реализация.
Это более длинный и быстрый ответ, который кэширует предыдущие записи в последовательности. Оба ответа работают только для версий после 1.9, как тогда
->
, когда в Ruby была представлена стабильная лямбда.источник
C #, 35 байт
источник
Гольфскрипт,
2625 байтПопробуйте онлайн!
Локально
10000
занимает не более полсекунды.источник
C,
3532 байтаСохранено 3 байта благодаря @PeterTaylor!
Попробуйте это на Ideone!
источник
a(n){return n?n-a(a(a(n-1))):0;}
:
в твоем коде тоже есть ошибки . Вы должны вынуть один после?
.Javascript ES6, 22 байта
Я буду скучным и сделаю рекурсивную версию: P
источник
VBA, 69 байт
Работает в мгновение ока на тестовом наборе, замедляется чуть выше n = 1000000, наталкивается на стену памяти чуть выше n = 25 миллионов.
источник
Pyth, 10 байт
Определяет функцию
y
. Попробуйте онлайн: демонстрацияЭто использует относительно новую особенность Pyth. Вы можете применить функцию несколько раз, используя сложный синтаксис. На самом деле он не сохраняет байты, я использовал его только для демонстрации.
Объяснение:
источник
Клен,
2826 байтИспользование:
источник
постоянный ток, 34 байта
Вход берется с вершины стека. Это должен быть единственный элемент в стеке, поскольку в качестве счетчика используется глубина стека. Пример использования:
Это довольно простая реализация определения последовательности:
Как бы то ни было, все началось просто ... а затем и игра в гольф.
источник
Common Lisp , 44 байта
Попробуйте онлайн!
источник
C ++ (MSVC, в основном)
Обычная версия: 40 байт
Версия метапрограммы шаблона: 130 байт
Использование :
Версия шаблона - самый быстрый код, так как нет ничего быстрее, чем переместить значение в регистр => с оптимизацией,
H<20>::a()
скомпилировать как:Для 10000 рекурсивная версия падает из-за ошибки переполнения стека, а версия шаблона падает во время компиляции из-за глубины создания шаблона. GCC идет до 900 (614)
источник
C
и{
в шаблонной версииD , 36 байт
Попробуйте онлайн!
источник
APL (Dyalog Unicode) ,
1817 байтПопробуйте онлайн!
Удивительно, но нет ответа APL на этот вызов. Это буквальная реализация функции в ОП.
Тайм-аут для TIOn > 90 ,
Сохраненный байт благодаря @ Zacharý.
источник
{⍵=0:0⋄⍵-∇⍣3⊢⍵-1}
Python 3, 72 байта
Идео это!
источник
PowerShell v2 +, 56 байт
PowerShell эквивалент лямбды для формирования рекурсивного определения. Выполните его через
&
оператор вызова, например&$a(5)
. Выполнение занимает много времени - даже50
на моей машине (последняя версия i5 с 8 ГБ ОЗУ) занимает около 90 секунд.Более быстрое итеративное решение, 59 байт
Дольше только потому, что нам нужно учитывать вход
0
(это*!!$n
в конце). В противном случае мы просто итеративно создаем массив до$n
, добавляя новый элемент каждый раз, и выводим последний в конце$o[-1]
. Суперскоростной - расчет10000
на моей машине занимает около 5 секунд.источник
> <> , 55 + 2 = 57 байт
Ожидается, что входные данные будут присутствовать в стеке при запуске программы, поэтому +2 байта для
-v
флага. Попробуйте онлайн!Это очень медленно, так как он использует рекурсию для вычисления результата. Использование TIO
h(50)
занимает больше минуты. Он возвращает правильные результаты <= 30, так что я уверен, что это сработаетh(10000)
, я просто не запустил его, чтобы узнать!источник