Quanti giorni in un mese?


25

Data una rappresentazione testuale (nome completo senza distinzione tra maiuscole e minuscole o abbreviazione di 3 caratteri) di un mese restituisce il numero di giorni del mese.

Ad esempio, december, DECe decdovrebbero essere tutti di ritorno 31.

Febbraio può avere 28 o 29 giorni.

Supponiamo che l'input sia un mese in una delle forme corrette.


19
Probabilmente dovresti elencare tutte le varianti dei nomi dei mesi che dovremmo essere in grado di accettare.
Giuseppe,

1
Per chiunque possa usarlo, le somme ordinali ASCII dei primi 3 caratteri abbassati sono uniche.
totalmente umano il

19
Era troppo, troppo presto per accettare una soluzione.
Shaggy,

5
penso che sarebbe meglio se l'input fosse solo il mese in un formato fisso, dato che il formato ora richiede sostanzialmente la conversione in un caso fisso e solo guardando le prime 3 lettere.
xnor

4
Così com'è sembra che si desidera risposte a gestire tutte le forme elencate - "Per esempio, december, DECe decdovrebbe tutte ritorno 31" - è che l'intenzione?
Jonathan Allan,

Risposte:


4

Pyke , 9 byte

l4C9@~%R@

Provalo qui!

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]

O 15 byte se sono richiesti tutti i formati di input

l43<C9 3L<@~%R@

Provalo qui!

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
Questo restituisce 31 per FEB.
Laikoni,

2
Credo @ punto di Laikoni è valido (restituisce anche 31 per Apr, Jun, Sep, e Nov), ma anche pensare che richiede un po 'di chiarimento nel PO (vedere la mia domanda ).
Jonathan Allan,

@JonathanAllan Bene, l'OP ha accettato questa risposta, quindi immagino sia valida?
Erik the Outgolfer,

4
@EriktheOutgolfer Non vorrei saltare a quella conclusione personalmente.
Jonathan Allan,

Avevo l'impressione che dovesse funzionare solo per una forma di input
Blue,

33

JavaScript (ES6),  48 47 44 43  42 byte

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

dimostrazione

Come?

Queste operazioni portano a una tabella di ricerca di 8 voci, che non sarebbe molto interessante se i valori fossero distribuiti casualmente. Ma qualsiasi risultato maggiore di 2 viene mappato a 31 giorni. Pertanto, solo le prime 3 voci devono essere archiviate in modo esplicito.

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
onestamente, come diavolo continui a fare queste incredibili strane osservazioni con roba matematica folle D: hai un programma per trovarle o sei semplicemente troppo bravo per il resto di noi
HyperNeutrino,

1
@HyperNeutrino La prima cosa che provo è sempre trovare una conversione di base, seguita da una moltiplicazione opzionale seguita da una o più operazioni del modulo. Questo è stato trovato rapidamente in quel modo. Ma ho letto male la sfida e per prima cosa ho pensato che .substr(0,3)non fosse necessario. Quindi, ripensandoci, questo potrebbe non essere l'approccio migliore.
Arnauld,

substr? slice!
Neil,

Il mio approccio banale è solo <s> 2 </s> di 3 byte in più, quindi potrebbe non essere più ottimale per questo, ma comunque molto impressionante :)
HyperNeutrino,

1
La modifica di qualcuno ha rimosso quella parte, ma uno dei motivi per cui inizialmente non lo avevo permesso è che volevo vedere risposte come questa. Adoro usare la base 34 per eludere il problema della capitalizzazione e dei diversi formati.
qw3n

15

Javascript (ES6), 36 33 byte

-3 byte grazie a @JustinMariner e @Neil

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

Spiacente @Arnauld, abusare della stranezza di JavaScript è più breve delle tue fantasiose conversioni di base.

Come funziona

Per qualche motivo, JavaScript consente di inserire date al di fuori del mese specificato. Il codice conta quanti giorni al di fuori del mese è la data per determinare quanti giorni ci sono nel mese. Esempi:
"FEB31"Thu Mar 02 200031 - 2 % 3129
"October31"Tue Oct 31 200031 - 31 % 3131

Casi test


Anche MS Excel lo fa. 0 gennaio è sempre l'ultimo giorno di dicembre, quindi = GIORNO ("00/01/2017") si tradurrà in 31
DavChana,

