Der Arbeitstag-Countdown


17

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.yyyyund heute oder an einem Tag in der Zukunft erfolgen.

Die Ausgabe sollte nur die Anzahl der verbleibenden Tage sein.

Da es sich um , 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 falseals Ausgabe anstelle von 0 <verwenden - aber es ist nicht schön
  • Keine Notwendigkeit, die Sommerzeit zu respektieren

9
Gibt es einen bestimmten Grund für dieses "inoffizielle" europäische Eingabeformat? Wir sind uns einig , wenn immer möglich, einen flexiblen Input zu ermöglichen.
Arnauld

6
Ist es wirklich sinnvoll, die "zusätzliche Herausforderung" eines schwer zu verarbeitenden Datumsformats hinzuzufügen? Das scheint nur unfair für Sprachen, die flexible Datumsformate haben ...
Quintec

3
@Hille Ich habe nicht gesagt, dass es "schwer" ist, es ist nur ein unnötiger Aufwand, besonders im Code-Golf ... beachte den Link, den Arnauld oben gepostet hat ... im Allgemeinen ist eine flexible Eingabe die Norm ...
Quintec

6
Übrigens, Sie stellen fest, dass dies Ihre erste Herausforderung ist. Ich lade Sie ein, The Sandbox zur Verfeinerung zu verwenden, bevor Sie eine Herausforderung an main senden ! Ansonsten gute Arbeit, und ich freue mich, noch mehr von Ihnen zu sehen!
Giuseppe

7
Nicht wirklich beeindruckt von dem strengen Eingabeformat, aber ansonsten eine gute Herausforderung.
ElPedro

Antworten:


18

05AB1E , 130 128 133 131 124 123 Byte

žežfžg)V0[Y`UÐ3‹12*+>13*5÷s3‹Xα©т%D4÷®т÷©4÷®·()ćsO7%2@+Y`т‰0Kθ4ÖUD2Qi\28X+ë<7%É31α}‹iY¬>0ëY1¾ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝVYI'.¡Q#

Ich 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;
2   Integer counter = 0;
3   Start an infinite loop:
4*    If(currentDate is NOT a Saturday and currentDate is NOT a Sunday):
5       Counter += 1;
6*    currentDate += 1; // Set currentDate to the next day in line
7     If(currentDate == parsed input-string):
8       Stop the infinite loop, and output the counter

1) Date currentDate = today;ist dieser Teil des 05AB1E-Programms:

že          # Push today's day
  žf        # Push today's month
    žg      # Push today's year
      )     # Wrap them into a single list
       V    # Pop and store this list in variable `Y`

2) Integer counter = 0;und 3) Start an infinite loop:sind im 05AB1E-Programm unkompliziert:

