Outro problema de manipulação de datas: P
Tarefa
Escreva um programa ou uma função que calcule a diferença entre duas datas fornecidas por um usuário.
Entrada e Saída
Semelhante à anterior , as entradas são dois YYYYMMDD
s, separadas por um espaço , vírgula
,
ou sinal de menos -
.
Exemplo de valores de entrada:
20100101-20010911
20110620-20121223
19000101 20101010
33330101,19960229
00010101 99991231
A saída é um número inteiro, que é a diferença entre duas datas, em dias.
Por exemplo, 20110101-20100101
rendimentos de entrada 365
e 33320229 17000101
rendimentos 596124
.
Você pode testar os resultados aqui aqui . (Veja os comentários de rintaun abaixo.) Se duas datas forem iguais, o programa retornará 0
, se a data for válida (consulte Pontuação ).
Restrição
Obviamente, você não deve usar nenhum tipo de função / classe / ... que esteja relacionado ao carimbo de data / hora ou data e deve usar o calendário gregoriano .
Ponto
Se o seu código não mantiver a restrição, então score = -∞
.
O padrão bonus
é 1.
- Se o seu código funcionar independentemente da ordem das entradas (por exemplo,
20100101,20110101
retorna365
ou-365
)bonus+=1
,. - Se o seu código pode manipular ano 0 ,
bonus+=0.5
. - Se o seu código reconhecer um mês inválido (entre 1 e 12) / data (entre 1 e 31), curtir
20109901
ou34720132
, e imprimirE
(e encerra o programa ou retorna algo como0
)bonus+=1
,. - Embora a regra acima, se o seu código reconhece datas inválidas, como
20100230
,20100229
, ou20111131
e impressõesE
(e termina o programa ou retorna algo parecido0
),bonus+=1
. - Independentemente das duas regras acima, se o seu código reconhece uma string de entrada inválida, como
20100101|20100202
ou2010010120100202
, e imprimeE
(& finaliza o programa ou retorna algo como0
)bonus+=1
,.
score = floor(-4.2*code.length/bonus)
. Código com maior pontuação ganha. Se dois códigos principais tiverem a mesma pontuação, os códigos com bônus mais altos serão ganhos. Se dois códigos principais tiverem a mesma pontuação e bônus, os códigos com os votos mais altos vencerão.
(Vencimento: quando houver mais de 5 códigos com mais de (ou igual) +1
voto).
20040229
. : P365*4 + 2 + 2
= 1464. Obrigado pela informação!Respostas:
Perl 5,14, pontuação = -162
-163-181-196-214-167-213-234-p
opçãoCódigo
Calcula um número de dia juliano modificado para cada data (ignorando os ajustes relacionados à época para economizar o comprimento do código) e subtrai os dois. (ref. "Dia Juliano" na Wikipedia ).
/r
opção nas substituições30+($m&1^$m>7)
parte fornece a duração de qualquer mês, exceto fevereiro; o restante é ajustado para fevereiro em um ano ordinário ou bissextoPremissas
00000101-00010101
dar 366, pois 0 é um múltiplo integral de 400 e, portanto, o ano 0 é um ano bissexto.fonte
20111300-20119999
devoluções2717
.PHP, Pontuação: -539.1
Código
Ungolfed
Nota
Calcula o número de dias repetindo cada data válida entre as duas fornecidas. É muito lento em intervalos maiores. Tenho certeza de que essa não é a melhor maneira de resolver isso, mas fiquei impaciente e foi com isso que acabei. :)
Além disso, eu sei que o código "ungolfed" ainda não é muito legível, mas reescrevê-lo completamente exigiria muito esforço.
fonte
Ruby 1.9, Pontuação: -175
-186-191-199243250260caracteresO código aceita entrada por meio de stdin.
Notas:
(!x[e]||e*f<1||f>x[e])
condição lida com os bônus de mês / dia / data inválidos.33320229 17000101
resultando em596134
.fonte
Python, Pontuação: -478
solução:
Eu não tenho a versão "ungolfed", pois foi assim que a escrevi. Eu não testei corretamente, portanto, se você encontrar um bug - por favor, comente.
edit: espero que tenha corrigido um bug apontado nos comentários e adicionado a descompactação na forma de [a, b], [c, d] = [[1,2], [3,4]
fonte
E
. (FYI,0>-1>12
,0>6>12
,0>13>12
retornaFalse
.)x<y<z
comparação ou existe umx if y else z
. Tentei consertar isso.[x,z][y]
que é mais curto quex if y else z
, embora nem sempre funcione, pois, diferentemente da expressão if, não é preguiçoso.PHP, pontuação: -516
caracteres:
685676bônus: 5,5
fonte
<?
início seja executado, caso contrário, apenas imprime o código.