Heute ist das Zentrum

36

Wenn Sie ein Datum als Eingabe in einem beliebigen Format angeben, geben Sie einen Kalender mit diesem Datum genau in der Mitte eines fünfwöchigen Fensters aus. Die Kopfzeile des Kalenders muss die aus zwei Buchstaben bestehenden Abkürzungen für die Wochentage (dh Su Mo Tu We Th Fr Sa) enthalten. Drei-Buchstaben- oder andere Abkürzungen der Tage sind nicht zulässig.

Beispielsweise sollte April 2 2019als Eingabe die Ausgabe angegeben werden

Sa Su Mo Tu We Th Fr
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31  1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19

so dass das angegebene Datum genau in der Mitte des Kalenders liegt.

Gegeben February 19 2020, ausgegeben

Su Mo Tu We Th Fr Sa
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
 1  2  3  4  5  6  7

Für September 14 1752, zeigt die folgende:

Mo Tu We Th Fr Sa Su
28 29 30 31  1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  1

  • Die Ein- und Ausgabe kann auf jede bequeme Weise erfolgen .
  • Die Eingabe ist garantiert nicht leer und gültig (dh Sie werden nie empfangen ""oder Feb 31usw.).
  • Nehmen Sie den Gregorianischen Kalender für alle Daten an.
  • Schaltjahre müssen berücksichtigt werden.
  • Eingabedaten reichen von Jan 1 1600bis Dec 31 2500.
  • Sie können es an STDOUT drucken oder als Funktionsergebnis zurückgeben.
  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig.
  • Beliebige Leerzeichen sind zulässig, sofern die Zeichen richtig ausgerichtet sind.
  • Führende Nullen an den einstelligen Tagen sind zulässig, ebenso wie das Ausrichten der einstelligen Tage, um stattdessen linksbündig zu sein.
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
AdmBorkBork
quelle

Antworten:

12

R , 77 72 Bytes

function(d,`~`=format)write(c(strtrim(d+-3:3~"%a",2),d+-17:17~"%e"),1,7)

Probieren Sie es online!

Bei der Ausgabe wurden 2-Buchstaben-Abkürzungen verwendet. Dieser Fehler wurde behoben.

-1 Byte mit strtrimDank an Aaron Hayman .

Schreibt Datumsangaben mit führenden Nullen auf; Nimmt Eingaben als ein Date, die mit erstellt werden können as.Date("YYYY/MM/DD").

Seltsam kurz für eine Antwort auf R ...

Giuseppe
quelle
8

05AB1E , 175 174 172 171 160 Bytes

¦WΘ1š-1šVтFY`2ô0Kθ4ÖUD2Qi\28X+ë<7%É31α}‹iY¬>0ëY1¾ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝVY})DJIJk18+£35.£¬.•4ιõ÷‡o‹ƶ¸•2ôs`UÐ3‹12*+>13*5÷s3‹Xα©т%D4÷®т÷©4÷®·()DćsćsO7%._s€нT‰J«7ô»

Eingabe im Format [day, month, year]. Ausgabe mit führenden 0s für einstellige Tage und Kleinbuchstaben mobis su(+1 Byte können hinzugefügt werden, wenn Titelbuchstaben erforderlich sind).

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Holy shit .. Dies könnte mein neuer Rekord für längste 05AB1E Antwort sein, und dann schließe ich einige sehr komplexe Herausforderungen habe ich ...>>. EDIT: Hmm ok, fast ..; p

Wichtiger Hinweis: 05AB1E verfügt über keine integrierten Funktionen für Datumsobjekte oder Berechnungen. Das einzige eingebaute Datum ist das heutige Jahr / Monat / Tag / Stunde / Minute / Sekunde / Mikrosekunde.

Aus diesem Grund sind fast alle angezeigten Codes manuelle Berechnungen zur Berechnung des vorherigen und des nächsten Tages (einschließlich des Übergangs über Jahre und unter Berücksichtigung der Schaltjahre) und zur Berechnung des Wochentags unter Verwendung von Zellers Kongruenz .

Riesige Teile des Codes wurden aus meiner früheren 05AB1E-Antwort kopiert , die auch für die folgende Erklärung relevant sein wird.

Erläuterung:

Wir beginnen mit dem ersten Tag des Vormonats:

¦          # Remove the first item (the days) from the (implicit) input
 W         # Get the minimum (without popping the list itself)
           # (since the year is guaranteed to be above 1599, this is the month)
  Θ        # Check if its exactly 1 (1 if 1, 0 if in the range [2,31])
   1š      # Prepend a 1 as list (so we now have either [1,1] or [1,0]
     -     # Subtract this from the month and year
      1š   # And prepend a 1 for the day
        V  # Pop and store this first day of the previous month in variable `Y`

Dann verwende ich dieses Datum als Startdatum und berechne die nächsten 100 Tage:

тF    # Loop 100 times:
  Y`2ô0Kθ4ÖUD2Qi\28X+ë<731α}‹iY¬>0ëY1¾ǝDÅsD12i>1ë\1Dǝ¤>2}}ǝV
      #  Calculate the next day in line
      #  (see the linked challenge above for a detailed explanation of this)
   Y  #  And leave it on the stack
 })   # After the loop: wrap the entire stack into a list, which contains our 100 days

Dann, mit dem Eingabedatum als Mitte, lasse ich nur die 17 vor und 17 nach diesem Eingabedatum aus der Liste:

DJ          # Duplicate the 100 dates, and join the day/month/year together to strings
  IJ        # Push the input, also joined together
    k       # Get the 0-based index of the input in this list
            # (the joins are necessary, because indexing doesn't work for 2D lists)
     18+    # Add 18 to this index (18 instead of 17, because the index is 0-based)
        £   # Only leave the first index+18 items from the 100 dates
     35.£   # Then only leave the last 35 items

Jetzt haben wir unsere 35 Tage. Der nächste Schritt besteht darin, den Wochentag zu berechnen und den Header der Ausgabetabelle zu erstellen:

¬                # Get the first date of the list (without popping the list itself)
 .•4ιõ÷‡o‹ƶ¸•    # Push compressed string "sasumotuwethfr"
             2ô  # Split it into chunks of size 2
s                # Swap to get the first date again
 `UÐ312*+>13*5÷s3Xα©т%D4÷®т÷©4÷®·()DćsćsO7%
                 # Calculate the day of the week (sa=0; su=1; ...; fr=6)
                 # (see the linked challenge above for a detailed explanation of this)
  ._             # Rotate the list of strings that many times

Sehen Sie diese 05AB1E Spitze Mine (Abschnitt Wie Kompresse Strings nicht Teil des Wörterbuchs? ) Zu verstehen , warum .•4ιõ÷‡o‹ƶ¸•ist "sasumotuwethfr".

Dann erstellen wir die Tage, um die Tabelle selbst auf der Grundlage unserer zuvor erstellten Datumsliste zu füllen. Welches wir zusammen mit dem Header zusammenführen. Danach können wir das Endergebnis ausdrucken:

s           # Swap to get the list of dates again
 €н         # Only leave the first item of each date (the days)
   T       # Take the divmod 10 of each
     J      # Join those divmod results together
            # (we now have leading 0s for single-digit days)
      «     # Merge this list together with the header list
       7ô   # Split it into chunks of size 7
         »  # Join each inner list by spaces, and then each string by newlines
            # (and output the result implicitly)
Kevin Cruijssen
quelle
2
Das ist sehr viel Arbeit!
Luis Mendo
2
Ja, Java schlägt 05AB1E! : D Zum ersten Mal, denke ich ;-)
Olivier Grégoire
@LuisMendo Das Meiste wurde letztes Mal mit der verknüpften Herausforderung erledigt, aber ja, es war viel Arbeit.;) Erläuterung wurde übrigens hinzugefügt.
Kevin Cruijssen
@ OlivierGrégoire Jetzt sind wir die gleiche Tschüss-Zählung. ;)
Kevin Cruijssen
@ OlivierGrégoire Und jetzt ist es wieder niedriger, sorry. ; p
Kevin Cruijssen
6

JavaScript (ES6),  141  126 Byte

15 Bytes durch Ausleihen .toUTCString().slice(0,2)aus Neils Antwort gespeichert

Übernimmt die Eingabe als Datumsobjekt.

f=(d,n=0)=>n<42?(D=new Date(d-864e5*(24-n)),n<7?D.toUTCString().slice(0,2):(i=D.getDate())>9?i:' '+i)+`
 `[++n%7&&1]+f(d,n):''

Probieren Sie es online!