0     # Push 0 to the stack
 [    # Start an infinite loop

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:

h=(q+13(m+1)5+K+K4+J42J)mod7,

Wo für die Monate März bis Dezember:

  • q ist dieday des Monats ([1, 31])
  • m ist das 1-indiziertemonth ([3, 12])
  • K ist das Jahr des Jahrhunderts (yearmod100 )
  • J ist das 0-indizierte Jahrhundert (year100)

Und für die Monate Januar und Februar:

  • q ist dieday des Monats ([1, 31])
  • m ist das 1-indiziertemonth+12 ([13, 14])
  • K ist das Jahr des Jahrhunderts für das vergangene Jahr ((year1)mod100 )
  • J ist das 0-indizierte Jahrhundert des Vorjahres (year1100)

Daraus ergibt sich der Wochentag h , wobei 0 = Samstag, 1 = Sonntag, ..., 6 = Freitag.
Quelle: Zellers Kongruenz

Dies können wir in diesem Teil des 05AB1E-Programms sehen:

Y             # Push variable `Y`
 `            # Push the day, month, and year to the stack
  U           # Pop and save the year in variable `X`
   Ð          # Triplicate the month
    3        # Check if the month is below 3 (Jan. / Feb.),
              # resulting in 1 or 0 for truthy/falsey respectively
      12*     # Multiply this by 12 (either 0 or 12)
         +    # And add it to the month
              # This first part was to make Jan. / Feb. 13 and 14

>             # Month + 1
 13*          # Multiplied by 13
    5÷        # Integer-divided by 5
s3           # Check if the month is below 3 again (resulting in 1 / 0)
   Xα         # Take the absolute difference with the year
     ©        # Store this potentially modified year in the register
      т%      # mYear modulo-100
D4÷           # mYear modulo-100, integer-divided by 4
®т÷©4÷        # mYear integer-divided by 100, and then integer-divided by 4
®·(           # mYear integer-divided by 100, doubled, and then made negative
)             # Wrap the entire stack into a list
 ć            # Extract the head (the counter variable that was also on the stack)
  s           # Swap so the calculated values above are as list at the top
   O          # Take the sum of this entire list
    7%        # And then take modulo-7 to complete the formula,
              # resulting in 0 for Saturday, 1 for Sunday, and [2, 6] for [Monday, Friday]

2@            # Check if the day is greater than or equal to 2 (so a working day)

5) Counter += 1;ist wieder unkompliziert:

     # The >=2 check with `2@` results in either 1 for truthy and 0 for falsey
+    # So just adding it to the counter variable is enough

6) currentDate += 1; // Set currentDate to the next day in lineist wieder komplexer, weil wir es manuell machen müssen. Dies wird also auf den folgenden Pseudocode erweitert:

a   Integer isLeapYear = ...;
b   Integer daysInCurrentMonth = currentDate.month == 2 ?
c                                 28 + isLeapYear
d                                :
e                                 31 - (currentDate.month - 1) % 7 % 2;
f   If(currentDate.day < daysInCurrentMonth):
g     nextDate.day += 1;
h   Else:
i     nextDate.day = 1;
j     If(currentDate.month < 12):
k       nextDate.month += 1;
l     Else:
m       nextDate.month = 1;
n       nextDate.year += 1;

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:

Y             # Push variable `Y`
 `            # Push the days, month and year to the stack
  т‰          # Divmod the year by 100
    0K        # Remove all items "00" (or 0 when the year is below 100)
      θ       # Pop the list, and leave the last item
       4Ö     # Check if this number is visible by 4
         U    # Pop and save the result in variable `X`

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 + isLeapYearwerden wie folgt durchgeführt:

D            # Duplicate the month that is now the top of the stack
 2Q          # Check if it's equal to 2
   i         # And if it is:
    \        #  Remove the duplicated month from the top of the stack
     28X+    #  Add 28 and variable `X` (the isLeapYear) together

6d) :und 6e) 31 - (currentDate.month - 1) % 7 % 2;werden so gemacht:

ë           # Else:
 <          #  Month - 1
  7%        #  Modulo-7
    É       #  Is odd (shortcut for %2)
     31     #  Push 31
       α    #  Absolute difference between both
}           # Close the if-else

6f) If(currentDate.day < daysInCurrentMonth):wird so gemacht:

     # Check if the day that is still on the stack is smaller than the value calculated
 i    # And if it is:

6g) nextDate.day += 1;wird so gemacht:

Y       # Push variable `Y`
 ¬      # Push its head, the days (without popping the list `Y`)
  >     # Day + 1
   0    # Push index 0

        # (This part is done after the if-else clauses to save bytes)
}}      # Close the if-else clauses
  ǝ     # Insert the day + 1 at index 0 in the list `Y`
   V    # Pop and store the updated list in variable `Y` again

6h) Else:und 6i) nextDate.day = 1;werden dann so gemacht:

ë        # Else:
 Y       #  Push variable `Y`
  1      #  Push a 1
   ¾     #  Push index 0
    ǝ    #  Insert 1 at index 0 (days part) in the list `Y`

6j) If(currentDate.month < 12)::

D           # Duplicate the list `Y`
 Ås         # Pop and push its middle (the month)
   D12     # Check if the month is below 12
       i    # And if it is:

6k) nextDate.month += 1;:

>       # Month + 1
 1      # Push index 1

        # (This part is done after the if-else clauses to save bytes)
}}      # Close the if-else clauses
  ǝ     # Insert the month + 1 at index 1 in the list `Y`
   V    # Pop and store the updated list in variable `Y` again

6l) Else:, 6m) nextDate.month = 1;und 6n) nextDate.year += 1;werden dann so gemacht:

ë        # Else:
 \       #  Delete the top item on the stack (the duplicated month)
  1      #  Push 1
   D     #  Push index 1 (with a Duplicate)
    ǝ    #  Insert 1 at index 1 (month part) in the list `Y`

 ¤       #  Push its tail, the year (without popping the list `Y`)
  >      #  Year + 1
   2     #  Index 2

         # (This part is done after the if-else clauses to save bytes)
}}       # Close the if-else clauses
  ǝ      # Insert the year + 1 at index 2 in the list `Y`
   V     # Pop and store the updated list in variable `Y` again

