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.


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]

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

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


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 .


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)


@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.


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




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.



@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

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!


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.


2

Modelo Mediawiki, 19 bytes

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

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

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.




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

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

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!


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

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)


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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.