Arnauld
quelle
Huh, ich hätte schwören können, dass mein Code für den dritten Testfall fehlgeschlagen ist, als ich ihn ursprünglich geschrieben habe ... nun, das spart mir 52 Bytes ...
Neil,
4

JavaScript (Node.js) , 205 152 145 Byte

f=
d=>`012345`.replace(g=/./g,r=>`0123456
`.replace(g,c=>`${new Date(d-864e5*(24-c-r*7))[+r?`getUTCDate`:`toUTCString`]()}`.slice(0,2).padStart(3)))
<input type=date oninput=o.textContent=f(this.valueAsDate)><pre id=o>

Probieren Sie es online! Übernimmt Eingaben als JavaScript-Datumsobjekt oder Zeitstempel. Bearbeiten: 1 Byte dank @EmbodimentofIgnorance gespeichert, wodurch ich weitere 7 Byte speichern konnte, indem ich der Ausgabe eine abschließende neue Zeile hinzufügte. 52 Bytes gespart, als ich feststellte, dass ich an Verhalten gearbeitet habe, das eigentlich nicht fehlerhaft war ...

Neil
quelle
padStart(2)-> padStart(3)entferne das Leerzeichen in der Verknüpfungszeichenfolge für -1 Byte
Ausführungsform der Ignoranz
3

Perl 6 , 87 Bytes

{~rotate(<Th Fr Sa Su Mo Tu We>,.day-of-week),|comb 21,($_-17..$_+17)>>.day.fmt('%2d')}

Probieren Sie es online!

Nimmt ein DateObjekt und gibt eine Liste von Zeilen zurück.

nwellnhof
quelle
2

Wolfram Language (Mathematica) , 123 Byte

(s=#;Grid@Join[{StringTake[ToString@DayName[s~d~#]&/@Range[-3,3],2]},Partition[Last@d[s,#]&/@Range[-17,17],7]])&
d=DatePlus

Probieren Sie es online!

Ich weiß nicht, warum GridTIO nicht funktioniert, aber dieser Code gibt dies aus

Bildbeschreibung hier eingeben

@DavidC hat 1 Byte gespeichert

J42161217
quelle
Funktioniert das möglicherweise Gridnicht, weil TIO die Elemente nicht wie auf Ihrem Bild zentrieren kann?
AdmBorkBork
@AdmBorkBork Es gibt eine Möglichkeit, solche Grafiken in TIO zu laden. Jemand hatte es mir letztes Jahr gezeigt, denke ich. Aber ich kann mich nicht erinnern, wie es geht ... Also, wenn jemand Bescheid weiß, lass es uns wissen!
J42161217
2

MATL , 34 33 31 Bytes

YO-17:17+t7:)8XOO3Z(!1ew7XOU7e!

Probieren Sie es online!

Erläuterung

YO       % Implicit input. Convert to date number. This is a single number
         % that specifies the date
-17:17   % Push [-17 -16 ... 16 17]
+        % Add to date number, element-wise. This gives a row vector of 35
         % date numbers centered around the input date
t        % Duplicate
7:       % Push [1 2 ... 7]
)        % Index into the 35-element vector. This keeps the first 7 entries
8XO      % Convert to day-of-week in 3 letters. Gives a 3-col char matrix
O3Z(     % Write char 0 (equivalent to space for display purposes) into the
         % 3rd column
!1e      % Tranpose and linearize into a row. This produces a string such as
         % 'Tu We Th Fr Sa Su Mo ', to be used as column headings
w        % Swap. This brings to top the row vector of 35 date numbers
         % computed from the input
7XO      % Convert to day-of-month. Gives a 2-col char matrix
U        % Convert each row to number
7e!      % Reshape into 7-row matrix and transpose
         % Implicit display. This prints the string with the headings and
         % the matrix. The latter has a minimum-one-space separation between
         % columns, so it is aligned with the headings
Luis Mendo
quelle
2

Java (JDK) , 149 Byte

d->{d.add(5,-24);for(int i=0,w;i<42;d.add(5,1))System.out.printf("%c%2s",i%7<1?10:32,i++<7?"SaSuMoTuWeThFr".substring(w=d.get(7)%7*2,w+2):d.get(5));}

Probieren Sie es online!

Credits

Olivier Grégoire
quelle
1
159 Bytes
Kevin Cruijssen
1
@ KevinCruijssen Warten ... was? Ich gratuliere dir! Ich habe versucht, dies zu tun, konnte aber keinen Weg finden, und doch hast du es getan! Sehr schön :-)
Olivier Grégoire
1
Vielleicht siehst du noch was das iund jirgendwie zu kombinieren ? Oder etwas kürzeres für j++%7<1?10:32etwas bitweise Magie? Aber das überlasse ich dir. Ich gehe zurück zur Arbeit, lol. ;)
Kevin Cruijssen
1
Ah, natürlich. Gute Teamarbeit! ;) PS: Wo steht das wdenn? Warum nicht hfür Header?
Kevin Cruijssen
1
@KevinCruijssen wfür "Tag der w eek". Auch Bit Twiddling kann nur dazu führen, (i%7+6)/7*22+10dass viel länger ist.
Olivier Grégoire
2

