Diese Tage arbeiten für mich


8

Hintergrund

Sie sind ein attraktiver Code-Golfer und einige Leute fragen Sie.

Sie haben keine Zeit darüber nachzudenken, welche Tage genau verfügbar sind. Sie entscheiden sich daher, eine Funktion zu erstellen, die ein Datum akzeptiert und die Wochentage zurückgibt.

Nehmen Sie dann diese Wochentage und fügen Sie sie in Ihr Kalenderprogramm ein, um festzustellen, ob Sie bereits von jemand anderem gefragt wurden.

Regeln

  • Akzeptiert ein Datum im Format JJJJ-MM-TT
  • Gibt ein Array / eine Liste der Daten dieser Woche zurück. (Sonntag ist der erste Tag)
    • Die Daten können als Millisekunden zwischen dem 1. Januar 1970 und diesem Datum in einem "allgemeinen" Datumsformat 1 oder als Datumsobjekte angezeigt werden.
  • Die Reihenfolge der Daten muss aufsteigend sein.
    • (Obwohl Sie klug genug sind, eine absteigende Liste zu unterstützen, kann das Programm am schnellsten mit einer aufsteigenden Liste arbeiten, und wer hat ein paar Millisekunden Zeit?)
  • Muss seit 1993 an jedem Tag arbeiten. (Ja, Sie sind zum Zeitpunkt des Schreibens 24 Jahre alt!)
  • Jede Javascript-Antwort erhält eine hohe Fünf!

Technische Daten

Beispieleingabe: whichDates(2017-08-29)

Ausgabe: (das Äquivalent von)

console.log([
  Date.parse('2017-08-27'),
  Date.parse('2017-08-28'),
  Date.parse('2017-08-29'),
  Date.parse('2017-08-30'),
  Date.parse('2017-08-31'),
  Date.parse('2017-09-01'),
  Date.parse('2017-09-02'),
]);

1 Ein Format, das ziemlich bekannt ist. Wie JJJJ-MM-TT.

2 Das ist ! Der kürzeste Code pro Sprache gewinnt, aber der kürzeste Code insgesamt erhält das Smaragd-Häkchen!


2
Außerdem empfehle ich Ihnen, andere Formate als zuzulassen YYYY-MM-DD(ich sehe keinen guten Grund, warum dies streng sein sollte).
Mr. Xcoder

5
Der erste Satz ist die seltsamste und weniger plausible Einführung, die ich bei einer Herausforderung gesehen habe. Gut gemacht :-)
Luis Mendo

2
@ LuisMendo Danke! Aber Sie wissen nie genau, wer Ihre kranken Programmierkenntnisse heimlich bewundert ...
Chris Happy

1
Warum jede Javascript-Antwort eine hohe Fünf bekommt! ?
Sergiol

1
Date.parse(2017-08-27)?? sollte dies sein Date.parse('2017-08-27')?
tsh

Antworten:


1

Japt , 15 Bytes

ÐU
7Æf1X+Uf -Ue

Probier es aus


Erläuterung

Implizite Eingabe einer Zeichenfolge U.

ÐU

In ein Datumsobjekt konvertieren Uund neu zuweisen U.

Erstellen Sie ein Array von Ganzzahlen von 0bis 6, die jeweils eine Funktion durchlaufen, in der Xsich das aktuelle Element befindet.

f1

Stellen Sie das Datum von ein U.

X+Uf

Fügen Sie das aktuelle Datum von Ubis hinzu X.

-Ue

Subtrahieren Sie den aktuellen Wochentag von U.

Das resultierende Array implizit ausgeben.


5

Perl 6 , 47 Bytes

{my$d=Date.new($_);map($d+*-$d.day-of-week,^7)}

Probieren Sie es online aus!

Der Code ist fast selbsterklärend. Zuerst $derstellen wir aus der Zeichenfolge ein Date-Objekt , das zufällig das schöne ISO-Format hat. Wir können mit den Datumsangaben rechnen (Hinzufügen einer Ganzzahl = Hinzufügen so vieler Tage, das gleiche gilt für das Subtrahieren). So $d-$d.day-of-weekist dasletzteDiese Woche (oh mein Gott, die Woche hat für mich immer mit Montag begonnen: D). ( .day-of-weekist 1 für Montag bis 7 für Sonntag.) Wir ordnen dann 0 bis 6 ( ^7) zu und addieren dies zum Sonntag, wobei alle Tage in der Woche abgerufen werden. Die Nummer, über die wir eine Zuordnung vornehmen, wird anstelle des Sterns angezeigt *. Diese Liste wird dann zurückgegeben.


5

JavaScript (ES6), 73 63 62 Bytes

Ich dachte, ich würde es auch in JavaScript versuchen.

Bearbeiten: Mit dem Millisekunden-Ansatz, den die Eingabeaufforderung zulässt, habe ich ihn auf 62 Byte reduziert.

s=>[..."0123456"].map(i=>(x=new Date(s))-(x.getDay()-i)*864e5)

