Der letzte Montag

27

Montag, 31. Oktober, ist Halloween. Und es hat mich zum Nachdenken gebracht - ich frage mich, in welchen anderen Monaten der letzte Tag des Monats auch ein Montag sein soll.

Eingang

  • Eine positive ganze Zahl in einem beliebigen Format, die ein Jahr darstellt 10000 > y > 0.
  • Die Eingabe kann mit Nullen aufgefüllt werden (z. B. 0025für das Jahr)25 ) werden.

Ausgabe

  • Eine Liste der Monate des Jahres, in denen der letzte Tag des Monats ein Montag ist.
  • Dies können Monatsnamen (zB January, March, October), Kurznamen ( Jan, Mar, Oct) oder Zahlen (1, 3, 10 ) sein, als separate Zeilen oder als Liste oder mit Trennzeichen usw., sofern dies für den Leser eindeutig ist.
  • Das Ausgabeformat muss konsistent sein:
    • Für alle Jahreingaben (dh, Sie können für einige Eingaben keine Monatsnamen und für andere Eingaben keine Monatsnummern ausgeben)
    • Sowie pro Ausgabe konsistent (dh, Sie können nicht 1für Januarydieselbe Ausgabe wie Julfür ausgeben)July )
    • Wählen Sie im Grunde ein Format und bleiben Sie dabei.

Regeln

  • Nehmen wir den Gregorianischen Kalender für die Eingabe / Ausgabe an, sogar bis auf y = 1.
  • Schaltjahre müssen ordnungsgemäß berücksichtigt werden (zur Erinnerung: jedes Jahr durch 4 teilbar, außer nicht durch 100 teilbar, es sei denn, auch durch 400 - 1700, 1800, 1900 teilbar, alle waren keine Schaltjahre, aber 2000 waren es).
  • Sie können beliebige integrierte Tools oder andere Tools zur Datumsberechnung verwenden.
  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
  • Standard-Schlupflöcher sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.

Beispiele

   1 --> Apr, Dec
 297 --> May
1776 --> Sep
2000 --> Jan, Jul
2016 --> Feb, Oct
3385 --> Jan, Feb, Oct

Bestenliste

AdmBorkBork
quelle
1
Verwandte 1 und Verwandte 2 .
AdmBorkBork
1
Verwandte, aber keine Duplikate oder?
ElPedro
@ ElPedro Verbunden, aber keine Duplikate. Die erste Option lässt keine integrierten Funktionen zu und fordert eine feste Kombination aus Datum und Tag (Freitag, den 13.) an, während die zweite
Option
Entschuldigung @TimmD. Mein Missverständnis deines Kommentars.
ElPedro
1
@ElPedro Kein Problem! Ich hätte lieber eine Frage und es wäre klar, als keine Frage zu haben und etwas Unklares zu haben.
AdmBorkBork

Antworten:

2

Dyalog APL mit DFNS ‚s cal , Version 15.0: 22; Version 16.0: 19 Bytes

Die cal-Funktion wird mit einer Standardinstallation geliefert )copy dfns. Geben Sie einfach ein .

Version 15.0: ∊⎕{⍵/⍨2=≢⍎⊢⌿cal⍺⍵}¨⍳12

eintreten (abflachen)

⎕{... numerische Eingabe als linkes Argument für die folgende anonyme Funktion, wobei jeder der Werte auf der rechten Seite als rechtes Argument verwendet wird

⍵/⍨ das Argument if (gibt eine leere Liste aus, wenn nicht)

2= zwei (nämlich Sonntag und Montag) ist gleich

die Bilanz von

die Zahlen in

⊢⌿ die unterste Reihe von

cal der Kalender für

⍺⍵ Argument Jahr links, Argument Monat rechts, letzteres ist

⍳12 1 bis 12

Version 16.0: ⍸2=⎕{≢⍎⊢⌿cal⍺⍵}¨⍳12

die Indizes wo

2= zwei gleich (nämlich Sonntag und Montag)

⎕{... numerische Eingabe als linkes Argument für die folgende anonyme Funktion, wobei jeder der Werte auf der rechten Seite als rechtes Argument verwendet wird

die Bilanz von

die Zahlen in

⊢⌿ die unterste Reihe von

cal der Kalender für

⍺⍵ Argument Jahr links, Argument Monat rechts, letzteres ist

⍳12 1 bis 12

Adam
quelle
19

JavaScript (Firefox 30+), 112 109 103 95 Byte

Schau ma, keine eingebauten!

y=>[for(m of(i=0,y%4|y%400*!(y%100)&&6)+"63153042641")if((i++,y+(y>>2)-(y/100|0)*3/4|0)%7==m)i]

Hier ist eine 107-Byte-ES6-Version:

y=>[...(y%4|y%400*!(y%100)&&6)+"63153042641"].map((m,i)=>(y+(y>>2)-(y/100|0)*3/4|0)%7-m?0:i+1).filter(x=>x)

Und hier ist mein vorheriger Versuch, 123 113 Bytes ES6:

y=>[(l=y%4|y%400*!(y%100))?[7]:[1,7],[4,12],[9],[3,6],[8,11],[5],l?[1,2,10]:[2,10]][(y+(y>>2)-(y/100|0)*3/4|0)%7]

Erläuterung

Der Wochentag eines bestimmten Jahres wird wie folgt berechnet:

y+(y>>2)-(y/100|0)*3/4|0)%7

Mit anderen Worten:

  • Nehmen y .
  • Addiere die Anzahl der 4. Jahre davor y(y>>2 ).
  • Subtrahieren Sie die Anzahl der 100 Jahre vor y(y/100|0 ).
  • Addiere zurück in die Zahl von 400 Jahren zuvor y; das ist 1/4 von y/100|0, also verwenden wir *3/4|0.

Dann modulieren wir das Ergebnis um 7. Wenn wir den 0Sonntag, 1den Montag usw. bedeuten lassen, entspricht das Ergebnis dem Wochentag des 31. Dezember dieses Jahres. Daher wollen wir für Dezember prüfen, ob das Ergebnis ist 1. Dies gibt uns das letzte Zeichen in der Zeichenfolge.

Der letzte Tag im November liegt 31 Tage vor dem letzten Tag im Dezember. Dies bedeutet, dass für den letzten Tag im November, der ein Montag sein soll, der 31. Dezember ein(1 + 31) % 7 = 4 = Donnerstag sein muss.

Dieser Vorgang wird wiederholt, bis wir auf März (a 3) zurückkommen . Unabhängig davon, ob es einen Schalttag gibt oder nicht, der letzte Tag im Februar liegt 31 Tage vor dem letzten Tag im März, daher können wir dies auch berechnen (3 + 31) % 7 = 6. Der schwierige Teil ist, den richtigen Wert für Januar zu finden:

  • Wenn es ein Schaltjahr ist, liegt der letzte Tag im Januar 29 Tage vor dem letzten Tag im Februar (6 + 29) % 7 = 0 .
  • Andernfalls ist es 28 Tage vor dem letzten Tag des Monats Februar (6 + 28) % 7 = 6.

Wir können mit dem folgenden Snippet berechnen, ob es sich um ein Schaltjahr handelt oder nicht:

!(y%400)|y%100*!(y%4)

Dies gibt an, 0ob ykein Schaltjahr ist, und ansonsten eine positive ganze Zahl. Das führt uns zu

!(y%400)|y%100*!(y%4)?0:6

zur Berechnung des Januartages. Wir können es jedoch besser machen, indem wir die Bedingungen umkehren:

y%4|y%400*!(y%100)?6:0

Da das falsche Ergebnis sowieso immer 0 ist, können wir es auf reduzieren

y%4|y%400*!(y%100)&&6

ein weiteres wertvolles Byte speichern.

Zusammengenommen durchlaufen wir alle Zeichen in der Zeichenfolge und prüfen, ob jedes Zeichen dem Wochentag des 31. Dezembers entspricht. Wir behalten die Indizes der übereinstimmenden bei und geben am Ende dieses Arrays zurück. Und so machen Sie Schaltjahresberechnungen ohne Einbauten.

ETHproductions
quelle
Owww ... Mein Hirn, hast du in alledem Schaltjahre hinterlassen?
Magic Octopus Urn
2
@carusocomputing Dafür !(y%4)*y%100|!(y%400)ist. jedes Jahr durch 4 teilbar, ausser nicht durch 100 teilbar, außer auch durch 400 teilbar
mbomb007
Hoffentlich y+(y>>2)+(z=y/25>>2)+(z>>2)spart dir noch ein Byte.
Neil
@Neil Danke, aber ich habe einen besseren Weg gefunden :-)
ETHproductions
Nett; Ich habe mit 6 Bytes auf meinem Batch-Port gespart (y*5/4-(y/100)*3/4).
Neil
11

