Este desafio é bastante simples. Você receberá uma entrada que será de um ano entre 1801 e 2400 e a saída, se for um ano bissexto ou não.
Sua entrada não terá novas linhas ou espaços finais:
1954
Você produzirá da maneira que desejar, que diga claramente ao usuário se é ou não um ano bissexto (aceitarei y ou n para sim / não)
Você pode obter uma lista dos anos bissextos aqui: http://kalender-365.de/leap-years.php Gostaria de observar que os anos bissextos nem sempre são quatro anos. 1896 é um ano bissexto, mas 1900 não é. Os anos seguintes a este "salto" são:
1900
2100
2200
2300
Casos de teste:
1936 -> y
1805 -> n
1900 -> n
2272 -> y
2400 -> y
EDIT: Isso é baseado em um calendário gregoriano padrão: http://www.epochconverter.com/date-and-time/daynumbers-by-year.php
code-golf
date
decision-problem
Kevin Cruijssen
fonte
fonte
(divisible by 4)∧((divisible by 100)→(divisible by 400))
.Respostas:
APL,
161412 caracteresRetorna
0
para um ano bissexto,1
para um ano não bissexto.Experimente esta solução em tryapl.org . Observe que eu mudei a solução para o
{≥/⌽×4 25 4⊤⍵}
dfn porque o tryapl.com não suporta⎕
( aceite a entrada do usuário). Observe que⎕
é uma caixa vazia, não um caractere ausente.A mesma solução em J:
Explicação
Diádico
⊤
(codificação) representa seu argumento correto na base especificada por seu argumento esquerdo. Eu uso base4 25 4
nesta solução. Isso representa o ano y como um polinômioDeixe proposições a, β, e y representam se , um b, e c são diferentes de zero: proposição γ é falso, se y é divisível por quatro, β ∧ γ é falso, se y é divisível por 100 e ct ∧ β ∧ γ seja false se y é dividível por 400.
Uma tabela de verdade (
*
representando “não se importa”) onde a proposição Δ representa se y for um ano bissexto obtém:A declaração a seguir expressa Δ em α , β e γ :
Devido à estrutura desta afirmação, pode-se expressar ΔΔ como a redução em
≥/⌽α β γ
que ≥ implementa ←. Isso leva à resposta que estou explicando agora.fonte
Pitão, 11 bytes
Este programa completo lê de STDIN e imprime True por anos bissextos e False de outra forma.
Obrigado a @Jakube por sugerir Pyth e basicamente portar meu código CJam.
Verifique você mesmo os casos de teste no Pyth Compiler / Executor .
Como funciona
fonte
CJam, 12 bytes
Este programa completo lê STDIN e imprime 1 por anos bissextos e 0 caso contrário.
Verifique você mesmo os casos de teste no interpretador CJam .
Como funciona
fonte
r2/~~\e|i4%!
,r2/~~\~e|4%!
,r2/:~~\e|4%!
,r2/S*~\e|4%!
E 13 byter2/:~W%:e|4%!
r2/:i:\e|4%!
(12) er2/:i(fe|~4%!
(13). Eu até tentei o GolfScript (que não requerr
), masor4
é interpretado como um único token. Se ao menos a entrada tivesse uma nova linha à direita ...Javascript (ES6), 21 caracteres
A regra padrão é que
y
é um ano bissexto se 4 se dividey
e se 100 não se dividey
ou se 400 se dividemy
. Em código,Não há necessidade de 100 e 400. Em vez disso, basta verificar se 16 ou 4 divide y, com 16 escolhido se 25 divide y, 4 caso contrário. Golfed, isso se torna
Uma função javascript que implementa isso tem 21 caracteres:
Perl,
2826 caracteresMesma ideia, mas em perl.
Execute usando as
-lp
opções. Por exemplo,Com o teste definido como entrada, isso produz
fonte
y=>...
) é um recurso do ES6.Pip , 13 bytes
Este foi mais interessante do que parecia à primeira vista. Demorou algum tempo para finalizar, mas finalmente consegui substituir aquelas referências longas com
400
with4
e ah
variável (= 100).Saídas
1
para o ano bissexto,0
para o ano não bissexto. Explicação:fonte
Pitão,
191514 bytesMuito fácil. Experimente on-line: demonstração ou equipamento de teste
edit: Missed, que você pode imprimir valores Truthy / Falsy, em vez de
n/y
. -4 byteseditar 2: Usou a idéia da raiz quadrada de Martin. -1 byte
Explicação
fonte
Regex,
836238Agradecemos a Toby pelas dicas sobre como combinar as duas metades da regex.
Se focarmos apenas no intervalo 1801..2400 e assumirmos que a entrada é um número inteiro:
Teste em Ruby (
^
=\A
e$
=\Z
porque Ruby) para o intervalo desejado:(Bônus) para algo que deve funcionar não apenas para 1801..2400, mas para qualquer ano não negativo:
Teste em Ruby (
^
=\A
e$
=\Z
porque Ruby) nos primeiros 100000 anos:fonte
(?!)
pode combinar as duas metades:(?!00)([02468][048]|[13579][26])(00)?$
- para 38. Porém, isso não funcionará por anos de um dígito.JavaScript ( ES6 ) 27
A regra:
(y%4==0) && (y%100!=0 || y%400==0)
Golfe:
!(y%100<1&&y%400||y%4)
(principalmente usando a lei de De Morgans )Uma função que implementa a regra:
Um teste (executado no Firefox) apenas para ter certeza:
fonte
!(y%(y%25?4:16))
vez de!(y%100<1&&y%400||y%4)
. Para aqueles incomodados pelo operador ternário, você pode usar!(y%(4<<2*!(y%25)))
e ainda salvar três caracteres!(y%100<1&&y%400||y%4)
.TI-BASIC,
20 17 1613Por ser tokenizado, o TI-BASIC geralmente é competitivo em desafios simples de matemática, mas não este, pois não existe um comando "divisível".Talvez seja afinal, mas ainda é mais longo que CJam e Pyth.Isso usa o método de David Hammond.
Código antigo com 16 bytes:
Ungolfed:
fPart(
é "parte fracionária"; exponenciação tem maior precedência que divisão. No TI-BASIC, os close-parens são opcionais.Uso o comportamento não documentado do
sub(
comando, geralmente usado para obter uma substring: quando seu argumento é um número em vez de uma string, ele divide o número por 100. Ele funcionará em uma calculadora da série TI-83 ou 84.20 -> 17 reorganizando o código para permitir a remoção de parentes próximos; 17 -> 16 substituindo 400 por 16; 16 -> 13 usando a idéia de David Hammond.
fonte
Stackylogic, 226 bytes (não concorrente)
Sim isso está certo. Eu fiz um programa em Stackylogic (não-TC), que foi inventado por Helka Homba, para o desafio encontrado aqui . Isso é feito após o desafio, portanto não competitivo.
O Stackylogic possui apenas entrada binária, portanto, 10 (ou mais, mais dígitos serão ignorados) deve ser usado o binário de bits (o bit menos significativo inserido primeiro). Qualquer data fora do intervalo especificado pode falhar, pois simplesmente verifica qual é o número inserido: ele não cobre datas desnecessárias
Não é apenas este o meu primeiro desafio com stackylogic, mas o primeiro desafio com stackylogic.
Prepare-se para esta bagunça:
Isso demorou tanto para ser feito, porque o Stackylogic é a linguagem mais confusa que encontrei e extremamente ilegível: você precisa saber como o resto do programa foi executado antes de poder ler a seção atual que está sendo editada. Eu até tive que adicionar espaços para facilitar a leitura enquanto o criava.
Pouca explicação
Esta é uma explicação simples do que faz.
O Stackylogic não possui funções matemáticas, tornando isso mais difícil. Eu tive que codificar a maior parte, para verificar se era um número específico.
Primeiro, este programa fará uma NOR dos bits menos significativos, descartando-os no processo. isto significa que, se for divisível por 4, prosseguirá para a parte principal do programa, caso contrário, será gerado 0.
Segundo, o ponteiro é transportado para o labirinto da stackylogic, a partir daqui, se os próximos dois bits forem zero, ele produzirá instantaneamente 1 (então é divisível por 16 e, portanto, um ano bissexto apesar de quaisquer outras condições), outras sábio, ele verificará se nenhum dos números é divisível por 4, mas não um ano bissexto, entre 1801 e 2400.
Para explicar em detalhes, envolveria tornar este post muito mais longo do que já é
fonte
Montador do IBM System Z - 56 bytes.
(96 bytes de origem. Anteriormente
712384202 bytes de origem, executável de 168 bytes).Versão menor ainda. Não salva mais os registros de chamadas, alterações no armazenamento literal, modo de endereçamento alterado.
Nova versão. Isso será ABEND com um S0C1 se for um ano bissexto, e repetido se não for. Espero que isso cumpra o requisito de indicar o resultado.
OK, então não é o mais curto (embora possa ser uma vez que analisemos o código executado real mais o tamanho do interpretador ...)
Saída:
ABEND S0C1 por um ano bissexto, S222 (quando o tempo da CPU acabar), se não.
1936 Y 1805 N 1900 N 2272 Y 2400 Y(quando executado várias vezes)fonte
CJam,
1816 bytesDá
1
(de verdade) por anos bissextos e0
(falsamente) de outra forma.Execute todos os casos de teste aqui.
Explicação
fonte
Mathematica,
4027 bytes, 17 caracteresUsa 17 caracteres, mas 27 bytes. Obrigado a @alephalpha pela dica. Observe que as barras verticais são na verdade U + 2223 para divisões. O
<U+F523>
deve ser substituído pelo caractere correspondente.fonte
∣
para representarDivisible
:,#∣4&&(!#∣100||#∣400)&
21 caracteres, 27 bytes UTF-8.U+F523
(\[Implies]
) para obter#∣4&&(#∣100<U+F523>#∣400)&
19 caracteres (mas ainda 27 bytes).R, 29
Execução de teste
fonte
C, 81
Eu posso fazer mais curto, mas este adere perfeitamente aos tipos 'char', sem analisar o argumento (por exemplo, com
atoi
):Ele deve ser chamado com um nome de 4 caracteres, porque assume a premissa padrão de que os argumentos seguem imediatamente o nome do programa, separados por NULs. Além disso, assume que o argumento único é codificado em ASCII e não possui espaço à esquerda.
Explicação:
*v+9
é a posição do dígito 'dezenas' emv[1]+2
.Se os caracteres 'dezenas' e 'unidades' forem adicionados a 96, terminamos com
00
, portanto, faça backup de dois caracteres, para que 'dezenas' e 'unidades' aponte para o número do século.Agora xor 'units' com o dobro das 'dezenas', mod 4. Isso funciona porque
10==±2 mod 4
, portanto, o bit inferior das 'dezenas' pode alternar apenas o bit 1 das 'unidades'. Usamos o resultado como um índice em nossa tabela de remanescentes, imprimindoy
apenas se o resultado modular for zero.fonte
Befunge -98, (41 bytes)
Simplicidade é incrível.
fonte
sed, 55
Observe que anos não bissextos podem ser impressos como
n
ouN
dependendo de serem pares ou ímpares. Considero isso uma interpretação criativa da regra que permite alternativas ao 'sim' e 'não' sem especificar que elas devem ser consistentes.fonte
Python2 - 37
g=lambda x:(x%4or x%400and x%100<1)<1
Observe que se
a
é um número inteiro não negativo,a<1
é uma maneira curta de escrevernot bool(a)
. O último<1
converte efetivamente a expressão entre parênteses em um booleano e nega o resultado.A aplicação da função
g
a um número inteiron
entre 1801 e 2400 retornaráTrue
sen
for um ano bissexto ouFalse
não.fonte
KDB (Q), 27 bytes
Explicação
Teste
fonte
Julia,
3028 bytesIsso cria uma função sem nome que aceita um argumento inteiro e retorna um valor booleano. Para chamá-lo, dê um nome, por exemplo
f=y->...
.Ungolfed:
Exemplo:
fonte
PHP - 45 bytes
Nada realmente especial, apenas abusando do malabarismo de tipos.
fonte
C #, 23 bytes
Experimente online!
Fonte completa, incluindo casos de teste:
fonte
C,
373430 bytesWandbox
fonte
T-SQL
3722 bytesEconomizou 15 bytes graças ao comentário de BradC.
A variável codificada habitual por falta de a
stdin
.por exemplo
Então a solução é:
fonte
1
ou0
diretamente:PRINT ISDATE(@+'0229')
Java 8,
49452220 bytes-2 bytes graças a @ OlivierGrégoire .
Experimente online.
Algumas soluções de 22 bytes:
Experimente online.
Experimente online.
Experimente online.
Explicação:
fonte
java.time.Year::isLeap
.n->n%(n%25<1?16:4)<1
Haskell, 19 bytes
Experimente online!
fonte
Javascript ES6, 32, 29, 26
Qualquer uma das seguintes linhas funciona:
fonte
C, 57 bytes
Retorna a entrada do stdin, com ou sem espaços à direita / nova linha. Só funciona em pequenas máquinas endian (sim, como todo mundo está no BE atualmente). Saídas Y ou N.
Explicação
Ungolfed:
Primeiro,
scanf
lê o ano como um número inteiro em y. Então, y é modulado com 4 ou 400, dependendo se o ano é divisível por 100. Se o restante for zero, o código ASCII para Y é atribuído a y, caso contrário, ele obtém o código ASCII para N. O valor de y é agora0x000000??
, onde0x??
está o caractere atribuído. Por estar em uma máquina little-endian, na memória isso é armazenado como?? 00 00 00
. Esta é uma cadeia C terminada em NULL, contendo apenas os caracteres atribuídos. O endereço de y é passado para put e o caractere é impresso (com uma nova linha à direita).fonte
main(y){scanf("%d",&y);y=!(y%(y%100?4:400))+48;puts(&y);}
. Eu posso descer até 48 bytes se conseguir gerar uma linha vazia por anos bissextos e qualquer caractere (ASCII 1-99), mas sinto que isso está um pouco distorcendo as regras. O que você acha?PowerShell, 31 bytes
Estou animado para dizer que joguei este mais curto do que o embutido!
Resultados verdadeiros para os anos bissextos e falsos caso contrário.
Construídas em:
No entanto, se eu quisesse esticar a declaração 'informa claramente ao usuário se é ou não um ano bissexto' e fazer algo fora do padrão, eu poderia salvar 3 bytes e usar:
Isso produz
0
anos bissextos e 1 ou superior para anos não bissextos, o que eu não gosto, pois prefiro retornar um valor mais padrão de verdade para os anos bissextos.fonte
LOLCODE,
228202159 bytesUngolfed:
Em Python não-destruído, porque LOLCODE é confuso:
fonte
WIN
..