Wie viele Tage im Monat?

25

Bei einer Textdarstellung (vollständiger Name ohne Berücksichtigung der Groß- / Kleinschreibung oder Abkürzung mit 3 Zeichen) eines Monats wird die Anzahl der Tage im Monat zurückgegeben.

Zum Beispiel december, DECund decsollte alle 31 zurück.

Februar kann entweder 28 oder 29 Tage haben.

Angenommen, die Eingabe ist ein Monat in einer der richtigen Formen.

qw3n
quelle
19
Sie sollten wahrscheinlich alle Variationen der Monatsnamen auflisten, die wir akzeptieren sollten.
Giuseppe
1
Für jeden, der es verwenden kann, sind die ASCII-Ordnungssummen der ersten drei Zeichen eindeutig.
Totalhuman
19
Das war viel zu früh, um eine Lösung zu akzeptieren.
Shaggy
5
Ich denke, das wäre schöner, wenn die Eingabe nur der Monat in einem festen Format wäre, da das Format jetzt im Grunde genommen das Konvertieren in einen festen Fall und nur das Betrachten der ersten drei Buchstaben erfordert.
Xnor
4
Wie es aussieht es sieht aus wie Sie wollen Antworten alle aufgeführten Formen zu handhaben - „Zum Beispiel december, DECund decsollten alle Rückkehr 31“ - Ist das die Absicht?
Jonathan Allan

Antworten:

4

Pyke , 9 Bytes

l4C9@~%R@

Probieren Sie es hier aus!

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]

Oder 15 Bytes, wenn alle Eingabeformate erforderlich sind

l43<C9 3L<@~%R@

Probieren Sie es hier aus!

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]
Blau
quelle
6
Dies ergibt 31 für FEB.
Laikoni
2
Ich glaube @ Laikoni des Punkt gültig ist (es gibt auch 31 Apr, Jun, Sep, und Nov) , aber auch denken , dass es eine wenig Klärung im OP erfordert (siehe meine Frage ).
Jonathan Allan
@ JonathanAllan Nun, das OP hat diese Antwort akzeptiert, also denke ich, dass sie gültig ist?
Erik der Outgolfer 29.10.17
4
@EriktheOutgolfer Ich würde nicht persönlich zu dieser Schlussfolgerung springen.
Jonathan Allan
Ich hatte den Eindruck, dass es nur für eine Form von Eingaben funktionieren musste
Blue
33

JavaScript (ES6),  48 47 44 43  42 Byte

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

Demo

Wie?

Diese Operationen führen zu einer Nachschlagetabelle von 8 Einträgen, was nicht sehr interessant wäre, wenn die Werte zufällig verteilt wären. Jedes Ergebnis, das größer als 2 ist, wird auf 31 Tage abgebildet . Daher müssen nur die ersten 3 Einträge explizit gespeichert werden.

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
quelle
14
ehrlich , wie auf der Erde tun halten Sie diese erstaunlichen seltsame Eingaben mit verrückten Mathe Sachen D zu machen: Sie haben ein Programm diese oder sind finden Sie einfach zu gut für den Rest von uns
HyperNeutrino
1
@HyperNeutrino Das erste, was ich versuche, ist immer, eine Basisumwandlung zu finden, gefolgt von einer optionalen Multiplikation, gefolgt von einer oder mehreren Modulo-Operationen. Dieser wurde so schnell gefunden. Aber ich habe die Herausforderung falsch verstanden und zuerst gedacht, dass dies .substr(0,3)nicht erforderlich ist. Nach dem zweiten Gedanken ist dies möglicherweise nicht der beste Ansatz.
Arnauld
substr? slice!
Neil
Mein trivialer Ansatz ist nur <s> 2 </ s> 3 Bytes länger, daher ist er möglicherweise nicht mehr optimal, aber dennoch sehr beeindruckend :)
HyperNeutrino
1
Jemand hat diesen Teil entfernt, aber einer der Gründe, warum ich ihn ursprünglich nicht zugelassen habe, war, dass ich Antworten wie diese sehen wollte. Ich liebe die Verwendung von Base 34, um das Thema Großschreibung und verschiedene Formate zu umgehen.
qw3n
15

Javascript (ES6), 36 33 Bytes

-3 Bytes dank @JustinMariner und @Neil

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

Entschuldigung @Arnauld, der Missbrauch von JavaScript ist kürzer als deine ausgefallenen Basis-Conversions.

