¡No se lo digas a nadie, pero he robado la máquina de viaje en el tiempo de mi tío! Sin embargo, mi tío está obsesionado con los números primos, y eso se nota en la máquina: lo ha programado para que solo pueda ir a fechas que sumen un número primo.
Entonces no puede ir 1947-08-15porque 1947 + 8 + 15 = 1970, que no es un número primo. Se puede ir a 1947-07-25, ya que 1947 + 7 + 25 = 1979, que es primo. Entonces, si quiero volver a ver las celebraciones de independencia de la India, parece que tendré que ir unas semanas antes y esperar esos 20 días.
Tengo otras fechas a las que quiero ir, y de manera similar tendré que ir a una fecha anterior (o si tengo suerte, igual a) mi fecha objetivo, que se resume en un número primo. Sin embargo, soy impaciente y no quiero esperar demasiado, así que quiero encontrar la fecha que pueda usar que sea más cercana a mi fecha objetivo.
¿Me puede escribir un programa que tome mi fecha objetivo y me dé la fecha que debo ingresar en la máquina del tiempo, la fecha más cercana antes o igual a la fecha dada cuyas partes suman un número primo?
(Para este desafío, estamos utilizando el calendario gregoriano proleptico , lo que simplemente significa que usamos el calendario gregoriano actual incluso para los períodos en que las personas usaban el calendario juliano más antiguo).
Entrada
- Una cita
- idealmente, cualquier fecha en la Era Actual (AD); prácticamente, cualquier subconjunto de ese que su idioma pueda manejar naturalmente
- en cualquier formato legible por humanos que desee
Salida
- La fecha más cercana a la fecha de entrada, que es menor o igual a la entrada y cuya fecha + mes + año suma un número primo.
- en cualquier formato legible por humanos que desee
⁺: "legible por humanos" como en el día, mes y año, todo enunciado por separado, en cualquier orden
Casos de prueba
1947-08-15
=> 1947-07-25
1957-10-04
=> 1957-09-27
1776-07-04
=> 1776-07-04
999-12-12
=> 0999-12-10
2018-06-20
=> 2018-06-15
1999-01-02
=> 1998-12-29
1319-12-29
=> 1319-07-01
(Gracias a @Shaggy, @PeterTaylor y @Arnauld por su ayuda con la pregunta).

