(Inspirado pelo Riddler da semana passada no FiveThirtyEight.com. Postagem na caixa de areia .)
Dado um ano entre 2001 e 2099, calcule e retorne o número de dias durante o ano civil em que mm * dd = yy
(onde yy
é o ano de 2 dígitos ).
2018, por exemplo, possui 5:
- 18 de janeiro (1 * 18 = 18)
- 9 de fevereiro (2 * 9 = 18)
- 6 de março (3 * 6 = 18)
- 3 de junho (6 * 3 = 18)
- 2 de setembro (9 * 2 = 18)
A entrada pode ser um ano numérico de 2 ou 4 dígitos.
A saída deve ser um número inteiro. O espaço à direita ou o retorno opcional é bom.
Lista completa de entrada / saída:
Input = Output
2001 = 1 2021 = 3 2041 = 0 2061 = 0 2081 = 2
2002 = 2 2022 = 3 2042 = 4 2062 = 0 2082 = 0
2003 = 2 2023 = 1 2043 = 0 2063 = 3 2083 = 0
2004 = 3 2024 = 7 2044 = 3 2064 = 2 2084 = 5
2005 = 2 2025 = 2 2045 = 3 2065 = 1 2085 = 1
2006 = 4 2026 = 2 2046 = 1 2066 = 3 2086 = 0
2007 = 2 2027 = 3 2047 = 0 2067 = 0 2087 = 1
2008 = 4 2028 = 4 2048 = 6 2068 = 1 2088 = 3
2009 = 3 2029 = 1 2049 = 1 2069 = 1 2089 = 0
2010 = 4 2030 = 6 2050 = 3 2070 = 3 2090 = 5
2011 = 2 2031 = 1 2051 = 1 2071 = 0 2091 = 1
2012 = 6 2032 = 3 2052 = 2 2072 = 6 2092 = 1
2013 = 1 2033 = 2 2053 = 0 2073 = 0 2093 = 1
2014 = 3 2034 = 1 2054 = 4 2074 = 0 2094 = 0
2015 = 3 2035 = 2 2055 = 2 2075 = 2 2095 = 1
2016 = 4 2036 = 6 2056 = 4 2076 = 1 2096 = 4
2017 = 1 2037 = 0 2057 = 1 2077 = 2 2097 = 0
2018 = 5 2038 = 1 2058 = 0 2078 = 2 2098 = 1
2019 = 1 2039 = 1 2059 = 0 2079 = 0 2099 = 2
2020 = 5 2040 = 5 2060 = 6 2080 = 4
Este é um desafio do código-golfe , com a menor contagem de bytes em cada idioma.
Pré-calcular e simplesmente procurar as respostas normalmente é excluído de acordo com nossas regras de brecha , mas estou explicitamente permitindo esse desafio. Ele permite algumas estratégias alternativas interessantes, embora não seja provável que uma lista de pesquisa de 98 99 itens seja a mais curta.
Respostas:
Excel, 48 bytes
Viva! Finalmente, algo em que o Excel é realmente bom.
Recebe a entrada de A1 na forma de um número inteiro de 1 a 99 representando o ano e sai para onde quer que você insira essa fórmula. É uma fórmula de matriz, então use Ctrl-Shift-Enter em vez de Enter para inseri-lo.
Isso tira vantagem do fato de
COUNT
ignorar erros; portanto, todos os erros causados pelo mês que não divide o ano (levando o Excel a analisar algo como2/12.5/25
ou a data que não é válida, por exemplo2/29/58
, são ignorados silenciosamente.fonte
A1
. A entrada de um ano de 4 dígitos simplesmente retorna0
.Python 2 , 44 bytes
Experimente online!
Uma função anônima fornecida como um objeto de método. Produz todos os produtos de
(month, day)
pares(m, d)
como codificado pork=32*m+d
com0≤m≤12
,0≤d≤31
, envolvendo em torno. Elimina os dias 29 e 31 de fevereiro, excluindo-os do intervalo.fonte
Java (JDK 10) , 65 bytes
Experimente online!
Créditos
fonte
29*n
, então não há necessidade do check(m==2?29:32)
para29+m%2*3
ainda parece dar todos osOK
resultados. Crédito para a resposta Ruby de @AsoneTuhid .PowerShell , 94 bytes
Experimente online!
Recebe a entrada como um ano de dois dígitos e constrói um
for
loop de1/1/year
para12/9/year
(porque 12/10 e além nunca contarão e isso economiza um byte). A cada iteração, incrementamos$z
se o.Month
tempo.Day
for igual ao nosso ano de entrada. Fora do loop,$z
é deixado no pipeline e a saída é implícita.Editar - isso depende da cultura. O código acima funciona para
en-us
. O formato da data pode precisar ser alterado para outras culturas.fonte
Ruby ,
4642 bytesExperimente online!
fonte
JavaScript (Node.js) ,
484443 bytesExperimente online!
JavaScript (Node.js) ,
5958 bytesExperimente online!
fonte
Gelatina , 15 bytes
Experimente online!
Pegue um número no intervalo
[0,100[
como entrada.fonte
JavaScript (ES6), 91 bytes
Eu estava curioso para saber como a codificação seria comparada a uma computação iterativa. Definitivamente, é mais longo (veja a resposta de @ Shaggy ), mas não muito mais.
Edit : É, no entanto, muito mais longo que uma fórmula mais direta (consulte a resposta na l4m2 ).
Recebe a entrada como um número inteiro em [1..99] .
Experimente online!
Quão?
Anos ímpares têm significativamente menos chance de ter mm * dd = aa do que anos pares. Mais concretamente, anos ímpares têm 0 a 3 correspondências, enquanto anos pares têm 0 a 7 correspondências. Isso nos permite codificar cada par de anos com apenas 5 bits, o que pode ser convenientemente representado como um único caractere na base 36.
fonte
Perl 6 , 40 bytes
Experimente online!
fonte
Python 2 e 3 ,
5552 bytesExperimente online!
fonte
Utilitários Bash + GNU , 57
Observe que o
seq
comando sempre produz uma lista de 366 datas - para os anos que não são bissextos, o 1º de janeiro do próximo ano será incluído. No entanto, no período de 2001 a 2099, MM * DD nunca será AA para 1º de janeiro do próximo ano em nenhum desses anos, portanto esse dia extra não afetará o resultado.Experimente online!
fonte
date
que faria matemática de datas assim enquanto analisava.seq
não precisa de um espaço após o-f
, então você pode salvar um byte lá.T-SQL,
123121 bytesDe acordo com nossas regras de IO , a entrada é obtida através da tabela preexistente t com um campo inteiro y , que contém um ano de 2 dígitos.
A quebra de linha é apenas para legibilidade. Inspirado em grande parte pela solução Excel da Sophia .
CONCAT()
, o que implicavarchar
conversões implícitas de tipo de dados. Caso contrário, eu teria que fazer várias declaraçõesCAST
ouCONVERT
.ISDATE()
, que retorna 1 para datas válidas e 0 para datas inválidas.y%m=0
) naWHERE
cláusula para salvar 2 bytes, obrigado @RazvanSocol.Infelizmente, não é muito menor que a versão da tabela de pesquisa (usando a string da versão do osdavison ):
Pesquisa T-SQL, 129 bytes
EDIT : deixando o original acima, mas podemos salvar alguns bytes usando algumas novas funções:
STRING_SPLIT
está disponível no MS SQL 2016 e acima.CONCAT_WS
está disponível no MS SQL 2017 e acima.IIF
porWHERE
MS-SQL 2017,
121118 bytesMS-SQL 2017, edição mais barata: 109 bytes
Requer que você esteja no
master
banco de dados, que contém uma tabela do sistemaspt_values
que (quando filtrada porTYPE='P'
) fornece números de 0 a 2048.fonte
m/d/y
) depende das configurações de localidade da instância SQL. Outras localidades podem exigir uma ordem diferente ou um separador diferente, mas acho que isso não afetaria o tamanho do código.SPLIT_STRING
vez de um CTE reduz para 120 bytes. Usar emCONCAT_WS
vez deCONCAT
salva outro caractere, atingindo 119 bytes.IIF
porWHERE
.Julia 0.6 ,
494442 bytesExperimente online!
-5 bytes inspirados na resposta Ruby de Asone Tuhid.
-2 bytes substituindo contagem por soma
Explicação:
Para cada mês,
i
de 1 a 12, calculey/i
e verifique se é um dos dias desse mês. Meses com 31 dias são 1, 3, 5, 7, 8, 10, 12 - portanto, são ímpares abaixo de 8 e pares iguais ou superiores a 8. Portanto,i%2
oui÷8
( ou seja, que é 0 para i <8 e 1 para i> = 8 aqui) deve ser 1, mas não os dois - então nós os XORamos. Se o resultado xor for verdadeiro, verificamos as datas ,1:28+3
ou seja1:31
, apenas as datas1:28
.1:28
é suficiente para o resto dos meses (essa melhoria inspirada na resposta Ruby de Asone Tuhid ) porque:para fevereiro, a única possibilidade seria
2*29 = 58
, mas2058
não é um ano bissexto, portanto, podemos assumir que fevereiro sempre tem 28 dias.os outros meses com 30 dias são o mês 4 e superior - para o qual
i*29
(ei*30
) seria superior a 100, o que pode ser ignorado.Finalmente, contamos o número de vezes que
y/i
essa lista de dias pertence (usando booleanosum
aqui) e retornamos.fonte
JavaScript,
9185828177 bytesRecebe a entrada como uma sequência de 2 dígitos (ou um número inteiro de 1 ou 2 dígitos).
Aproveita o fato de que
new Date
será transferido para o próximo mês e continuará fazendo isso, se você passar um valor de dia que excede o número de dias no mês em que você passa para ele, na primeira iteração, ele tenta construir o datayyyy-01-345
que se tornayyyy-12-11
, ouyyyy-12-10
em anos bissextos. Não precisamos verificar as datas depois disso, pois isso12*11+
resulta em um número de três dígitos.3 bytes salvos graças ao Arnauld .
Teste-o
fonte
Python 2 ,
89846858 bytesExperimente online!
fonte
Excel, 83 bytes
A entrada está na célula
A1
no formatoyyyy
. Esta é uma fórmula de matriz e é inserida com Ctrl+ Shift+ Enterpara obter os colchetes{}
. É bastante direto e sem nenhuma esperteza.Quando em uma fórmula de matriz,
DATE(A1,1,0)+ROW(1:366)
fornece uma matriz de 366 valores de data. Em anos não bissextos, isso incluirá 1º de janeiro do próximo ano, mas isso não é um problema, porque1*1=1
só contaria como falso positivo se o próximo ano for2001
, mas, como o intervalo de anos exigido2001 - 2099
, nunca surgirá como um questão.Se você colocou um pouco mais simples
~
, a fórmula é muito mais fácil de seguir:Eu tentei usar em
COUNTIF()
vez de,SUM(IF())
mas o Excel nem me deixou entrar como uma fórmula de matriz, muito menos me deu um resultado. I fez encontrar um Sheets Google solução usandoCountIf()
, mas o mesmo método de outra forma que acabou por ser 91 bytes, principalmente porque ele usaArrayFormula()
em vez de simplesmente{ }
.fonte
Retina 0.8.2 , 55 bytes
Experimente online! Leva um ano de dois dígitos; adicione 1 byte para oferecer suporte a anos de 4 dígitos. Explicação: O primeiro estágio simplesmente se converte em unário. O segundo estágio inicia correspondendo de 1 a 12 caracteres antes da posição de correspondência, representando o mês e, em seguida, tenta olhar para a frente por um número inteiro de repetições daquele mês. No entanto, o lookahead contém uma condicional, que escolhe entre 27 ou 30 repetições adicionais, dependendo do mês. A contagem de posições de partida é o resultado desejado.
fonte
R ,
22122 bytesExperimente online!
Decidiu ir com uma abordagem de tabela de pesquisa. O ano de entrada precisa ter 2 dígitos.
fonte
if
, uma vez que a entrada pode ser qualquer um de 2 dígitos ou 4 dígitos, a sua escolha (de modo que você pode optar por aceitar apenas a entrada de 2 dígitos). . Mas parece que o código considera todos os meses para conter 31 dias, por isso, para, por exemplo, 62 (para 2062) retorna 1, onde ele deve retornar 0.C (gcc),
656059 bytesPorta da resposta Java do user202729 . Experimente online aqui . Agradecimentos a Jonathan Frech por jogar 1 byte.
fonte
a=0,m=13;for(;
~>for(a=0,m=13;
.J , 29 bytes
Experimente online!
Como funciona
Tentei muito menos de 2 vezes a solução Jelly :)
Nota
Se alguém realmente deseja codificar os dados de 99 dígitos, aqui estão algumas informações:
Divida os 99 dígitos em pedaços de 2 dígitos. Então o primeiro dígito é
<4
e o segundo<8
, o que significa que cinco bits podem codificar dois números. Em seguida, todos os dados podem ser codificados em 250 bits ou 32 bytes.fonte
Python 3 , 158
162215241bytesRemovido 4 Obrigado a Stephen por jogar golfe nos condicionais.
Removido 53 agradecimentos Stephen por apontar o espaço em branco
Removido 26 graças ao link fornecido por caird
Eu sou muito novo nisso. Não conseguia pensar em como fazer isso sem que os dias do mês fossem descritos.
Experimente online!
fonte
(28if Y%4else 29)
pode ser reduzido para[29,28][Y%4>0]
. Além disso, a lista longa pode ser reduzida para[a,...]+2*[a,b,a,b,a]
.a,b,c
pode ser adicionado na lista de parâmetros para salvar uma linha.int(str(Y)[2:])
pode ser reduzido paraY%100
. Finalmente, as variáveis do contador podem ser abreviadas paralen
s de lista, o que também permiten
que seja feito alambda
. Isso faz 118 .Quarto (gforth) ,
6059 bytesExperimente online!
Esta versão aproveita o fato de que não pode haver mais de um dia correspondente por mês e que o ano deve ser divisível por mês para que ele corresponda.
Explicação
Repete ao longo dos meses, verifica se o ano é divisível por mês e se o quociente é <31 (28 de fevereiro). Os meses após março não podem corresponder para dias superiores a 25, para que possamos assumir todos os meses (exceto fevereiro) tem 31 dias para o objetivo do quebra-cabeça.
Código Explicação
[1] - A seguir, o conceito de números de comprimento duplo, que são armazenados na pilha como dois números de comprimento único (da forma xy, em que o valor de double =
y * 2^(l) + x
onde l é o tamanho em bits de um único no com a qual você está trabalhando).Nesse caso, comparei o quociente e o restante com 32 (ou 29) 0. Se o restante fosse maior que 0 (ano não divisível por mês), o primeiro dobro seria automaticamente maior que 32 (ou 29) 0 e o resultado seria falso. Se o restante for 0, ele resolverá efetivamente uma verificação regular do quociente <= 32 (ou 29)
Quarto (gforth) , 61 bytes
Experimente online!
Economizou alguns bytes ao perceber que apenas fevereiro é importante em termos de número correto de dias no mês
Explicação
As comparações adiante (pelo menos adiante) retornam -1 para verdadeiro e 0 para falso
fonte
Java (JDK 10) ,
797270 bytesExperimente online!
fonte
d
ays)&&
para&
, é a mesma resposta que a resposta Java de OlivierGrégoire, embora ele tenha respondido 19 minutos antes.JavaScript (Node.js) , 108 bytes
fonte
Perl 5 , 68 bytes
Experimente online!
fonte
Python 3, 132 bytes
Este é realmente um programa bastante longo, mas achei que poderia ser interessante.
Todos os valores estão entre 0 e 7, então eu codifico cada número com 3 bits em uma cadeia binária longa. Tentei colar uma string binária bruta no meu programa python, mas não consegui fazê-la funcionar, por isso decidi pela base64 no arquivo.
Usei a seguinte string como uma tabela de pesquisa (as 7 finalizações usadas para preenchimento):
01223242434261334151533172234161321260115040331061312042410060032130113060021220420051013051110140127
O programa pega essa string e a decodifica como um número e usa a mudança de bits para extrair o resultado.
66 bytes + arquivo de 37 bytes = 103 bytes
Isso lê um arquivo binário chamado
e
e evita o uso de base64.Aqui está um hexdump do arquivo lido (sem preenchimento):
fonte
Haskell ,
6151 bytesExperimente online!
Inspirado na resposta Python 2 do xnor e em Laikoni.
fonte
f y=sum[1|i<-[1..12],mod y i<1,div y i<29+mod i 2*3]
Experimente online!Oracle SQL, 115 bytes
Podemos notar que, na verdade, não importa quantos dias em abril (e meses posteriores), desde 100/4 <28. Também não é necessário verificar se o ano é bissexto ou não. Nós apenas temos que especificar que há 28 dias em fevereiro (não 29, porque essa validação será executada apenas para 2058, o que não é um salto), caso contrário, pode ser apenas 31 por qualquer mês.
Outras abordagens
Oracle SQL (12c Release 2 e posterior), 151 bytes
Oracle SQL (12c Release 2 e posterior), 137 bytes
Ambas as soluções poderiam ter sido 8 bytes mais curtas se substituirmos
(select level l from dual connect by level<=12)
por,xmltable('1to 12'columns l int path'.')
mas o Oracle lança uma exceção por causa do bug (testado nas versões 12.2.0.1.0, 18.3.0.0.0).O único caso em ambas as soluções, quando o ano importa, é 2058, que é sem salto, então literalmente '-1' foi usado para especificar o ano sem salto.
Oracle SQL, 128 bytes
Oracle SQL, 126 bytes
Atualizar
Oracle SQL, 110 bytes
Oracle SQL, 108 bytes
Spark SQL, 137 bytes
Spark 2.3+ SQL, 126 bytes
(a
replace
função fica disponível)fonte
PHP , 73 bytes
Usando entrada de tubo e
php -nR
:Experimente online!
PHP , 76 bytes
Usando a entrada de linha de comando arg
php dm.php 18
:Experimente online!
Abordagem iterativa. Como o único ano bissexto a ser observado é 2 * 29 = 58, e 2058 não é um ano bissexto, não há necessidade de considerar o ano bissexto nos dias de fevereiro. E como a envolvente não é uma preocupação - a partir de abril, qualquer dia maior que 25 excederá 100, apenas dizemos que o restante dos meses tem apenas 25 dias.
A entrada é de 2 dígitos ano via linha de comando (-10 bytes como programa, thx à sugestão de @Titus).
OU:
PHP , 101 bytes
Experimente online!
Ainda iterativo, mas usando as funções de carimbo de data / hora do PHP. Aceita ano como número de quatro dígitos. Thx para @Titus por sugestão de uso em
strtotime()
vez demktime()
.fonte
$m<5?$m-2?31:28:25
pela primeira e$d=strtotime("$y-1")
pela segunday
o eval entre aspas?strtotime()
vez demktime()
e reimplementado como programa, -7 bytes. Além disso, observei a maioria dos envios, incluindo os mais votados, aceitarão o ano apenas com 2 ou 4 dígitos, por isso vou considerar que isso depende do remetente. Obrigado novamente pelas sugestões!PHP,
7470 bytesaceita apenas dois anos.
Eu adotei considerações gwaugh's e golfed-los; minha primeira abordagem foi maior que a dele (92 bytes):
%100
permite usar anos de 4 dígitos.Execute como pipe
-nR
ou experimente-os online .fonte