Wie es funktioniert

Aus irgendeinem Grund ermöglicht JavaScript die Eingabe von Daten außerhalb des angegebenen Monats. Der Code zählt, wie viele Tage außerhalb des Monats das Datum ist, um zu bestimmen, wie viele Tage es in dem Monat gibt. Beispiele:
"FEB31"Thu Mar 02 200031 - 2 % 3129
"October31"Tue Oct 31 200031 - 31 % 3131

Testfälle

Herman L
quelle
MS Excel macht das auch. Januar 0 ist immer der letzte Tag im Dezember, also ergibt = DAY ("00/01/2017") 31
DavChana 29.10.17
Es sieht so aus, als würde Javascript nur Datumsstrings zulassen, bei denen der Tag bis zu 31 ist. Wenn Sie versuchen, "feb 32" einzugeben, wird dies zu 2032-02-01 übersetzt, und wenn Sie versuchen, es mit "0-feb-32" zu erzwingen (oder eine ähnliche Zeichenfolge), es heißt nur "Ungültiges Datum". Seltsamerweise wird der Tag, wenn Sie ihn auf 0 setzen ("feb 0"), in den 01.02.2000 und nicht in den 31.01.2000 übersetzt.
TehPers
Möglicherweise können Sie ein Byte speichern, indem Sie den Speicherplatz zuvor löschen 31. Es scheint zum new Date("feb31")Beispiel in Chrome zu funktionieren .
Justin Mariner
Tatsächlich könnten Sie wahrscheinlich +31drei Bytes insgesamt sparen. Nichts davon funktioniert jedoch in Firefox.
Neil
7

Bash , 21 Bytes

cal $1|xargs|tail -c3

Probieren Sie es online!

Nimmt Eingaben als Befehlszeilenargument und gibt sie mit einer nachgestellten Newline aus. Die Tageszählung für Februar hängt von der des laufenden Jahres ab

Benötigt die Version util-linux 2.29 von cal, die auf TIO verfügbar ist . Ist auch vom Gebietsschema abhängig, daher muss LC_TIME auf nicht englischen Systemen geändert werden (danke @Dennis für die Klarstellung).

Aus dieser SO-Antwort ergibt sich die Idee , die Ausgabe von xargstrim weiterzuleiten .cal

Justin Mariner
quelle
2
Dies ist nicht nur eine Bash. Im Allgemeinen ist es sh, aber es ist wahrscheinlich fast jede Shell-Implementierung, die Path-Lookups und Pipes auf einem System mit cal, tail und xargs unterstützt.
Kojiro
5

Proton , 50 Bytes

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

Probieren Sie es online!

-14 Bytes dank Jonathan Frech

Dreißig Tage haben September, April, Juni und November. Der ganze Rest hatte Erdnussbutter. Alle außer meiner Großmutter; Sie hatte ein kleines rotes Trike, aber ich habe es gestohlen. muahahahahaha

(Ich habe lange darauf gewartet, diesen Witz (Quelle: mein Mathematikprofessor) auf dieser Website zu erzählen: D: D: D)

HyperNeutrino
quelle
@Riker oh whoops das war nicht da, als ich anfing zu schreiben: /
HyperNeutrino
1
Es gibt eine neue Regel, nach der Sie überprüfen müssen, ob ein Monat ungültig ist und 0 zurückgeben. Ich hoffe, er wird gelöscht
Level River St
1
Keine Sorge,
Ich denke, Sie können eine einzelne Zeichenfolge 'sepaprjunnov'anstelle einer Liste von Zeichenfolgen verwenden.
Jonathan Frech
@ JonathanFrech vielleicht; Ich werde es versuchen, danke
HyperNeutrino
4

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

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

Probieren Sie es online!

+24 für using D=System.DateTime;

Danksagung

-3 Bytes dank Grzegorz Puławski.

Ayb4btu
quelle
Funktioniert das ohne using System;? Oder können Sie das von der Byteanzahl ausschließen?
Matty
@Matty Das ist ein guter Punkt; jetzt hinzugefügt.
Ayb4btu
Später Tipp, aber -3 Bytes: using D=System.DateTime;und m=>D.DaysInMonth(1,D.Parse(1+m).Month)wie hier: tio.run/##jc5BSwMxEAXgs/…
Grzegorz Puławski
3

Python 3 , 60 Bytes

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

Probieren Sie es online!

Portierung meiner Proton-Lösung

-10 bytes dank totalhuman