Sembra che Javascript consenta solo stringhe di date in cui il giorno è fino a 31. Se si tenta di inserire "feb 32", si traduce in 2032-02-01 e se si tenta di forzarlo con "0-feb-32" (o una stringa simile), indica semplicemente "Data non valida". Stranamente, se si imposta il giorno su 0 ("feb 0"), si traduce in 2000-02-01 anziché 2000-01-31.
TehPers,

Potresti riuscire a salvare un byte rilasciando prima lo spazio 31. Sembra funzionare in Chrome come new Date("feb31")ad esempio.
Justin Mariner,

In effetti, probabilmente potresti usare il +31salvataggio complessivo di tre byte. Niente di tutto questo funziona in Firefox però.
Neil,


7

Bash , 21 byte

cal $1|xargs|tail -c3

Provalo online!

Accetta input come argomento della riga di comando e output con una nuova riga finale. Il conteggio dei giorni per febbraio dipende da quello dell'anno in corso

Richiede la versione util-linux 2.29 di cal, che è quella disponibile su TIO . Inoltre dipende dalle impostazioni locali, quindi LC_TIME deve essere modificato su sistemi non inglesi (grazie a @Dennis per chiarimenti).

L'idea di passare attraverso il canale xargsper tagliare call'output proviene da questa risposta SO .


2
Questo non è solo bash. Generalmente è sh, ma probabilmente è quasi tutte le implementazioni della shell che supportano ricerche di percorsi e pipe, su un sistema con cal, tail e xargs.
Kojiro,

5

Proton , 50 byte

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

Provalo online!

-14 byte grazie a Jonathan Frech

Trenta giorni ha settembre, aprile, giugno e novembre. Tutto il resto aveva burro di arachidi. Tutti tranne mia nonna; aveva un piccolo trike rosso, ma l'ho rubato. muahahahahaha

(Sto aspettando di raccontare quella battuta (fonte: il mio professore di matematica) da anni su questo sito: D: D: D)


@Riker oh whoops che non c'era quando ho iniziato a scrivere questo: /
HyperNeutrino

1
C'è una nuova regola che devi controllare per un mese non valido e restituire 0. Spero che venga cancellato
Level River St

1
Non importa di cambiare, sto cancellando quella parte
qw3n,

Penso che puoi usare una singola stringa 'sepaprjunnov'anziché un elenco di stringhe.
Jonathan Frech,

@JonathanFrech forse; Ci proverò, grazie
HyperNeutrino,

4

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

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

Provalo online!

+24 per using D=System.DateTime;

Ringraziamenti

-3 byte grazie a Grzegorz Puławski.


Funziona senza using System;? O puoi escluderlo dal conteggio dei byte?
Matty,

@Matty Questo è un buon punto; ora aggiunto.
Ayb4btu,

Suggerimento in ritardo, ma -3 byte: using D=System.DateTime;e m=>D.DaysInMonth(1,D.Parse(1+m).Month)come qui: tio.run/##jc5BSwMxEAXgs/…
Grzegorz Puławski




2

Python 3 - 93 86 84 82 byte

Varianti di risposta (che mostrano la progressione di tempo e byte per ciascuno, con collegamenti TIO):

Risposta originale (93 byte)

-7 byte grazie a Jonathan Frech. (86 byte)

-2 byte in più grazie al mio ulteriore test dei monthrangerisultati, con il secondo valore sempre il valore più alto. (84 byte) 1

-2 più usando import calendar as ce facendo riferimento a c.monthrange. (82 byte, revisione corrente )


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

Ovviamente non è carino come la risposta di HyperNeutrino che non usa i built-in, ma funziona ancora.


Le note

1 : Casi di test tramite TIO.run che mostrano la prova di come sto gestendo quei monthrangevalori, per un numero variabile di casi di test mensili.



@JonathanFrech Grazie. Ulteriormente rivisto al ribasso dal fatto di aver testato di più su come funziona la gamma mensile, e anche di usarlo import ...,calendar as cper non dover digitare "calendario" due volte.
Thomas Ward,


2

Haskell , 65 63 62 byte

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

Provalo online!

Approccio di corrispondenza del modello. La prima riga è gestire l'insensibilità al maiuscolo / minuscolo. Quindi restituiamo 28se la terza lettera è più piccola di C (numero 3), 30se la seconda lettera è più grande di C e la terza più grande di M, oppure31 altrimenti.

Modifica: -1 byte grazie a Leo


Alternativa ( 65 64 byte)

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

Provalo online!


