Certains nombres, comme , sont des palindromes en base 10: si vous écrivez les chiffres dans l'ordre inverse, vous obtenez le même nombre.
Certains nombres sont la somme de 2 palindromes; par exemple, ou .
Pour les autres nombres, 2 palindromes ne suffisent pas; par exemple, 21 ne peut pas être écrit comme la somme de 2 palindromes, et le mieux que vous puissiez faire est de 3: .
Écrivez une fonction ou un programme qui prend une entrée entière n
et sort le n
nombre e qui ne peut pas être décomposé comme la somme de 2 palindromes. Cela correspond à OEIS A035137 .
Les chiffres uniques (dont 0) sont des palindromes.
Les règles standard pour les séquences s'appliquent:
- l'entrée / sortie est flexible
- vous pouvez utiliser l'indexation 0 ou 1
- vous pouvez sortir le
n
e terme, ou les premiersn
termes, ou une séquence infinie
(En guise de note: tous les nombres entiers peuvent être décomposés comme la somme d'au plus 3 palindromes.)
Cas de test (1 indexé):
1 -> 21
2 -> 32
10 -> 1031
16 -> 1061
40 -> 1103
C'est le golf de code, donc la réponse la plus courte l'emporte.
n
, imprime le nième membre de la séquence OEIS An? Cela semble prometteur ...Réponses:
JavaScript (ES6),
93 83 8079 octets1 octet enregistré grâce à @tsh
Renvoie len ième terme, indexé sur 1.
Essayez-le en ligne!
Comment?
Étant donnén , nous testons s'il existe un 1≤k≤n tel que k et n−k soient des palindromes. Si nous trouvons un tel k , alors n est la somme de deux palindromes.
L'astuce consiste ici à traiterk et n-k en même temps en testant une seule chaîne constituée de la concaténation de k , n - k et k .
Exemple:
Pourn = 2380 :
Commenté
NB: Il s'agit d'une version sans
eval()
lisibilité.la source
i=>eval("for(n=k=1;k=(s=[...k+[n-k]+k])+''!=s.reverse()?k-1||i--&&++n:++n;);n")
79 octetsi=>eval("...")
, ES6 vous permet d'utiliseri=>eval`...`
, en économisant 2 octets;n
à la fin.eval()
car elle ne contraint pas son argument à une chaîne. La suppression;n
entraînerait une erreur de syntaxe et la suppressionn
entraînerait simplement le retour de la fonctionundefined
.Gelée ,
16 109 octets-1 octet grâce à Erik l'Outgolfer . Génère lesn premiers termes.
Essayez-le en ligne!
J'ai essayé de proposer une idée différente de mon approche d'origine. Passons en revue le processus de réflexion:
Initialement, le test a fonctionné comme suit: il a généré les partitions entières de ce nombre, puis a filtré celles qui contenaient également des non-palindromes, puis a compté le nombre de listes admissibles de longueur 2. Ce n'était évidemment pas trop efficace en termes de longueur de code.
La génération des partitions entières deN puis le filtrage présentaient 2 inconvénients principaux: l'efficacité en temps et en temps. Pour résoudre ce problème, j'ai pensé que je trouverais d'abord une méthode pour générer uniquement les paires d'entiers (x,y) qui totalisent N (pas toutes les listes de longueur arbitraire) à condition que les deux nombres soient palindromes.
Mais quand même, je n'étais pas satisfait de la "manière classique" de procéder. J'ai changé d'approches: au lieu de générer des paires , concentrons le programme sur des palindromes individuels . De cette façon, on peut simplement calculer tous les palindromesx dessous de N , et si N−x est également palindrome, alors nous avons terminé.
Explication du code
* Tout autre chiffre non nul fonctionne, d'ailleurs.
la source
Gelée , 11 octets
Essayez-le en ligne!
Le programme complet fonctionne à peu près comme ceci:
Vous pouvez soupçonner que l'étape 5 ne fait pas vraiment le travail qu'elle devrait. Nous ne devrions vraiment pas décrémenter z si toutes les paires qui totalisent x sont palindromiques. Cependant, nous pouvons prouver que cela ne se produira jamais:
Nous concluons que, si nous commençons par fixer x à une valeur supérieure ou égale à 10 , nous ne pouvons jamais avoir toutes les paires d'entiers non négatifs qui totalisent x x paires de palindromes.
la source
ŻŒḂ€aṚ$Ṁ¬µ#
Rétine ,
135102 octetsEssayez-le en ligne! Trop lent pour
n
10 ou plus. Explication:Commencez par essayer 0.
Répétez
n
fois.Convertissez la valeur d'essai actuelle en unaire et incrémentez-la.
Créez toutes les paires d'entiers non négatifs qui totalisent la nouvelle valeur d'essai.
Répétez pendant qu'il existe au moins une paire contenant deux nombres entiers palindromiques.
Augmentez et augmentez à nouveau la valeur d'essai.
Extraire la valeur finale.
la source
Haskell,
686763 octetsRenvoie une séquence infinie.
Rassemblez tout
n
où soita
oun-a
n'est pas un palindrome pour tousa <- [0..n]
.Essayez-le en ligne!
la source
Perl 5
-MList::Util=any -p
,5955 octets-3 octets grâce à @NahuelFouilleul
Essayez-le en ligne!
Remarque:
any
pourrait être remplacé pargrep
et éviter le-M
commutateur de ligne de commande, mais selon les règles de notation actuelles, cela coûterait un octet de plus.la source
+
après lewhile
.R ,
115111 octets-4 merci à Giuseppe
Essayez-le en ligne!
La plupart du travail est intégré dans les arguments de fonction pour supprimer
{}
pour un appel de fonction à instructions multiples et pour réduire les crochets nécessaires à la définition de l'objetr
La stratégie de base consiste à trouver tous les palindromes jusqu'à une limite donnée (y compris 0), à trouver toutes les sommes par paire, puis à prendre le nième nombre qui ne figure pas dans cette sortie.
La limite de
n*1000
été choisie uniquement à partir d'une supposition éclairée, donc j'encourage quiconque à le prouver / le réfuter comme un choix valide.r=0:(n*1e3)
peut probablement être amélioré avec une limite plus efficace.Map(paste,Map(rev,strsplit(a,"")),collapse="")
est arraché de la réponse de Mark ici , et est juste incroyablement intelligent pour moi.r[!r%in%outer(p,p,'+')][n]
me lit un peu inefficace.la source
C # (Visual C # Interactive Compiler) , 124 octets
Essayez-le en ligne!
la source
J , 57/60 octets
Essayez-le en ligne!
La version liée ajoute 3 octets pour un total de 60 afin d'enregistrer en tant que fonction que le pied de page peut appeler.
Dans le REPL, cela est évité en appelant directement:
Explication
La structure générale est celle de cette technique à partir d'une réponse de Miles :
Cela a permis d'économiser quelques octets par rapport à ma technique de boucle d'origine, mais comme la fonction principale est ma première tentative d'écriture de J, il y a probablement encore beaucoup à améliorer.
la source
1&(_:1&((e.((*&(-:|.)&":"0>:)&i.-))+])+)*
05AB1E ,
1512 octets-3 octets grâce à @Grimy .
0 indexé.
Très lent, expire donc pour la plupart des cas de test.
Essayez-le en ligne ou vérifiez les premiers cas en supprimant le
Iè
.Version 15 octets beaucoup plus rapide:
1 indexé.
Essayez-le en ligne ou sortez le premiern valeurs .
Explication:
la source
°LDʒÂQ}ãOKIè
(il y a probablement une meilleure limite supérieure que 10 ^ x pour la vitesse). Je suppose que∞DʒÂQ}ãOK
c'est techniquement un 9, mais il expire avant la première sortie.Iè
) va comme:[1,21,32,43,54,65,76,87,98,111,131,141,151,...]
mais est supposée aller comme[*,21,32,43,54,65,76,87,98,201,1031,1041,1051,1052,...]
(le premier1
/*
peut être ignoré puisque nous utilisons une entrée indexée 1).L
0 .. :)Rouge , 142 octets
Essayez-le en ligne!
Renvoie le nième terme, 1 indexé
la source
Python 3 , 107 octets
Essayez-le en ligne!
Inverser la vérification du palindrome a sauvé 2 octets :)
Pour référence, le contrôle positif simple (109 octets):
la source
APL (NARS), 486 octets
Quel est le mot pour rompre la boucle? Il semble que ce soit ": partir", non?
{k≡⌽k←⍕⍵}
en p est le test du palindrome. Cette fonction ci-dessus dans la boucle stocke tout le palindrome trouvé dans l'ensemble P, si pour un élément w de P est tel que iw est aussi dans P, cela signifie que le i n'est pas correct et nous avons l'incrément i. Résultats:la source