JavaScript (Firefox 30-57), 67 65 64 63 61 Bytes

y=>[for(_ of(m='')+1e11)if(new Date(y+400,++m).getDay()==2)m]

Gespeichert 2 4 6 Byte dank @ETHproductions. Speichert ein weiteres Byte, indem die Monate in umgekehrter Reihenfolge ausgegeben werden.

Neil
quelle
Ich denke, Sie können 2 Bytes sparen, indem Sie es ohne .keys()y=>[for(_ of(m=0,Array(12)))if(new Date(y+400,++m).getDay()==2)m]
winging
@ETHproductions Durch Umkehren der Reihenfolge kann ich ein weiteres Byte speichern!
Neil
Die umgekehrte Reihenfolge ist in Ordnung. Das Formatieren der Ausgabe ist nicht der interessante Teil dieser Herausforderung.
AdmBorkBork
Wie lauten unsere Richtlinien für Array-Comprehensions, nachdem sie aus der Spezifikation entfernt wurden?
MayorMonty
Sie können weitere 2 Bytes einsparen, indem Sie Array(12)y=>[for(_ of(m=0,1e11+""))if(new Date(y+400,++m).getDay()==2)m]
Folgendes
8

MySQL, 183 134 129 106 Bytes

SET @y=2016;SELECT help_topic_id AS m FROM mysql.help_topic HAVING m BETWEEN 1 AND 12 AND 2=DAYOFWEEK(LAST_DAY(CONCAT(@y,-m,-1)))

Ersetzen 2016 durch das gewünschte Jahr. Lauf.

Rev. 2: Verwendete die help_topicsTabelle in der Standardinstallation, anstatt eine temporäre Tabelle zu erstellen.

Rev.3: Ich habe den -Trick von aross übernommen und festgestellt, dass ich auch die Anführungszeichen für weglassen kann "-1".
In -1MySQL ist jedoch erforderlich: Ich benötige ein vollständiges Datum.

Rev. 4: Die Einschränkung m BETWEEN 1 AND 12kann wie folgt erfolgen m>0 AND m<13(-6), ist jedoch überhaupt nicht erforderlich. Ungültige Werte werden ignoriert. Warnungen werden gezählt, aber nicht aufgelistet.

Titus
quelle
Sie brauchen wirklich die Tabelle Shema MySQL? mariadb.com/kb/en/mariadb/mysqlhelp_topic-table
Jörg
@ JörgHülsermann Ich verstehe deinen Standpunkt nicht.
Titus
Sollte FROM help_topicohne mysql.Arbeit? Ich habe es nicht ausprobiert
Jörg Hülsermann
@ JörgHülsermann nur wenn du voranstellst USE mysql;Irgendwie muss die richtige Datenbank ausgewählt werden.
Titus
5

Perl, 64 Bytes

Beinhaltet +1 für -n

Geben Sie Input auf STDIN:

perl -M5.010 mon.pl <<< 2016

mon.pl:

#!/usr/bin/perl -n
map$b.=$/.gmtime$_.e4,-7e6..3e7;say$b=~/on (\S+ )\S.* $_.* 1 /g
Tonne Hospel
quelle
5

Batch, 160 152 Bytes

@set/ay=%1,m=0,j=6*!(!(y%%4)*(y%%100)+(y%%400)),y=(y*5/4-y/100*3/4)%%7
@for %%d in (%j% 6 3 1 5 3 0 4 2 6 4 1)do @set/am+=1&if %%d==%y% call echo %%m%%

Antwort von Port of @ ETHproduction. Mit Monatsabkürzungen für 197 189 Bytes:

@set/ay=%1,j=6*!(!(y%%4)*(y%%100)+(y%%400)),y=(y*5/4-y/100*3/4)%%7
@for %%m in (Jan.%j% Feb.6 Mar.3 Apr.1 May.5 Jun.3 Jul.0 Aug.4 Sep.2 Oct.6 Nov.4 Dec.1)do @if %%~xm==.%y% call echo %%~nm
Neil
quelle
4

J, 48 34 33 Bytes

[:I.(2=7|_2#@".@,@{.])&>@calendar

15 Bytes mit Hilfe von @ Adám gespeichert .

Verwendet den eingebauten Kalender, um ein Array von Zeichenfolgen zu generieren, die die Monate darstellen, und analysiert dann jede Zeichenfolge, um festzustellen, ob der letzte Montag der letzte Tag des Monats ist. Es gibt jeden Monat als Monatszahl aus. Das heißt, Jan = 0, Feb = 1, ...,Dec = 11 .

Die Ausgabe von calendarist

   _3 ]\ calendar 2016
┌─────────────────────┬─────────────────────┬─────────────────────┐
│         Jan         │         Feb         │         Mar         │
│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│
│                 1  2│     1  2  3  4  5  6│        1  2  3  4  5│
│  3  4  5  6  7  8  9│  7  8  9 10 11 12 13│  6  7  8  9 10 11 12│
│ 10 11 12 13 14 15 16│ 14 15 16 17 18 19 20│ 13 14 15 16 17 18 19│
│ 17 18 19 20 21 22 23│ 21 22 23 24 25 26 27│ 20 21 22 23 24 25 26│
│ 24 25 26 27 28 29 30│ 28 29               │ 27 28 29 30 31      │
│ 31                  │                     │                     │
├─────────────────────┼─────────────────────┼─────────────────────┤
│         Apr         │         May         │         Jun         │
│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│
│                 1  2│  1  2  3  4  5  6  7│           1  2  3  4│
│  3  4  5  6  7  8  9│  8  9 10 11 12 13 14│  5  6  7  8  9 10 11│
│ 10 11 12 13 14 15 16│ 15 16 17 18 19 20 21│ 12 13 14 15 16 17 18│
│ 17 18 19 20 21 22 23│ 22 23 24 25 26 27 28│ 19 20 21 22 23 24 25│
│ 24 25 26 27 28 29 30│ 29 30 31            │ 26 27 28 29 30      │
│                     │                     │                     │
├─────────────────────┼─────────────────────┼─────────────────────┤
│         Jul         │         Aug         │         Sep         │
│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│
│                 1  2│     1  2  3  4  5  6│              1  2  3│
│  3  4  5  6  7  8  9│  7  8  9 10 11 12 13│  4  5  6  7  8  9 10│
│ 10 11 12 13 14 15 16│ 14 15 16 17 18 19 20│ 11 12 13 14 15 16 17│
│ 17 18 19 20 21 22 23│ 21 22 23 24 25 26 27│ 18 19 20 21 22 23 24│
│ 24 25 26 27 28 29 30│ 28 29 30 31         │ 25 26 27 28 29 30   │
│ 31                  │                     │                     │
├─────────────────────┼─────────────────────┼─────────────────────┤
│         Oct         │         Nov         │         Dec         │
│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│
│                    1│        1  2  3  4  5│              1  2  3│
│  2  3  4  5  6  7  8│  6  7  8  9 10 11 12│  4  5  6  7  8  9 10│
│  9 10 11 12 13 14 15│ 13 14 15 16 17 18 19│ 11 12 13 14 15 16 17│
│ 16 17 18 19 20 21 22│ 20 21 22 23 24 25 26│ 18 19 20 21 22 23 24│
│ 23 24 25 26 27 28 29│ 27 28 29 30         │ 25 26 27 28 29 30 31│
│ 30 31               │                     │                     │
└─────────────────────┴─────────────────────┴─────────────────────┘

Verwendung

   f =: [:I.(2=7|_2#@".@,@{.])&>@calendar
   f 1
3 11
   f 297
4
   f 1776
8
   f 2000
0 6
   f 2016
1 9
   f 3385
0 1 9

Erläuterung

[:I.(2=7|_2#@".@,@{.])&>@calendar  Input: year Y
                         calendar  Get 12 boxes each containing a month
    (                )&>@          Operate on each box
                    ]                Identity, get the box
         _2       {.                 Take the last two strings
                ,@                   Flatten it
             ".@                     Parse it into an array of integers
           #@                        Get the length
       7|                            Take it modulo 7
     2=                              Test if it equals 2 - it will either
                                     have two days or 9 days in the last
                                     two lines if the end is on a Monday
[:I.                               Return the indices containing a true value
Meilen
quelle
Warten Sie, gibt der Kalender tatsächlich ASCII-Kunst aus?
Destructible Lemon
@DestructibleWatermelon Um genau zu sein, ist das Ausgabeformat von calendarein Array von 12 Feldern, wobei jedes Feld ein 2D-Array von Zeichen enthält
Meilen
Ich weiß nicht einmal, wie man "jeden" in J macht, aber das ist schon viel kürzer: I.7=;#&.>".&.>,&.>_2{.&.>calendar 2016Wenn Sie alle "under-open" kombinieren, sollten Sie in der Lage sein, es ziemlich kurz zu machen.
Adám
@ Adám Danke, es verwendet eine bessere Methode, aber es ist kein Verb in J. Ich denke, es wird trotzdem helfen
Meilen
Ich wollte nur inspirieren. Ich weiß, dass es kein Verb ist.
Adám
4

Mathematica, 62 57 Bytes

DayName@DayRange[{#},{#+1},"EndOfMonth"]~Position~Monday&

Anonyme Funktion. Nimmt eine Zahl als Eingabe und gibt eine Liste von Zahlen mit einzelnen Elementen als Ausgabe zurück. Ich bin mir ehrlich gesagt nicht mehr sicher, wie es funktioniert.

LegionMammal978
quelle
4

Perl + cal, 46 Bytes

say`cal $_ $ARGV[0]`=~/\n.{5}\n/&&$_ for 1..12

Beispiel:

$ perl -E 'say`cal $_ $ARGV[0]`=~/\n.{5}\n/&&$_ for 1..12' 2016

2







10


$
Steve
quelle
1
Genau genommen ist dies perl + cal, nicht nur perl :-p. Zum Beispiel hat mein Windows-Rechner Perl, aber das funktioniert dort nicht.
Philomory
Fair Point, aktualisiert dies und mein Bash-Versuch.
Steve
4

Java 7,186 182 172 Bytes

Vielen Dank an Kevin für das Speichern von 4 Bytes.
Vielen Dank an @cliffroot für das Speichern von 10 Bytes

int[]f(int n){int c=n-1,x=c*365+c/4+c/400-c/100,k=0,b[]={3,(n%4<1&n%100>0)|n%400<1?1:0,3,2,3,2,3,3,2,3,2,3},a[]=new int[12];for(int i:b)a[k++]=(x+=i+28)%7==1?1:0;return a;}

ungolfed

int[] f(int n) {
 int c=n-1,x=c*365+(c/4)+(c/400)-(c/100),k=0,
   b[] = {3,(n % 4 < 1 & n % 100 > 0) | n % 400 < 1 ? 1 : 0
                                     ,3,2,3,2,3,3,2,3,2,3},a = new int[ 12 ];

 if ( (n % 4 < 1 & n % 100 > 1) | n % 400 < 1 )
     b[ 1 ] = -1;
 for (int i : b)
    a[ k++ ] = (x += i + 28) % 7 == 1 ? 1 : 0;

return a;
     }

Diese Version wird bereitgestellt von @cliffroot ( 168 Bytes )

 static int[] f(int n) {
 int b = 13561787 | ( (n%4 < 1 & n%100 > 0) | n%400 < 1 ? 1 << 20 : 0 ),
           x = --n*365 + n/4 + n/400 - n/100,a[]=new int[12],k=0;
    while (k < 12)
    a[k++] = (x += (b >> 24 - k*2&3 ) + 28) % 7 == 1 ? 1 : 0;
  return a;   }
    }

Ausgabebeispiel

1 1 0 0 0 0 0 0 0 1 0 0(for input 3385)
Zahlenknoten
quelle
1
Nachdem ich meine Antwort schrieb wusste , dass ich alles , was die Berechnung würde sich kürzer sein .. :) BTW, können Sie Golf n%4==0auf n%4<1; n%400==0zu n%400<1und int c=...;int[]b=...,a=...zu int c=...,b[]=...,a[]=....
Kevin Cruijssen
1
bund akann in dem intTeil wie int ... ,b[]=...,a[]=...
Olivier Grégoire
1
int[]f(int n){int x=--n*365+n/4+n/400-n++/100,k=0,b[]={1,(n%4<1&n%100>0)|n%400<1?-1:-2,1,0,1,0,1,1,0,1,0,1},a[]=new int[12];for(int i:b)a[k++]=(x+=i+30)%7==1?1:0;return a;}Wenige Bytes gespeichert
Cliffroot
1
kann auch verändern bzu b[]={3,(n%4<1&n%100>0)|n%400<1?1:0,3,2,3,2,3,3,2,3,2,3}und i+30auf i+282 für mehr Bytes
cliffroot
1
und weitere 3 Bytesint[]f(int n){int b=13561787|((n%4<1&n%100>0)|n%400<1?1<<20:0),x=--n*365+n/4+n/400-n/100,a[]=new int[12],k=0;while(k<12)a[k++]=(x+=(b>>24-k*2&3)+28)%7==1?1:0;return a;}
Cliffroot
3

Python 2, 100 Bytes

Pfui. Mathe mit Daten ist nicht so einfach, wie ich es gerne hätte.

lambda y:[m+1for m in range(12)if(date(y,12,31)if m>10else(date(y,m+2,1)-timedelta(1))).weekday()<1]

Probieren Sie es online aus

Die gleiche Länge:

lambda y:[m-1for m in range(2,14)if(date(y,12,31)if m>12else(date(y,m,1)-timedelta(1))).weekday()<1]
mbomb007
quelle
Ich würde Python nicht einmal mit diesem versuchen. Nette Anstrengung.
ElPedro
3

MATL , 21 Bytes

12:"G@QhO6(YO9XO77=?@

Monate werden als Zahlen angezeigt.

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

Dies verwendet integrierte Funktionen zur Datumskonvertierung. Für das angegebene Jahr wird geprüft, welcher Monat der letzte Tag des Monats Montag ist.

Anstatt den letzten Tag des Monats k(der 28, 29, 30 oder 31 sein kann) explizit anzugeben , geben wir den 0-ten Tag des Monats an k+1, der äquivalent ist und nicht von Monat oder Jahr abhängt.

12:      % Push [1 2 ... 12] (months)
"        % For each month k
  G      %   Push input
  @Q     %   Push k+1
  h      %   Concatenate
  O6(    %   Postpend four zeros. For example, for input 2016 and month k=1 
         %   (first iteration) this gives [2016 2 0 0 0 0] (year, month, day,
         %   hour, min, sec). The 0-th day of month k+1 is the same as the
         %   last day of month k.
  YO     %   Convert the above 6-element date vector to date number
  9XO    %   Convert date number to date string with output format 9, which 
         %   is weekday as a capital letter
  77=    %   Is it an 'M'?
  ?      %   If so
    @    %     Push current month (will be implicitly displayed)
Luis Mendo
quelle
3

Bash + GNU-Dienstprogramme, 56 Bytes

seq -f1month-1day$1-%g-1 12|date -f- +%B%u|sed -n s/1//p

Scheint, dateVersion 8.25 zu erfordern . Die Version 8.23 ​​in Ideone schneidet es nicht.

Digitales Trauma
quelle
3

Excel, 537 Bytes

Weil - du weißt schon - Excel!

Nimmt das Eingabejahr in A1 auf. Gibt die hexadezimale Liste der Monate zurück. 1 = Januar, C = Dezember. Da jeder Monat eine einzelne Ziffer ist, ist kein Trennzeichen erforderlich.

=IF(2=WEEKDAY(EOMONTH(DATE(A1,1,1),0)),1,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,2,1),0)),2,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,3,1),0)),3,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,4,1),0)),4,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,5,1),0)),5,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,6,1),0)),6,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,7,1),0)),7,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,8,1),0)),8,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,9,1),0)),9,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,10,1),0)),"A","")&IF(2=WEEKDAY(EOMONTH(DATE(A1,11,1),0)),"B","")&IF(2=WEEKDAY(EOMONTH(DATE(A1,12,1),0)),"C","")