1
Uno intelligente! Puoi salvare un byte controllando c<3invece di a==6(febbraio è il primo mese se li ordini con la loro terza lettera, seguita da dicembre)
Leone

2

APL (Dyalog) , 32 byte *

Funzione prefisso tacita. Assume ⎕IO( I NDICE O rigine) 0, che è di default su molti sistemi.

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

Provalo online!

⍠1 caso insensibilmente

1 restituisce la lunghezza di

⎕S PCRE S earch per

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

⊃⍨∘⊃ e usa il primo elemento (0 se nessuno) da cui scegliere

31 28 30 questo elenco

Così:

  • Ap r, S ep , J un e No v selezioneranno il numero in corrispondenza dell'indice 2, ovvero 30

  • F eb selezionerà il numero all'indice 1, ovvero 28

  • qualsiasi altra cosa selezionerà il numero all'indice 0, ovvero 31


* Utilizzando Classic e contando come ⎕OPT.


2

Modello di Mediawiki, 19 byte

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

1

MATL , 22 byte

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

Provalo online!

Spiegazione

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 byte

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

Provalo online!

Darà uno 28o 29per febbraio a seconda che l'anno in corso sia un anno bisestile.

Come funziona

Tutti i comandi di data in Mathematica interpreteranno ingresso quali April, APR, ApRiLe così via come il primo giorno del mese corrispondente dell'anno in corso. (Come bonus, inserisci come "February 2016"o{2016,2} funziona anche come previsto.)

#~NextDate~"Month"indica il primo giorno del mese successivo e DayCountindica il numero di giorni tra i suoi due argomenti. Il numero di giorni tra il 1 aprile e il 1 maggio è 30, il numero di giorni nel mese di aprile.




1

q / kdb +, 36 byte

Soluzione:

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

Esempi:

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

Spiegazione:

Ci sono milioni di modi per scuoiare un gatto. Penso che sia leggermente diverso dagli altri. Prendi la seconda e la terza lettera dell'input, mettile in minuscolo, quindi cercale nella stringa "ebeprunov". Se si trovano nella posizione 0, allora è febbraio, se si trovano in una posizione> 0 sono di 30 giorni, se non sono nella stringa, sono di 31 giorni.

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 byte

Funzione di finestra immediata VBE anonima che accetta input, come nome del mese, abbreviazione o numero, dall'intervallo [A1]e genera la durata di quel mese dell'anno 2001 alla funzione di finestra immediata VBE.

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

Vecchia versione

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

1

PHP, 38 33 + 1 32 + 1 byte

5 byte salvati grazie a Titus

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

Esegui come pipe con -nF

Provalo online!


1
Ehi, non penso che tu abbia bisogno .' 1', sembra funzionare su TIO senza di essa!
Dom Hastings,

1
28 + 1 byte: <?=date(t,strtotime($argn));(eseguito come pipe con -nF)
Titus

3
@DomHastings - quindi, prima di pubblicare, avevo testato per vedere se avrebbe funzionato senza il .' 1', ma non funzionava. Dopo aver visto il tuo commento, ho cercato di capire cosa avevo fatto di sbagliato. Poiché lo stavo eseguendo il 31 del mese, ci voleva il 31 ° (attuale) giorno per ogni mese che inserivo, il che lo avrebbe messo oltre il mese corrente. Il 31 febbraio si trasforma in 3 marzo, quindi il codice restituisce 31 (il numero di giorni a marzo). Per questo motivo, ogni mese restituiva 31. Quindi, funziona senza il .' 1'<= 28 del mese.
Jo.

Ahhh, mi dimentico di come PHP riempie gli spazi vuoti! Grazie per aver spiegato!
Dom Hastings,

@Titus Grazie. Sono un principiante del golf! Non so perché non ho realizzato il 't'-> t. Inoltre, ho dovuto fare un sacco di ricerche per capire come "correre come una pipa -nF" ma l'ho capito (penso). :)
Jo.


0

QBIC , 49 35 byte

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

Significativamente più breve con qualche trucco.

Spiegazione

?                          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

Rubino , 45 byte

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

Provalo online!

Ruby Date.parseaccetta il nome di un mese da solo. Quello che normalmente sarebbe uno spostamento a destra ( >>) in realtà si aggiunge al mese Datedell'oggetto. La sottrazione influisce sul giorno del mese, che andrà a capo all'ultimo giorno del mese precedente.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.