¡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-15
porque 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.LocalDate
La clase ha sido una mejora en comparación con la anteriorjava.util.Date
, pero ¿por qué tuvieron que hacer esos nombres más largos (getMonthValue
y engetDayOfMonth
lugar degetMonth
ygetDay
) ..>.>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
d
y el espacio después deif
eso, 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
8e4
lugar 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.0
como-1.
, en la llamada AddDays.PowerShell ,
10590 bytesPruébalo en línea!
Gracias a sundar por -13 bytes.
Toma la entrada como a
DateTime
2018-06-20
y la guarda en$a
. Entonces estamos en unfor
bucle. Cada iteración, tomamos$a
-f
ormatted comoyyyy+MM+dd
(es decir, la fecha actual en la que estamos separados por+
signos) sumados con|iex
(similar aeval
), multiplicando la cadena con1
s 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$a
en 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-01
cuya 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,r
verificar 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