Beispiel: A1 enthält 2016. B1 enthält die obige Formel und wird wie folgt angezeigt 2A: Februar und Oktober.

Adam
quelle
3

PHP, 109 180 159 Bytes

for($z=$argv[1];$m++<12;)if(date(N,strtotime(sprintf("%04d-$m-",$z).cal_days_in_month(0,$m,$z)))<2)echo"$m,";
  • Gibt das angegebene Jahr aus, nicht alle (... lese immer die Frage)
  • Ignorierte Hinweise (danke Titus)
  • Ändern Sie whilezu, forda es jetzt ein einziges Jahr ist (noch einmal, danke Titus)

Alt 2

$z=0;while($z++<9999){$o=[];$m=0;while($m++<12)if(date("N",strtotime(sprintf("%04d-$m-","$z").cal_days_in_month(0,$m,$z)))<2)$o[]=$m;echo count($o)>0?"$z:".implode(",",$o)."
":"";}

Unterstützt alle Jahre von Punkt bis 10000 und behebt eine undefinierte var-Warnung, die ich auf einem PC nicht kannte. Ja, es ist länger als die alte Version, aber robuster.

Alt 1

while($z++<9999){$o=[];$m=0;while($m++<12)if(date("N",strtotime("$z-$m-".cal_days_in_month(0,$m,$z)))<2)$o[]=$m;echo count($o)>0?"$z:".implode(",",$o)."
":"";}

Wenn Sie mit Windows oder einem 32-Bit-System arbeiten, tritt der gefürchtete 2038-Fehler auf, aber auf einem 64-Bit-Linux-System ist dies in Ordnung.

Ich habe versucht, ein date("t"...Datum zu verwenden, das das letzte Datum des angegebenen Monats darstellen soll, aber die Ergebnisse stimmen nicht mit den zuvor in diesem Thread erwähnten überein.

CT14.IT
quelle
2
-2: "$ z" benötigt keine Anführungszeichen -7: Ignorieren Sie die Hinweise (sie werden nicht mit den Standardeinstellungen gedruckt: Nicht initialisieren $z, keine Anführungszeichen für N) -1: forstatt while -43 : Nehmen Sie die gewünschten Eingaben vor, anstatt die Jahre zu durchlaufen -3: joinstatt implode-16: direkte Ausgabe: for($z=$argv[1];$m++<12;)if(date(N,strtotime(sprintf("%04d-$m-",$z).cal_days_in_month(0,$m,$z)))<2)echo"$m,";+9, wenn Sie darauf bestehen, kein nachgestelltes Komma zu haben:echo$o=$o?",$m":$m;
Titus
Ahh hat die Frage falsch verstanden! Dachte, es war für alle Jahre .. oops: B Danke für die anderen Vorschläge, werden sie auch bekommen
CT14.IT
3

PHP, 92 Bytes

for($d=new DateTime("$argv[1]-1-1");$i++<12;)$d->modify("1month")->format(w)!=2?:print"$i,";

check 12 mal 1 Monat nach dem ersten Tag eines Jahres ist ein Dienstag. Wenn es dann ist, ist der Tag vor dem letzten Tag im Monat ein Montag.

Jörg Hülsermann
quelle
Sie können Echo anstelle von Drucken verwenden und 1
Octopus
1
@ Octopus nicht im ternären Operator
Jörg Hülsermann
3

C 214 Bytes

main(int a,char *b[]){for(int x,y,d,m=12;m;m--){y=atoi(b[1]);x=m-1;d=x==1?(y%4==0?(y%100==0?(y%400==0?29:28):29):28):(x==3||x==5||x==10?30:31);if((d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7==1)printf("%d\n",m);}}

Kompilieren

gcc -std=c99 -o foo foo.c

Ungolfed

Mit Credits zu den jeweiligen Gurus.

Michael Keith und Tom Craver für das C-Programm ermitteln das angegebene Datum für den Wochentag .

Collin Biedenkapp für Fragen und : Wie finde ich den letzten Tag des Monats heraus?

/* credit to Collin Biedenkapp */
short _get_max_day(short x, int z) {
    if(x == 0 || x == 2 || x == 4 || x == 6 || x == 7 || x == 9 || x == 11)
        return 31;
    else if(x == 3 || x == 5 || x == 8 || x == 10)
        return 30;
    else {
        if(z % 4 == 0) {
            if(z % 100 == 0) {
                if(z % 400 == 0)
                    return 29;
                return 28;
            }
            return 29;
        }
        return 28;
    }
}

main(int argc,char *argv[]) {
 for(int y,d,m=12;m;m--) {
  y=atoi(argv[1]);
  d=_get_max_day(m-1,y);
  /* credit to Michael Keith and Tom Craver */
  if ((d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7 == 1)
    printf("%d\n",m);
 }
}
Steve
quelle
1
Was ist, wenn Sie in ifdie andere Richtung drehen , um Ihre elseRückkehr zu erreichen 31, und daher die große ==Kette beseitigen können ?
AdmBorkBork
1
wäre besser wenn (x == 1) {z part} else wenn (x == 3 || x == 5 || x == 8 || x == 10) return 30 else return 31
RosLuP
1
was ist mit: return x == 1? (z% 4 == 0? (z% 100 == 0? (z% 400 == 0? 29: 28): 29): 28) :( x == 3 | | x == 5 || x == 8 || x == 10? 30: 31)
RosLuP
TimmyD + RosLuP: danke für die return () Punkte, 100 Bytes jetzt gespeichert.
Steve
1
es ist möglich, endlich weiter zu reduzieren, bis: u (y, m) {return m-1? 30 + ((2773 >> m) & 1): 28+ (y% 4 == 0 && y% 100 || y% 400 == 0);} wobei y das Jahr und m der Monat ist
RosLuP
3

C 119 Bytes

t=1248700335,m;main(y){for(scanf("%d",&y),t+=y&3||y%25<1&&y&15;m++,(6+y+y/4-y/100+y/400+t)%7||printf("%d,",m),t;t/=7);}

Dies verwendet eine Tabelle, die den Versatz der Wochentage des letzten Tages jedes Monats für ein Schaltjahr enthält, codiert in einem vorzeichenbehafteten 32-Bit-Wort unter Verwendung von Basis 7. Wenn es kein Schaltjahr ist, addieren wir 1 zum Versatz von Januar (wie Sie sehen können, y&3||y%25<1&&y&15wird verwendet, um Jahre ohne Schalttage zu überprüfen). Dann durchlaufen wir einfach jeden Monat und prüfen, ob der letzte Tag ein Montag ist. Ganz einfach, keine hässlichen Hacks oder Tricks. Hier ist es leicht ungolfed:

t=1248700335,m;
main(y){
  for(
    scanf("%d",&y),t+=y&3||y%25<1&&y&15;
    m++,(6+y+y/4-y/100+y/400+t)%7||printf("%d,",m),t;
    t/=7
  );
}

Ich könnte dies nochmals besuchen, um es als Funktion zum Speichern einiger Zeichen umzuschreiben. Dasprintf nimmt auch etwas zu viel Platz in Anspruch ...

Fors
quelle
Die printf ("% d,", m) würde etwas als 1 oder 2, 3
ausgeben
Tatsächlich bevorzuge ich auch Leerzeichen in der Ausgabe, aber ich schreibe meine Golf-C-Lösungen normalerweise so, dass sie kein Whitespace benötigen. Daher kann ich einfach alle Whitespaces aus meiner Halbgolf-Version entfernen, wenn ich die Anzahl meiner Zeichen überprüfen möchte .
Fors
3

PHP 96 95 76 71 69 64 61 Bytes

Hinweis: Jahreszahlen müssen mit 4 Zeichen aufgefüllt werden 0070 .

for(;13+$i-=1;)date(N,mktime(0,0,0,1-$i,0,$argn))-1||print$i;

Laufen Sie wie folgt:

echo 3385 | php -nR 'for(;13+$i-=1;)date(N,mktime(0,0,0,1-$i,0,$argn))-1||print$i;';echo
> -1-2-10

Erläuterung

Iteriert von -1 bis -12. Erstelle ein Datum mit mktime, day 0(dem letzten Tag des vorherigen Monats) und month 2..13. Formatieren Sie das Datum als Tageszahl. Wenn das Ergebnis 1 ist, drucken Sie die aktuelle Zahl. Das negative Vorzeichen- wird als Begrenzer verwendet.

Der Millenium Bug schlägt wieder zu!

Beachten Sie, dass bei dieser Version der Bereich 0..100als interpretiert wird 1970..2069. Dies ist für den Bereich kein Problem 0..69, da Wochen ein Muster haben, das sich alle 400 Jahre wiederholt (146097 Tage, genau 20871 Wochen), aber für den Bereich 70..99wird der Jahreszahl 1900 hinzugefügt, was kein Vielfaches von 400 ist Das Problem ist NUR für 30-Jahres-Zahlen in einem Bereich von 10 KB. Die einfachste Möglichkeit besteht darin, der Jahreszahl 400 hinzuzufügen, um die zweistellige Interpretation ( +4 Byte ) zu verhindern:

for(;13+$i-=1;)date(N,mktime(0,0,0,1-$i,0,$argn+400))-1||print$i;

Optimierungen

  • Durch !~-$iVergleichen $imit 1( -1binär negiert ist 0, logisch negiert ist) wurde ein Byte gespeicherttrue ; jede andere Zahl ist false), sodass Klammern nicht erforderlich sind
  • 19 Bytes mit gespeichert last day ofYYYY-m Notation zum Erstellen des Datums
  • 5 Bytes mit dateund gespeichertstrtotime anstelle vondate_create
  • 2 Byte durch Zählen von negativen Zahlen gespeichert, wobei das negative Vorzeichen als Ausgabetrennzeichen (negative Monatszahlen sind nicht vorhanden) und auch als Trennzeichen in der Tabelle verwendet wird YYYY-m Teil des Datums verwendet wird
  • 5 Bytes gespart durch Verwendung von mktimeanstelle von strtotime. Zurückgesetzt, um Tag zu verwenden 0( mktimeunterstützt auch Monat 13, also0-13 == 31-12)
  • 3 Bytes mit gespeichert -R, um $argnverfügbar zu machen
aross
quelle
mktimebeseitigt die Notwendigkeit, das Jahr aufzuschreiben, nicht wahr?
Titus
@ Titus, scharf. Nun , ich dachte nur heraus , dass mktimeist kontraintuitiv , weil die Argumente als genommen werden INTs. Das bedeutet, dass Sie das Jahr nicht auffüllen können ... also wird alles im Bereich 0..100als interpretiert 1970..2070. Dies ist für den Bereich kein Problem, 0..70da 400 Jahre eine genaue Anzahl von Wochen haben (Kalender wiederholen das Muster also alle 400 Jahre), aber 70..991900 addieren (kein Vielfaches von 400!). Daher neu ver. hat einen Fehler.
28.
Die einzige Lösung, die ich im Moment sehe, ist $argv[1]+400... es sei denn, Julianische und Gregorianische Wochentage unterscheiden sich.
Titus
@ Titus, yep. Regeln besagen, dass Gregorianische Kal. Verwendet werden
Am
3

Excel, 428 97 96 Bytes

Eingabe in A1. Ungetrennte Hexadezimalwerte ausgeben (Januar = 0, Dezember = B)

=IF(2=WEEKDAY(DATE(A1+2000,1,31)),0,"")&CHOOSE(WEEKDAY(DATE(A1+2000,3,0)),4,19,6,"3B",8,25,"7A")

10 Bytes ("+2000") hinzugefügt, um die Verarbeitung von Daten vor 1990 zu ermöglichen.

11 Bytes dank @ Engineer Toast eingespart .


Erster Versuch (428 Bytes), stark von @ Adáms Lösung entlehnt .

=IF(2=WEEKDAY(DATE(A1,1,31)),1,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,2,1),0)),2,"")&IF(2=WEEKDAY(DATE(A1,3,31)),3,"")&IF(2=WEEKDAY(DATE(A1,4,30)),4,"")&IF(2=WEEKDAY(DATE(A1,5,31)),5,"")&IF(2=WEEKDAY(DATE(A1,6,30)),6,"")&IF(2=WEEKDAY(DATE(A1,7,31)),7,"")&IF(2=WEEKDAY(DATE(A1,8,31)),8,"")&IF(2=WEEKDAY(DATE(A1,9,30)),9,"")&IF(2=WEEKDAY(DATE(A1,10,31)),"A","")&IF(2=WEEKDAY(DATE(A1,11,30)),"B","")&IF(2=WEEKDAY(DATE(A1,12,31)),"C","")
Wernisch
quelle
Wie funktioniert das bei Jahren vor 1900? Der Testfall 297 -> Maykehrt 6mit dieser Formel. Sollte es nicht 4 sein? 1776gibt 7Astatt nur 8für September.
Ingenieur Toast
Wenn Sie es zum Laufen bringen, können Sie wahrscheinlich Date(A1,3,0)anstelle vonEOMONTH(DATE(A1,2,1),0)
Engineer Toast
2

Bash + cal, 58 Bytes

$ cat t.sh
for A in {1..12};do cal $A $1|grep -qx .....&&echo $A;done
$ bash t.sh 2016
2
10
$
Steve
quelle
+1 - funktioniert für BSD cal(zB OSX), aber achten Sie auf nachfolgende Leerzeichen unter GNU cal.
Digitales Trauma
2

Python 2, 94 Bytes

from datetime import*
lambda y:[m for m in range(1,13)if date(y+(m>11),m%12+1,1).weekday()==1]

repl.it

Eine unbenannte Funktion, die ein ganzzahliges Jahr annimmt, gibt eine Liste der Monatszahlen aus [1-12].

Ich habe auch versucht, die Byteanzahl mit Arithmetik ohne Erfolg zu schlagen (110 Bytes). :

lambda y:map(lambda x,v:(23*((x+2)%13or 1)/9+y-2*(0<x<11)+(x>10)+v/4-v/100+v/400)%7==4,range(12),[y-1]+[y]*11)

Eine unbenannte Funktion, die eine Liste von Booleschen Werten zurückgibt, die angibt, ob die Monate [Jan-Dez] an einem Montag enden

Jonathan Allan
quelle
2

Java 7, 200 249 Bytes

import java.util.*;String c(int y){String r="";GregorianCalendar c=new GregorianCalendar();c.setGregorianChange(new Date(1L<<63));c.set(1,y);c.set(2,0);for(int i=0;i++<12;c.add(2,1)){c.set(5,c.getActualMaximum(5));if(c.get(7)==2)r+=i+" ";}return r;}

In Java GregorianCalendarist eine Mischung aus einem Gregorianischen und einem Julianischen Kalender. Aus diesem Grund 1ergab das Jahr falsche Ergebnisse. Das Ändern, Calendar c=Calendar.getInstance();um GregorianCalendar c=new GregorianCalendar();c.setGregorianChange(new Date(1L<<63));dieses Problem zu beheben, erzwingt nur die Verwendung des Gregorianischen Kalenders. Vielen Dank an @ JonSkeet auf stackoverflow.com für die Erklärung.

Ungolfed & Testcode:

Probieren Sie es hier aus.

import java.util.*;
class M{
  static String c(int year){
    String r = "";
    GregorianCalendar calendar = new GregorianCalendar();
    calendar.setGregorianChange(new Date(Long.MIN_VALUE));
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, 0);
    for(int i = 0; i++ < 12; calendar.add(Calendar.MONTH, 1)){
      calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
      if(calendar.get(Calendar.DAY_OF_WEEK) == 2){
        r += i+" ";
      }
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(1));
    System.out.println(c(297));
    System.out.println(c(1776));
    System.out.println(c(2000));
    System.out.println(c(2016));
    System.out.println(c(3385));
  }
}

