Ya sabes lo que son un palíndromo , una prima y una cita .
Su tarea es enumerar todas las fechas en 100 miles de años que cumplan con las tres características.
No importa nada más que los números, utilizan los siguientes formatos: AAAAMMDD y YYYYYMMDD .
Las fechas entre 0000-01-01 y 9999-12-31 deben imprimirse como fechas de palíndromos de 8 dígitos (si hay alguna) y las fechas entre 10000-01-01 y 99999-12-31 deben imprimirse como palíndromos de 9 dígitos .
No es obligatorio enumerar las fechas en orden cronológico.
Parte de ejemplo de salida válida.
Primeras tres fechas palindrómicas primas de 9 dígitos:
...
100111001
100131001
100161001
...
Reglas
Se aplican lagunas estándar .
02-29
solo existe para años que son divisibles por 400 o (divisibles por 4 y no divisibles por 100).Respuestas:
Ruby ,
144141 bytes (134 + 7 para la-rprime
bandera)¡Guardado 3 bytes gracias a benj2240 !
Pruébalo en línea!
El algoritmo:
Time
instancia con el dadoy
,m
,d
valores. Si el objeto de tiempo resultante tiene un#day
valor igual ad
, entonces esa era una fecha válida. De lo contrario, cambiaría la fecha (por ejemplo,Time.new 2018,2,30
devoluciones2018-03-02
).El bucle interno era inicialmente una función que se llamaba para cada elemento en el
(?0..?9)
rango, así como para la cadena vacía.Como la cadena vacía no produjo resultados (no hay palíndromos primos de 8 dígitos válidos), decidí eliminarla y refactorizar esta versión.
fuente
t
variable: TIOPython 2 ,
116107128122119 bytesLa segunda mitad de la cuarta línea está inspirada en la respuesta de mxdsp aquí a otra pregunta de golf .
Explicación
La función
g()
toma un argumento solo para inicializar lan
variable usando su valor predeterminado. El valor inicial es un número impar que es lo más corto posible y lo más grande posible sin dejar de ser la primera respuesta válida 100111001.Bucle hasta
n
llegar al final del rango de fechas 10 9 . Incrementarn
en 2.m
es el mes de la fechan
.Si
n
es una fecha válida, palíndromo y primo, imprímala:0 < m < 13
comprueba quem
es un mes válido.n % 100 < 31 + (m+m/8)%2
comprueba que esen
día del mes es válido.(m+m/8)%2
agrega1
para todos los meses con 31 días. El crédito por eso va a la respuesta de ArmanX . No hay primos para el 29 y 30 de febrero.`n`[::-1] == `n`
. Los backticks stringifyn
.[::-1]
invierte la cadena.2**n % n == 2
es una prueba de primalidad de Fermat . Esa prueba es solo probabilística. También hay no primos que coinciden. Pero no en el rango de números que estamos viendo.fuente
APL (Dyalog Unicode) , 155 bytes
Pruébalo en línea!
Este es un Tradfn ( trad itional f unctio n ) que toma un argumento
arg = yyyymmdd
oarg = yyyyymmdd
. El uso esf arg
.Esto no generará nada cuando el argumento comience en
10000101
porque no encuentra una fecha de palíndromo principal en 60 segundos.Aquí hay un enfoque menos complejo que generará la salida de ejemplo de OP de
(¡ Pruébelo en línea! )
Observe que ambos códigos son exactamente iguales hasta justo antes de llamar a la función de forma recursiva para la próxima fecha. Si bien la versión de golf simplemente lo llama así
f arg+1
, el código menos golfizado salta de día31
en día01
y de mes12
a mes01
, lo que lo acelera un poco.Cómo funciona:
fuente
Python 3, 163 bytes
La solución es bastante larga (y probablemente se puede mejorar), pero no utiliza ninguna función integrada para la comprobación de prim / date / palindrome. Una versión un tanto descuidada para mayor claridad:
Las fechas válidas se generan al elegir un mes y un día. Como se comentó anteriormente, solo se debe considerar el tamaño 9. También tenga en cuenta que los años bisiestos no se consideran. Esto no es necesario debido a la afortunada coincidencia de que los primos de palíndromo de longitud 9 que terminan en 0229 simplemente no existen (otras anomalías de fecha como el 30 de febrero de 1712 pueden descartarse por la misma razón).
A continuación, el dígito del medio se elige libremente y se realiza una prueba principal. Debido a que la prueba principal tenía que ser lo más corta posible, es muy ingenua y, por lo tanto, muy lenta. El uso de una biblioteca externa podría resolver esto (y guardar algunos bytes), pero como se mencionó anteriormente, no quería usar ninguno.
fuente
WolframLanguage (Mathematica) 187 bytes
Puede haber alguna reducción en el tamaño que se encuentra. Explicación a seguir ...
Casos de prueba
(* {"100111001", "100131001", "100161001"} *)
Explicación de código
DayRange[d@#,d@#2]
devuelve todas las fechas entre{10011, 10, 1}
y{10017, 1, 1}
. En este caso, devuelve aproximadamente 5 años, 4 meses de fechas (precisamente 1920 fechas). Los años bisiestos se tienen en cuenta.Las fechas se devuelven en el formato estándar Wolfram. Por ejemplo, la primera fecha aparecerá como
DateObject[List[1,1,1],"Day","Gregorian",-5.
] `#[[1]] & /@
eliminará la parte de la fecha, en cada fecha, que nos concierne. En el ejemplo,DateObject[List[1,3,7],"Day","Gregorian",-5.]
devuelve la fecha abreviada,{1,3,7}
.t/@p[#3,2]}
oToString/@Padleft[#3,2]
rellena el tercer elemento, a saber, el 7 que se encuentra "para el 7º día del mes" como"07"
. Se proporciona un relleno similar para el símbolo de un solo dígito para el mes de marzo, es decir,3
se devuelve como"03"
.p[#, If[Length@# < 5, 4, 5]]
rellena el año con ceros para alcanzar la longitud de una cadena de 4 o 5 dígitos. En este caso, enero, a saber1
, se devuelve como "00001" '."" <>...
une las cuerdas. En este caso, vuelve"000010307"
.Cases[...x_ /; PalindromeQ@x && PrimeQ@ToExpression@x]
devuelve esos casos, entre las fechas de 1920, que son palíndromos y números primos.fuente
Javascript ,
187177Suposiciones: no coinciden años de 4 dígitos; no hay días coincidentes en febrero entre 29-30
Funciona así:
Historia:
Notas:
A través de las pruebas, descubrí que no hay coincidencias válidas que tengan años de 4 dígitos o caigan el 29 o 30 de febrero. Desafortunadamente, por el bien del código, hay exactamente cinco resultados (no válidos) que caen el 31 de varios meses. que solo tienen 31 días.
fuente
Java 10,
329327320318312308307264 bytes-1 byte gracias a @assylias .
Explicación:
Pruébelo en línea (nota: la parte de verificación de cebado ha sido reemplazada por un método separado más eficiente, aunque incluso con eso todavía se agota después de 60 segundos, produciendo solo las primeras ~ 115 fechas de primo palindrómico).
Pastebin de todos los 197 resultados de una ejecución local.
fuente
if(t.equals(new StringBuffer(t).reverse()+"")
->if(t.contains(new StringBuffer(t).reverse())
para guardar 1 carácter (funciona porque sabemos que ambas cadenas tienen la misma longitud). Eso no es mucho :-(VBA, 347
fuente
DateString
es un nombre de variable arbitrario, por lo que debería poder reducirlo a un solo carácter, ¿verdad?Limpio ,
262... 213 bytesPruébalo en línea!
fuente
Javascript ,
234229 bytesUn poco voluminoso, pero lo publica para que la bola de JS ruede. Cualquier sugerencia bienvenida!
Sin golf:
Cómo funciona:
La magia de volteo de dígitos se basa principalmente en la experimentación.
Comencé por averiguar de qué número restar para obtener la versión invertida. Solo me importaban los dos últimos dígitos.
Entonces, si tomamos
n
, buscamosk
eson+k=flip(n)
. Para10<n<20
k
comenzado en 101 y el aumento en incrementos de 9. Sin embargo, paran<10
, esto era 100. asumík
aumentó para cada salto de 10, y después de un poco de tocar el violín que pensé que era correcto.Entonces,
k=100+9*n+n//10
donde // significa división entera.Por lo tanto, obtenemos
n+k = n+(100+9*n+n//10) = 100+10*n+n//10 = flipped(n)
.No puedo probar, ni afirmar que esto funciona para cualquier número, pero produjo resultados correctos para los números utilizados aquí.
Para la prueba de primalidad, acredite la respuesta de Kevin Cruijssen . Tenía una versión un poco más corta, pero no pude hacerlo bien:
Me salteé la prueba de palíndromo, haciendo bucles durante meses, días y un dígito medio para poder construir cadenas como
dDmMxMmDd
, dondeD
es el primer dígito del día,d
es el segundo, etc.Historia
Se ahorraron 5 bytes al deshacerse de la parte condicional de q
fuente
f
el resultado de 'como parámetro para'q
, así que recorte el intermediario y escribaf=n=>''+n%10+(n/10|0)
, y el resultado de q siempre se usa como una cadena, para que pueda escribirq=n=>n<10?'0'+n:n
.NARS APL 626 bytes, 313 caracteres
Esto imprime lo que encuentra en 50 segundos, que se detiene (porque de lo contrario no puedo detener el programa para copiar y pegar la prueba, porque no sé cómo detener el programa sin cerrar las ventanas del intérprete):
fuente
Julia 0.6 , 109 bytes
El enlace va a una versión más larga con dos diferencias:
Pruébalo en línea!
fuente