Sua função ou programa deve levar um ano como entrada e retornar (ou imprimir) a data (no calendário gregoriano) dos anos da Páscoa (não a Páscoa Ortodoxa Oriental). A data retornada deve ser formatada de acordo com a ISO 8601, mas com suporte para anos maiores que 9999 (como 312013-04-05 ou 20010130 ) e só precisa trabalhar com anos maiores ou iguais a 1583 (o ano do adoção do calendário gregoriano) e anos menores ou iguais a 5701583 (como é quando a sequência das datas da Páscoa começa a se repetir).
Exemplos:
e(5701583) = 5701583-04-10
e(2013) = 2013-03-31
e(1583) = 1583-04-10
e(3029) = 30290322
e(1789) = 17890412
e(1725) = 17250401
O uso de funções internas para retornar a data da páscoa é chato e, portanto, não é permitido. A resposta mais curta (em caracteres) vence.
Recursos:
Respostas:
GolfScript (85 caracteres)
Uso da amostra:
Observe que isso usa um algoritmo diferente da maioria das respostas atuais. Para ser específico, adaptei o algoritmo atribuído a Lichtenberg no recurso vinculado por Sean Cheshire em um comentário sobre a questão.
O algoritmo original, assumindo tipos sensíveis (ou seja, não números do JavaScript) e com uma adaptação para fornecer o mês * 31 + dia (usando o deslocamento do dia de 0), é
Extraí uma subexpressão comum e fiz outras otimizações para reduzir a
Essa abordagem possui operações aritméticas um pouco mais do que a outra (algoritmo 20-op de Al Petrofsky), mas possui constantes menores; O GolfScript não precisa se preocupar com os parênteses extras porque é baseado em pilha e, como cada valor intermediário no meu layout otimizado é usado precisamente duas vezes, ele se encaixa perfeitamente na limitação do GolfScript de fácil acesso aos três principais itens da pilha.
fonte
Python 2 -
125120119 caracteresEsta é a resposta de Fors descaradamente portada para Python.
Editar : última linha alterada de
print"%d-0%d-%02d"%(y,b/31,b%31+1)
para salvar 5 caracteres. Eu adoraria representar10000
como1e4
, mas isso produziria um ponto flutuante que requer uma ligação paraint
.Edit2 : Obrigado a Peter Taylor por mostrar como se livrar disso
10000
e salvar 1 personagem.fonte
10000
,100*100
poderá colocar a última linha na forma de Horner como(y*100+b/31)*100+b%31+1
. O parêntese inicial permite remover o espaço depoisprint
e você pode extrair as três instâncias de100
para uma variável para uma economia geral de 1 caractere.e(y)
e salvar alguns bytesPHP 154
150 caracteres se eu alternar para AAAAMMDD em vez de AAAA-MM-DD.
Com quebras de linha:
Uso:
php easter.php 1997
Saída:
1997-03-30
Uso:
php easter.php 2001
Saída:
2001-04-15
fonte
<?=$y=$argv[1],"-0",3+$m=($d=56-($c=($y%19*351-~(($a=$y/100|0)*29.32+($b=$a>>2)+13.54)*31.9)/33%29)-~($a-$b+$c-24-$y/.8)%7)>>5,31*$m-$d;
1725-04-1
vez de1725-04-01
.dc: 106 caracteres
Uso:
Isso deve ser reduzido usando 'd' e 'r' em vez de todas as cargas e armazenamentos.
fonte
C:
151148 caracteresE o mesmo código, mas melhor formatado:
Existem muitos algoritmos para o cálculo da data da Páscoa, mas apenas alguns deles são adequados para o código de golfe.
fonte
Javascript
162156145Inspirado na solução PHP de @ jdstankosky ... Fornece resultado AAAAMMDD ...
Agora reduzido para:
Agora pede entrada ... reduziu a seqüência literal de "0" para 0 e deixou a digitação solta trabalhar para minha vantagem! :)
Reduzido ainda mais para levar em consideração o ES6 ...
e=y=>y+"0"+((d=56-(c=(y%19*351-31.9*~((b=(a=y/100|0)>>2)+29.32*a+13.54))/33%29|0)-~(a-b+c-24-y/.8)%7)>(f=31)?4:3)+(d-f>0&d-f<10?0:"")+(d>f?d-f:d)
fonte
APL 132
Esse algoritmo calcula o número de dias que a Páscoa fica em relação ao início de março. A data é retornada no formato AAAAMMDD, conforme permitido na pergunta:
Tomando os casos de teste originais:
fonte
Fortran (GFortran) , 179 bytes
Experimente online!
Usa o algoritmo "Emended Gregorian Easter" (Al Petrofsky) no segundo link de recurso. Estranhamente, ele falha no ano 5701583 (e, aparentemente, apenas neste ano), prevendo a Páscoa como uma semana antes. Imprime a data no
YYYYYYYMMDD
formato, com alguns espaços à esquerda, se o ano tiver menos de sete dígitos.fonte