Tarea
Escriba un programa o una función que calcule el nombre del día de la semana de una fecha que ingresa un usuario.
De entrada y salida
Entrada es una cadena, YYYYMMDD
.
Ejemplo de valores de entrada:
20110617: 17 de junio de 2011 19040229: 29 de febrero de 1904 06661225: 25 de diciembre de 666 00000101: 1 de enero de 0 99991231: 31 de diciembre de 9999
Puede suponer que todas las entradas son válidas. Tenga en cuenta que el año cero es válido.
La salida es un entero entre 0
y 6
. Cada entero representa un nombre de día de la semana. Puede decidir libremente qué número entero representa un nombre de día de la semana, como este
0: lunes 1: martes 2: miércoles ... 6: domingo
(en orden) o este
0: lunes 1: miércoles 2: domingo ... 6: sábado
(Desordenado).
Casos de prueba
Entrada Semana-día Salida ([0..6 -> Lunes ... Domingo] se utiliza en este ejemplo). 20110617 viernes 4 19500101 Domingo 6 22220202 Sábado 5 19000228 miércoles 2 19000301 jueves 3 19450815 Miércoles 2 19040229 Lunes 0 19040301 martes 1 17760704 jueves 3 20000228 Lunes 0 20000229 martes 1 20000301 miércoles 2 20121223 domingo 6 00000401 Sábado 5 66660606 miércoles 2 59161021 Sábado 5
Restricción
No debe usar ningún tipo de función / clase / ... que esté relacionada con la marca de tiempo o la fecha, como la Date
clase en Java
/ JavaScript
/ ActionScript
, o la getdate
función en PHP
.
Debería usar el calendario gregoriano , que es utilizado por muchas personas ahora.
Por supuesto, el código más corto gana. Si dos códigos tienen la misma longitud, gana el código con los votos más altos.
(Debido: cuando hay más de 5 códigos que tienen más de (o igual) +1
votos).
echo 4
.Respuestas:
Ruby,
9592 caracteresImplementación sencilla de rubí con 0: lunes, ...
fuente
PHP -
10197103125 caracteresCódigo
Nota
Desafortunadamente, debido al tipeo dinámico y débil de PHP, el algoritmo Sakamoto no funciona correctamente sin explícitamente poner en el suelo cada operación de división.
fuente
y+y/4-y/100+y/400
.y=4
en ese caso, devuelve 4, en lugar del 5 correcto dey+y/4+y/100+y/400
(donde solo entran en juego los dos primeros términos). Eso es lo que plaga mi respuesta de JavaScript. ¿Es posible que se estén creando dobles en lugar de ints? (Mi PHP es demasiado débil para saberlo)C - 129
Esto abusa de cómo la división se redondea hacia cero, al menos en mi sistema (Linux x86).
La constante mágica
86400
, tiene dos propósitos:También es la cantidad de segundos en un día.
fuente
y+=m>2;
lugar dem>2?y++:0;
y afeite unos pocos bytes.Javascript,
126123 caracteresUsando el algoritmo de Sakamoto con 0 = domingo:
Sospecho que las divisiones pueden colapsarse, pero en este momento no lo veo.
Editar: Mejora las divisiones (no es necesario
~~
cuando solo puedes~
).fuente
Python 2 ,
83116113109 bytesImplementa el algoritmo de Sakamoto . Sugerencias de golf bienvenidas. Pruébalo en línea!
Editar:
debería haber solucionado esto hace mucho tiempo.-6 bytes de las sugerencias de Jonathan Allan +2 bytes para arreglar el código.fuente
int('032503514624'[m-1])
salva 6Perl - 110 bytes
Aquí hay una solución para ejecutarse con perl -p source.pl O perl -pe 'here-is-code'.
Simplemente copie y pegue los casos de prueba en stdin.
Este parece ser el único código sin variables, constantes de cadena y divisiones.
fuente
JavaScript (ES6), 73 bytes (no competitivos)
Intentalo
fuente