Sie können ein .map(x=>new Date(x))für das zurückgegebene Array ausführen, wenn Sie es konvertieren möchten.


Beibehaltung des Datumsansatzes ( 72 Bytes )

s=>[..."0123456"].map(i=>new Date((x=new Date(s))-(x.getDay()-i)*864e5))

In meiner ersten Einreichung war ein Fehler aufgetreten, der behoben wurde. Dank einer Beobachtung durch Milch konnte ich den Fehler beseitigen und die Anzahl der Bytes noch senken.


Gib mir fünf!!
Chris Happy

2
Willkommen auf der Seite!
Luis Mendo

Es ist kürzer, nur die Zahlen im Array zu schreiben. 60 Bytes:s=>[..."0123456"].map(i=>(x=new Date(s))-(x.getDay()-i)*8e7)
Milch

1
Willkommen bei PPCG und gut gebunden :) Tipp 1: Lassen Sie keysden Index fallen und verwenden Sie den Index anstelle des Elements, wenn Sie das Array zuordnen . Tipp 2: Für ein so kleines Array ist es kürzer, es so zu generieren, wie ich es getan habe.
Shaggy

3

MATL , 22 21 Bytes

7:j8XOs21Y2=f-GYO+1XO

Die Ausgabe erfolgt im dd-mm-yyyyFormat.

Probieren Sie es bei MATL Online aus!

Erläuterung

7:     % Push [1 2 3 4 5 6 7]
j      % Input as a string
8XO    % Convert date to string with format 8, which is 'Mon', 'Tue' etc
s      % Sum
21Y2   % Push predefined literal [298 302 288 305 289 296 310]. The first number
       % is the sum of ASCII codes of 'Mon', the second is that of 'Tue', etc.
=      % Is equal?, element-wise
f      % Index of nonzero value. For example, if input is a Friday this gives 5
-      % Subtract, element-wise. For a Friday this gives [-4 -3 -2 -1 0 1 2]
G      % Push input again
YO     % Convert to date number: number of days from January 0, 0000
+      % Add, element-wise
1XO    % Convert to date format 1, which is 'dd-mm-yyyy'. Implicitly display

3

JavaScript (ES6), 76 Byte

Ich denke, ich habe endlich die Umgebung gefunden, die für effizientes Golfen am wenigsten förderlich ist: hinter meiner Bar, während ich mit der anderen Hand Pints ​​serviere!

s=>[...""+8e6].map((_,x)=>d.setDate(d.getDate()-d.getDay()+x),d=new Date(s))

Probieren Sie es online aus (Snippet folgt)


Erläuterung

s=>

Anonyme Funktion, die den String (vom Format yyyy-(m)m-(d)d) als Argument über einen Parameter verwendet s.

[...""+8e6]

Erstellen Sie ein Array mit 7 Elementen, indem Sie es 8000000in wissenschaftlicher Notation in eine Zeichenfolge konvertieren und diese strukturieren, die kürzer als ist [...Array(7)].

.map((_,x)=>          )

Ordnen Sie das Array zu und übergeben Sie jedes Element durch eine Funktion, wobei _das aktuelle Element, das nicht verwendet wird, und xder aktuelle Index auf 0 basieren.

,d=new Date(s)

In sein DateObjekt konvertieren und einer Variablen zuweisend

d.setDate(     )

Stellen Sie das Datum von ein d.

d.getDate()

Holen Sie sich das aktuelle Datum von d.

-d.getDay()

Subtrahieren Sie die aktuelle Wochentagsnummer (0-indiziert), um den Sonntag zu erhalten.

+x

Hinzufügen x.


2
beim servieren von pints mit meiner anderen hand! -
Gute

Fast vergessen ... High Five!
Chris Happy

2
@ ChrisHappy, wenn Sie JS lernen, suchen Sie nicht nach Code Golf für Tipps: P
Caird Coinheringaahing

1
@ ChrisHappy: Es könnte durchaus Sonntag sein, bis ich genug Zeit habe, einen aufzuschreiben. bis dahin hinter der Bar stecken.
Shaggy

1
@ ChrisHappy: Eine Minute gefunden, Erklärung hinzugefügt. Sie sollten sich die JS-Tipps unter dem Tipps- Tag ansehen, wenn Sie nach mehr Tricks für das Golfen in JS suchen.
Shaggy

2

Bash + Common Utilities, 53

jot -w@ 7 `date -f- +%s-%w*86400|bc` - 86400|date -f-

Probieren Sie es online aus .

Dies setzt voraus, dass die Ausgabe des GNU-Datums ein "allgemeines" Datumsformat ist, z Fri Sep 1 00:00:00 UTC 2017.

Erläuterung

           date -f- +%s-%w*86400                       # read date from STDIN, output expression "seconds-since-epoch - (index of day in week * 60 * 60 * 24)
                                |bc                    # arithmetically evaluate generated expression - result is date of required sunday in seconds-since-epoch
