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.


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]

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

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


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


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)


@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


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.


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




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.



@ 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

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!


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.


2

Mediawiki-Vorlage, 19 Byte

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

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

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.




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

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

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!


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

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)


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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.