Otro problema de manipulación de fecha: P
Tarea
Escriba un programa o una función que calcule la diferencia entre dos fechas dadas por un usuario.
De entrada y salida
Similar a la anterior , las entradas son dos YYYYMMDD
s, separadas por un espacio , una coma
,
o un signo menos -
.
Ejemplo de valores de entrada:
20100101-20010911
20110620-20121223
19000101 20101010
33330101,19960229
00010101 99991231
La salida es un número entero, que es la diferencia entre dos fechas, en días.
Por ejemplo, 20110101-20100101
rendimientos de entrada 365
y 33320229 17000101
rendimientos 596124
.
Puedes probar los resultados aquí en aquí . (Véanse los comentarios de Rintaun a continuación.) Si dos fechas son iguales, el programa debería regresar 0
, si la fecha es válida (ver Puntuación ).
Restricción
Por supuesto, no debe usar ningún tipo de función / clase / ... que esté relacionado con la marca de tiempo o la fecha, y debe usar el calendario gregoriano .
Puntuación
Si su código no mantiene la restricción, entonces score = -∞
.
El valor predeterminado bonus
es 1.
- Si su código funciona independientemente del orden de las entradas (por ejemplo,
20100101,20110101
devoluciones365
o-365
)bonus+=1
,. - Si su código puede manejar el año 0 ,
bonus+=0.5
. - Si su código reconoce un mes no válido (entre 1 ~ 12) / fecha (entre 1 ~ 31), me gusta
20109901
o34720132
, e imprimeE
(y finaliza el programa o devuelve algo como0
)bonus+=1
,. - Independientemente de la regla anterior, si su código reconoce fechas no válidas, como
20100230
,20100229
, o20111131
, e impresionesE
(y termina el programa o vuelve algo así0
),bonus+=1
. - Independientemente de las dos reglas anteriores, si su código reconoce una cadena de entrada no válida, como
20100101|20100202
o2010010120100202
, e imprimeE
(y finaliza el programa o devuelve algo como0
)bonus+=1
,.
score = floor(-4.2*code.length/bonus)
. El código con la puntuación más alta gana. Si dos códigos principales tienen el mismo puntaje, entonces los códigos con la mayor bonificación ganan. Si dos códigos principales tienen la misma puntuación y bonificación, entonces ganan los códigos con los votos más altos.
(Debido: cuando hay más de 5 códigos que tienen más de (o igual) +1
votos).
20040229
. : P365*4 + 2 + 2
= 1464. ¡Gracias por la información!Respuestas:
Perl 5.14, puntaje = -162
-163-181-196-214-167-213-234-p
opciónCódigo
Calcula un número de día juliano modificado para cada fecha (ignorando los ajustes relacionados con la época para guardar la longitud del código) y resta los dos. (Ref. "Julian Day" en Wikipedia ).
/r
opción en las sustituciones30+($m&1^$m>7)
parte proporciona la duración de cualquier mes, excepto febrero; el resto se ajusta para febrero en un año ordinario o bisiestoSupuestos
00000101-00010101
debe dar 366, ya que 0 es un múltiplo integral de 400, por lo que el año 0 es un año bisiesto.fuente
20111300-20119999
devoluciones2717
.PHP, Puntuación: -539.1
Código
Sin golf
Nota
Calcula el número de días iterando a través de cada fecha válida entre los dos proporcionados. Es bastante lento en rangos más grandes. Estoy seguro de que esta no es la mejor manera de resolver esto, pero me impaciente, y esto es con lo que terminé. :)
Además, sé que el código "no protegido" todavía no es muy legible, pero reescribirlo completamente requeriría demasiado esfuerzo.
fuente
Ruby 1.9, Puntuación: -175
-186-191-199229243250260caracteresEl código acepta entradas a través de stdin.
Notas:
(!x[e]||e*f<1||f>x[e])
condición maneja los bonos de mes / día / fecha no válidos.33320229 17000101
resulta en596134
.fuente
Python, Puntuación: -478
solución:
No tengo una versión "sin golf" ya que así es como la escribí. No lo probé correctamente, así que si encuentras un error, por favor comenta.
editar: con suerte se corrigió un error señalado en un comentario y se agregó desempaquetado en forma de [a, b], [c, d] = [[1,2], [3,4]
fuente
E
. (FYI,0>-1>12
,0>6>12
,0>13>12
retornosFalse
.)x<y<z
comparación o hay unax if y else z
. Intenté arreglarlo.[x,z][y]
que es más corto quex if y else z
, aunque no siempre funciona, ya que, a diferencia de la expresión if, no es vago.PHP, puntaje: -516
caracteres:
685676bonificación: 5.5
fuente
<?
al principio para ejecutarse, de lo contrario solo imprime el código.