Quantos dias em um mês?

25

Dada uma representação textual (nome completo que não diferencia maiúsculas de minúsculas ou abreviação de 3 caracteres) de um mês, retorne o número de dias no mês.

Por exemplo, december, DECe dectodos devem retornar 31.

Fevereiro pode ter 28 ou 29 dias.

Suponha que a entrada seja um mês em uma das formas corretas.

qw3n
fonte
19
Você provavelmente deve listar todas as variações dos nomes dos meses que devemos aceitar.
Giuseppe
11
Para quem pode usá-lo, as somas ordinais ASCII dos três primeiros caracteres reduzidos são únicas.
totallyhuman
19
Isso foi longe, muito cedo para aceitar uma solução.
Shaggy
5
Eu acho que isso seria melhor se a entrada fosse apenas o mês em um formato fixo, já que o formato agora basicamente requer a conversão para um caso fixo e apenas as três primeiras letras.
Xnor 28/10
4
Tal como está, parece que você quer respostas para lidar com todas as formas enunciadas - "Por exemplo, december, DECe decdeve tudo retorno 31" - é que a intenção?
Jonathan Allan

Respostas:

4

Pyke , 9 bytes

l4C9@~%R@

Experimente aqui!

l4        -   input.title()
    @     -  v.index(^)
  C9      -   ['PADDING', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
        @ - v[^]
     ~%R  -  ['Padding', 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

Ou 15 bytes, se todos os formatos de entrada forem necessários

l43<C9 3L<@~%R@

Experimente aqui!

l43<            -   input.title()[:3]
          @     -  v.index(^)
    C9 3L<      -   ['PAD', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
              @ - v[^]
           ~%R  -  ['Padding', 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
Azul
fonte
6
Isso retorna 31 para FEB.
Laikoni
2
Eu acredito @ ponto de Laikoni é válido (ele também retorna 31 para Apr, Jun, Sepe Nov), mas também acho que ele requer um pouco de esclarecimento no OP (ver a minha pergunta ).
Jonathan Allan
@ JonathanAllan Bem, o OP aceitou esta resposta, então acho que é válida?
Erik the Outgolfer
4
@EriktheOutgolfer Eu não chegaria a essa conclusão pessoalmente.
Jonathan Allan
Fiquei com a impressão de que só precisava de trabalho para uma forma de entradas
Azul
33

JavaScript (ES6),  48 47 44 43  42 bytes

m=>31^'311'[parseInt(m[1]+m[2],34)*3%49%8]

Demo

Quão?

Essas operações levam a uma tabela de pesquisa de 8 entradas, o que não seria muito interessante se os valores fossem distribuídos aleatoriamente. Mas qualquer resultado maior que 2 é mapeado para 31 dias. Portanto, apenas as 3 primeiras entradas precisam ser armazenadas explicitamente.

Month | [1:2] | Base 34 -> dec. | * 3  | % 49 | % 8 | Days
------+-------+-----------------+------+------+-----+-----
  JAN |    AN |             363 | 1089 |   11 |   3 |  31
  FEB |    EB |             487 | 1461 |   40 |   0 |  28
  MAR |    AR |             367 | 1101 |   23 |   7 |  31
  APR |    PR |             877 | 2631 |   34 |   2 |  30
  MAY |    AY |              10 |   30 |   30 |   6 |  31
  JUN |    UN |            1043 | 3129 |   42 |   2 |  30
  JUL |    UL |            1041 | 3123 |   36 |   4 |  31
  AUG |    UG |            1036 | 3108 |   21 |   5 |  31
  SEP |    EP |             501 | 1503 |   33 |   1 |  30
  OCT |    CT |             437 | 1311 |   37 |   5 |  31
  NOV |    OV |             847 | 2541 |   42 |   2 |  30
  DEC |    EC |             488 | 1464 |   43 |   3 |  31
Arnauld
fonte
14
honestamente como na terra você continuar fazendo essas incríveis apresentações estranhas com louco matemática coisas D: você tem um programa para encontrar estes ou você está simplesmente muito bom para o resto de nós
HyperNeutrino
11
@HyperNeutrino A primeira coisa que tento é sempre encontrar uma conversão de base, seguida por uma multiplicação opcional seguida por uma ou várias operações de módulo. Este foi encontrado rapidamente dessa maneira. Mas interpretei mal o desafio e primeiro pensei que isso .substr(0,3)não era necessário. Portanto, pensando bem, essa pode não ser a melhor abordagem.
Arnauld 28/10
substr? slice!
28417 Neil
Minha abordagem trivial é de apenas <s> 2 </ s> 3 bytes mais por isso pode não ser o ideal mais por causa disso, mas ainda muito impressionante :)
HyperNeutrino
11
A edição de alguém removeu essa parte, mas uma das razões pelas quais eu inicialmente não a permitia é que eu estava querendo ver respostas como essa. Adoro a base de uso 34 para contornar a questão da capitalização e de diferentes formatos.
Qw3n 29/10/19
15

Javascript (ES6), 36 33 bytes

-3 bytes graças a @JustinMariner e @Neil

m=>31-new Date(m+31).getDate()%31

Desculpe @Arnauld, abusar da estranheza do JavaScript é mais curto do que suas conversões básicas sofisticadas.

Como funciona

Por alguma razão, o JavaScript permite inserir datas fora do mês especificado. O código conta quantos dias fora do mês a data é para determinar quantos dias existem no mês. Exemplos:
"FEB31"Thu Mar 02 200031 - 2 % 3129
"October31"Tue Oct 31 200031 - 31 % 3131

Casos de teste

Herman L
fonte
O MS Excel também faz isso. 0 de janeiro é sempre dezembro do último dia, portanto = DAY ("00/01/2017") resultará em 31
DavChana
Parece que o Javascript permite apenas cadeias de datas com dia até 31. Se você tentar digitar "32 de fevereiro", será traduzido para 2032-02-01 e se tentar forçá-lo com "0 de fevereiro-32" (ou uma sequência semelhante), apenas diz "Data inválida". Por incrível que pareça, se você definir o dia como 0 ("0 de fevereiro"), ele será traduzido para 01-02 2000-02 em vez de 2000-01-31.
TehPers
Você pode salvar um byte eliminando o espaço antes 31. Parece funcionar no Chrome como new Date("feb31")por exemplo.
23617 Justin Mariner
Na verdade, você provavelmente poderia usar o +31salvamento de três bytes no total. Porém, nada disso funciona no Firefox.
Neil
7

Bash , 21 bytes

cal $1|xargs|tail -c3

Experimente online!

Recebe a entrada como argumento da linha de comando e gera uma nova linha à direita. A contagem de dias para fevereiro depende da do ano atual

Requer a versão util-linux 2.29 do cal, que é a disponível no TIO . Também depende da localidade, portanto LC_TIME deve ser alterado em sistemas que não sejam o inglês (obrigado @Dennis pelo esclarecimento).

A idéia de passar xargsa tubulação para cala saída do compensador é dessa resposta do SO .

Justin Mariner
fonte
2
Isso não é apenas uma festa. Geralmente é sh, mas provavelmente é quase todas as implementações de shell que suportam pesquisas de caminho e pipes, em um sistema com cal, tail e xargs.
Kojiro # 30/17
5

Próton , 50 bytes

k=>31-((e=k.lower()[1to3])in"eprunov")-3*(e=="eb")

Experimente online!

-14 bytes graças a Jonathan Frech

Trinta dias têm setembro, abril, junho e novembro. Todo o resto tinha manteiga de amendoim. Todos, exceto minha avó; ela tinha um pequeno trike vermelho, mas eu roubei. muahahahahaha

(Estou esperando para contar essa piada (fonte: meu professor de matemática) há muito tempo neste site: D: D: D)

HyperNeutrino
fonte
@Riker oh whoops que não estavam lá quando comecei a escrever isso: /
HyperNeutrino
11
Há uma nova regra que você deve verificar para não ser um mês válido e retornar 0. Espero que seja excluído #
Level River St
11
Nevermind mudando Eu estou apagar essa parte
qw3n
Eu acho que você pode usar uma única string em 'sepaprjunnov'vez de uma lista de strings.
Jonathan Frech
@JonathanFrech talvez; Vou tentar que, graças
HyperNeutrino
4

C # (.NET Core) , 52 + 13 = 65 38 + 24 = 62 bytes

m=>D.DaysInMonth(1,D.Parse(1+m).Month)

Experimente online!

+24 para using D=System.DateTime;

Agradecimentos

-3 bytes graças a Grzegorz Puławski.

Ayb4btu
fonte
Isso funciona sem using System;? Ou você pode excluir isso da contagem de bytes?
quer
Matty @ Esse é um bom ponto; agora adicionado.
Ayb4btu
Dica tardia, mas com -3 bytes: using D=System.DateTime;e m=>D.DaysInMonth(1,D.Parse(1+m).Month)como aqui: tio.run/##jc5BSwMxEAXgs/…
Grzegorz Puławski
3

Python 3 , 60 bytes

x=input().lower()[1:3];print(31-(x in"eprunov")-3*(x=="eb"))

Experimente online!

Portando minha solução Proton

-10 bytes graças a totalmente humano

HyperNeutrino
fonte
Melhor do que o meu, heh #
Thomas Ward
11
um
totallyhuman
: P builtins às vezes são muito longos: P
HyperNeutrino 28/10
@totallyhuman oh rly uau. +1 thanks: P
HyperNeutrino 28/10
2
umm
totallyhuman
2

AWK , 45 44 bytes

L=tolower($1){$0=L~/v|p|un/?30:L~/f/?28:31}1

Experimente online!

Robert Benson
fonte
2

Python 3 - 93 86 84 82 bytes

Variantes de resposta (mostrando a progressão do tempo e bytes para cada um, com links TIO):

Resposta original (93 bytes)

-7 bytes graças a Jonathan Frech. (86 bytes)

Mais -2 bytes graças aos meus próprios testes adicionais dos monthrangeresultados, com o segundo valor sempre sendo o valor mais alto. (84 bytes) 1

-2 mais usando import calendar as ce referenciando-o com c.monthrange. (82 bytes, revisão atual )


lambda x:c.monthrange(1,time.strptime(x[:3],'%b')[1])[1];import time,calendar as c

Obviamente, não é tão bom quanto a resposta do HyperNeutrino, que não usa built-ins, mas isso ainda funciona.


Notas de rodapé

1 : Casos de teste via TIO.run mostrando a prova de como estou lidando com esses monthrangevalores, para um número variável de casos de teste do mês.

Thomas Ward
fonte
86 bytes .
Jonathan Frech 28/10
@JonathanFrech Thanks. Revisado mais para baixo por ter testado mais de como o monthrange funciona e também usando-o import ...,calendar as cpara não precisar digitar 'calendar' duas vezes.
Thomas Ward
2

Perl 5 , 47 + 1 ( -p) = 48 bytes

$_=substr$_,1,2;$_=31-("eprunov"=~/$_/i)-3*/b/i

Experimente online!

Xcali
fonte
-6 bytes: em ($_)=/.(..)/;vez de $_=substr$_,1,2;e ()ao redor "eprunov"=~/$_/ipode ser removido.
Nahuel Fouilleul 3/11
2

Haskell , 65 63 62 bytes

f.map((`mod`32).fromEnum)
f(_:b:c:_)|c<3=28|c>13,b>3=30
f _=31

Experimente online!

Abordagem de correspondência de padrões. A primeira linha é lidar com a distinção entre maiúsculas e minúsculas. Então retornamos 28se a terceira letra for menor que C (número 3), 30se a segunda letra for maior que C e a terceira maior que M, ou 31não.

Edit: -1 byte graças a Leo


Alternativa ( 65 64 bytes)

f s|let i#n=n<mod(fromEnum$s!!i)32=sum$29:[2|2#2]++[-1|2#13,1#3]

Experimente online!

Laikoni
fonte
11
Inteligente! Você pode salvar um byte, verificando c<3em vez de a==6(Fevereiro é o primeiro mês se você encomendá-los por sua terceira carta, seguido de Dezembro)
Leo
2

APL (Dyalog) , 32 bytes *

Função de prefixo tácito. Supõe ⎕IO( I ndex O rigin) 0, que é padrão em muitos sistemas.

31 28 30⊃⍨∘⊃'.p|un|no|f'S 11

Experimente online!

⍠1 caso insensível

1 retornar o comprimento do

⎕S PCRE S Earch para

'.p|un|no|f' any-char, "p" ou "un" ou "no" ou "f"

⊃⍨∘⊃ e use o primeiro elemento disso (0 se não houver) para escolher

31 28 30 esta lista

Portanto:

  • Ap r, S ep , J un e No v selecionarão o número no índice 2, ou seja, 30

  • F eb selecionará o número no índice 1, ou seja, 28

  • qualquer outra coisa selecionará o número no índice 0, ou seja, 31


* Usando Classic e contando como ⎕OPT.

Dyalog APL
fonte
2

Modelo Mediawiki, 19 bytes

{{#time:t|{{{1}}}}}
tsh
fonte
1

MATL , 22 bytes

14L22Y2c3:Z)Z{kj3:)km)

Experimente online!

Explicação

14L    % Push numeric array of month lengths: [31 28 ... 31]
22Y2   % Push cell array of strings with month names: {'January', ..., 'December'}
c      % Convert to 2D char array, right-padding with spaces
3:Z)   % Keep first 3 columns
Z{     % Split into cell array of strings, one each row
k      % Convert to lower case
j      % Input string
3:)    % Keep first 3 characcters
k      % Convert to lower case
m      % Ismember: gives a logical index with one match
)      % Use that as index into array of month lengths. Implicit display
Luis Mendo
fonte
1

Wolfram Language (Mathematica) , 46 30 bytes

#~NextDate~"Month"~DayCount~#&

Experimente online!

Dará um 28ou 29para fevereiro, dependendo se o ano atual é um ano bissexto.

Como funciona

Todos os comandos de data no Mathematica vai interpretar a entrada tal April, APR, ApRiL, e assim por diante como o primeiro dia do mês correspondente no ano corrente. (Como bônus, entradas como "February 2016"ou {2016,2}também funcionam conforme o esperado.)

#~NextDate~"Month"fornece o primeiro dia do mês seguinte e DayCounto número de dias entre seus dois argumentos. O número de dias entre 1º de abril e 1º de maio é 30, o número de dias em abril.

Misha Lavrov
fonte
1

Java 8 , 47 bytes

m->31-new java.util.Date(m+"31 1").getDate()%31

Experimente online!

Acabou usando a mesma idéia que a resposta JS de Herman Lauenstein , onde a data para 31 foi adiada para o próximo mês. Java requer um ano, para que tenha sido definido como 1.

Justin Mariner
fonte
1

Retina , 32 31 28 bytes

i`f
28
i`p|v|un
30
\D

^$
31

Experimente online! Editar: salvou 1 byte graças a @RobertBenson. Economizou 3 bytes graças a @ovs.

Neil
fonte
Eu acredito que você poderia salvar um byte usando 'f' em vez de 'eb'
Robert Benson
28 bytes
ovs 30/10
1

q / kdb +, 36 bytes

Solução:

28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#

Exemplos:

q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"January"
31
q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"FEB"
28
q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"jun"
30

Explicação:

Existem milhões de maneiras de esfolar um gato. Eu acho que é um pouco diferente dos outros. Pegue a segunda e a terceira letras da entrada, minúsculas e depois procure-as na string "ebeprunov". Se eles estiverem no local 0, então é fevereiro; se estiverem em um local> 0, terão 30 dias; se não estiverem na sequência, terão 31 dias.

28 30 31@2^1&first"ebeprunov"ss lower 1_3# / ungolfed solution
                                        3# / take first 3 items from list, January => Jan
                                      1_   / drop the first item from the list, Jan => an
                                lower      / lower-case, an => an
                  "ebeprunov"ss            / string-search in "ebeprunov", an => ,0N (enlisted null)
             first                         / take the first, ,0N => 0N
           1&                              / take max (&) with 1, 0N => 0N
         2^                                / fill nulls with 2, 0N => 2
        @                                  / index into
28 30 31                                   / list 28,30,31
rua
fonte
1

Excel VBA, 47 43 bytes

Função de janela imediata anônima do VBE que recebe entrada, como nome, abreviação ou número do mês, do intervalo [A1]e gera a duração desse mês no ano 2001 para a função de janela imediata do VBE.

?31-Day(DateValue("1 "&[A1]&" 1")+30)Mod 31

Versão antiga

d=DateValue(["1 "&A1&" 1"]):?DateAdd("m",1,d)-d
Taylor Scott
fonte
1

PHP, 38 33 + 1 32 + 1 bytes

Economizou 5 bytes graças a Titus

<?=date(t,strtotime("$argn 1"));

Executar como tubo com -nF

Experimente online!

Jo.
fonte
11
Ei, acho que você não precisa .' 1', parece funcionar no TIO sem ele!
Dom Hastings
11
28 + 1 bytes: <?=date(t,strtotime($argn));(executado como pipe com -nF)
Titus
3
@DomHastings - então, antes de publicar, eu testei para ver se funcionaria sem o .' 1', mas não estava funcionando. Depois de ver seu comentário, tentei descobrir o que havia feito de errado. Como eu estava executando o programa no dia 31 do mês, estava levando o 31º dia (atual) para qualquer mês que eu inseri, o que o colocaria além do mês atual. O dia 31 de fevereiro se transforma em 3 de março, portanto, o código retorna 31 (o número de dias em março). Por esse motivo, todo mês retornava 31. Portanto, ele funciona sem o .' 1'dia <= 28 do mês.
Jo.
Ahhh, eu esqueço como o PHP preenche os espaços em branco! Obrigado por explicar!
Dom Hastings
@ Titus Obrigado. Eu sou um novato em golfe! Não sei por que não percebi o 't'-> t. Além disso, eu tive que fazer várias pesquisas para descobrir como "correr como cano -nF", mas descobri isso (acho). :)
Jo.
0