HyperNeutrino
quelle
Besser als meins heh
Thomas Ward
1
um
totalhuman
: P builtins sind manchmal zu lang: P
HyperNeutrino
@ totallyhuman oh rly wow. +1 Danke: P
HyperNeutrino
2
umm
totalhuman
2

Python 3 - 93 86 84 82 Bytes

Antwortvarianten (mit Angabe des Zeitverlaufs und der Bytes für jede Antwort mit TIO-Links):

Ursprüngliche Antwort (93 Bytes)

-7 Bytes dank Jonathan Frech. (86 Bytes)

-2 weitere Bytes dank meiner eigenen weiteren Prüfung der monthrangeErgebnisse, wobei der zweite Wert immer der höhere Wert ist. (84 Bytes) 1

-2 mehr durch Verwenden import calendar as cund Referenzieren mit c.monthrange. (82 Bytes, aktuelle Revision )


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

Offensichtlich nicht so schön wie die Antwort von HyperNeutrino, die keine eingebauten Funktionen verwendet, aber das funktioniert immer noch.


Fußnoten

1 : Testfälle über TIO.run mit dem Beweis, wie ich mit diesen monthrangeWerten umgehe , für eine unterschiedliche Anzahl von monatlichen Testfällen.

Thomas Ward
quelle
86 Bytes .
Jonathan Frech
@ JonathanFrech Danke. Weiter nach unten korrigiert, indem ich mehr über die Funktionsweise von monthrange getestet habe und auch verwendet import ...,calendar as chabe, um "calendar" nicht zweimal eingeben zu müssen.
Thomas Ward
2

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

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

Probieren Sie es online!

Xcali
quelle
-6 Bytes: ($_)=/.(..)/;statt $_=substr$_,1,2;und ()um "eprunov"=~/$_/ikönnen entfernt werden.
Nahuel Fouilleul
2

Haskell , 65 63 62 Bytes

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

Probieren Sie es online!

Pattern Matching Ansatz. In der ersten Zeile wird die Groß- und Kleinschreibung behandelt. Dann kehren wir zurück, 28wenn der dritte Buchstabe kleiner als C (Nummer 3) ist, 30wenn der zweite Buchstabe größer als C und der dritte größer als M ist, oder auf 31andere Weise.

Edit: -1 Byte dank Leo


Alternative ( 65 - 64 Byte)

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

Probieren Sie es online!

Laikoni
quelle
1
Schlauer! Sie können durch die Kontrolle eine Byte speichern c<3statt a==6(Februar ist der erste Monat , wenn man sich nach ihrem dritten Brief bestellen, gefolgt von Dezember)
Leo
2

APL (Dyalog) , 32 Byte *

Tacit-Präfix-Funktion. Angenommen ⎕IO( I ndex O rigin) 0, was auf vielen Systemen Standard ist.

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

Probieren Sie es online!

⍠1 Groß- und Kleinschreibung wird nicht berücksichtigt

1 Geben Sie die Länge der zurück

⎕S PCRE S uche nach

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

⊃⍨∘⊃ und verwenden Sie das erste Element davon (0, falls keines vorhanden), um eine Auswahl zu treffen

31 28 30 diese Liste

Somit:

  • Ap r, S ep , J un und No v wählen die Nummer bei Index 2, nämlich 30

  • F eb wählt die Nummer bei Index 1 aus, nämlich 28

  • Alles andere wählt die Nummer bei Index 0, nämlich 31


* Mit Classic und Zählen als ⎕OPT.

Dyalog APL
quelle
2

Mediawiki-Vorlage, 19 Byte

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

MATL , 22 Bytes

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

Probieren Sie es online!

Erläuterung

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
quelle
1

Wolfram Language (Mathematica) , 46 30 Bytes

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

Probieren Sie es online!

Wird entweder 28oder geben29 für Februar an, je nachdem, ob das aktuelle Jahr ein Schaltjahr ist.

Wie es funktioniert

Alle Daten Befehle in Mathematica interpretieren Eingabe so April, APR, ApRiL, und so weiter wie am ersten Tag des entsprechenden Monats im laufenden Jahr. (Als Bonus können Eingaben wie "February 2016"oder{2016,2} funktioniert die erwartet auch.)

#~NextDate~"Month"gibt den ersten Tag des Monats danach an und DayCountgibt die Anzahl der Tage zwischen den beiden Argumenten an. Die Anzahl der Tage zwischen dem 1. April und dem 1. Mai beträgt 30, die Anzahl der Tage im April.

