Ich hatte gerade die geniale Idee, das Arbeitsleben zu vereinfachen - ein Countdown bis zu einem bestimmten Datum, das nur Arbeitstage zählt.
Die grundlegende Aufgabe besteht darin, einen Countdown bis zu einem bestimmten Datum zu erstellen, der nur die Arbeitstage in den Countdown einbezieht.
Als Arbeitstag gelten Montag , Dienstag , Mittwoch , Donnerstag und Freitag .
Die Eingabe sollte ein bestimmtes Datum im "inoffiziellen" europäischen Standardformat sein dd.MM.yyyy
und heute oder an einem Tag in der Zukunft erfolgen.
Die Ausgabe sollte nur die Anzahl der verbleibenden Tage sein.
Da es sich um Code-Golf handelt , gewinnt der kürzeste Code.
Testfall:
Today | Input | Output
10.12.2018 | 17.12.2018 | 5
02.10.2018 | 16.10.2018 | 10
Wenn ich ein paar Dinge in der Frage verpasst habe, bitte vergib mir - es ist meine erste Frage :)
BEARBEITEN:
- Sie können
false
als Ausgabe anstelle von0
<verwenden - aber es ist nicht schön - Keine Notwendigkeit, die Sommerzeit zu respektieren
Antworten:
05AB1E ,
130128133131124123 ByteIch bin außer mir..
Für die Golfsprache 05AB1E spielt es keine Rolle, ob die Eingabe mit
.
oder erfolgt-
. 05AB1E verfügt jedoch nicht über integrierte Funktionen für Datumsobjekte oder Berechnungen. Das einzige eingebaute Datum ist das heutige Jahr / Monat / Tag / Stunde / Minute / Sekunde / Mikrosekunde.Aus diesem Grund handelt es sich bei fast dem gesamten Code, den Sie sehen, um manuelle Berechnungen für den nächsten Tag und für die Berechnung des Wochentags.
+5 Bytes aufgrund eines Teils, den ich in Zellers Formel vergessen habe (Jahr-1 für die Monate Januar und Februar).
Probieren Sie es online aus oder Probieren Sie es online mit einem emulierten, selbst festgelegten Datum von "Heute" aus .
Erläuterung:
Eingehende Textwand.
Im Allgemeinen folgt der Code dem folgenden Pseudocode:
1)
Date currentDate = today;
ist dieser Teil des 05AB1E-Programms:2)
Integer counter = 0;
und 3)Start an infinite loop:
sind im 05AB1E-Programm unkompliziert:4)
If(currentDate is NOT a Saturday and currentDate is NOT a Sunday):
ist der erste schwierige Teil mit manuellen Berechnungen. Da in 05AB1E kein Datum integriert ist, müssen wir den Wochentag manuell berechnen .Die allgemeine Formel dafür lautet:
Wo für die Monate März bis Dezember:
[1, 31]
)[3, 12]
)Und für die Monate Januar und Februar:
[1, 31]
)[13, 14]
)Daraus ergibt sich der Wochentagh , wobei 0 = Samstag, 1 = Sonntag, ..., 6 = Freitag.
Quelle: Zellers Kongruenz
Dies können wir in diesem Teil des 05AB1E-Programms sehen:
5)
Counter += 1;
ist wieder unkompliziert:6)
currentDate += 1; // Set currentDate to the next day in line
ist wieder komplexer, weil wir es manuell machen müssen. Dies wird also auf den folgenden Pseudocode erweitert:Quellen:
Algorithmus zur Bestimmung, ob ein Jahr ein Schaltjahr ist.(BEARBEITEN: Nicht mehr relevant, da ich eine alternative Methode verwende , um Schaltjahre zu überprüfen, die 7 Byte einsparen.)Algorithmus zur Bestimmung der Anzahl der Tage in einem Monat.
6a)
Integer isLeapYear = ...;
wird im Programm 05AB1E folgendermaßen durchgeführt:Wird auch in meiner 05AB1E-Antwort verwendet , daher werden einige Beispieljahre hinzugefügt, um die Schritte zu veranschaulichen.
6b)
currentDate.month == 2 ?
und 6c)28 + isLeapYear
werden wie folgt durchgeführt:6d)
:
und 6e)31 - (currentDate.month - 1) % 7 % 2;
werden so gemacht:6f)
If(currentDate.day < daysInCurrentMonth):
wird so gemacht:6g)
nextDate.day += 1;
wird so gemacht:6h)
Else:
und 6i)nextDate.day = 1;
werden dann so gemacht:6j)
If(currentDate.month < 12):
:6k)
nextDate.month += 1;
:6l)
Else:
, 6m)nextDate.month = 1;
und 6n)nextDate.year += 1;
werden dann so gemacht:Und zum Schluss bei 8)
If(currentDate == parsed input-string):
und 9)Stop the infinite loop, and output the counter
:quelle
Excel 24 Bytes
Übernimmt die Eingabe in Zelle A1
Verwendet die eingebaute Funktion. Leider umfasst die Funktion sowohl das heutige als auch das Enddatum. OP hat seitdem geklärt, heute nicht zu zählen, also füge ich JETZT einen hinzu, um heute nicht zu zählen.
Auch hier handelt es sich um einen Excel-Standard, um Kommentare zum Zahlenformat zu adressieren:
quelle
10.12.2018
ist eine Zeichenfolge, wenn sie in einer Zelle statt in einem Datum gespeichert ist. Die naheliegende, aber langwierige Lösung, um dies zu korrigieren, wäreA1
,DATE(RIGHT(A1,4),MID(A1,4,2),LEFT(A1,2))
in Ihrer Lösung zu wechselnHKCU\Control Panel\International\sDecimal
Registrierungszeichenfolge. Bei einer Windows-Standardinstallation in den USA ist dies MM / tt / jjjj. In den meisten EU-Ländern wäre dies die Standardeinstellung.R , 76 Bytes
Schauen Sie sich auch diese 72-Byte-R-Antwort an, die ebenfalls von der Ländereinstellung unabhängig ist.
Probieren Sie es online!
weekdays
Gibt den Wochentag des Textes an, sodass wir die Tage in der Reihenfolge zwischen dem heutigen Tag und der Eingabe, die nicht enthalten sindS
, zählen und dem Ergebnis einen hinzufügen.quelle
Java 10,
233232226 BytesDate erinnert mich immer daran, wie ausführlich Java wirklich ist.
ANMERKUNG: Es gibt jetzt zwei kürzere Java-Antworten (unter 175 Byte), eine mit intelligenter Verwendung veralteter Methoden aus früheren Java-Versionen von @LukeStevens und eine mit der
java.time.LocalDate
neuen Java- Version 8 von @ OlivierGrégoire .Probieren Sie es online aus.
Erläuterung:
quelle
e=s.clone()
?Calendar s=Calendar.getInstance(),e=s.getInstance()
, was leider genau gleich lang ist.C
ist in der Tat nicht notwendig. Es war aus einem alten Teil des Codes, wo ich auchC
woanders verwendet habe. In der Lage gewesen, 1 Byte zu spielen, indem manvar s=Calendar.getInstance();var e=s.getInstance();
so dankt. :)java.time
.JavaScript (ES6),
116103 BytesProbieren Sie es online!
Wie?
.toJSON()
YYYY-MM-DD
YYYY-MM-DD
DD.MM.YYYY
D.getDay()
quelle
MATL , 24 Bytes
Probieren Sie es online!
Das ist dir zur Hälfte gelungen :-)
Erläuterung
quelle
16.10.2018
würde heute (Montag01-10-2018
) ergeben11
, morgen10
usw.Wolfram Language (Mathematica) ,
6456 BytesProbieren Sie es online!
DayCount[x,y,"Weekday"]
zählt die Anzahl der Wochentage zwischenx
undy
.Die Eingaben
x
undy
können viele Dinge sein, darunter eine FantasieDateObject
wie die, die von zurückgegeben wurdeToday
, oder eine Zeichenfolge im Format (leider)mm.dd.yyyy
.Mein früherer Versuch versuchte, die
dd.mm.yyyy
Eingabe in eineDateObject
umzuwandeln, indem ich Mathematica sagte, wie sie zu analysieren ist. Die neue Lösung ordnet die Zeichenfolge einfach neu, um Tag und Monat in die von Mathematica erwartete Reihenfolge zu bringen.Es ist erwähnenswert, dass die 28-Byte-Lösung
DayCount[Today,#,"Weekday"]&
nicht nur für ein Monat-Tag-Jahr-Eingabeformat perfekt funktioniert, sondern auch eindeutige Tag-Monat-Jahr-Eingaben wie "31.12.2018
, die möglicherweise nicht den 12. Tag des 31. bedeuten können" korrekt verarbeitet Monat". Also ist es in mehr als 60% der Fälle richtig :)quelle
Perl 6 , 61 Bytes
Probieren Sie es online!
quelle
R, 72 Zeichen
Eine Variation der Antwort von @ngm, die das Speichern einiger Zeichen vermeidet und in nicht-englischen Gebietsschemas funktioniert.
sum(strftime(seq(Sys.Date(),as.Date(scan(,""),"%d.%m.%Y"),1),'%u')<6)+1
quelle
Java (OpenJDK 8) ,
174166165 BytesMit ein wenig Inspiration von Kevins Antwort und einem guten Durchforsten der veralteten Date-API habe ich es geschafft, eine prägnantere Java-Lösung zu erhalten.
-8 Bytes dank Kevins erfinderischer Analyse des Regex-Datums
-1 Byte dank der cleveren bitweisen Operation von Nevay
Probieren Sie es online!
Erläuterung
quelle
d=d[0].split
und dem.parse
mit Standardformat veraltetenMM/dd/yyyy
Format. Einen kleinen Fehler in Ihrem Beitrag haben Sieimport java.text.*;
stattimport java.util.*;
in Ihrem Code und// Required import for both Calendar and Date
in Ihrer Erklärung (obwohl Sie nicht verwendenCalendar
).java.text
jetzt aber behoben hatte! Vielen Dank!d=d[0].split
mit den varargs gefallen hat, ändere ich die Eingabe in einen regulären String, entferned=d[0].split("\\.");
und ändered[1]+"/"+d[0]+"/"+d[2]
umd.replaceAll("(..).(..).","$2/$1/")
7 Bytes zu sparen .r+=new Date(s).getDay()%6<1?0:1,s+=864e5);
vons+=864e5)r+=new Date(s).getDay()%6<1?0:1;
. :)r-=-new Date(s).getDay()%6>>-1;
Rot , 72 Bytes
Probieren Sie es online!
Nimmt das Datum im Format TT-MM-JJJJ, zum Beispiel 31-10-2018 (funktioniert auch mit 10-Okt-2018)
Strikte Eingabe:
Rot , 97 Bytes
Probieren Sie es online!
Bonus:
Gibt eine Liste der Daten / Wochentage der Arbeitstage bis zum angegebenen Datum zurück:
Rot , 235 Bytes
Probieren Sie es online!
quelle
JavaScript,
87BytesRückgabe
false
für0
.Probieren Sie es online aus oder prüfen Sie die nächsten 31 Tage
quelle
Python 2 ,
163156149147 BytesProbieren Sie es online!
-7 danke an @mypetlion
-7 mehr dank @ovs
+30 aufgrund des sehr restriktiven Eingabeformats, das ich erst kurz bevor ich meinen vorherigen Code gepostet habe, bemerkt habe, der Eingaben wie zB
(2018,11,1)
:-(quelle
(0,1)[t.weekday()<5]
. Python-Boolesche Werte sind eine Unterklasse vonint
undTrue, False
können in arithmetischen Operationen als verwendet werden1,0
. Ersetzen Sie es durchc+=t.weekday()<5
, um 7 Bytes zu sparen.Java (JDK 10) , 171 Byte
Probieren Sie es online!
Credits
quelle
(.*)\\.(.*)\\.(.*)
zu ändern(..).(..).(.*)
.replaceAll
Technik kann seine Antwort jedoch auch um 7 Bytes golfen werden, sodass Ihre Antwort noch etwas länger ist. ;)JavaScript (Node.js) ,
168160139133 Byte35 Bytes weniger dank Quintec und Kevin Cruijssen
Probieren Sie es online!
quelle
f=
Byteanzahl hinzufügen (und bei TIO können Sie sie in den Header einfügen). Aus diesem Grund hat @Quintec angegeben, dass sie 139 Bytes statt 141 Bytes beträgt. Darüber hinaus können Sie ändern ,if((d.getDay()+1)%7>1)n++;
umn+=-~d.getDay()%7>1;
zum Golf es zu 133 Bytes .-~i
derselbe wie(i+1)
Auch, wenn Sie ihn noch nicht gesehen haben, Tipps zum Golfen in JavaScript und Tipps zum Golfen in <allen Sprachen> könnten interessant sein, durchzulesen. :)Python3 & Numpy , 96 Bytes
Ich könnte nicht kleiner werden als die langweilige vorgefertigte Lösung ...
Probieren Sie es online!
quelle
PowerShell ,
107 bis99 Byte-8 bytes dank mazzy
Probieren Sie es online!
Führt eine Regex
-split
für die Eingabe durch$args
und speichert die Werte in$d
ays,$m
onths und$y
ears. Tritt dann in einefor
Schleife ein, die$a
auf das heutige Datum initialisiert wird. Die Schleife wird fortgesetzt , während$a
ist-l
esst
han unser Eingangszieldatum. Jede Iteration fügen wir1
days
an$a
, und zu prüfen , ob die aktuelleD*k
(kurz fürDayOfWeek
) im Bereich1..5
(dh von Montag bis Freitag). Dieses boolesche Ergebnis wird akkumuliert$o
und sobald wir die Schleife verlassen haben, verbleibt dieser Wert in der Pipeline und die Ausgabe ist implizit.quelle
$d,$m,$y=$args-split'\.';for($a=date;$a-lt(date "$y-$m-$d");$a=$a|% *ys 1){$o+=($a|% D*k)-in1..5};$o
for(...){...}
und$o
entfernt werden, sodass wir jetzt unter 100 sind!Python 2 ,
147143141140 BytesProbieren Sie es online!
Nimmt einen String, e, der das Enddatum im Format "TT.MM.JJJJ" darstellt. Optional wird auch das Startdatum verwendet, es wird jedoch erwartet, dass dies ein datetime.date ist.
Das Startdatum s wird standardmäßig auf das heutige Datum als datetime.date-Objekt gesetzt, um die Uhrzeit nicht zu berücksichtigen. Die Endzeit wird in ein datetime.datetime-Objekt geparst und dann in ein Datum konvertiert, da datetime.date-Objekte keine Analysemethode haben und Datumsangaben nicht zu Datumsangaben hinzugefügt / von Datumsangaben abgezogen werden können. Durchläuft jeden Tag in (Anfang, Ende) und addiert 1 zur Gesamtsumme, wenn die Wochentagsnummer <5 ist. ([0-4] sind [Mo-Fr], [5-6] sind [Sa-So]).
Datetime-Parsing ist das Schlimmste, Leute.
EDIT: Stola ElPedro 's Map (int, thing) Trick, um 4 Bytes zu sparen.
EDIT 2: ELECTRIC BOOGALOO: Speichert 2 Bytes, indem es zu einer anonymen Funktion gemacht wird. (Danke Aaron!)
EDIT 3: xrange -> range. (Nochmals vielen Dank Aaron!)
quelle
f=
hier auf die Ausdrücke von Lambda verzichten könnenrange
anstattxrange
es sollte immer noch gut funktionieren.PHP, 66 Bytes
leere Ausgabe für
0
; einfügen+
zwischenecho
und$r
fixieren.Als Rohr mit laufen lassen
-nr
oder probieren Sie es online aus .60 Bytes bei unärer Ausgabe:
quelle
PHP (mit Carbon ), 107 Bytes
quelle
IBM / Lotus Notes-Formel - 99 Byte
Übernimmt Eingaben aus einem Datums- / Zeitfeld
i
. Das Eingabeformat voni
ist auf.
Separiert eingestellt, sodass die Eingabe nicht konvertiert werden muss. Notizen können mit jedem Trennzeichen ein Datum eingeben, solange Sie es vorher angeben (ich hoffe, das betrügt nicht!). Die Formel befindet sich in einem berechneten numerischen Feldo
in derselben Form.Interessant am Rande: Seit
@For
und@While
wurden in die Formelsprache eingeführt in (glaube ich) R6 durch den großen Damien Katz das habe ich nur für sie gefunden verwenden ist Code Golf spielen. Ich habe sie noch nie in einer Produktions-App verwendet.Es ist kein TIO für die Formel verfügbar. Hier ist ein Screenshot vom 02.10.2018:
quelle
Ruby , 81 Bytes
Probieren Sie es online!
quelle
K4 , 40 Bytes
Lösung:
Erläuterung:
Berechnen Sie die Differenz zwischen den Daten, verwenden Sie Modulo 7, um Wochenenden zu ignorieren.
Anmerkungen:
"D"$,/|"."\:x
quelle
C (Klirren) ,
209208205 BytesCompiler-Flags
-DU=u=localtime(&b)
-DW=tm_wday
-DY=tm_year
-DT=tm_yday
(52 Byte).Probieren Sie es online!
-1 Byte dank @JonathanFrech
quelle
?i++:0
->&&++i
.q,
5279 BytesIn q hat jedes Datum einen zugrunde liegenden ganzzahligen Wert, der darauf basiert, wie viele Tage seit Beginn des Jahrtausends vergangen sind. Wenn Sie 'mod 7' anwenden, erhalten Sie eindeutige Werte für jeden Wochentag (0 für Samstag, 6 für Freitag). Wenn also 2> x mod 7 ist, erhöhe den Zähler nicht, um das Zählen am Wochenende zu vermeiden.
BEARBEITEN: Striktes Datumsformat fehlt, Bearbeitung
EDIT2: Inbegriffen
quelle
{sum 1<mod[d+til("D"$x 10 vs 67893401)-d:.z.d]7}
für 48 Bytes, ohne auf K-Verben zurückzugreifen.