Tarefa
Escreva um programa ou uma função que calcule o nome do dia da semana de uma data inserida pelo usuário.
Entrada e Saída
Entrada é uma sequência YYYYMMDD
,.
Exemplo de valores de entrada:
20110617: 17 de junho de 2011 19040229: 29 de fevereiro de 1904 06661225: 25 de dezembro de 666 00000101: 1 de janeiro de 0 99991231: 31 de dezembro de 9999
Você pode assumir que todas as entradas são válidas. Observe que o ano zero é válido.
A saída é um número inteiro entre 0
e 6
. Cada número inteiro representa um nome para o dia da semana. Você pode decidir livremente qual número inteiro representa um nome para o dia da semana, como este
0: segunda-feira 1: terça-feira 2: quarta-feira ... 6: domingo
(em ordem) ou este
0: segunda-feira 1: quarta-feira 2: domingo ... 6: sábado
(não está em ordem).
Casos de teste
Entrada Saída do dia da semana ([0..6 -> segunda-feira .. domingo] é usado neste exemplo.) 20110617 sexta-feira 4 19500101 domingo 6 22220202 sábado 5 19000228 quarta-feira 2 19000301 quinta-feira 3 19450815 quarta-feira 2 19040229 segunda-feira 0 19040301 terça-feira 1 17760704 quinta-feira 3 20000228 segunda-feira 0 20000229 terça-feira 1 20000301 quarta-feira 2 20121223 domingo 6 00000401 sábado 5 66660606 quarta-feira 2 59161021 sábado 5
Restrição
Você não deve usar nenhum tipo de função / classe / ... que esteja relacionada ao registro de data e hora, como Date
classe em Java
/ JavaScript
/ ActionScript
ou getdate
função em PHP
.
Você deve usar o calendário gregoriano , que é usado por muitas pessoas agora.
Obviamente, o código mais curto vence. Se dois códigos tiverem o mesmo comprimento, o código com mais votos vence.
(Vencimento: quando houver mais de 5 códigos com mais de (ou igual) +1
voto).
echo 4
.Respostas:
Ruby,
9592 caracteresImplementação simples e simples de ruby com 0: segunda-feira, ...
fonte
PHP -
10197103125 caracteresCódigo
Nota
Infelizmente, devido à digitação dinâmica e fraca do PHP, o algoritmo Sakamoto não funciona corretamente sem incluir explicitamente cada operação de divisão.
fonte
y+y/4-y/100+y/400
.y=4
nesse caso, retorna 4, em vez dos 5 corretosy+y/4+y/100+y/400
(de onde apenas os dois primeiros termos entram em jogo). É isso que atormenta minha resposta em JavaScript. É possível que duplas estejam sendo criadas em vez de ints? (Meu PHP é fraco demais para saber.)C - 129
Isso abusa de como a divisão se aproxima de zero, pelo menos no meu sistema (Linux x86).
A constante mágica
86400
, serve a dois propósitos:Também é o número de segundos em um dia.
fonte
y+=m>2;
vez dem>2?y++:0;
e raspe alguns bytes.Javascript,
126123 caracteresUsando o algoritmo de Sakamoto com 0 = domingo:
Suspeito que as divisões possam estar em colapso, mas no momento não estou vendo.
Editar: Melhorou as divisões (não é necessário
~~
quando você pode apenas~
).fonte
Python 2 ,
83116113109 bytesImplementa o algoritmo de Sakamoto . Sugestões de golfe são bem-vindas. Experimente online!
Edit:
Eu deveria ter corrigido isso há muito tempo.-6 bytes das sugestões de Jonathan Allan +2 bytes para realmente corrigir o código.fonte
int('032503514624'[m-1])
salva 6Perl - 110 bytes
Aqui está uma solução a ser executada com o perl -p source.pl OU o perl -pe 'here-is-code'.
Simplesmente copie e cole os casos de teste no stdin.
Este parece ser o único código sem variáveis, constantes de string e divisões.
fonte
JavaScript (ES6), 73 bytes (Não concorrente)
Tente
fonte