Fri Jul 25 02:46:39 CEST 1947. ej. )Respuestas:
Rojo , 87 bytes
Pruébalo en línea!
Más legible:
fuente
JavaScript (Node.js) , 94 bytes
Toma la entrada como 3 enteros en la sintaxis de curry
(year)(month)(day). Devuelve una cadena separada por guiones con un guión inicial.Pruébalo en línea!
¿Cómo?
Primero convertimos la fecha al formato JSON
yyyy-mm-ddT00:00:00.000Z( ISO 8601 ), la dividimos en'T', conservamos solo la parte izquierda y agregamos un guión inicial, que da-yyyy-mm-dd.Esta expresión s ahora se puede calcular
eval()para obtener el opuesto n de la suma de año + mes + día .Usamos la función auxiliar P () para probar si -n es primo (en cuyo caso devuelve 0 ). Si es así, devolvemos s . De lo contrario, intentamos nuevamente con el día anterior.
fuente
Python 2 ,
130127 bytesEntrada es
year, month, day.-3 bytes gracias a Kevin Cruijssen .
Pruébalo en línea!
fuente
Java 8,
144128bytesPruébalo en línea.
java.time.LocalDateLa clase ha sido una mejora en comparación con la anteriorjava.util.Date, pero ¿por qué tuvieron que hacer esos nombres más largos (getMonthValuey engetDayOfMonthlugar degetMonthygetDay) ..>.>Explicación:
fuente
Ruby , 94 bytes
Pruébalo en línea!
Toma una sola entrada de fecha y devuelve una cadena en el formato ISO 8601 (
YYYY-MM-DD).Utiliza el módulo principal de Ruby. Si eso no está permitido, o está mal visto, entonces para dos bytes más presento esta abominación:
Ruby , 97 bytes
Pruébalo en línea!
Utiliza un cheque para un número que es primo de esta respuesta de stackoverflow . No tengo idea de cómo funciona esto, se parece un poco a la brujería. Misma entrada que arriba y misma salida.
fuente
dy el espacio después deifeso, por lo que puede eliminar 3 bytes de su primera respuesta para eliminarlos. TIO link?x*n !~ /^x?$|^(xx+?)\1+$/= para verificar si n es primo, haz una cadena de n 'x's, verifica que no sea 0 o 1 x (que no son primos), y que no coincide con ninguno Se repiten 2 o más x (la coincidencia^(xxxxx)\1+$significaría que n es divisible por 5). Abusa de la marcha atrás del motor regex para hacer nuestro bucle por nosotros: es brillante, es monstruoso, y el sacrificio de animales probablemente estuvo involucrado en su descubrimiento.Ruby ,
5753 bytesPruébalo en línea!
No es mi idea, robada de la "abominación" por IMP1
Idea original:
Ruby , 59 bytes
Pruébalo en línea!
fuente
8e4lugar funcionaría?R , 117 bytes
Pruébalo en línea!
fuente
F #,
134133 bytes-1 byte gracias a desde sundar .
Pruébalo en línea!
Totalice el día, mes y año y vea si es primo. Si es así, devuelva esa fecha. Si no, disminuya la fecha en 1 día e intente nuevamente.
fuente
-1.0como-1., en la llamada AddDays.PowerShell ,
10590 bytesPruébalo en línea!
Gracias a sundar por -13 bytes.
Toma la entrada como a
DateTime2018-06-20y la guarda en$a. Entonces estamos en unforbucle. Cada iteración, tomamos$a-formatted comoyyyy+MM+dd(es decir, la fecha actual en la que estamos separados por+signos) sumados con|iex(similar aeval), multiplicando la cadena con1s para formar un número unario y usando una expresión regular de verificación de primos para determinar si la fecha actual es primo o no. Si no es primo, debemos.AddDays(-1)retroceder un día y continuar el ciclo. Si es primo, salimos del bucle y lo colocamos$aen la tubería con salida implícita.El resultado resultante depende de la cultura. En TIO, que utiliza
en-us, el resultado es un formato de fecha larga, que se pareceSaturday, July 1, 1319 12:00:00 AM.fuente
0001-01-01cuya suma es 3). Tomé una grieta en estos cambios aquí .Bash ,
114108bytesPruébalo en línea!
Mi primer golpe de golf. Honestamente, mi primer programa real de bash ... prueba de primigenia tomada desde aquí .
Esto a veces puede fallar si hay un cambio de zona horaria, pero TIO usa UTC, por lo que debería funcionar.
fuente
@$, se obtiene un código de trabajo de 110 bytes .C (gcc) , 167 bytes
Pruébalo en línea!
Atropellar
La función de control anti-cebado. Dado que el primer año válido con el que tenemos que lidiar es 0001-01-01, el número más bajo del que debemos preocuparnos es 3, por lo que se eliminan las verificaciones de casos especiales para n == 2 o n <2. r se establece en un valor verdadero si n no es primo. r se mantiene global, ya que al no tener que devolverlo se ahorran dos bytes (
i=n;para devolver vs,rverificar el global). i se establece en 1 por la persona que llama la función, para guardar otros 2 bytes.Tomamos la fecha como tres enteros separados y comenzamos el ciclo principal, que continúa hasta que y + m + d es primo. Luego llegamos a la carne de la función:
Puede parecer dudoso usar my e tanto en la verificación del año bisiesto como en el índice de la cadena, cuando el orden de evaluación no está especificado. Afortunadamente, solo verificamos el año bisiesto si m == 2, lo que no puede suceder al mismo tiempo que cambiamos my e, ya que eso solo ocurre de enero a diciembre, por lo que la verificación del año bisiesto nunca se ve afectada por orden de evaluación.
Finalmente, el resultado se imprime en STDOUT:
fuente
C # -
281239232 Charsin golf:
Hizo que el código fuera menos eficiente pero más pequeño. Prime loop ahora irá al entero en lugar de a la raíz cuadrada. También procesará todos los números pares.
fuente
public. Además, dado que no parece estar prohibido obtener la entrada de la fecha como parámetro de llamada, podría haberlo hechoMain(string[]a)y luegoDateTime.Parse(a[0])MATL , 14 bytes
Pruébalo en línea!
Alternativamente:
15 bytes
Pruébalo en línea!
fuente