Finden Sie das nächste Datum zu einem Zieldatum für einen bestimmten Wochentag.
Wenn Sie beispielsweise ein Datum 20161219
und einen Wochentag für angeben Friday (6)
, lautet die Antwort 20161216
.
Bei einem anderen Beispiel lautet die Antwort , wenn ein Datum 20161219
und ein Wochentag angegeben Wednesday (4)
sind 20161221
.
Ein letztes Beispiel mit einem Datum 20161219
und einem Wochentag von Monday (2)
lautet die Antwort 20161219
.
Regeln:
- Das Datumsformat für die Eingabe und Ausgabe muss übereinstimmen. In den Beispielen habe ich verwendet
yyyymmdd
, aber Sie können jedes Format verwenden , solange das Jahr (mindestens zwei Ziffern), der Monat und der Tag des Monats "vom Menschen lesbar" sind. - Wochentag wird als Ganzzahl eingegeben. In meinem Beispiel ist Sonntag der erste Tag der Woche, daher ist es der Wochentag Nummer
1
. Sie können jeden Wochentag nummerieren, sofern Sie ihn notieren, wenn er vom Beispiel abweicht. - Die Jahre 1970 bis 2030 müssen berücksichtigt werden.
- Gängige Datumstools und -bibliotheken für Sprachen sind zulässig, aber diejenigen, die sie nicht verwenden, erhalten eine Straßenberechtigung.
- Die geringste Anzahl von Bytes gewinnt.
Antworten:
Perl 6 , 46 Bytes
Ein Lambda, das zwei Argumente akzeptiert: Eine Datumszeichenfolge im
yyyy-mm-dd
Format und eine Wochentagszahl zwischen1
= Montag und7
= Sonntag.Erläuterung:
Unter Verwendung des in den Beispielen verwendeten Datums- und Wochentagsformats wären es 88 Bytes:
quelle
Perl 6 , 83 Bytes
Versuch es
Erweitert
quelle
JavaScript (ES6), 93 Byte
Verwendet das
%Y-%m-%d
Datumsformat. Wenn%a %b %d %Y
es sich um ein akzeptables Datumsformat handelt, gilt für 82 Bytes Folgendes:Ich könnte weitere 2 Bytes einsparen, indem ich Sonntag = 10 bis Samstag = 16 benötige, aber das ist eine alberne Wochentagszuordnung. Vorherige
142141-Byte-Version (dank @Guedes), die das spezifische Datumsformat JJJJMMTT verwendet hat, mit der folgenden Erklärung:Das fühlt sich viel zu lang an. Erläuterung: Fügt zuerst
-
s in das Datum ein, um es in das ISO-Format zu bringen, dasnew Date
dann analysiert werden kann. Dann wird der gewünschte Tag mit dem tatsächlichen Tag verglichen, um einen Wert zwischen-3
und3
für den tatsächlichen Versatz zu erhalten. Die Magie9
kommt von7
(weil%
ist CPU Modulo, nicht wahr Modulo) plus3
(für den-3
Offset) minus1
(weiln
ist 1-indiziert undgetDay
ist 0-indiziert). Das Datum wird dann wieder in das ISO-Format konvertiert und die unerwünschten Zeichen entfernt.quelle
.replace(/(?=..(..)?$)/g,'-')
Python,
150 bis149 BytesOouuf, 149. Repl.it
Unbenannte Funktion, die eine Zeichenfolge
s
, das angegebene Datum (unter Verwendung einer Formatzeichenfolget='%Y%m%d'
sowohl für die Eingabe als auch für die Ausgabe) und eine Zahl in [1,7] annimmtn
.Überprüft die sieben Tage ab drei Tagen vor drei Tagen nach dem für den gewünschten Wochentag angegebenen.
Die Woche
datetime
beginnt am Montag und basiert auf Null, der Test ist also(n-2)%7==d.weekday()
.quelle
Bash + Coreutils, 50
Probieren Sie es online aus .
date -d$1 +%u
gibt den Wochentag an (1..7); 1 ist Montag3 + 7 - 1
. Die 3 stellt den Eingangsbereich für den Bereich [-3, 3] ein und wird nach dem Modulo erneut subtrahiert. Die 7 ist erforderlich, da das Bash-Modulo mit dem CPU-Modulo identisch ist und zu -ve-Ergebnissen führen kann. Durch Hinzufügen von 7 Anpassungen in den richtigen Bereich. Das -1 ist, weil in der Eingabe 1 Sonntag ist, aber mit der% u-Ausgabe ist 1 Montag.date
analysiert<input date> + <magic factor>days
und präsentiert es dann im Format JJJJMMTT.quelle
SAS-Makrosprache, 110 Bytes
Eine schreckliche Golfsprache, aber hier ist die Erklärung (von innen nach außen):
Erstellen Sie ein Makro
s
, das eine Datumseingabed
und einen numerischen Wochentag akzeptierta
. Dann%eval(%sysfunc(putn(&d,8.))-4)
wandelt das Datum auf ein numerisches Datum SAS und dekrementiert sie durch 4 Tage. Dieintnx
Funktion gibt dann das nächste Vorkommen des angegebenen Wochentags zurück.putn
Formatiert dann das Datum zurück auf JJJJMTT und%put
druckt die Ausgabe in das Protokoll.quelle
Mathematica,
8549 BytesDas Eingabeformat für Datumsangaben ist entweder eine Liste
{2016, 12, 16}
oder eine tatsächlicheDateObject
(ich denke, einige andere funktionieren auch, aber ich habe diese getestet). In beiden Fällen wird das Ausgabeformat automatisch angepasst. Die Tagesnummerierung beginnt1
montags.Die Idee besteht darin, die Differenz zwischen dem eingegebenen Wochentag und dem Ziel-Wochentag mit zu berechnen
#2-#~DateValue~"ISOWeekDay"
und dann[-3, 3]
mit einem Modulo mit Offset (dhMod[...,7,-3]
) abzubilden . Das Ergebnis wird einfach zum Eingabedatum addiert (die Standardeinheit für das Hinzufügen von Datumsobjekten ist Tage).quelle
R,
119 7756 BytesUnbenannte Funktion, die zwei Eingaben akzeptiert, das Datum
D
(Zeichenfolge) und den Tagd
(numerisch).Verwendet die Funktion
wday()
aus demlubridate
Paket. Es kannDate
Objekte bequem in Wochentage konvertieren, wobei1
es standardmäßig als Sonntag behandelt wird.Bearbeiten: E / A ist jetzt die Standardeinstellung der
as.Date()
Funktion:"YYYY-mm-dd"
Ungolfed und erklärt
Bearbeiten: Erstellt jetzt eine Folge von
+-3
Tagen, für die ein bestimmter Wochentag garantiert gefunden wird. Anschließend müssen wir nur noch einen Tag abgleichen, was das Problem erheblich vereinfacht hat.quelle