jot -w@ 7 `                        ` - 86400           # output seconds-since-epoch for all 7 required days of the week, prefixed with "@"
                                            |date -f-  # convert all seconds-since-epoch dates back to regular dates

2

Python 3, 133 124 126 112 Bytes

-9 Bytes dank Mr. Xcoder
+2 Bytes, da die Woche mit Sonntag beginnt
-14 Bytes dank Notjagan

from datetime import*
a=date(*map(int,input().split('-')))
for i in range(7):print(a-timedelta(a.weekday()-i+1))

Das lief nicht so gut, wie ich gehofft hatte.





Dies funktioniert in Python2 auch, wenn wir dies raw_input()anstelle von input()oben tun . (+4 Bytes). rangefunktioniert auch in Python2 auch für diese kleine Sache. Ohne dass raw_inputSie Fehler bekommen.
Thomas Ward

1

Mathematica 20 Bytes?

Mathematica drückt die Liste der Tage als einzelnes Datumsobjekt aus. Wenn ein solches Datumsobjekt eine akzeptable Ausgabe ist, funktioniert die folgende reine 20-Byte-Funktion:

#~DateObject~"Week"&

Beispiel

#~DateObject~"Week"&["2017-08-29"]

Wochenobjekt


1
Ich sehe kein Problem damit! :)
Chris Happy

1

Java 8 ( 161 154 123 122 102 + 19 36 Byte)

Probieren Sie es online aus!

import static java.time.LocalDate.*;

e->{for(int i=0;i<7;System.out.println(parse(e).plusDays(i++-parse(e).getDayOfWeek().getValue()%7)));}

Vergessen Sie nicht, Importe in Ihre Lösung und die Anzahl der Bytes aufzunehmen.
Jakob

Sie können auch Bytes speichern, lindem Sie Referenzen entfernen und durch ersetzen LocalDate.parse(e).
Jakob

@ Jakob Guten Ruf, danke
Roberto Graham

Und jetzt können Sie iden Schleifenkörper erhöhen, um 1 Byte zu sparen. Oh, und der java.util.function.*Import wird vom Lambda nicht verwendet, sodass Sie ihn nicht als Teil der Lösung zählen müssen.
Jakob

1

Python 2, 115 Bytes oder 111 Bytes, je nach Eingabeformat.

Grundsätzlich ist dies fast derselbe Code in der Antwort für Python3, die von Sobsz geschrieben wurde , aber in Python 2 funktioniert.


Wenn die Eingabe in der Form erfolgt YYYY-MM-DD:

(Dies setzt voraus, dass die Eingabe nicht in einfache Anführungszeichen gesetzt wird, um eine Zeichenfolge als Eingabe zu kennzeichnen.)

Der Hauptunterschied besteht darin, dass wir raw_inputstattdessen inputdas Datum in 'YYYY-MM-DD'den Apostrophen explizit angeben müssen , um es als Zeichenfolgenliteral zu identifizieren. Ohne die Eingabe des String-Literal erhalten wir einen Syntaxfehler, daher die Verwendung von raw_input, um Datumsangaben YYYY-MM-DDdirekt zu akzeptieren, ohne sie in String-Literale einzufügen.

Dies setzt natürlich voraus, dass die Eingabe wie folgt eingegeben wird : 2017-08-29.

from datetime import*
a=date(*map(int,raw_input().split('-')))
for i in range(7):print a-timedelta(a.weekday()-i+1)

+4 aus Sobsz 'Antwort, dann -1, weil wir keine Klammern für die printAnweisung benötigen und ein Byte aus der schließenden Klammer speichern, die nicht vorhanden ist; Insgesamt +3 Byte Differenz.

Probieren Sie es online aus!


Wenn die Eingabe in der Form erfolgt 'YYYY-MM-DD':

(Beachten Sie, dass das Datum in Anführungszeichen angegeben werden muss, damit diese Antwort funktioniert.)

Wir können 4 Bytes speichern, weil wir das nicht benötigen, raw_und dies ist praktisch die gleiche Antwort wie Sobsz, abzüglich eines Bytes, weil wir die Klammern um den printBefehl nicht benötigen .

Vielen Dank an Herrn Xcoder für diesen Hinweis, obwohl dies technisch gesehen ein genaues Duplikat von Sobsz 'Antwort ist, abzüglich eines Bytes .

from datetime import*
a=date(*map(int,input().split('-')))
for i in range(7):print a-timedelta(a.weekday()-i+1)

1
Willkommen bei PPCG! Sie können durch raw_input()Eingabe ersetzen und die Eingabe mit Anführungszeichen umgeben, um 4 Bytes zu sparen. Das macht Ihre Lösung natürlich zu einem Duplikat: P
Mr. Xcoder

@ Mr.Xcoder Stimmt, weshalb ich das übersprungen habe. Wenn wir die Eingabe zuerst in Anführungszeichen setzen, speichern wir tatsächlich ein Byte von Sobsz, und ich habe das notiert.
Thomas Ward
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.