Und zum Schluss bei 8) If(currentDate == parsed input-string):und 9) Stop the infinite loop, and output the counter:

Y          # Push variable `Y`
 I         # Push the input
  '.¡     '# Split it on dots
     Q     # Check if the two lists are equal
      #    # And if they are equal: stop the infinite loop
           # (And output the top of the stack (the counter) implicitly)

5
Du bist ein Verrückter ... hast eine Gegenstimme.
AdmBorkBork

1
Das längste 05AB1E-Programm aller Zeiten?
Luis Mendo

2
@LuisMendo schließen, aber ich fürchte , ich habe eine 05AB1E Antwort selbst das ist noch länger , und eine , die Art und Weise nahe kommt auch .. ;) Ich bin sicher , werde ich ein paar Bytes hier ein dort zum Golf der Lage sein und simplify Teile der Pseudocode-Implementierung des nächsten Tages. Werde morgen früh schauen, bin aber gerade vom Sport zurückgekommen und werde bald ins Bett gehen.
Kevin Cruijssen

11

Excel 24 Bytes

Übernimmt die Eingabe in Zelle A1

=NETWORKDAYS(NOW()+1,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: Bildbeschreibung hier eingeben


Dies funktioniert zwar mit Datumswerten, kann jedoch nicht wie angegeben eingegeben werden. Das heißt, (zumindest in der US-Version) 10.12.2018ist eine Zeichenfolge, wenn sie in einer Zelle statt in einem Datum gespeichert ist. Die naheliegende, aber langwierige Lösung, um dies zu korrigieren, wäre A1, DATE(RIGHT(A1,4),MID(A1,4,2),LEFT(A1,2))in Ihrer Lösung zu wechseln
Taylor Scott

Leider hat die Community entschieden, dass Sprachen unter ihren Standardeinstellungen ausgeführt werden müssen, um gültig zu sein (die einzige Ausnahme, die ich gesehen habe, ist language - IE. Wenn Ihre Sprache sowohl Englisch als auch Spanisch unterstützt, können Sie beide verwenden, aber Dies muss beachtet werden.) Ferner hat OP (@hille) nicht angegeben, dass das Format flexibel ist, und hat tatsächlich das Gegenteil festgestellt (siehe zweiten Kommentar zu dieser Frage)
Taylor Scott

2
Das Format ist kein Standard, es basiert auf dem Gebietsschema. Excel liest das Format aus der HKCU\Control Panel\International\sDecimalRegistrierungszeichenfolge. Bei einer Windows-Standardinstallation in den USA ist dies MM / tt / jjjj. In den meisten EU-Ländern wäre dies die Standardeinstellung.
Erik A

@ LuisMendo Ja, das funktioniert. Ich habe keine Klarstellung gesehen. Wenn es stattdessen gewesen wäre, den letzten Tag nicht zu zählen, hätte ich = NETWORKDAYS (NOW (), A1-1). Ich wusste, dass es immer die gleiche Byteanzahl sein würde, egal welche Klarstellung.
Keeta - wieder Monica

Schön, dass das funktioniert. Ich habe die Ablehnung entfernt
Luis Mendo


8

Java 10, 233 232 226 Bytes

import java.util.*;d->{int r=0;var s=Calendar.getInstance();s.setTime(new Date());var e=s.getInstance();for(e.setTime(new java.text.SimpleDateFormat("dd.MM.yyyy").parse(d));!s.after(e);s.add(5,1))if(s.get(7)%7>1)r++;return r;}

Date 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.LocalDateneuen Java- Version 8 von @ OlivierGrégoire .

Probieren Sie es online aus.

Erläuterung:

import java.util.*;            // Required import for both Calendar and Date
d->{                           // Method with String parameter and integer return-type
  int r=0;                     //  Result-integer, starting at 0
  var s=Calendar.getInstance();//  Create a Calendar instance for the start-date
  s.setTime(new Date());       //  Set the start date to today
  var e=s.getInstance();       //  Create a Calendar instance for the end-date
  for(e.setTime(               //  Set the end date to:
        new java.text.SimpleDateFormat("dd.MM.yyyy")
                               //   Create a formatter for the "dd.MM.yyyy" format
         .parse(d));           //   And parse the input-String to a Date
      !s.after(e)              //  Loop as long as we haven't reached the end date yet
      ;                        //    After every iteration:
       s.add(5,1))             //     Increase the start-date by 1 day
    if(s.get(7)%7>1)           //   If the day of the week is NOT a Saturday or Sunday:
                               //   (SUNDAY = 1, MONDAY = 2, ..., SATURDAY = 7)
      r++;                     //    Increase the result-sum by 1
  return r;}                   //  Return the result-sum

Könntest du tun e=s.clone()?
Quintec

1
Das können wir auch (nehme ich an) Calendar s=Calendar.getInstance(),e=s.getInstance(), was leider genau gleich lang ist.
Mischa Lawrow

1
@ Mischa Lawrow Ah, die Statik Cist in der Tat nicht notwendig. Es war aus einem alten Teil des Codes, wo ich auch Cwoanders verwendet habe. In der Lage gewesen, 1 Byte zu spielen, indem man var s=Calendar.getInstance();var e=s.getInstance();so dankt. :)
Kevin Cruijssen

