Les nombres carrés sont ceux qui prennent la forme n^2
où n est un entier. Ils sont également appelés carrés parfaits, car lorsque vous prenez leur racine carrée, vous obtenez un entier.
Les 10 premiers nombres carrés sont: ( OEIS )
0, 1, 4, 9, 16, 25, 36, 49, 64, 81
Les nombres triangulaires sont des nombres qui peuvent former un triangle équilatéral. Le n-ème nombre de triangle est égal à la somme de tous les nombres naturels de 1 à n.
Les 10 premiers nombres triangulaires sont: ( OEIS )
0, 1, 3, 6, 10, 15, 21, 28, 36, 45
Les nombres triangulaires carrés sont des nombres à la fois carrés et triangulaires.
Les 10 premiers nombres triangulaires carrés sont: ( OEIS )
0, 1, 36, 1225, 41616, 1413721, 48024900, 1631432881, 55420693056, 1882672131025, 63955431761796
Il existe un nombre infini de nombres carrés, de nombres triangulaires et de nombres triangulaires carrés.
Écrivez un programme ou une fonction nommée qui a donné un numéro d'entrée (paramètre ou stdin) n
, calcule le n
numéro triangulaire carré et le renvoie / le retourne, où n est un nombre positif non nul. (Pour n = 1, retournez 0)
Pour que le programme / la fonction soit une soumission valide, il doit être en mesure de renvoyer au moins tous les nombres triangulaires carrés inférieurs à 2 ^ 31-1.
Prime
-4 octets pour pouvoir sortir tous les nombres triangulaires carrés inférieurs à 2 ^ 63-1
-4 octets pour pouvoir théoriquement sortir des nombres triangulaires carrés de n'importe quelle taille.
Pénalité de +8 octets pour les solutions qui prennent du temps non polynomial.
Pile de bonus.
C'est un défi de code-golf, donc la réponse avec le moins d'octets l'emporte.
n
étapes, et à chaque étape l'arithmétique prend du temps linéaire parce que le nombre de chiffres croît linéairementn
. Je ne pense pas que le temps linéaire soit possible. À moins que vous ne disiez que les opérations arithmétiques sont à temps constant?Réponses:
CJam,
128 octetsUtilise la relation de récurrence de l'article Wikipedia.
Le code est long de 16 octets et se qualifie pour les deux bonus.
Essayez-le en ligne dans l' interpréteur CJam .
Comment ça fonctionne
Mon code s'est avéré être identique à xnor dans tous les aspects, sauf que j'utilise la pile de CJam au lieu de variables.
la source
Python 2, 45 - 4 - 4 = 37
Itère en utilisant la récurrence
En théorie, cela prend en charge des nombres de toute taille, mais fonctionne en temps exponentiel, donc il ne devrait pas être admissible aux bonus. Devrait fonctionner pour des numéros de toute taille. Par exemple, pour 100, donne
Une solution récursive utilise 41 caractères, mais ne doit pas être qualifiée car elle prend un temps exponentiel.
la source
exec
solution. Si vous êtes autorisé à modifier la limite de récursivité, il pourrait également calculer un nombre de triangle carré de n'importe quelle taille, le qualifiant pour # 2. Cependant, je ne sais pas si cela est admissible (@Rodolvertice).Pyth, 16-4-4 = 8 octets
Utilise la formule récursive de l'article OEIS.
Il utilise la commande post-assign qui est assez nouvelle et semble vraiment cool. Les utilisations réduisent les temps d'itération en
n-1
raison de l'indexation basée sur 1.Semble être polynomial car il boucle n fois et fait des calculs et des affectations à chaque itération, mais je ne suis pas un informaticien. Finit n = 10000 presque instantanément.
Essayez-le ici en ligne .
la source
b
.Oasis , 7 - 4 - 4 = -1 (sans compétition)
Essayez-le en ligne!
Les usages
a(0) = 0, a(1) = 1; for n >= 2, a(n) = 34 * a(n-1) - a(n-2) + 2
Oasis prend en charge des nombres entiers de précision arbitraire, il devrait donc pouvoir atteindre n'importe quel nombre tant qu'aucun débordement de pile ne se produit. Faites-moi savoir si cela ne compte pas pour le bonus en raison du débordement de pile. Il est également possible que cet algorithme particulier soit non polynomial, et faites-moi savoir si c'est le cas.
Non concurrentiel parce que le défi des postdates linguistiques.
Explication:
Solution alternative:
Utilise plutôt
a(n) = 35*(a(n-1)-a(n-2)) + a(n-3)
la source
For n=1 return 0
, mais cela renvoie 1. Cela peut être résolu en ajoutant l'option -O .JavaScript (ES6), 29-4 = 25 octets
5 octets enregistrés grâce à @IsmaelMiguel !
J'ai dû coder en dur le 0, 1 et les négatifs pour éviter une récursion infinie.
Console, j'ai nommé la fonction
f
:EDIT : il s'avère que JavaScript arrondira les nombres à 16 (15) chiffres (Spec) car ces nombres sont trop grands, provoquant un débordement. Mettez 714341252076979033 dans votre console JavaScript et voyez par vous-même. C'est plus une limitation de JavaScript
la source
f(15)
devrait revenir85170343853180456676
, non85170343853180450000
.n=>n?n<2?0:34*f(n-1)-f(n-2)+2:1
(31 octets). J'ai testé jusqu'au 5ème numéro.n=>n>1?34*f(n-1)-f(n-2)+2:!!n
. Il revientfalse
sur0
,true
sur1
et36
sur2
. Si vous souhaitez qu'il renvoie un numéro, vous pouvez le remplacer!!n
par+!!n
.n=>n>1?34*f(n-1)-f(n-2)+2:n|0
(même nombre d'octets, renvoie désormais toujours des nombres)Excel VBA - 90 octets
En utilisant la relation de récurrence de la page Wikipedia:
Une fois exécuté, vous êtes invité à entrer n, puis la séquence jusqu'à n inclus est sortie dans la colonne A:
Il peut être exécuté jusqu'à n = 202 inclusivement avant de donner une erreur de débordement.
la source
[Pas de concurrence] Pyth (14 - 4 - 4 = 6 octets)
Utilisé la première récurrence d' OEIS , qu'après 0,1,36 vous pouvez trouver A n = (A n-1 -1) 2 / A n-2 . A Pas en concurrence car cette solution commence à 36, si vous descendez, vous divisez par zéro (donc l'entrée de 0 donne 36). A également dû coder en dur 36.
Essayez-le ici
la source
Java, 53-4 = 49 octets
C'est une autre récursion simple, mais je n'arrive pas souvent à publier Java avec un score <50, alors ...
Maintenant, pour quelque chose de non récursif, cela devient un peu plus long. Celui-ci est à la fois plus long (112-4 = 108) et plus lent, donc je ne sais pas pourquoi je le poste, sauf pour avoir quelque chose d'itératif:
la source
Julia, 51 octets - 4 - 4 = 43
Cela utilise la première relation de récurrence répertoriée sur la page Wikipedia pour les nombres triangulaires carrés. Il calcule n = 1000 en 0,006 secondes et n = 100000 en 6,93 secondes. C'est quelques octets de plus qu'une solution récursive mais c'est beaucoup plus rapide.
Non golfé + explication:
Exemples:
la source
PHP,
655956-4 = 52 octetsrépéter jusqu'à ce que la racine carrée de
$s
soit ∈ℤ: ajouter$f
à la somme$s
, incrémenter$f
;répéter
$argv[1]
fois.somme de sortie.
la source
Prolog,
7074-4-4 = 66Exécution de
n(100,R)
sorties:Prend environ 1 seconde pour fonctionner
n(10000,X)
sur mon ordinateur.Edit : La version 66 est récursive de queue. La version précédente, non récursive, est la suivante:
Ils ont la même longueur en octets mais le non récursif de queue génère des débordements de pile au-delà d'un certain point (sur mon ordinateur, vers 20500).
la source
Javascript ES6,
777571 caractèresTester:
la source
C, 68 octets
Ce fut un défi amusant avec C
main(o,k){o==1?k=0:0;k<9e9&&k>=0&&main(34*o-k+2,o,printf("%d,",k));}
Regardez-le fonctionner ici: https://ideone.com/0ulGmM
la source
Gelée , 13 - 8 = 5 octets
Cela donne droit aux deux bonus.
Essayez-le en ligne!
Fait aux côtés de caird coinheringaahing dans le chat .
Explication
la source
Perl 6 , 25 - 8 = 17 octets
Essayez-le en ligne!
la source
05AB1E , 10 - 8 = 2 octets
Essayez-le en ligne!
la source
APL (NARS), 67 caractères, 134 octets
tester:
f rechercherait en séquence quadratique les éléments qui sont également des nombres triangulaires, ils doivent donc suivre la formule de vérification triangulaire dans les APL: 0 = 1∣√1 + 8 × m avec le nombre m à vérifier.
la source