Ausgabe:

4 12
5 
9 
1 7 
2 10 
1 2 10 
Kevin Cruijssen
quelle
2

C # 6 C #, 171 167 135 Bytes

using System;
void d(int n){for(int i=0;++i<13;)if((int)new DateTime(n,i,DateTime.DaysInMonth(n,i)).DayOfWeek==1)Console.Write(i+" ");}

-32 Bytes dank Shebang

Monate als Zahlen ausgeben; mit Raum begrenzt; mit Leerzeichen. Diese Antwort funktioniert jetzt auch für frühere Versionen von C #.


Alt, 167 Bytes

using System;using System.Linq;
c(int n)=>string.Join(",",Enumerable.Range(1,12).Where(i=>new DateTime(n,i,DateTime.DaysInMonth(n,i)).DayOfWeek==(DayOfWeek)1));

-4 Bytes dank TimmyD

Ausgabemonate sind durch Kommas getrennte Zahlen in der Rückgabezeichenfolge

Ungolfed

string c(int n)=>
    string.Join(",",                                        // Join them with commas
        Enumerable.Range(1,12)                              // For 1-12 inclusive
        .Where(                                             // Select only
            i=>new DateTime(n,i,DateTime.DaysInMonth(n,i)   // Get last day of that year-month
            ).DayOfWeek                                     // Get its day of week
            ==(DayOfWeek)1                              // Is Monday
        )
    )