1
150 Bytes mit java.time.
Olivier Grégoire

1
Erledigt! Es ist in Bytes sehr nahe an der anderen Antwort, aber noch nicht übertroffen.
Olivier Grégoire

7

JavaScript (ES6), 116 103 Bytes

f=(d,n=+new Date)=>(D=new Date(n)).toJSON()<d.split`.`.reverse().join`-`&&(D.getDay()%6>0)+f(d,n+864e5)

Probieren Sie es online!

Wie?

n

nD.toJSON()

JJJJ - MM - TT T hh : mm : ss.sss Z

YYYY-MM-DDdYYYY-MM-DDDD.MM.YYYY

d.split`.`.reverse().join`-`

D.getDay()0606

(D.getDay() % 6 > 0) + f(d, n + 864e5)

86,400,000n


6

MATL , 24 Bytes

46tQZt24&YO:Z':X-9XO83-z

Probieren Sie es online!

Ich möchte kein Eingabeformat haben, damit bestimmte Code-Golf-Sprachen einen großen Vorteil haben

Das ist dir zur Hälfte gelungen :-)

Erläuterung

46      % Push 46 (ASCII for '.')
tQ      % Duplicate, add 1: gives 47 (ASCII for '/')
Zt      % Implicit input. Replace '.' by '/' in the input string
24&YO   % Convert string with date format 24 ('dd/mm/yyyy') to serial date number.
        % This is an integer representing day starting at Jan-1-0000
:       % Inclusive range from 1 to that
Z'      % Push current date and time as a serial number. Integer part is day;
        % decimal part represents time of the day
:       % Inclusive range from 1 to that
X-      % Set difference. Gives serial numbers of days after today, up to input
9XO     % Convert each number to date format 9, which is a letter for each day
        % of the week: 'M', 'T', 'W', 'T', ' F', 'S', 'S'
83-     % Subtract 83 (ASCII for 'S')
z       % Number of nonzeros. Implicit display

Wenn ich die Herausforderung richtig verstanden habe, nimmst du nur eine Datumseingabe und vergleichst sie mit dem heutigen Datum. Zum Beispiel 16.10.2018würde heute (Montag 01-10-2018) ergeben 11, morgen 10usw.
Kevin Cruijssen

@ KevinCruijssen Whoops. Vielen Dank! Jetzt korrigiert
Luis Mendo

1
Und mit der gleichen Byteanzahl. :) Schön, +1 von mir.
Kevin Cruijssen

6

Wolfram Language (Mathematica) , 64 56 Bytes

DayCount[Today,""<>#~StringTake~{{4,6},3,-4},"Weekday"]&

Probieren Sie es online!

DayCount[x,y,"Weekday"]zählt die Anzahl der Wochentage zwischen xund y.

Die Eingaben xund ykönnen viele Dinge sein, darunter eine Fantasie DateObjectwie die, die von zurückgegeben wurde Today, oder eine Zeichenfolge im Format (leider) mm.dd.yyyy.

Mein früherer Versuch versuchte, die dd.mm.yyyyEingabe in eine DateObjectumzuwandeln, 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 :)



5

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


1
Auch kürzer und allgemeiner. Schöne Antwort und willkommen in der Anstalt.
ngm

