Préface
Dans le célèbre chant des douze jours de Noël , le narrateur reçoit chaque jour plusieurs cadeaux. La chanson est cumulative - dans chaque verset, un nouveau cadeau est ajouté, avec une quantité supérieure au cadeau précédent. Une perdrix, deux tourterelles, trois poules françaises, etc.
À n'importe quel verset donné, N , nous pouvons calculer la somme cumulée des présents jusqu'à présent dans la chanson en trouvant le N ème nombre tétraédrique , qui donne les résultats:
Verse 1: 1
Verse 2: 4
Verse 3: 10
Verse 4: 20
Verse 5: 35
Verse 6: 56
Verse 7: 84
Verse 8: 120
Verse 9: 165
Verse 10: 220
Verse 11: 286
Verse 12: 364
Par exemple, après le verset 4, nous avons eu 4 * (1 perdrix) , 3 * (2 tourterelles) , 2 * (3 poules françaises) et 1 * (4 oiseaux chanteurs) . En les résumant, nous obtenons 4(1) + 3(2) + 2(3) + 1(4) = 20
.
Le défi
Votre tâche consiste à écrire un programme ou une fonction qui, étant donné un entier positif représentant le nombre de cadeaux 364 ≥ p ≥ 1 , détermine de quel jour (verset) de Noël il s'agit.
Par exemple, si p = 286 , nous sommes le 11e jour de Noël. Cependant, si p = 287 , alors la prochaine charge de cadeaux a commencé, ce qui signifie que c'est le 12ème jour.
Mathématiquement, cela consiste à trouver le nombre tétraédrique suivant et à retourner sa position dans toute la séquence des nombres tétraédriques.
Règles:
- Il s'agit de code-golf , donc la solution la plus courte (en octets) l'emporte.
- Des échappatoires de golf standard s'appliquent.
- En ce qui concerne les jours, votre programme doit être indexé 1.
- Votre soumission doit être un programme complet ou une fonction - mais pas un extrait.
Cas de test
1 -> 1
5 -> 3
75 -> 7
100 -> 8
220 -> 10
221 -> 11
364 -> 12
la source
x=>{while(x>p)p+=r+=++i;return i}
je suis sûr qu'il peut être raccourci dans un langage comme JavaScript.Réponses:
Gelée ,
76 octets-1 octet grâce à Dennis (utilisez un minimum vectorisé,,
«
et le premier index,i
)TryItOnline
Comment?
Pas tout à fait efficace - calcule le 1er au nième nombre tétraédriques dans l'ordre dans une liste et renvoie l'index basé sur 1 du premier qui est égal ou supérieur.
Précédent 7 byters utilisant intervalle réduit
[0,1,2,3,...,n-1]
et de comptage tétraèdres inférieur à n:Ḷ+\⁺<µS
,Ḷ+\⁺<ḅ1
,Ḷ+\⁺<ċ1
, etḶ+\⁺<¹S
la source
Python , 27 octets
Essayez-le en ligne!
Une formule directe avec un ajustement de courbe, identique à celle trouvée par Level River St.
L'équation décalée
i**3-i==n*6
est proche dei**3==n*6
grandei
. Il résouti=(n*6)**(1/3)
. Prendre la parole les rondes au besoin, compensant le coup par coup.Mais, il y a 6 entrées sur les limites où l'erreur le prend en dessous d'un entier qu'il devrait être au-dessus. Tout cela peut être corrigé en augmentant légèrement l'exposant sans introduire d'autres erreurs.
Python , 38 octets
La formule
n=i*(i+1)*(i+2)/6
des nombres tétraédriques peut être plus facilement écrite sous lai+1
formen*6=(i+1)**3-(i+1)
. Donc, nous trouvons le plus basi
pour lequeli**3-i<n*6
. Chaque fois que nous incrémentons ài
partir de 1, les appels récursifs s'ajoutent1
à la sortie. Partir dei=1
plutôt quei=0
compenser le changement.la source
**.33359
fonctionne pour un octet supplémentaire.lambda n:n**.3336//.5501
enregistre quelques octets.J , 12 octets
Il peut y avoir une façon plus golfique de le faire, mais c'est une belle occasion d'utiliser l'inversion de fonction intégrée de J.
Essayez-le en ligne!
Comment ça marche
la source
Python , 22 octets
Fortement inspiré par la réponse Python de @ xnor .
Essayez-le en ligne!
la source
Gelée , 7 octets
Essayez-le en ligne!
Comment ça marche
la source
JavaScript (ES6), 33 octets
Basé sur la formule récursive:
La deuxième expression peut également s'écrire ...
... qui est celui que nous utilisons ici.
a(i - 1)
est en fait stocké dans lak
variable et passé à l'itération suivante jusqu'auk >= n
.Cas de test
Afficher l'extrait de code
la source
Rubis, 26 octets
Edit: version alternative, toujours 26 octets
Version originale
Utilise le fait
T(x) = x(x+1)(x+2)/6 = ((x+1)**3-(x+1))/6
qui est très proche de(x+1)**3/6
.La fonction multiplie simplement par 6, trouve une version légèrement modifiée de la racine du cube (oui, 5 décimales sont requises) et renvoie le résultat tronqué à un entier.
Programme de test et sortie
la source
0.3336
semble fonctionner pour la version originale. (Edit: ça ne fait rien, Dennis souligne queJavaScript,
3633 octets-3 octets grâce à Luke (rendant la fonction curry)
Il s'agit d'une fonction lambda sans nom qui peut être affectée à
func
et appelée avecfunc(220)()
, comme décrit dans cette publication . Ma fonction d'origine, non curry, ressemble à ceci:Cette réponse utilise le fait que le x ème nombre tétraédrique peut être trouvé avec la fonction suivante:
La soumission fonctionne en augmentant
i
et en trouvant récursivementtetrahedral(i)
, jusqu'à ce qu'elle soit supérieure ou égale àn
(le nombre de cadeaux donnés).Lorsqu'il est appelé avec un argument comme prévu
i = undefined
, et n'est donc pas plus grand quen
. Ce moyenf(n,-~i)
est exécuté et-~undefined
évalué à1
, ce qui déclenche la récursivité.Extrait de test:
la source
n=>g=i=>n<=i/6*++i*++i?i-2:g(~-i)
. Vous appelleriez ça commef(2)()
.i=>n<=i
Beautiful ;-)MATL ,
1211 octetsEssayez-le en ligne!
Explication
la source
05AB1E , 10 octets
Essayez-le en ligne!
Explication
la source
[N2Ý+P6÷¹Q#N>
, gentil.Pyke, 11 octets
Essayez-le ici!
la source
Mathematica, 26 octets
Fonction sans nom prenant un argument entier non négatif et retournant un entier non négatif (ouais, ça marche aussi pour le jour
0
). Nous voulons trouver le plus petit entieri
pour lequel l'entrée#
est au maximumi(i+1)(i+2)/6
, qui est la formule du nombre de cadeaux offerts les premiersi
jours. Grâce à une légère ruse algébrique, l'inégalité# ≤ i(i+1)(i+2)/6
est équivalente à(i+1) + 6# ≤ (i+1)^3
. La structure0//.i_/;i+6#>i^3:>i+1
commence donc par un0
et continue à s'ajouter1
tant que le testi+6#>i^3
est satisfait; puis(...)-1&
soustrait1
à la fin (plutôt que de dépenser des octets avec des parenthèses à l'intérieur de l'inégalité).Si nous laissons les 12 jours de Noël continuer, nous pouvons gérer environ 65536 jours avant que la limite de récursivité intégrée pour
//.
arrête le processus ... c'est environ 4,7 * 10 ^ 13 jours, soit environ dix fois l'âge de l'univers jusqu'à présent ....la source
J , 9 octets
Essayez-le en ligne!
C'est plus inefficace que d'utiliser l'inverse de factorielle mais s'avère plus court.
Par exemple, si l'entier d'entrée est n = 5, définissez la plage
[2, n+1]
.Ce sont les 5 premiers nombres tétraédriques. L'étape suivante consiste à déterminer à quel intervalle (jour) n appartient. Il y a n +1 = 6 intervalles.
Alors n = 5 appartient à l'intervalle 3 qui est
(4, 10]
et le résultat est 3.Explication
la source
Python, 43 octets
5 octets enregistrés grâce à @FlipTack et 3 autres grâce à @xnor !
la source
f(220)=11
, ce qui devrait êtref(220)=10
.and-~f(n,i+1)
pourand f(n,i+1)or i
. Étrangement, il est généralement plus court lorsque vous comptez une variable récursivement pour ne pas la renvoyer, mais pour incrémenter la sortie de manière récursive.Japt , 12 octets
Testez-le en ligne! ou Vérifiez tous les cas de test à la fois
Comment ça marche
Il s'agit d'une simplification de la formule tétraédrique que plusieurs autres réponses utilisent:
En substituant
x - 1
pourx
, nous pouvons simplifier considérablement:Par conséquent, le résultat correct est un de moins que le plus petit entier
x
tel que(x^3 - x) / 6
est supérieure ou égale à l'entrée.Solution de 13 octets, inspirée de la réponse de @ xnor :
Quelques autres solutions @ETHproductions et j'ai joué avec
Testez-le ici .
la source
SmileBASIC, 43 octets
I
est le jour,R
lei
numéro triangulaire etP
lei
numéro tétraédrique (nombre de cadeaux).Je pense qu'une réponse similaire dans une autre langue, peut-être:
x=>{while(x>p)p+=r+=++i;return i}
pourrait être assez bonne.la source
?I
à la fin, non?Python 3,
4846 octetsla source
221
le plantera.Mathematica,
3125 octetsla source
Haskell,
2123 octetsEdit: Comme l'a souligné xnor, la solution originale (
floor.(/0.82).(**0.4)
) n'a pas fonctionné entre les jours de Noëlla source
Lot, 69 octets
Calcule manuellement les nombres tétraèdres.
la source
Pyth 11 octets
Essayez-le en ligne!
à peu près juste traduit la réponse de Dennis en Pyth
la source
R, 19 caractères
basé sur la réponse de xnor dans
Python
.la source
QBIC , 19 octets
Cela vole la formule de @xnor:
J'ai essayé de réduire la résolution à .3336 pour enregistrer un octet, mais cela échoue sur le testcase final.
la source
Bash + bc, 44 octets
la source