;
Link Ng
quelle
@TimmyD Ja, muss aber explizit besetzt werden. Antwort aktualisiert
Link Ng
LINQ ist Spaß , aber das ist 126 Bytes: void q(int y){for(int m=1;m<13;m++){if((int)new DateTime(y,m,DateTime.DaysInMonth(y,m)).DayOfWeek==1){Console.WriteLine(m);}}};) Auch wäre es kürzer die zu werfen , DayOfWeekum intals es die zu werfen wäre intzuDayOfWeek
Kade
@Shebang Danke. Ich sollte wirklich nicht einzeilig Golf spielen - das kann nur Jon Skeet. Sehen Sie, ob ich morgen Zeit für ein Update habe. Müde jetzt.
Link Ng
Sie können dies konvertieren, um ein Action<int>paar Bytes zu sparen
TheLethalCoder
2

Ruby, 54 + 6 = 60 Bytes

λ cat monday.rb
p (1..12).select{|m|Date.new($*[0].to_i,m,-1).monday?}
λ ruby -rdate monday.rb 2016
[2, 10]

6 Bytes für -rdate in der Befehlszeile, um die Date-Klasse aus der Standardbibliothek abzurufen.

Erklärung: Ziemlich unkompliziert dank der großartigen DateKlasse der Ruby-Stdlib . Nicht nur , dass es Methoden wie monday?, tuesday?usw., wird der Konstruktor nimmt negative Zahlen für jedes Feld vergangenes Jahr bedeutet ‚vom Ende dieses Feld rückwärts zählt der Periode vom vorherigen Feld‘ dargestellt. $*ist eine Abkürzung für ARGV, also $*[0]eine schnelle Möglichkeit, das erste Befehlszeilenargument abzurufen.