1
Willkommen bei PPCG! Sie können einen TIO-Link hinzufügen - es ist einfach und formatiert die Antwort für Sie :)
JayCe

5

Java (OpenJDK 8) , 174 166 165 Bytes

Mit 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

import java.util.*;d->{long r=0,s=new Date().getTime(),e=Date.parse(d.replaceAll("(..).(..).","$2/$1/"));for(;s<=e;s+=864e5)r-=-new Date(s).getDay()%6>>-1;return r;}

Probieren Sie es online!

Erläuterung

import java.util.*;                         // Required import for Date 
long r=0,                                   // Initialise result variable
     s=new Date().getTime(),                // Current date in millis
     e=Date.parse(
         d.replaceAll("(..).(..).","$2/$1/")// Use regex to convert to MM/dd/yyyy
     );                                     // Parse date arg using deprecated API
for(;s<=e;                                  // Loop while current millis are less than date arg (e.g. date is before)       
    s+=864e5)                               // Add 86400000 ms to current date (equiv of 1 day)
    r-=-new Date(s).getDay()%6>>-1;        // If day is Sunday (0) or Saturday (6) don't increment, else add 1
return r;                                   // When loop finished return result

1
Gute Antwort! Intelligente Verwendung der varargs mit dem d=d[0].splitund dem .parsemit Standardformat veralteten MM/dd/yyyyFormat. Einen kleinen Fehler in Ihrem Beitrag haben Sie import java.text.*;statt import java.util.*;in Ihrem Code und // Required import for both Calendar and Datein Ihrer Erklärung (obwohl Sie nicht verwenden Calendar).
Kevin Cruijssen

@KevinCruijssen Keine Ahnung warum ich das java.textjetzt aber behoben hatte! Vielen Dank!
Luke Stevens

1
Obwohl mir das d=d[0].splitmit den varargs gefallen hat, ändere ich die Eingabe in einen regulären String, entferne d=d[0].split("\\.");und ändere d[1]+"/"+d[0]+"/"+d[2]um d.replaceAll("(..).(..).","$2/$1/") 7 Bytes zu sparen .
Kevin Cruijssen

1
Und 1 weiteres Byte durch Ändern r+=new Date(s).getDay()%6<1?0:1,s+=864e5);von s+=864e5)r+=new Date(s).getDay()%6<1?0:1;. :)
Kevin Cruijssen

1
-1 Byte:r-=-new Date(s).getDay()%6>>-1;
Nevay

4

Rot , 72 Bytes

func[a][b: now/date s: 0 until[if b/weekday < 6[s: s + 1]a < b: b + 1]s]

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

func[a][a: do replace/all a".""-"b: now/date s: 0 until[if b/weekday < 6[s: s + 1]a < b: b + 1]s]

Probieren Sie es online!

Bonus:

Gibt eine Liste der Daten / Wochentage der Arbeitstage bis zum angegebenen Datum zurück:

Rot , 235 Bytes

f: func [ a ] [
    b: now/date
    d: system/locale/days
    collect [ 
        until [ 
            if b/weekday < 6 [ 
                keep/only reduce [ b ":" d/(b/weekday) ]
            ]
            a < b: b + 1
        ]
    ]
]

Probieren Sie es online!


Oh nein, in Python muss ich ungefähr 72 Bytes für die Verarbeitung dieses
E / A-

1
Normalerweise gehören meine Red-Lösungen zu den längsten, aber zum Glück geht Red sehr gut mit Datteln um :)
Galen Ivanov

1
90 Bytes zum Verarbeiten von Python ... Ich bin fertig, ich beende, bis es ein flexibleres Eingabeformat gibt: P
Quintec


3

Python 2 , 163 156 149 147 Bytes

lambda s:sum((date.today()+timedelta(x)).weekday()<5for x in range((date(*map(int,(s.split(".")[::-1])))-date.today()).days))
from datetime import*

