Geben Sie anhand einer Liste der Aktivitäten und ihrer Startzeit / ihres Startdatums einen ASCII-Kunstkalender aus, in dem die Aktivitäten an den entsprechenden Tagen angezeigt werden. Es wird garantiert, dass alle Aktivitäten im selben Monat stattfinden, dass keine zwei Aktivitäten am selben Tag stattfinden und dass alle Aktivitäten garantiert in das Kalenderfeld passen.
Der Kalender hat das Datum in der oberen linken Ecke jeder Box. Die Boxen sind 9 Felder breit und 5 Felder hoch, umgeben von -
und |
. Die aus zwei Buchstaben bestehende Abkürzung für den Wochentag befindet sich über der ersten Zeile, und die Wochen beginnen mit dem Sonntag.
Zum Beispiel bei folgenden Aktivitäten:
10/5/2018 - 9:00am - Sandbox calendar challenge
10/9/2018 - 9:00am - Post challenge to main
10/10/2018 - 10:00am - Profit
10/31/2018 - 7:30pm - Halloween party
Geben Sie diesen entsprechenden Kalender aus:
Su Mo Tu We Th Fr Sa
-----------------------------------------------------------------------
| |1 |2 |3 |4 |5 |6 |
| | | | | |9:00am | |
| | | | | |Sandbox | |
| | | | | |calendar | |
| | | | | |challenge| |
-----------------------------------------------------------------------
|7 |8 |9 |10 |11 |12 |13 |
| | |9:00am |10:00am | | | |
| | |Post |Profit | | | |
| | |challenge| | | | |
| | |to main | | | | |
-----------------------------------------------------------------------
|14 |15 |16 |17 |18 |19 |20 |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
-----------------------------------------------------------------------
|21 |22 |23 |24 |25 |26 |27 |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
-----------------------------------------------------------------------
|28 |29 |30 |31 | | | |
| | | |7:30pm | | | |
| | | |Halloween| | | |
| | | |party | | | |
| | | | | | | |
-----------------------------------------------------------------------
Klarstellungen
- Die Zeitplanwörter (passend zu [A-Za-z] +) werden durch ein einzelnes Leerzeichen zwischen ihnen begrenzt (wie im Beispiel).
- Das Aufteilen des Textes auf Wortgrenzen ist ausreichend. Keine Notwendigkeit, Wörter zu trennen.
- Wenn der Februar an einem Sonntag in einem Nicht-Schaltjahr beginnt, haben Sie nur vier Kalenderzeilen.
- Wenn ein 31-Tage-Monat (z. B. August) spät in der Woche beginnt, müssen Sie möglicherweise sechs Kalenderzeilen ausgeben.
E / A und Regeln
- Ihr Code muss mindestens Daten zwischen
0001-01-01
und9999-12-31
im Gregorianischen Kalender enthalten, einschließlich der Schaltjahre. Wenn beispielsweise eine Eingabe erfolgt2016-02-13 9:00am Test
, sollte der Ausgabekalender den 29. Februar haben. - Das eingegebene Datumsformat kann in einem beliebigen Format vorliegen. ISO 8601, ein
datetime
Objekt, eine besonders formatierte Zeichenfolge usw. Das Parsen von Eingaben ist nicht der interessante Teil dieser Herausforderung. - Die Ein- und Ausgabe kann auf jede bequeme Weise erfolgen .
- Führende / nachfolgende Zeilenumbrüche oder andere Leerzeichen sind optional, sofern die Zeichen entsprechend ausgerichtet sind.
- Entweder ein vollständiges Programm oder eine Funktion sind akzeptabel. Wenn es sich um eine Funktion handelt, können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
- Die Ausgabe kann an die Konsole erfolgen, als Liste von Zeichenfolgen, als einzelne Zeichenfolge usw. zurückgegeben werden.
- Standardlücken sind verboten.
- Dies ist Code-Golf, daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Bytes) gewinnt.
1752-09-02 - 09:00am - Wife's Birthday Tomorrow (14th!)
Antworten:
JavaScript (ES8),
380…321320 ByteNimmt Eingabe als
(y,m,e)
wo:y
ist das Jahrm
ist der Monat, 0-indizierte
ist ein Objekt, dessen Schlüssel die Tage und dessen Werte die Ereignisse im[hour, task]
Format sindProbieren Sie es online aus!
Wie?
Im Folgenden sind einige wichtige Teile des Codes aufgeführt.
Header
Die Kopfzeile wird generiert mit:
Wenn
split()
ein regulärer Ausdruck verwendet wird, der eine Erfassungsgruppe enthält, wird diese Gruppe in das Ausgabearray aufgenommen. In diesem Fall gibt es:Wir verbinden dieses Array mit 4 Leerzeichen, was zu Folgendem führt:
Das ist genau das, was wir wollen.
Monatsstruktur
Die Hilfsfunktion ein Datum aus dem Eingabejahr und dem Eingabemonat (die konstant sind) und dem Tag (der dynamisch ist). Sein Parameter ist ein Methodenname, mit dem entweder der Wochentag oder der Monat extrahiert werden kann.G y m d
Es wird zuerst verwendet, um den Wochentag des ersten Tages des Monats zu identifizieren, damit wir von dort zum letzten Sonntag zurückkehren können. Es wird dann verwendet, um zu erkennen, wann wir den richtigen Monat zurückgeben und wann wir ihn verlassen (diese Informationen werden im Booleschen gespeichert ).x
Ereignisformatierung
Der folgende Code wird zum Formatieren eines Ereignisses verwendet.
quelle
Python 2 ,
326324315312307 BytesProbieren Sie es online aus!
Gleiche Eingabe wie Arnauld's JS-Antwort :
Nimmt Eingabe als
(y,m,e)
wo:y
ist das Jahrm
ist der Monat, 1-indizierte
ist ein Objekt, dessen Schlüssel die Tage und dessen Werte die Ereignisse im(hour, task)
Format sindquelle
Holzkohle ,
215206 BytesProbieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Nimmt Daten im Format TT / M / JJJJ. Erläuterung:
Geben Sie das erste Ereignis ein.
Extrahieren Sie das Datum und teilen Sie es auf
/
s auf.Umrechnung in Monate seit März 1 v. Ich möchte den Wochentag des ersten des nächsten Monats und des aktuellen Monats berechnen, und das Arbeiten in Monaten ist einfacher, als die Monate und Jahre getrennt zu halten und am Ende des Jahres zu tragen. Außerdem kann ich mit dem Zählen beginnen Monate ab März statt Januar, was nach Zellers Kongruenz erforderlich ist.
Verwenden Sie eine modifizierte Zellerkongruenz, um den Wochentag des ersten Tages des nächsten Monats und dieses Monats zu extrahieren. Der grundlegende Teil beruht auf der Tatsache, dass die Anzahl der Tage vom 30. Oktober des Vorjahres bis zum 1. eines bestimmten Monats, an denen
m = 4
für März undm = 14
für Januar des folgenden Jahres angegeben wird, durch die Formel angegebenm * 153 / 5
wird. Wir können jedoch 140 subtrahieren, weil wir nur kümmere dich um den Wochentag. Es bleiben dann Anpassungen aufgrund des Jahres vorzunehmen; Jedes Jahr fügt einen Tag hinzu, jedes 4. Jahr fügt einen zusätzlichen Tag hinzu, jedes 100. Jahr subtrahiert einen Tag und jedes 400. Jahr fügt wieder einen Tag hinzu. (Da ich in Monaten arbeite, werden diese Werte alle mit 12 multipliziert.) Praktischerweise gibt mir dies direkt die Antwort in Form einer sonntagsindizierten Woche (normalerweise würden Sie den Tag des Monats hinzufügen und am Samstag mit dem Zählen beginnen).Negieren Sie den Wochentag und speichern Sie ihn als aktuellen Tag des Monats.
Berechnen Sie die Anzahl der Tage im Monat ab dem Wochentag der beiden Monate.
Geben Sie die Tagesüberschriften aus.
Drucken Sie die oberste Zeile von
-
s.Schleife bis zum letzten Tag des Monats ausgegeben wurde.
Bewegen Sie den Cursor an den Anfang der nächsten Zeile.
7 Tage auf einmal verarbeiten.
Drucken Sie die Spalte von
|
s links aus.Erhöhen Sie den aktuellen Tag des Monats.
Wenn der aktuelle Tag des Monats der Tag des aktuellen Ereignisses ist, ...
... die anderen Teile der Veranstaltung extrahieren, ...
... die Zeit auf 9 Leerzeichen auffüllen und eine leere Zeichenfolge als Liste speichern, ...
... die Beschreibung auf Leerzeichen aufteilen und diese durchlaufen, ...
... jedes Wort zum vorherigen Wort hinzufügen, wenn es passt; ...
... Zeit und Beschreibung ausgeben (
Pδ
funktioniert nicht, könnte ein Holzkohlefehler sein?), ...... und geben Sie das nächste Ereignis ein.
Wenn der aktuelle Tag des Monats zwischen 1 und dem letzten Tag des Monats liegt, geben Sie ihn aus. Andernfalls geben Sie einfach genügend Leerzeichen aus, um zum nächsten Tag zu wechseln.
Drucken Sie am Ende der Woche die rechte Spalte von
|
s und die untere Zeile von-
s.quelle
year-1
sollte anstelle vonyear
undmonth+12
anstelle von verwendet werdenmonth
. Oder haben Sie den Algorithmus, den ich in meiner 05AB1E-Antwort erwähnt habe, irgendwie vereinfacht, der dem von Wikipedia entspricht ?Java (JDK) ,
538439428425 ByteWahrscheinlich die längste Code Golf-Lösung, die ich je gepostet habe. Ich versuche immer noch, von hier aus Golf zu spielen, aber es ist ein Kampf.
Es gelang, 99 Bytes durch Ändern des Eingabeformats und Verwenden von Regex-Parsing und weitere 11 Bytes aus verschiedenen Bits zu entfernen.
3 zusätzliche Bytes dank Kevin!
Inspiriert von anderen Antworten werden Eingaben wie Jahr, Monat und Karte von Tagen in eine Zeichenfolge eingegeben, die die Zeit und das Ereignis im Format darstellt
<time>-<event>
.Probieren Sie es online aus!
Ungolfed
quelle
&&(i=1)<2?7:0
kann sein?7*(i=1):0
, 3 Bytes zu speichern.b>x|i++<6?0:7*(i=1)
anstelle vonb<=x&++i>6?7*(i=1):0
undc*i>1|b<1|b>x?c<2&e!=null?e.split("-")[i-2]:" ":b+""
anstelle vonc*i<2&b>0&b<=x?b+"":c<2&e!=null?e.split("-")[i-2]:" "
Rot ,
674651 BytesProbieren Sie es online aus!
Besser lesbar:
quelle
if e = 0[e: 7]
kann entfernt werden, oder? Sie verwendene: 1 + c/weekday % 7
,e
wird also immer im Bereich sein[1, 7]
.1 +
passiert zuerst .. Ok, ich sehe meinen Fehler. Ich bin es gewohnt%
und habe/
Vorrang vor Operatoren+
.