Philomory
quelle
2

PHP, 84 Bytes

for($m=1;$m++<14;){if(strftime('%w',strtotime($argv[1]."-$m-1"))==2)echo($m-1)." ";}

Mein erster Code Golf. Dies ist das bisher kürzeste PHP in dieser Frage.

BEARBEITEN: Scheint für das erste Jahr nicht zu funktionieren. Ich muss herausfinden, warum, aber jetzt muss ich gehen.

Tintenfisch
quelle
1
Ich würde sagen "Willkommen bei PPCG!" aber du bist schon länger hier als ich! : D Nettes erstes Golf.
AdmBorkBork
Dein Fehler ist, dass du 1-13-1 und 1-14-1 für das Jahr 1 <13 erstellst. Wenn Sie dies lösen, können Sie die unnötigen Klammern im Moment entfernen und über die Verwendung des ternären Operators nachdenken
Jörg Hülsermann
Dies sollte Ihre Probleme behebenfor(;$m++<12;)strftime("%w",strtotime($argv[1]+($m/12^0)."-".($m%12+1)."-1"))!=2?:print"$m ";
Jörg Hülsermann
2

R 106 99 95 83 78 77 74 Bytes

g=function(x)which(format(seq(as.Date(paste0(x,-2,-1)),,'m',12)-1,"%u")<2)

