Défi
Avec un nombre entier positif, déterminez s'il s'agit d'un nombre triangulaire et indiquez en conséquence l'une de deux valeurs distinctes constantes.
Définition
Un nombre triangulaire est un nombre qui peut être exprimé par la somme d'entiers positifs consécutifs, commençant à 1. Ils peuvent également être exprimés avec la formule n(n + 1) / 2
, où n
est un entier positif.
Cas de test
Vérité
1
3
6
10
15
21
55
276
1540
2701
5050
7626
18915
71253
173166
222111
303031
307720
500500
998991
Fausseté:
2
4
5
7
8
9
11
16
32
50
290
555
4576
31988
187394
501500
999999
Règles
- Votre entrée peut être une fonction ou un programme.
- Vous pouvez supposer que l'entrée est un entier positif inférieur à 10 6 .
- Vous devez choisir deux sorties constantes et distinctes pour distinguer les deux catégories.
C'est du code-golf , donc le code le plus court en octets dans chaque langue gagne.
code-golf
number
decision-problem
ETHproductions
la source
la source
Réponses:
Haskell , 23 octets
MODIFIER:
$
.Une fonction anonyme prenant un
Int
et retournant unChar
.La sortie
'1'
concerne les nombres triangulaires et les'0'
autres.Essayez-le en ligne!
((!!)$show.(10^)=<<[0..]) 998991
.Génère les nombres 1, 10, 100, 1000, ..., les convertit en chaînes et les concatène. Puis indexe dans la chaîne infinie résultante
la source
(!!)$show.(10^)=<<[0..]
.Python , 24 octets
Essayez-le en ligne!
Sorties
False
pour les nombres triangulaires,True
pour le reste. Vérifie si8*n+1
est un carré parfait. Python prendra des carrés parfaits pour obtenir des nombres entiers exacts, quelle que soit leur taille. Il n'y a donc pas de problème de virgule flottante.la source
(1<<10000)**.5
: OverflowError: int trop volumineux pour être converti en floatGelée , 4 octets
Essayez-le en ligne!
Comment?
la source
/
et figuraient\
probablement parmi les cinq premiers rapides à être implémentés, avant l’idée de convertir les arguments entiers en intervalles.Retina , 10 octets
L'entrée est unaire. La sortie est
0
ou1
.Essayez-le en ligne!(En tant que suite de tests permettant une conversion décimale à unaire pour plus de commodité.)
Explication
C'est l'exercice le plus fondamental dans les références en aval. La plupart des gens connaissent les références arrières dans les expressions rationnelles, par exemple
(.)\1
pour faire correspondre un caractère répété. Cependant, certaines des versions les plus avancées vous permettent d’utiliser une référence arrière avant ou à l’intérieur du groupe auquel elle fait référence. Dans ce cas, cela s'appelle généralement une référence directe. Cela peut avoir un sens si la référence est répétée. Cela peut ne pas être bien défini lors de la première itération, mais lors des itérations suivantes, le dernier groupe ou le groupe environnant a capturé quelque chose et peut être réutilisé.Ceci est le plus souvent utilisé pour implémenter des modèles récurrents sur des chaînes unaires. Dans ce cas, nous essayons de faire correspondre l'entrée avec la somme d'entiers consécutifs:
la source
(^|1\1)+$
fonctionne pas ?+
à{2,}
, il devrait fonctionner. Cette optimisation empêche les boucles infinies, mais c'est aussi la seule chose qui empêche les regex .NET d'être Turing-complete par eux-mêmes.\G
!Python 2 , 25 octets
Vérifie si ( 8x + 1 ) est un nombre carré.
Essayez-le en ligne!
la source
Mathematica, 16 octets
Essentiellement un port de la solution Python de xnor . Sorties
True
pour les nombres triangulaires,False
sinon.la source
JavaScript (ES6),
3027 octets2 octets sauvés grâce à kamoroso94
Cas de test
Afficher l'extrait de code
Version non récursive (ES7), 19 octets
Réponse du port d' Adnan .
la source
f=(n,k=1)=>n>0?f(n-k,k+1):!n
?k
.undefined
valeur initiale ; votre édition était un plaisir de lire après que je suis indépendamment arrivé à votre solution précédente.CJam , 11 octets
Sorties
1
pour triangulaire,0
sinon.Essayez-le en ligne!
Explication
Considérez l'entrée
21
.la source
Brain-Flak , 40 octets
Wheat Wizard et moi avons eu un duel sur cette question. Lorsque nous avons décidé d’afficher nos solutions, nous étions à égalité à 42 octets, mais j’ai trouvé une solution à deux octets. Nous avons décidé que cela compterait comme égalité (ma solution est ci-dessous).
Essayez-le en ligne!
Explication:
Pour une explication complète, veuillez consulter la réponse de Wheat Wizard .
Brain-Flak , 42 octets
Les sorties
0\n
(nouvelle ligne littérale) pour vérité et la chaîne vide pour fausseté.L'idée est de soustraire 1, puis 2, puis 3, jusqu'à l'entrée. Si vous frappez 0, alors vous savez que c'est un nombre triangulaire, vous pouvez donc vous arrêter là.
Essayez-le en ligne! (vérité)
Essayez-le en ligne! (fausseté)
Voici une solution de 46 octets que j'ai trouvée intéressante.
Sorties
0\n
(nouvelle ligne littérale) pour vérité, la chaîne vide pour fausseté.L'idée est de décompter d'une entrée à la fois par numéros consécutifs, un à la fois. Par exemple
input - (1) - (1,1) - (1,1,1)
. Chaque fois que nous soustrayons, si nous ne sommes pas encore à 0, nous laissons une valeur supplémentaire sur la pile. De cette façon, si nous sommes à 0 et que nous soustrayons toujours lorsque nous sautons, nous retirons la dernière valeur de la pile. Si l'entrée était un nombre triangulaire, nous finirons exactement à 0 et ne verrons pas le 0.Essayez-le en ligne! vérité
essayez-le en ligne! fausseté
la source
Gelée , 5 octets
Essayez-le en ligne!
Contexte
Soit n l'entrée. Si n est le k ème nombre triangulaire, on a
ce qui signifie qu'il y aura une solution naturelle si et seulement si 1 + 8n est un carré impair et parfait. Clairement, vérifier la parité de 1 + 8n n'est pas requise.
Comment ça marche
la source
PowerShell ,
31 à30 octetsEssayez-le en ligne!
Méthode de force brute agréable et lente. Faites un tableau de chaque somme de 1 à 10 6 et voyez si l’argument est dedans.
la source
Brain-Flak , 42 octets
Essayez-le en ligne!
Explication
Le but de ce programme est de créer un état sur deux piles et d’effectuer une opération constante sur les deux piles jusqu’à ce que l’un des zéros soit zéros, nous pouvons ensuite afficher le résultat en fonction de la pile sur laquelle nous nous trouvons. Ceci est similaire aux programmes qui déterminent le signe d’un nombre. Ces programmes mettent
n
sur une pile et-n
sur l’autre et ajoutent un et commutent les piles jusqu’à ce que l’une des piles soit à zéro. Si le nombre était négatif en premier lieu, la première pile atteindra zéro, si le nombre était positif, l'autre pile atteindra zéro.Ici, nous créons deux piles, une qui soustrait des nombres consécutifs de l’entrée et une autre qui en soustrait un. Celui qui soustrait des nombres consécutifs ne se terminera que si le nombre est triangulaire (sinon, il passera juste de zéro et continuera à aller dans les négatifs). L'autre se terminera toujours pour tout nombre positif, mais le sera toujours plus lentement que le premier, ainsi les nombres non triangulaires se termineront sur cette pile.
Alors, comment pouvons-nous configurer des piles de sorte que la même opération soustrait des nombres consécutifs sur l’une et soustrait l’une sur l’autre? Sur chaque pile, nous avons l'entrée en haut pour pouvoir vérifier dans, en dessous nous avons la différence et en dessous nous avons la différence de la différence. Chaque fois que nous courons, nous ajoutons la "différence de la différence" à la "différence" régulière et soustraisons celle-ci de l'entrée. Pour la pile qui vérifie la triangularité, nous définissons notre double différence de
1
manière à obtenir des entiers consécutifs à chaque fois que nous exécutons. Pour l'autre pile, nous la définissons de0
manière à ne jamais changer la différence, c'est-à-dire qu'elle reste toujours 1. Voici comment la pile est mise en place au début, où sen
trouve l'entrée:Lorsque nous terminons finalement, nous pouvons utiliser ces différences pour vérifier la pile sur laquelle nous nous trouvons. Les deux premières valeurs sont extraites et nous obtenons
1
un nombre triangulaire et0
un nombre non triangulaire.Code annoté
Voici une solution de 50 octets que j'aime bien aussi.
Essayez-le en ligne!
la source
Cubix , 23
2425octets0 pour la vérité et rien
0pour Falsey. Forces brutes en incrémentant le compteur, en ajoutant à la somme cumulative et en comparant à l'entrée.Maintenant, essayez de l’ajuster sur un cube 2x2x2.L'a fait!Essayez-le en ligne!
/
Réfléchis pour faire face.I10\
obtenir une entrée entière, appuyer sur 1 (compteur), appuyer sur 0 (somme) et réfléchir+s;p-
corps de boucle. Ajouter la somme et le compteur, supprimer la somme précédente, augmenter les entrées et soustraire?
Tester le résultat de la soustraction\.uO@
reporter à la face inférieure, non-op, demi-tour, sortie et arrêt.@
arrêtez-vous;qWs)/su
, soustraction de gouttes à gauche , mettez l’entrée en bas, décalez à gauche, compteur et échange, somme, compteur d’incréments, réflexion, somme et compteur, demi-tour sur le corps de la boucle principale.la source
.
sur le cube mais un1
dans votre code.05AB1E ,
7 à6 octetsEDIT : Merci à @Dennis: Enregistrement d’un octet car j’ai oublié l’opérateur d’incrément
Essayez-le en ligne!
n
est triangulaire sisqrt(8n + 1)
est un entierComment ça marche
la source
t.ï
peut être le cas deŲ
nos jours, ce qui permet de vérifier si un nombre est un carré.Perl 6 , 17 octets
Vérifie simplement si
$_
, l'entrée dans la fonction, est égale à l'un des éléments de la réduction d'addition triangulaire(1, 1+2, ..., 1+2+...+$_)
.la source
Alice ,
3822 octetsBeaucoup d'octets sauvés grâce à Martin et Leo
Il y a un retour à la ligne. Sorties
1
pour triangulaire,0
sinon.Essayez-le en ligne!
Explication
Ceci utilise la même approche que ma réponse CJam , seulement plus maladroite. Sous forme linéarisée, le programme devient
où
i
eto
sont en réalité en mode ordinal.Considérez l'entrée
21
comme un exemple.la source
...h*-no@
).Japt ,
107 octets3 octets sauvegardés grâce à @Luke et @ETHproductions
Essayez-le en ligne!
Explication:
Explication:
Essayez-le en ligne!
la source
*8Ä ¬u1 c
pour 9B (sortie 0 si l'entrée est triangulaire, 1 sinon)u1 c
àv1
, je crois (commutation des sorties)R ,
2319 octetsApproche similaire aux autres réponses. Vérifie si
8x+1
c'est un carré parfait.-4 octets merci Giuseppe et MickyT.
Essayez-le en ligne!
la source
!
au lieu de==0
!(8*scan()+1)^.5%%1
MATL , 5 octets
Essayez-le en ligne!
Explication:
la source
t:Ys=a
. Oubliém
:-)m
jusqu'à ce que j'ai vu cette réponse . C'est drôle comme les deux réponses sont presque identiques: DLot, 72 octets
Sorties 1 en cas de succès, rien en cas d'échec. Fonctionne pour zéro aussi, bien que cela ne soit pas demandé par la question pour une raison quelconque.
la source
JavaScript (ES7),
1918 octetsDe ma réponse à une question connexe .
Sorties
false
pour les nombres triangulaires outrue
pour des non triangulaires, comme le permet le PO.L'essayer
la source
n=>(8*n+1)**.5%1>0
(ce qui inverserait les sorties)PHP, 30 octets
Imprime 1 pour vrai et rien pour faux
Essayez-le en ligne!
fmod
PHP, 37 octets
Imprime 1 pour vrai et rien pour faux
Essayez-le en ligne!
la source
Mathematica, 28 octets
la source
7!
par#
. D'abord, c'est plus court. plus important encore, la solution actuelle n’est pas correcte, car elle impose artificiellement une limite à la taille de l’entrée sur laquelle il travaille.Pari / GP , 18 octets
Essayez-le en ligne!
Il y a une fonction intégrée pour tester si un nombre est un nombre polygonal, mais c'est un octet de plus.
Pari / GP , 19 octets
Essayez-le en ligne!
la source
Excel,
3122 octets9 octets sauvés grâce à Octopus
Sorties
TRUE
pour les nombres triangulaires. SinonFALSE
. Vérifie si8*n+1
est un carré parfait.la source
=MOD(SQRT(8*A1+1),1)=0
sauve quelques octetsBrachylog , 5 octets
Essayez-le en ligne!
Explication
la source
Fourier , 26 octets
Essayez-le en ligne!
la source
Python - 52 octets
Note: Je sais que les deux autres réponses en Python sont beaucoup plus courtes, mais c'est la manière de la vieille école, plus d'un algorithme à la main
la source
APL (Dyalog) , 6 octets
Essayez-le en ligne!
Explication
Sorties
0
pour false et1
pour true.la source
TI-BASIC,
10 à7 octets-3 grâce à @lirtosiast
Prend des commentaires sur
X
. Vérifie si√(8X+1)
est un nombre entierla source
not(fPart(√(8Ans+1
?