Définition
a(0) = 0
a(n) = n-a(a(a(n-1)))
pour entiern > 0
Tâche
Étant donné un entier non négatif n
, sortie a(n)
.
Cas de test
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
Les références
code-golf
sequence
number-theory
recursion
Leaky Nun
la source
la source
Réponses:
Haskell,
2322 octetsUtilise simplement la définition de la séquence.
f(f$f$n-1)
est équivalent àf (f (f (n-1)))
.Tester:
Merci à Anders Kaseorg pour un octet!
la source
(f$f$f$n-1)
=f(f$f$n-1)
enregistre un octet.Gelée , 8 octets
Essayez-le en ligne! ou vérifiez les cas de test plus petits .
Comment ça fonctionne
la source
Mathematica, 20 octets
Le nombre d'octets suppose un codage ISO 8859-1 (ou compatible) et
$CharacterEncoding
défini sur une valeur correspondante, comme la valeur par défaut de WindowsWindowsANSI
.Ceci définit un opérateur unaire
±
.la source
PlusMinus
. Voir cet article pour plus de détails.@
ou du[ ]
trop.J,
1412 octetsEnregistré 2 octets grâce à @ Leaky Nun .
Calcule le résultat en s'appelant récursivement lorsque n > 0 trois fois sur n -1 et en soustrayant ce résultat de n . Il y a une situation différente pour le cas de base lorsque n = 0. Là, il calcule n - n qui est égal à 0.
Essayez-le ici.
Explication
la source
Julia, 16 octets
Essayez-le en ligne!
Comment ça fonctionne
Nous redéfinissons l'opérateur unaire
!
pour nos besoins.Si n = 0 , la comparaison
n>0
renvoie faux et il en va de même!
.Sinon, le code après
&&
est exécuté.~-n
est équivalent à(n-1)
en complément à deux,!!!
appelle récursivement!
trois fois sur n - 1 , et la valeur résultante est soustraite de n .la source
-!!~-
._.!
est simplement le nom de la fonction.Python, 31 octets
La limite de récursivité et les contraintes de temps rendent la fonction ci-dessus peu pratique, mais en théorie, cela devrait fonctionner (et fonctionne pour les petits n).
la source
JavaScript (ES6), 52 octets
J'aurais pu être ennuyeux et avoir écrit la version récursive mais cette version est beaucoup plus rapide (en faisant facilement face au dernier cas de test) et utilise aussi
reduce
donc c'est un plus!la source
Rétine ,
4943 octetsEssayez-le en ligne!
la source
CJam,
1312 octetsMerci à Dennis d'avoir économisé 1 octet.
Testez-le ici.
la source
a
.R,
4241 octetsUsage:
Cette approche récursive n'est pas adaptée à des valeurs plus importantes
n
.la source
n<1
. Comme c'est une séquence, elle n'est de toute façon vraiment définie que pour les entiers non négatifs.a=function(n)"if"(n,n-a(a(a(n-1))),0)
fonctionnera pendant plusieurs octets.Oasis , 6 octets
Code:
Version étendue:
Code:
Essayez-le en ligne!
la source
Sesos ,
5855 octetsGère jusqu'à 400 entrées raisonnablement bien, mais le temps d'exécution augmente considérablement après ce point.
Essayez-le en ligne! Vérifier le débogage pour voir le code SBIN généré.
Assemblage Sesos
Le fichier binaire ci-dessus a été généré en assemblant le code SASM suivant.
la source
LISP, 61 octets
Probablement pas la solution optimale, mais cela fonctionne.
la source
Java 7, 42 octets
Cas non testés et testés:
Essayez-le ici.
Production:
la source
Rubis, 27 octets
La mise en œuvre évidente.
Il s'agit d'une réponse plus longue et plus rapide qui met en cache les entrées précédentes de la séquence. Les deux réponses ne fonctionnent que pour les versions après 1.9, car c'est à ce moment
->
-là que la stabby lambda a été présentée à Ruby.la source
C #, 35 octets
la source
Golfscript,
2625 octetsEssayez-le en ligne!
Localement
10000
prend moins d'une demi-seconde.la source
C,
3532 octetsSauvegardé 3 octets grâce à @PeterTaylor!
Essayez-le sur Ideone!
la source
a(n){return n?n-a(a(a(n-1))):0;}
:
dans votre code. Vous devez retirer celui qui suit?
.Javascript ES6, 22 octets
Je vais être ennuyeux et faire la version récursive: P
la source
VBA, 69 octets
Fonctionne en un clin d'œil sur l'ensemble de test, ralentit un peu au-dessus de n = 1000000, se heurte à un mur de mémoire un peu supérieur à n = 25 millions.
la source
Pyth, 10 octets
Définit une fonction
y
. Essayez-le en ligne: DémonstrationCela utilise une nouvelle fonctionnalité relative de Pyth. Vous pouvez appliquer une fonction plusieurs fois à l'aide de la syntaxe de pliage. Il n'enregistre en fait aucun octet, je l'ai utilisé uniquement à des fins de démonstration.
Explication:
la source
Érable,
2826 octetsUsage:
la source
dc, 34 octets
L'entrée provient du haut de la pile. Ce doit être le seul élément de la pile, car la profondeur de la pile est utilisée comme compteur. Exemple d'utilisation:
Il s'agit d'une implémentation assez simple de la définition de séquence:
Quoi qu'il en soit, cela a commencé simplement ... puis le golf s'est produit.
la source
Lisp commun , 44 octets
Essayez-le en ligne!
la source
C ++ (MSVC, principalement)
Version normale: 40 octets
Version de programmation de méta modèle: 130 octets
Utilisation:
La version du modèle est le code le plus rapide, car il n'y a rien de plus rapide que de déplacer une valeur dans un registre => avec optimisation,
H<20>::a()
compiler comme:Pour 10000, la version récursive se bloque en raison d'une erreur de dépassement de pile et la version du modèle se bloque au moment de la compilation en raison de la profondeur d'instanciation du modèle. GCC passe à 900 (614)
la source
C
et{
dans la version de programmation de méta modèleD , 36 octets
Essayez-le en ligne!
la source
APL (Dyalog Unicode) ,
1817 octetsEssayez-le en ligne!
Étonnamment, il n'y a pas de réponse APL à ce défi. Il s'agit d'une implémentation littérale de la fonction dans l'OP.
TIO expire pourn > 90 .
Un octet enregistré grâce à @ Zacharý.
la source
{⍵=0:0⋄⍵-∇⍣3⊢⍵-1}
Python 3, 72 octets
Ideone it!
la source
PowerShell v2 +, 56 octets
L'équivalent PowerShell d'un lambda pour former la définition récursive. Exécutez-le via l'
&
opérateur d'appel, par exemple&$a(5)
. L' exécution prend beaucoup de temps - même50
sur ma machine (un i5 récent avec 8 Go de RAM) prend environ 90 secondes.Solution itérative plus rapide, 59 octets
Plus longtemps seulement parce que nous devons tenir compte de l'entrée
0
(c'est*!!$n
la fin). Sinon, nous construisons simplement le tableau de manière itérative jusqu'à$n
, en ajoutant un nouvel élément à chaque fois, et en sortant le dernier à la fin$o[-1]
. Super rapide - le calcul10000
sur ma machine prend environ 5 secondes.la source
> <> , 55 + 2 = 57 octets
L'entrée devrait être présente sur la pile au démarrage du programme, donc +2 octets pour l'
-v
indicateur. Essayez-le en ligne!C'est très lent, car il utilise la récursivité pour calculer le résultat. L'utilisation de TIO
h(50)
prend plus d'une minute. Il renvoie les résultats corrects <= 30, donc je suis sûr que cela fonctionneraith(10000)
, je ne l'ai pas exécuté pour le savoir!la source