Die Reihenfolge der letzten Tage eines jeden Monats ist gegeben durch seq(as.Date(paste0(x,-2,-1)),,'m',12)-1:

  • paste0zwingt -2 und -1 zu Zeichen. Wenn das xzum Beispiel 2016 war, paste0(x,-2,-1)gibt "2016-2-1"das dann zum 1. Februar 2016 umgerechnet durch as.Date.

  • seqangewendet auf ein POSIXct- oder ein Date-Objekt lautet seq(from, to , by, length.out): hier towird nicht angegeben, bywird angegeben, 'm'was 'month'dank partiellem Abgleich abgeglichen wird , und length.outist natürlich 12.

  • Die resultierende Sequenz ist der erste Tag der 12 Monate, beginnend mit dem Februar des betreffenden Jahres. -1gibt uns dann den letzten tag der 12 monate beginnend mit januar des jeweiligen jahres.

Testfälle:

> g(1)
[1]  4 12
> g(25)
[1] 3 6
> g(297)
[1] 5
> g(2000)
[1] 1 7
> g(2016)
[1]  2 10
> g(3385)
[1]  1  2 10
> g(9999)
[1] 5

Alte Version bei 95 Bytes, die die Monatsnamen anstelle nur ihrer Zahlen ausgibt:

g=function(x)format(S<-seq(as.Date(sprintf("%04i-02-01",x)),,'m',12)-1,"%B")[format(S,"%u")==1]
Plannapus
quelle
Diese Antwort ist einfach genial. Ich hatte keine Ahnung , seqein Verfahren zum hatte Date-Objekte und diese löst das Problem der as.Datenicht Jahre über Umgang 10000in meiner gelöschten Antwort.
Billywob
@Billywob ja seq.Dateund seq.POSIXtsind recht beeindruckend: sie können sogar Befehle wie seq(time1, time2, by="10 min")oder verarbeiten seq(date1, date2, by="quarter"). Sehr nützlich beim Plotten einer Zeitreihe.
Plannapus
2

Japt, 24 Bytes

Do1 £Ov"Ð400+U"+X e ¥2©X

Online testen! Gibt ein Array von Zahlen mit ausfalse anstelle von Monaten kein Montag endet.

Es gab einen Fehler im Interpreter, der es mir nicht erlaubte, ihn Ðim Funktionskörper zu verwenden £. Nach dem Bugfix und einem weiteren Feature-Zusatz sind dies 18 Bytes im aktuellen Commit:

Do1@Ð400+UX e ¥2©X
ETHproductions
quelle
1

Java, 143 129 Bytes

Dies verwendet die neue Zeit-API von Java 8.

y->{String s="";for(int m=0;++m<13;)if(java.time.YearMonth.of(y,m).atEndOfMonth().getDayOfWeek().ordinal()==0)s+=m+" ";return s;}

Ausgabe

Beachten Sie, dass jede Zeile am Ende ein zusätzliches Leerzeichen enthält.

4 12 
5 
9 
1 7 
2 10 
1 2 10 

Ungolfed und Prüfung

import java.time.*;
import java.util.function.*;

public class Main {
    public static void main (String[] args) {
        IntFunction<String> func = year -> {
          String result = "";
          for (int month=1; month <= 12; month++) {
            if (YearMonth.of(year, month).atEndOfMonth().getDayOfWeek().ordinal() == 0) {
              result += month + " ";
            }
          }
          return result;
        };
        System.out.println(func.apply(1));
        System.out.println(func.apply(297));
        System.out.println(func.apply(1776));
        System.out.println(func.apply(2000));
        System.out.println(func.apply(2016));
        System.out.println(func.apply(3385));
    }
}

Rasiert

  1. 143 bis 129 Bytes: DayOfWeek::ordinalZum Vergleichen mit einer numerischen Konstante anstelle der Enum-Konstante.
    Danke @TimmyD für die allgemeine Idee, wenn nicht die genaue Lösung! ;-)
Olivier Grégoire
quelle
@ TimyD leider ist es eine Aufzählung. Es gibt jedoch eine getValue()Methode, die einige Bytes einspart.
Celos
@Celos ordinal()spart 1 Byte mehr als getValue(), obwohl empfohlen wird, es niemals zu verwenden.
Olivier Grégoire
Ja, gutes Denken. Ich habe meinen Kommentar ohne vorherige Aktualisierung gepostet, sodass ich Ihre Antwort nicht sehen und bearbeiten konnte.
Celos
1

GNU awk, 80 Bytes

{for(;m<13;a=mktime($0" "++m" 1 9 0 0")){if(strftime("%w",a-8e4)~1){print m-1}}}

Beispiel

$ gawk '{for(;m<13;a=mktime($0" "++m" 1 9 0 0")){if(strftime("%w",a-8e4)~1){print m-1}}}' <<<2016
2
10
$
Steve
quelle