Escreva uma função que tenha uma data e retorne o dia da semana do próximo 29 de fevereiro após essa data.
A entrada é uma sequência no formato ISO estendido: AAAA-MM-DD (por exemplo, 27 de maio de 2010 seria "2010-05-27").
A saída é uma string que é o nome do dia da semana (por exemplo, "segunda-feira"). Letras maiúsculas não importam, mas dê o nome completo em inglês.
Se a data especificada for 29 de fevereiro, retorne o dia da semana do próximo dia 29 de fevereiro .
Use os cálculos do Calendário Gregoriano Proléptico (portanto, ele usa os cálculos do ano bissexto gregoriano para toda a sua duração). Não se preocupe com o calendário juliano ou quando ocorreu a mudança de juliano para gregoriano. Apenas assuma gregoriano para tudo.
A função deve funcionar para pelo menos o intervalo de "0001-01-01" - "2100-01-01".
Sinta-se à vontade para usar as bibliotecas padrão fornecidas por seu idioma, mas não use bibliotecas de terceiros, a menos que queira incluir esse código como parte da sua solução.
O código mais curto (menos caracteres) vence.
Exemplos:
func("0001-01-01")
->"Sunday"
func("1899-12-03")
->"Monday"
func("1970-01-01")
->"Tuesday"
func("1999-07-06")
->"Tuesday"
func("2003-05-22")
->"Sunday"
func("2011-02-17")
->"Wednesday"
func("2100-01-01")
->"Friday"
(e não, você não precisa nomear a função func
)
Dicas:
- Lembre-se de que os anos terminados em 00, que não são divisíveis por 400, não são bissextos.
- 1 de janeiro de 0001 é uma segunda-feira.
date
. Basta remover o GNUWin32 do PATH e ele deve funcionar. Ou mudedate
paraGet-Date
(esse tipo de comportamento de fallback só funciona quando nenhum comando é encontrado - para verificar, basta usargcm date
). De qualquer forma, não considero que um problema específico com esse script, pois o GNUWin32 não faça parte de nenhuma instalação padrão do Windows.get-date
e recebi a mensagem de erroMethod invocation failed because [System.Management.Automation.PSObject] doesn't contain a method named 'op_Addition'.
Precisa de PS2 ou .Net 4 ou algo assim?Get-Date
mas aSystem.DateTime
.$d=Get-Date "0400-01-01"; $d++
dá uma mensagem de erro sobre++
não estar definido no DateTime. O mesmo substituindo++
por+=1
ou+="1"
ou+='1'
dá a mensagem de erro sobre o PSObject. E simplesmente+"1"
funciona.Ruby 1.9, 85 caracteres
Solução simples. Chame a função com
f[args]
.0001-01-01
testcase.fonte
def*
apenas define uma função chamada*
. Dessa forma, não preciso de um espaço entredef
e o nome da função.T-SQL
166185 caracteresEu já estava mexendo com as funções de data do T-SQL, então imaginei por que não ...
A solução original estava incorreta ...
Aqui está o que eu realmente tenho que fazer para que essa estratégia funcione:
fonte
C #, 176
fonte
string f(string d){...}
.ToString("dddd")
imprime a data na localidade atual, porém, não em inglês.string f(string d){var n=DateTime.Parse(d).AddDays(1);return DateTime.IsLeapYear(n.Year)&&n.DayOfYear==60?n.DayOfWeek+"":f(n+"");}
Bash, 96 bytes
Obrigado Peter ... Versão altamente golfe, 96 bytes:
Versão antiga, 229 bytes
E / S DE AMOSTRA
fonte
i=0;d=;until [ `date -d"$1 $i days" +%m-%d` = "02-29" ];do((i++));done
Perl, sem biblioteca de datas:
160 159155O benefício real dessas bibliotecas de datas é adiar a duração dos nomes dos dias para outra pessoa.
Por outro lado, acho que essa é a única solução até agora que funciona independentemente da localidade.
fonte
DATE e um pouco de cola BASHy (90)
A função:
Teste:
fonte
D: 175 caracteres
Mais legivelmente:
É muito fácil escrever em D, mas definitivamente não vai ganhar nenhum concurso de código de golfe. Ainda assim, fora do código de golfe, eu preferiria que fosse fácil escrever e entender, mas longo, do que conciso, mas difícil de escrever e entender.
fonte
Caracteres Java 8 - 252
Golfe:
Ungolfed:
fonte
Rebol - 78
Ungolfed:
Exemplo de uso (no console Rebol):
fonte
PHP, 104 bytes
demolir
date(L)
:1
para o ano bissexto,0
elsedate(l)
: representação textual completa do dia da semanafonte
Coreutils GNU, 71 bytes
Pesquisa linear dos próximos 8 anos (pior caso, em 2096-02-29). Sed encontra e gera a primeira linha que corresponde a 29 de fevereiro.
Fiquei surpreso ao descobrir que
t;d;:;q
era mais curto que o teste para ver se os dígitos permaneciam (/[01]/d;q
), apesar de ter o dobro de comandos.Testes
Adicionei uma linha extra de testes para casos de canto difíceis:
fonte