Java (OpenJDK 8) , 126 bytes

s->{for(java.time.Month m:java.time.Month.values())if(m.name().startsWith(s.toUpperCase()))System.out.print(m.length(false));}

Experimente online!

Roberto Graham
fonte
11
Eu acho que você pode encurtar falsepara uma expressão booleana, como 1<0para salvar alguns bytes.
23717 Justin Mariner
0

QBIC , 49 35 bytes

?31-(instr(@aprjunsepnov feb`,;)%3)

Significativamente mais curto com alguns truques.

Explicação

?                          PRINT
31-(                       31 minus
  instr(                   the position of
                      ,;   our input string
    @aprjunsepnov feb`  )  in the string cntaining all non-31 months                                
    %3)                    modulo 3 (this yields a 1 for each month except feb=2)
steenbergh
fonte
0

Ruby , 45 bytes

->m{((Date.parse(m)>>1)-1).day}
require'date'

Experimente online!

Ruby Date.parseaceita o nome do mês por conta própria. O que normalmente seria um shift-right ( >>) realmente adiciona ao mês do Dateobjeto. A subtração afeta o dia do mês, que será retrocedido para o último dia do mês anterior.

Justin Mariner
fonte
0

Kotlin , 92 bytes

val d={m:String->arrayOf(0,31,30,30,31,30,31,28,31,0,30)[(m[1].toInt()+m[2].toInt())%32%11]}

Experimente online!

JohnWells
fonte