Probieren 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):-(


2
Keine Notwendigkeit für diese: (0,1)[t.weekday()<5]. Python-Boolesche Werte sind eine Unterklasse von intund True, Falsekönnen in arithmetischen Operationen als verwendet werden 1,0. Ersetzen Sie es durch c+=t.weekday()<5, um 7 Bytes zu sparen.
mypetlion

1
149 Bytes als Lambda.
OVS

Vielen Dank @mypetlion. Ich hätte das nicht verpassen sollen.
ElPedro

Vielen Dank @ovs. Du hast vor kurzem zum zweiten Mal geholfen. Das letzte Mal war ein sehr beeindruckender -30. Versuchte herauszufinden, wie man dies in einen Lambda umwandelt.
ElPedro

3

Java (JDK 10) , 171 Byte

s->{int c=0;for(var t=java.time.LocalDate.now();!t.parse(s.replaceAll("(..).(..).(.*)","$3-$2-$1")).equals(t);t=t.plusDays(1))c-=t.getDayOfWeek().getValue()/6-1;return c;}

Probieren Sie es online!

Credits


1
Sie können das (.*)\\.(.*)\\.(.*)zu ändern (..).(..).(.*).
Kevin Cruijssen

Mit Ihrem replaceAll Technik kann seine Antwort jedoch auch um 7 Bytes golfen werden, sodass Ihre Antwort noch etwas länger ist. ;)
Kevin Cruijssen

@ KevinCruijssen Danke für den Regex! Und keine Sorge: Es macht mir nichts aus, eine längere Antwort zu haben;)
Olivier Grégoire

3

JavaScript (Node.js) , 168 160 139 133 Byte

35 Bytes weniger dank Quintec und Kevin Cruijssen

D=>{var i=D.split('.'),n=0;for(var d=new Date();d<=new Date(i[2],i[1]-1,i[0]);d.setDate(d.getDate()+1))n+=-~d.getDay()%7>1;return n;}

Probieren Sie es online!

D=>{
  var i=D.split('.'),                 // Splits the date string by .
      n=0;                            // Counter variable
  for(var d=new Date();               // For the actual date
      d<=new Date(i[2],i[1]-1,i[0]);      // As long as the date is less or equal the requested date
      d.setDate(d.getDate()+1))           // Count the date one up
    n+=-~d.getDay()%7>1;                // If the date is not a Sunday or Saturday
  return n;                           // Return the counter variable
}

1
158 Bytes mit Lambda
Quintec

1
139 Bytes mit verbesserter if-Bedingung
Quintec

1
Da Ihre Methode nicht rekursiv ist, müssen Sie die nicht zur 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++;um n+=-~d.getDay()%7>1;zum Golf es zu 133 Bytes .
Kevin Cruijssen

1
Hier ist der relevante Tipp warum -~iderselbe 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. :)
Kevin Cruijssen

1
Noch ein paar Tipps zum Nachschlagen.
Zottelig

3

Python3 & Numpy , 96 Bytes

Ich könnte nicht kleiner werden als die langweilige vorgefertigte Lösung ...

from numpy import*
d=datetime64
lambda s:busday_count(d('today'),d(f'{s[6:]}-{s[3:5]}-{s[:2]}'))

Probieren Sie es online!


Muss in Python 3 bekommen;)
ElPedro

Basierend auf Ihrem Import verwenden Sie nicht Python 3 , sondern Python 3 mit Numpy .
Jonathan Frech

@ JonathanFrech sollte das im Titel sein? Andere, die Python verwenden, haben ebenfalls eine Bibliothek verwendet, da Python keinen integrierten Datentyp für Datums- und Uhrzeitangaben hat.
Aaron

1
Dies hängt von Ihrer Definition der eingebauten Module ab - Module wie datetime sind Standardbibliotheksmodule und daher würde ich sie als Teil der Kernsprache betrachten. Wenn man jedoch Module von Drittanbietern wie numpy verwendet , verbessert man die Sprachfähigkeiten und daher würde ich es als eine andere Sprache ansehen.
Jonathan Frech

2

PowerShell , 107 bis 99 Byte

-8 bytes dank mazzy

$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

Probieren Sie es online!

Führt eine Regex -splitfür die Eingabe durch $argsund speichert die Werte in $days, $months und $years. Tritt dann in eine forSchleife ein, die $aauf das heutige Datum initialisiert wird. Die Schleife wird fortgesetzt , während $aist -less than unser Eingangszieldatum. Jede Iteration fügen wir 1da ysan $a, und zu prüfen , ob die aktuelle D*k(kurz für DayOfWeek) im Bereich 1..5(dh von Montag bis Freitag). Dieses boolesche Ergebnis wird akkumuliert $ound sobald wir die Schleife verlassen haben, verbleibt dieser Wert in der Pipeline und die Ausgabe ist implizit.


100 Bytes? $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
mazzy