PHP ,197 189 187 Bytes

for($d=date_create($argn)->sub($i=new DateInterval(P17D)),$i->d=1;$x++<35;$h.=$x<8?substr($d->format(D),0,2).' ':'',$d->add($i))$o.=str_pad($d->format(j),3,' ',2);echo wordwrap($h.$o,20);

Probieren Sie es online!

Die Eingabe erfolgt STDINals Datumszeichenfolge. Laufen Sie mit php -nF.

$ echo April 2 2019|php -nF cal.php

Sa Su Mo Tu We Th Fr 
16 17 18 19 20 21 22 
23 24 25 26 27 28 29 
30 31  1  2  3  4  5 
 6  7  8  9 10 11 12 
13 14 15 16 17 18 19 

Überprüfen Sie alle Testfälle

Oder 174 Bytes mit null aufgefüllten einzelnen Ziffern.

640 KB
quelle
1

Excel VBA, 190 159 Bytes

Vielen Dank an TaylorScott

Function z(i)
Dim d(5,6)
v=DateValue(i)-17
For x=1To 5
For y=0To 6
d(0,y)=Left(WeekdayName(Weekday(v+y)),2)
d(x,y)=day(v+y+(x-1)*7)
Next y,x
z=d()
End Function

Übernimmt die Eingabe in Form einer gültigen Datumszeichenfolge für Excel VBA (z. B. 19. Februar 2020; 19. Februar 2020; 19. Februar 2019) und gibt ein Array mit dem angegebenen Kalender in der Mitte zurück.

William Porter
quelle
Sie können diese Lösung auf 159 reduzieren, indem Sie das Leerzeichen von dieser Lösung entfernen.Function z(i) Dim d(5,6) v=DateValue(i)-17 For x=1To 5 For y=0To 6 d(0,y)=Left(WeekdayName(Weekday(v+y)),2) d(x,y)=Day(v+y+(x-1)*7) Next y,x z=d() End Function
Taylor Scott
@TaylorScott Danke, ich habe nur den eingebauten Editor verwendet, der diese Räume automatisch ausfüllt.
William Porter
0

Rot , 153 131 Bytes

func[d][s: d - 24 loop 7[prin[""copy/part system/locale/days/(s/10) 2]s:
s + 1]loop 5[print""loop 7[prin pad/left s/4 3 s: s + 1]]]

Probieren Sie es online!

Galen Ivanov
quelle
0

T-SQL, 203 Bytes

DECLARE @f date='2020-02-19'

,@ char(20)=0,@d char(105)=0SELECT
@=left(format(d,'D'),2)+' '+@,@d=right(d,2)+char(32-n%7/6*19)+@d
FROM(SELECT dateadd(d,number-17,@f)d,number n
FROM spt_values WHERE'P'=type)x ORDER BY-n
PRINT @+'
'+@d

Die Online-Version ist etwas anders, diese veröffentlichte Version funktioniert in MS-SQL Studio Management. Es spart 1 Byte im Vergleich zur Online-Version, gibt aber online nicht das richtige Ergebnis

Probieren Sie es online aus

t-clausen.dk
quelle
0

Python 2 , 115 Bytes

from datetime import*
d=input()
for i in range(42):print(d+timedelta(i-24)).strftime('%'+'da'[i<7])[:2]+i%7/6*'\n',

Probieren Sie es online!

Ich bin mir nicht sicher, ob dies zulässig ist. Übernimmt Eingaben von STDIN im Formular date(year, month, day). Dies kann auch als dargestellt werden __import__('datetime').date(year, month, day). Das sind wirklich __import__('datetime').dateGegenstände.

Erik der Outgolfer
quelle