Mischa Lawrow
quelle
1

Java 8 , 47 Bytes

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

Probieren Sie es online!

Endete mit der gleichen Idee wie Herman Lauensteins JS-Antwort , bei der das Setzen des Datums auf den 31. in den nächsten Monat verschoben wurde. Java benötigt ein Jahr, daher wurde dies auf gesetzt 1.

Justin Mariner
quelle
1

Retina , 32 31 28 Bytes

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

^$
31

Probieren Sie es online! Bearbeiten: 1 Byte dank @RobertBenson gespeichert. 3 Bytes dank @ovs gespart.

Neil
quelle
Ich glaube, Sie könnten ein Byte speichern, indem Sie 'f' anstelle von 'eb' verwenden
Robert Benson
28 Bytes
Ovs
1

q / kdb +, 36 Bytes

Lösung:

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

Beispiele:

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

Erläuterung:

Es gibt eine Million Möglichkeiten, eine Katze zu häuten. Ich denke ist etwas anders als die anderen. Nehmen Sie den 2. und 3. Buchstaben der Eingabe, schreiben Sie sie in Kleinbuchstaben und schlagen Sie sie in der Zeichenfolge nach "ebeprunov". Wenn sie sich an Position 0 befinden, ist dies der Februar. Wenn sie sich an einer Position> 0 befinden, sind sie 30 Tage alt. Wenn sie nicht in der Zeichenfolge enthalten sind, sind sie 31 Tage alt.

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
Streetster
quelle
1

Excel VBA, 47 43 Bytes

Anonyme VBE-Sofortfensterfunktion, die die Eingabe als Monatsname, Abkürzung oder Nummer aus dem Bereich übernimmt [A1]und die Länge dieses Monats im Jahr 2001 an die VBE-Sofortfensterfunktion ausgibt.

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

Alte Version

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

PHP, 38 33 + 1 32 + 1 Bytes

5 Bytes gespart dank Titus

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

Als Rohr mit laufen lassen -nF

Probieren Sie es online!

Jo.
quelle
1
Hey, ich glaube nicht, dass du es brauchst .' 1', es scheint ohne TIO zu funktionieren!
Dom Hastings
1
28 + 1 Bytes: <?=date(t,strtotime($argn));(als Pipe mit ausgeführt -nF)
Titus
3
@DomHastings - also, bevor ich gepostet habe, hatte ich getestet, ob es ohne das funktionieren würde .' 1', aber es funktionierte nicht. Nachdem ich Ihren Kommentar gesehen hatte, versuchte ich herauszufinden, was ich falsch gemacht hatte. Da ich es am 31. des Monats ausführte, dauerte es für jeden Monat, den ich eingab, den 31. (aktuellen) Tag, wodurch es über den aktuellen Monat hinausging. Der 31. Februar wird zum 3. März, sodass der Code 31 (die Anzahl der Tage im März) zurückgibt. Aus diesem Grund kehrte jeder Monat 31 zurück. Also funktioniert es ohne .' 1'jeden Tag <= 28. des Monats.
Jo.
Ahhh, ich vergesse, wie PHP die Lücken füllt! Danke fürs Erklären!
Dom Hastings
@Titus Danke. Ich bin so ein Golf-Neuling! Ich weiß nicht, warum ich das 't'-> nicht realisiert habe t. Außerdem musste ich ein paar Mal suchen, um herauszufinden, wie man "als Pipe mit -nF" läuft, aber ich habe es herausgefunden (glaube ich). :)
Jo.
0

Java (OpenJDK 8) , 126 Byte

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

Probieren Sie es online!

Roberto Graham
quelle
1
Ich denke, Sie können falsezu einem booleschen Ausdruck verkürzen 1<0, um ein paar Bytes zu sparen.
Justin Mariner
0

QBIC , 49 35 Bytes

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

Deutlich kürzer mit einigen Tricks.

Erläuterung

?                          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
quelle
0

Ruby , 45 Bytes

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

Probieren Sie es online!

Ruby's Date.parseakzeptiert einen eigenen Monatsnamen. Was normalerweise eine Rechtsverschiebung ( >>) wäre, wird dem Monat des DateObjekts hinzugefügt. Die Subtraktion wirkt sich auf den Tag des Monats aus, der auf den letzten Tag des Vormonats zurückgeht.

Justin Mariner
quelle