Vous savez ce qu'est un palindrome , un prime et une date .
Votre tâche consiste à répertorier toutes les dates dans 100 milliers d'années qui remplissent les trois caractéristiques.
Nevermind quoi que ce soit , mais les chiffres, utilisez les formats suivants: AAAAMMJJ et YYYYYMMDD .
Les dates comprises entre 0000-01-01 et 9999-12-31 doivent être imprimées sous forme de palindromes à 8 chiffres (s'il y en a?) Et les dates comprises entre 10000-01-01 et 99999-12-31 doivent être imprimées sous forme de palindromes à 9 chiffres .
Il n'est pas obligatoire de lister les dates par ordre chronologique.
Exemple de partie d'une sortie valide.
Trois premières dates palindromiques à 9 chiffres:
...
100111001
100131001
100161001
...
Règles
Des échappatoires standard s'appliquent.
02-29
n'existe que pour les années divisibles par 400 ou (divisible par 4 et non divisible par 100).Réponses:
Rubis ,
144141 octets (134 + 7 pour le-rprime
drapeau)Sauvegardé 3 octets grâce à benj2240 !
Essayez-le en ligne!
L'algorithme:
Time
instance avec les donnéesy
,m
, lesd
valeurs. Si l'objet de temps résultant a une#day
valeur égale àd
, puis qui était une date valide. Sinon, cela changerait la date (par exemple, lesTime.new 2018,2,30
retours2018-03-02
).La boucle interne était initialement une fonction qui était appelée pour chaque élément de la
(?0..?9)
plage, ainsi que pour la chaîne vide.Étant donné que la chaîne vide n'a donné aucun résultat (il n'y a pas de palindromes premiers valides à 8 chiffres), j'ai décidé de la supprimer et de refactoriser cette version.
la source
t
variable: TIOPython 2 ,
116107128 128122119 octetsLa seconde moitié de la 4ème ligne est inspirée par mxdsp de réponse ici à une autre question de golf .
Explication
La fonction
g()
prend un argument uniquement pour initialiser lan
variable en utilisant sa valeur par défaut. La valeur initiale est un nombre impair aussi court que possible et aussi grand que possible tout en restant inférieur à la première réponse valide 100111001.Boucle jusqu'à
n
la fin de la plage de dates 10 9 . Incrémentern
de 2.m
est le mois de la daten
.Si
n
est une date valide, un palindrome et un nombre premier, imprimez-le:0 < m < 13
chèques quim
est un mois valide.n % 100 < 31 + (m+m/8)%2
vérifie quen
le jour du mois est valide.(m+m/8)%2
ajoute1
pour tous les mois avec 31 jours. Le mérite en revient à la réponse d' ArmanX . Il n'y a pas de nombres premiers pour les 29 et 30 février.`n`[::-1] == `n`
. Les backticks se stringifientn
.[::-1]
inverse la chaîne.2**n % n == 2
est un test de primalité de Fermat . Ce test n'est que probabiliste. Il existe également des nombres non premiers qui correspondent. Mais pas dans la gamme de chiffres que nous examinons.la source
APL (Dyalog Unicode) , 155 octets
Essayez-le en ligne!
Ceci est un Tradfn ( trad itional f unctio n ) qui prend un argument
arg = yyyymmdd
ouarg = yyyyymmdd
. L'utilisation estf arg
.Cela ne produira rien au début de l'argument
10000101
car il ne trouvera pas de date palindrome principale dans 60 secondes.Voici une approche moins golfée qui produira la sortie d'exemple du PO de
( Essayez-le en ligne! )
Notez que les deux codes sont exactement les mêmes jusqu'à ce que juste avant d'appeler la fonction récursivement pour la prochaine date. Alors que la version golfée l'appelle simplement
f arg+1
, le code le moins golfé saute de jour31
en jour01
et de mois12
en mois01
, ce qui l'accélère un peu.Comment ça fonctionne:
la source
Python 3, 163 octets
La solution est assez longue (et peut probablement être améliorée), mais n'utilise aucune fonction intégrée pour la vérification prime / date / palindrome. Une version un peu dépourvue de clarté:
Les dates valides sont générées en choisissant un mois et un jour. Comme indiqué précédemment, seule la taille 9 doit être prise en compte. Notez également que les années bissextiles ne sont pas prises en compte. Cela n'est pas nécessaire en raison de la coïncidence chanceuse que les nombres premiers de palindrome de longueur 9 qui se terminent sur 0229 n'existent tout simplement pas (d'autres anomalies de date comme le 30 février 1712 peuvent être écartées pour la même raison).
Ensuite, le chiffre du milieu est choisi librement et un premier test est effectué. Étant donné que le test principal devait être aussi court que possible, il est très naïf et donc extrêmement lent. L'utilisation d'une bibliothèque externe pourrait résoudre ce problème (et économiser quelques octets), mais comme mentionné précédemment, je ne voulais pas en utiliser.
la source
WolframLanguage (Mathematica) 187 octets
Il peut y avoir une certaine réduction de taille à trouver. Explication à suivre ...
Cas de test
(* {"100111001", "100131001", "100161001"} *)
Explication du code
DayRange[d@#,d@#2]
renvoie toutes les dates entre{10011, 10, 1}
et{10017, 1, 1}
. Dans ce cas, il renvoie environ 5 ans, 4 mois de dates (précisément 1920 dates). Les années bissextiles sont prises en compte.Les dates sont renvoyées au format standard Wolfram. Par exemple, la première date apparaîtra comme
DateObject[List[1,1,1],"Day","Gregorian",-5.
] `#[[1]] & /@
supprimera la partie de la date, à chaque date, qui nous concerne. Dans l'exemple,DateObject[List[1,3,7],"Day","Gregorian",-5.]
renvoie la date abrégée{1,3,7}
.t/@p[#3,2]}
ouToString/@Padleft[#3,2]
garnit le troisième élément, à savoir, le 7 debout "pour le 7e jour du mois" comme"07"
. Un rembourrage similaire est fourni pour le symbole à un chiffre du mois de mars, à savoir,3
est renvoyé sous la forme"03"
.p[#, If[Length@# < 5, 4, 5]]
remplit l'année de zéros pour atteindre la longueur d'une chaîne de 4 ou 5 chiffres. Dans ce cas, janvier, à savoir1
, est renvoyé sous la forme "" 00001 ""."" <>...
rejoint les cordes. Dans ce cas, il revient"000010307"
.Cases[...x_ /; PalindromeQ@x && PrimeQ@ToExpression@x]
renvoie les cas, parmi les 1920 dates, qui sont des palindromes et des nombres premiers.la source
Javascript ,
187177Hypothèses: aucune année correspondante à 4 chiffres; aucun jour correspondant en février entre le 29 et le 30
Cela fonctionne comme ceci:
Histoire:
Remarques:
Grâce aux tests, j'ai trouvé qu'il n'y a pas de correspondances valides qui sont des années à 4 chiffres ou qui tombent le 29 ou le 30 février. Malheureusement, pour le code, il y a exactement cinq résultats (invalides) qui tombent le 31 du mois. qui n'ont que 31 jours.
la source
Java 10,
329327320318312308307264 octets-1 octet grâce à @assylias .
Explication:
Essayez-le en ligne (remarque: la partie de vérification de prime a été remplacée par une méthode séparée plus efficace, même si elle expire toujours après 60 secondes, ne produisant que les 115 premières dates palindromiques).
Pastebin des 197 sorties d'une exécution locale.
la source
if(t.equals(new StringBuffer(t).reverse()+"")
->if(t.contains(new StringBuffer(t).reverse())
pour enregistrer 1 caractère (fonctionne car nous savons que les deux chaînes ont la même longueur). Ce n'est pas grand chose :-(VBA, 347
la source
DateString
c'est un nom de variable arbitraire, donc vous devriez pouvoir le réduire à un seul caractère, non?Nettoyer ,
262... 213 octetsEssayez-le en ligne!
la source
Javascript ,
234229 octetsUn peu volumineux, mais le poster pour faire rouler la balle JS. Toutes les suggestions sont les bienvenues!
Non golfé:
Comment ça fonctionne:
La magie du retournement des chiffres est basée principalement sur l'expérimentation.
J'ai commencé par trouver le nombre à soustraire pour obtenir la version inversée. Je ne me souciais que des deux derniers chiffres.
Donc, si nous prenons
n
, trouvezk
-len+k=flip(n)
. Pour10<n<20
k
commencé à 101 et augmenté par incréments de 9. Cependant, pourn<10
, c'était 100. J'ai supposék
augmenté pour chaque saut de 10, et après un peu de tripotage, je me suis dit que c'était correct.Ainsi,
k=100+9*n+n//10
où // signifie une division entière.Ainsi, nous obtenons
n+k = n+(100+9*n+n//10) = 100+10*n+n//10 = flipped(n)
.Je ne peux pas prouver ni prétendre que cela fonctionne pour n'importe quel nombre, mais cela a produit des résultats corrects pour les nombres utilisés ici.
Pour le test de primalité, crédit à la réponse de Kevin Cruijssen . J'avais une version un peu plus courte, mais je ne pouvais pas faire les choses correctement:
J'ai sauté le test du palindrome, en bouclant sur des mois, des jours et un chiffre du milieu pour pouvoir construire des chaînes comme
dDmMxMmDd
, oùD
est le premier chiffre du jour,d
est le deuxième, etc.Histoire
Enregistré 5 octets en se débarrassant de la partie conditionnelle de q
la source
f
le résultat de comme paramètre pourq
, donc coupez l'homme du milieu et écrivezf=n=>''+n%10+(n/10|0)
, et le résultat de q est toujours utilisé comme une chaîne, donc vous pouvez écrireq=n=>n<10?'0'+n:n
.APL NARS 626 octets, 313 caractères
cette impression ce que trouver en 50 secondes, que s'arrêter lui-même (car sinon je ne peux pas arrêter le programme pour copier coller le test, car je ne sais pas comment arrêter le programme sans fermer les fenêtres de l'interpréteur) test:
la source
Julia 0,6 , 109 octets
Le lien passe à une version plus longue avec deux différences:
Essayez-le en ligne!
la source