1
@mazzy In der Tat. Außerdem kann das Semikolon zwischen for(...){...}und $oentfernt werden, sodass wir jetzt unter 100 sind!
AdmBorkBork

2

Python 2 , 147 143 141 140 Bytes

from datetime import*
lambda e,s=date.today():sum((s+timedelta(x+1)).weekday()<5for x in range((date(*map(int,e.split(".")[::-1]))-s).days))

Probieren 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!)


1
Bitte! Gute Antwort :)
ElPedro

1
Es ist eine Konvention, dass Sie f=hier auf die Ausdrücke von Lambda verzichten können
Aaron

1
"Datetime Parsing ist das Schlimmste, Leute" Hahahaha, fühle meinen Schmerz, du hast es geschafft, wo ich versagt habe: P
Quintec

@Aaron Ich bin mir nie sicher, ob das mit mehreren Funktionen oder mit import-Anweisungen in Ordnung ist, danke!
Triggernometrie

1
Sie können auch verwenden, rangeanstatt xrangees sollte immer noch gut funktionieren.
Aaron

2

PHP, 66 Bytes

for($t=time();$t<strtotime($argn);)$r+=date(N,$t+=86400)<6;echo$r;

leere Ausgabe für 0 ; einfügen +zwischen echound $rfixieren.

Als Rohr mit laufen lassen -nr oder probieren Sie es online aus .


60 Bytes bei unärer Ausgabe:

for($t=time();$t<strtotime($argn);)echo date(N,$t+=86400)<6;

1

PHP (mit Carbon ), 107 Bytes

function a($d){return Carbon\Carbon::parse($d)->diffInDaysFiltered(function($e){return!$e->isWeekend();});}

1

IBM / Lotus Notes-Formel - 99 Byte

d:=i;c:=0;@While(d>@Today;@Set("c";c+@If(@Weekday(d)=1:7;0;1));@Set("d";@Adjust(d;0;0;-1;0;0;0)));c

Übernimmt Eingaben aus einem Datums- / Zeitfeld i. Das Eingabeformat von iist 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 Feld oin derselben Form.

Interessant am Rande: Seit @Forund @Whilewurden 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:

Bildbeschreibung hier eingeben



1

K4 , 40 Bytes

Lösung:

{+/1<.q.mod[d+!(."."/:|"."\:x)-d:.z.d]7}

Erläuterung:

Berechnen Sie die Differenz zwischen den Daten, verwenden Sie Modulo 7, um Wochenenden zu ignorieren.

{+/1<.q.mod[d+!(."."/:|"."\:x)-d:.z.d]7} / the solution
     .q.mod[                         ]7  / modulo with 7
                                 .z.d    / UTC date
                               d:        / save as d
                              -          / subtract from
               (             )           / do this together
                       "."\:x            / split input on "."
                      |                  / reverse
                 "."/:                   / join back with "."
                .                        / take the value
              !                          / range 0..the difference
            d+                           / add today's date to range
   1<                                    / is 1 less than the modulo (ie is this mon-fri)?
 +/                                      / sum up

Anmerkungen:

  • gleiche Byte-Alternative zum Datums-Parsing: "D"$,/|"."\:x

1

C (Klirren) , 209 208 205 Bytes

Compiler-Flags -DU=u=localtime(&b) -DW=tm_wday -DY=tm_year -DT=tm_yday(52 Byte).

#import<time.h>
i;f(char*a){long b;struct tm t,*u;time(&b);U;strptime(a,"%d.%m.%Y",&t);for(i=0;u->T^t.T|u->Y^t.Y;u->W&&u->W^6&&i++,b+=86400,U);return i;}

Probieren Sie es online!

-1 Byte dank @JonathanFrech


?i++:0-> &&++i.
Jonathan Frech

0

q, 52 79 Bytes

{x:"D"$"."sv reverse"."vs x;i:0;while[x-.z.d;$[2>x mod 7;x-:1;[i+:1;x-:1]]];:i}

In 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


1
Das Beste, was ich mir ausgedacht habe, ist {sum 1<mod[d+til("D"$x 10 vs 67893401)-d:.z.d]7}für 48 Bytes, ohne auf K-Verben zurückzugreifen.
Streetster

Das Verwenden der Listenindizes ist viel eleganter als das Umkehren und das Anwenden von Mod auf die Liste, anstatt eine Schleife zu verwenden. Tolle Antwort +1
Thaufeki
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.