¿Cuál es el programa más corto que puede predecir la próxima vez que el viernes caiga el día 13 del mes?
- Debe ser un programa de funcionamiento completo (no solo una función / subrutina)
- Debe imprimir la fecha en el siguiente formato:
YYYY-MM-DD
- Permitir al usuario proporcionar una fecha de inicio como argumento de línea de comando o mediante
STDIN
- Si el usuario no proporciona una fecha de inicio, úsela hoy como fecha de inicio.
- Si la fecha de inicio es un viernes 13, el programa debe encontrar el próximo viernes 13.
Si tuviera que ejecutar el programa hoy (16 de febrero de 2011) debería obtener el siguiente resultado.
$ ./fr13th 2013-05-09
2013-09-13
$ ./fr13th 2007-06-29
2007-07-13
$ ./fr13th 2007-07-13
2008-06-13
$ ./fr13th
2011-05-13
2013-9-13
salida estaría bien para el primer ejemplo?Respuestas:
Windows PowerShell, 74
Bastante sencillo. Un bit quizás confuso es el uso de
"Get-Date $args" | Invoke-Expression
para obtener la fecha actual (si$args
está vacía) o la fecha especificada$args
sin generar un error.Variante de 72 bytes:
Sin embargo, lleva años ... esto no incrementa la fecha y hora en un día completo en cada iteración, sino que solo 900 nanosegundos. Pero dos bytes más cortos.
Variante de 67 bytes:
Esto es un poco sensible a la configuración regional; Si falla en su máquina, intente configurar su formato de fecha en ISO-8601 de antemano. :-)
Ah, y se puede convertir en 65 bytes al igual que la versión de 72 bytes.
Historia:
for
. La comparación solo como resta en lugar de la-eq
cual ahorra otros dos bytes.date
cadena de formato Unix es un poco más corta.yyy-MM-d
suficiente (ya que el año siempre es más largo que tres caracteres y el día siempre es 13. Gracias a Ty Auvil por esto.fuente
iex
? Pruebe solo (date $ args) en su lugar.$null
queGet-Date
se obtendrá un error, no la fecha actual."date $args"|iex
sin embargo, se resuelve en la fecha dada$args
o en la fecha actual, que es justo lo que queremos aquí.bash, 75
Esto es un poco sensible a la configuración regional; Si falla en su máquina, intente
export
deLC_ALL=C
antemano.fuente
Ruby,
9675 caracteresToma la fecha de stdin. Para no especificar una fecha, presione ctrl-d.
Muchas gracias por la ayuda de Ventero.
Sin golf:
Muestra IO:
fuente
d.wday*d.day==65
Es 4 caracteres más corto. Y usted debería ser capaz de reemplazarDate.today.to_s
con"thu"
require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d
. Y puede leer la fecha de stdin con engets
lugar de$*[0]
guardar otro carácter (ingrese EOF para obtener el comportamiento predeterminado).C #, 185
Basado en la solución C # de Andrew Koester , pero muy modificado en el camino. Finalmente llegué a una solución similar a mi solución PowerShell:
fuente
Perl (y otros), 114
Perl 5.10 o posterior, ejecuta con
-E 'code here'
o-M5.010 file
. Necesidadesdate
(de coreutils para Linux) ycal
(de util-linux)Ejecución de muestra:
No estoy seguro de cuándo se mantiene el cero inicial durante meses antes de octubre. Obviamente se pierde cuando se acerca el año; parece mantenerse cuando la respuesta es solo el próximo mes. Llamemos a eso comportamiento indefinido: ¡hey, esto es jugar al golf!
fuente
GOLPETAZO
CONCEPTO UTILIZADO:
Muestra de E / S
fuente
C#
240 caracteres ¡C # necesita un modo "ejecutar dentro de una función solamente"!
Sin golf:
Prueba de salida
fuente
D: 227 caracteres
Más legible:
La parte divertida es que si bien std.datetime de D hace que este tipo de código sea muy fácil de escribir, también es increíblemente detallado, debido principalmente a los nombres de funciones precisos (y por lo tanto largos). Por lo tanto, la usabilidad y mantenibilidad del código es muy alta, pero su capacidad de codificación es bastante baja.
fuente
Python - 166 caracteres
Lee desde stdin, por lo que debe alimentar una línea en blanco si desea la fecha de hoy
fuente
SQLite, 374 caracteres
(Saltos de línea agregados aquí para facilitar la lectura; no incluidos en el recuento).
Se omite el requisito de "Permitir al usuario proporcionar una fecha de inicio como argumento de línea de comando o mediante STDIN" debido a limitaciones técnicas.
Las primeras 4 declaraciones crean una tabla (R) con una sola columna que contiene todos los enteros de 0 a 4095.
La quinta declaración construye una tabla (F) de todos los viernes 13 entre 2000-10-13 y 2340-12-13.
La sexta declaración simplemente devuelve el primer viernes 13 después de la fecha actual (UTC).
fuente
PHP - 103
(fuerza bruta)
Sin golf:
Prueba:
fuente
!=
a-
. También puede guardar hasta 2 caracteres subiendo$d->modify('next fri')
en la sección de incremento del bucle.-r
y no necesita la etiqueta. Utilice la configuración predeterminada con-n
y no necesita@
.\n
es innecesarioecho
en lugar dedie
guardar otro byte.strtotime
en lugar deDate
clase puede guardar uno o dos más.C #,
206194 caracteresActualizar
Esta es una versión ligeramente diferente del problema, así que dejé mi otro intento aquí por completo.
Aquí, encuentro el viernes de la semana "actual" y luego incrementé en 7 hasta encontrar uno que es 13. También utilicé Joey para el formato de bucle y salida para afeitar algunos caracteres.
Sin golf:
Original:
Esto es similar al anterior de Andrew, pero había suficientes diferencias. Decidí publicar una respuesta por separado en lugar de comentar y sugerir ediciones.
Sin golf:
fuente
R, 113 caracteres
Ejecuciones de ejemplo:
fuente
Perl 6 , 69 bytes
Pruébalo en línea!
Gracias a @ ASCII-only por -5
fuente
day-of-week==5
Javascript
ps: sí, lo sé, rompí la primera regla (no podría ser solo una función)
Pruebas en javascript shell
fuente
T-SQL
359285253 caracteresSolo quería echar un vistazo a la solución SQLite con mi función de fecha detallada no inteligente usando el procedimiento T-SQL.
Actualización: Mi temor original de que hacer un incremento de un día tomaría más espacio que un incremento de un mes era muy incorrecto.
Resultados de la prueba (SSMS):
fuente
Otro Javascript, 153
Publico otra respuesta de JavaScript porque no puedo comentar la primera ...
Ejecutar con nodeJS:
fuente
Python 3.3, 166 caracteres
La entrada está en el formato
2013 1 1
,o simplemente presione enter para usar la fecha de hoy (sería 2013/12/11 para esta salida)
(en realidad, hay una mezcla de mi solución y la de @gnibbler que cuenta 144 caracteres)
La línea muy bonita
while t.day*t.weekday()-65:
es de la solución de @ gnibbler.fuente
Japt, 35 bytes
-8 bytes gracias a @ASCIIOnly!
¡Intentalo!
fuente
toISOString
convierte a UTC, lo que cambia la fechaK
Almacena la hora como hora local?Swift 4 , 310 bytes
Pruébalo en línea!
-4 gracias a TagTaco.
Pobre de mí...:
Int
que se use s comoBool
.??
.!=
también necesita espacio, para que no se interprete como un desenvolvimiento.fuente
VB.net (96c *)
Entrada
Entonces mi puntuación se desglosa así
fuente
Rebol, 136
Sin golf:
Ejemplo de uso:
fuente
Java 8,
200197 bytesExplicación:
Pruébelo aquí (elimine el argumento para usar la fecha actual).
NOTA: El formato predeterminado de Java cuando la impresión ya está
yyyy-MM-dd
.fuente
05AB1E , 141 bytes
05AB1E no tiene ninguna función integrada para los objetos o cálculos de fecha. Lo único que incluye las fechas que tiene es el año / mes / día / horas / minutos / segundos / microsegundos de hoy.
Por eso, casi todo el código que ves son cálculos manuales para ir al día siguiente y calcular el día de la semana.
Principalmente derivado de mi respuesta 05AB1E en el desafío The Work Day Countdown (por eso lo edité hace aproximadamente una hora cuando me encontré con un error ...)
La entrada es una cadena en el formato
dd-MM-yyyy
(pero la salida está en el formatoyyyy-MM-dd
, ya que es una de las reglas del desafío).Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente