Ziffern-Datumsbereich

15

HINWEIS: Da ich selbst Niederländer bin, liegen alle Daten dd-MM-yyyyin der Beschreibung der Herausforderung und in den Testfällen im niederländischen Format vor.

Herausforderung:

Eingänge:
Startdatum s ; Enddatum ; Zifferen

Ausgaben:
Alle Daten im Bereich (auch auf beiden Seiten), deren Datum eindeutige Ziffern enthält.[s,e]n

Beispiel:

Eingänge: Startdatum: 12-11-1991; Enddatum 02-02-1992:; Ziffer:4

Ausgänge:
Mit führenden Nullen für Tage / Monate:

[20-11-1991, 23-11-1991, 24-11-1991, 25-11-1991, 26-11-1991, 27-11-1991, 28-11-1991, 30-11-1991, 01-12-1991, 02-12-1991, 09-12-1991, 10-12-1991, 13-12-1991, 14-12-1991, 15-12-1991, 16-12-1991, 17-12-1991, 18-12-1991, 20-12-1991, 23-12-1991, 24-12-1991, 25-12-1991, 26-12-1991, 27-12-1991, 28-12-1991, 31-12-1991, 01-01-1992, 02-01-1992, 09-01-1992, 10-01-1992, 11-01-1992, 12-01-1992, 19-01-1992, 20-01-1992, 21-01-1992, 22-01-1992, 29-01-1992, 01-02-1992, 02-02-1992]

Ohne führende Nullen für Tage / Monate:

[20-11-1991, 23-11-1991, 24-11-1991, 25-11-1991, 26-11-1991, 27-11-1991, 28-11-1991, 30-11-1991, 3-12-1991, 4-12-1991, 5-12-1991, 6-12-1991, 7-12-1991, 8-12-1991, 10-12-1991, 13-12-1991, 14-12-1991, 15-12-1991, 16-12-1991, 17-12-1991, 18-12-1991, 20-12-1991, 23-12-1991, 24-12-1991, 25-12-1991, 26-12-1991, 27-12-1991, 28-12-1991, 31-12-1991, 3-1-1992, 4-1-1992, 5-1-1992, 6-1-1992, 7-1-1992, 8-1-1992, 10-1-1992, 13-1-1992, 14-1-1992, 15-1-1992, 16-1-1992, 17-1-1992, 18-1-1992, 20-1-1992, 23-1-1992, 24-1-1992, 25-1-1992, 26-1-1992, 27-1-1992, 28-1-1992, 31-1-1992]

Herausforderungsregeln:

  • Die Eingabe- und Ausgabedaten können in jedem vernünftigen (Datums-) Format vorliegen. Kann als Zeichenfolge in einem beliebigen dMyFormat (einschließlich optionaler Trennzeichen), als Liste mit drei Ganzzahlen, als systemeigenes Datumsobjekt Ihrer Sprache usw. ausgegeben werden. Die Ausgabe kann eine Liste / ein Array / ein Datenstrom sein, der auf STDOUT gedruckt wird, eine einzelne durch Trennzeichen getrennte Zeichenfolge usw.
  • Sie dürfen führende Nullen für Tage / Monate in Ihre Ausgaben einbeziehen oder ausschließen. Bitte geben Sie an, welche der beiden Antworten Sie verwenden , da dies zu unterschiedlichen Ergebnissen führt. Dh 1-1-1991hat 2 eindeutige Ziffern, aber 01-01-1991als 3 eindeutige Ziffern.
  • Sie müssen sich nicht mit Schaltjahren und Unterschieden zwischen Gregorianischen und Julianischen Kalendern auseinandersetzen. Sie können davon ausgehen, dass die in den Testfällen angegebenen Datumsbereiche für Jahre, die durch 4 teilbar sind, nicht über den 28. Februar / 1. März hinausgehen.
  • Die Eingabeziffer n liegt garantiert im Bereich [1,8] , daher ist der Umgang mit n=0 nicht spezifiziert (eine leere Liste zurückzugeben wäre am sinnvollsten, aber einen Fehler oder ein falsches Ergebnis anzugeben ist auch in Ordnung; Sie haben gewonnen muss mich nicht mit dieser Eingabe befassen).

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln mit Standard-E / A-Regeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp, verwenden. Ihr Anruf.
  • Standardlücken sind verboten.
  • Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu (z. B. TIO ).
  • Es wird außerdem dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.

Testfälle:

Inputs: [12-11-1991, 02-02-1992], 4
Outputs with leading 0s:    [20-11-1991, 23-11-1991, 24-11-1991, 25-11-1991, 26-11-1991, 27-11-1991, 28-11-1991, 30-11-1991, 01-12-1991, 02-12-1991, 09-12-1991, 10-12-1991, 13-12-1991, 14-12-1991, 15-12-1991, 16-12-1991, 17-12-1991, 18-12-1991, 20-12-1991, 23-12-1991, 24-12-1991, 25-12-1991, 26-12-1991, 27-12-1991, 28-12-1991, 31-12-1991, 01-01-1992, 02-01-1992, 09-01-1992, 10-01-1992, 11-01-1992, 12-01-1992, 19-01-1992, 20-01-1992, 21-01-1992, 22-01-1992, 29-01-1992, 01-02-1992, 02-02-1992]
Outputs without leading 0s: [20-11-1991, 23-11-1991, 24-11-1991, 25-11-1991, 26-11-1991, 27-11-1991, 28-11-1991, 30-11-1991, 3-12-1991, 4-12-1991, 5-12-1991, 6-12-1991, 7-12-1991, 8-12-1991, 10-12-1991, 13-12-1991, 14-12-1991, 15-12-1991, 16-12-1991, 17-12-1991, 18-12-1991, 20-12-1991, 23-12-1991, 24-12-1991, 25-12-1991, 26-12-1991, 27-12-1991, 28-12-1991, 31-12-1991, 3-1-1992, 4-1-1992, 5-1-1992, 6-1-1992, 7-1-1992, 8-1-1992, 10-1-1992, 13-1-1992, 14-1-1992, 15-1-1992, 16-1-1992, 17-1-1992, 18-1-1992, 20-1-1992, 23-1-1992, 24-1-1992, 25-1-1992, 26-1-1992, 27-1-1992, 28-1-1992, 31-1-1992]

Inputs: [19-09-2019, 30-09-2019], 5
Outputs (same with and without leading 0s): [23-09-2019, 24-09-2019, 25-09-2019, 26-09-2019, 27-09-2019, 28-09-2019, 30-09-2019]

Inputs: [19-09-2019, 30-09-2019], 8
Output (same with and without leading 0s): []

Inputs: [20-06-1749, 30-06-1749], 8
Outputs with leading 0s:    [23-06-1749, 25-06-1749, 28-06-1749]
Outputs without leading 0s: []

Inputs: [10-12-1969, 12-01-1970], 6
Outputs (same with and without leading 0s): [30-12-1969]

Inputs: [10-12-1969, 12-01-1970], 5
Outputs with leading 0s:    [10-12-1969, 13-12-1969, 14-12-1969, 15-12-1969, 17-12-1969, 18-12-1969, 20-12-1969, 23-12-1969, 24-12-1969, 25-12-1969, 27-12-1969, 28-12-1969, 31-12-1969, 02-01-1970, 03-01-1970, 04-01-1970, 05-01-1970, 06-01-1970, 08-01-1970, 12-01-1970]
Outputs without leading 0s: [10-12-1969, 13-12-1969, 14-12-1969, 15-12-1969, 17-12-1969, 18-12-1969, 20-12-1969, 23-12-1969, 24-12-1969, 25-12-1969, 27-12-1969, 28-12-1969, 31-12-1969, 2-1-1970, 3-1-1970, 4-1-1970, 5-1-1970, 6-1-1970, 8-1-1970, 12-1-1970]

Inputs: [11-11-1111, 11-11-1111], 1
Output (same with and without leading 0s): [11-11-1111]
Kevin Cruijssen
quelle
Ich weiß, dass es nicht das hier verlangte Format ist, aber ich möchte hier nur einen Kommentar abgeben, um das Wort zu verbreiten: Es gibt einen internationalen Standard, den Programmierer für Datumsangaben (in Protokollen, Dateinamen usw.) verwenden sollten: en.wikipedia.org / wiki / ISO_8601 . (verwendet ein 'T' zur Begriffsklärung (ohne das T könnte das Datum + die Uhrzeit etwas ganz anderes sein) und spezifiziert die zu verwendenden Trennzeichen, und wenn man keine Trennzeichen verwenden kann [dh verschiedene Varianten (von kurz bis lang) desselben vorschlägt standard]: das wichtigste ist YYYY-MM-DDThh:mm:ss.mmm +hh:mm:, das + hh: mm ist der zeitliche Versatz Ihres Gebietsschemas von UTC.)
Olivier Dulac

Antworten:

2

Japt , 23 Bytes

Übernimmt die Datumseingaben als Unix-Zeitstempel und gibt 0abhängig von Ihrer Ländereinstellung eine Reihe von Zeichenfolgen mit Formatierungen und führenden Zeichen aus. Wäre in Japt v2 1 Byte kürzer, aber es scheint einen Fehler beim Konvertieren von DateObjekten in Zeichenfolgen zu geben.

òV864e5@ÐX s7Ãf_¬â ʶWÄ

Versuch es

òV864e5@ÐX s7Ãf_¬â ʶWÄ     :Implicit input of integers U=s,V=e & W=n
òV                          :Range [U,V]
  864e5                     :  With step 86,400,000 (24*60*60*1000)
       @                    :Map each X
        ÐX                  :  Convert to Date object
           s7               :  Convert to locale date string
             Ã              :End map
              f             :Filter
               _            :By passing each through the following function
                ¬           :  Split
                 â          :  Deduplicate
                   Ê        :  Length
                    ¶       :  Is equal to
                     WÄ     :  W+1, to account for the inclusion of the delimiting "/" or "-"
Zottelig
quelle
5

R , 81 Bytes

function(s,e,n,x=seq(s,e,1))x[lengths(sapply(strsplit(paste(x),""),unique))==n+1]

Probieren Sie es online!

Verwendet das native Datumsformat von R und hat führende Nullen an Tag und Monat.

Nick Kennedy
quelle
3

Rot , 93 Bytes

func[a b n][until[if n = length? exclude d: rejoin[a/4"-"a/3"-"a/2]"-"[print d]b < a: a + 1]]

Probieren Sie es online!

Ohne führende Nullen für Tage / Monate.

Schade , dass Red wandelt intern 09-10-2019zu 9-Oct-2019- deshalb muss ich individuell den Tag / Monat / Jahr extrahieren.

Galen Ivanov
quelle
Ich kenne Rot nicht, aber es scheint, als gäbe es eine Menge Leerzeichen, die hieraus herausgeschnitten werden könnten. Verzeihen Sie mir, wenn ich mich irre.
connectyourcharger
@connectyourcharger Kein Problem! Anscheinend gibt es mehrere unnötige Leerzeichen, aber sie werden benötigt, um die Token zu trennen. Wörter (Bezeichner) in Rot können enthalten -=+*<>?!~&, daher wird ein Leerzeichen (oder (...)[...]"...") benötigt.
Galen Ivanov
2

Python 3.8 (Vorabversion) , 84 Byte

-6 Bytes dank Gloweye

lambda s,e,n:[d for i in range((e-s).days+1)if-len(set(d:=str(s+type(e-s)(i))))==~n]

Eine unbenannte Funktion, die eine Liste von Zeichenfolgen (einschließlich führender Nullen) zurückgibt, die drei Argumente akzeptiert:

  • sder Anfang - ein datetime.dateObjekt;
  • edas Ende - ein datetime.dateObjekt; und
  • n, die Anzahl der Tage - ein intObjekt.

Probieren Sie es online!

Hinweis: Da die Funktion datetime.dateObjekte akzeptiert , habe ich den Importcode dafür nicht gezählt (und den Import des datetime.timedeltaObjekts umgangen, da dieser indirekt durch Subtraktion dieser Eingabeobjekte zugänglich ist).

Jonathan Allan
quelle
1
type(obj)ist 3 Bytes kürzer als obj.__class__.
Gloweye
@Gloweye super danke!
Jonathan Allan
@Gloweye speichert 6 am Ende (der Punkt geht und die Klammern sind bereits vorhanden)
Jonathan Allan
1
Ich hatte noch nicht bis zu dieser Tiefe analysiert, sah nur die __class__und machte einen kurzen Kommentar. Immer gerne helfen.
Gloweye
1

JavaScript (ES6), 91 Byte

Übernimmt die Eingabe als (n)(end)(start), wobei die Daten als Unix-Zeitstempel in Millisekunden erwartet werden. Gibt eine durch Leerzeichen getrennte Liste von Datumsangaben im Format zurück yyyy-mm-dd.

Führende Nullen sind enthalten.

n=>b=>g=a=>a>b?'':(new Set(d=new Date(a).toJSON().split`T`[0]).size+~n?'':d+' ')+g(a+864e5)

Probieren Sie es online!

Arnauld
quelle
1
Dieses Snippet wird wahrscheinlich fehlschlagen, wenn die Sommerzeit verschoben wurde (in diesem Fall ist ein + 864e5 möglicherweise nicht morgen). Zum Glück können Sie jedoch eine UTC-Zeitzone ohne Sommerzeit verwenden. - von jemandem, der dieselbe Logik auf der Produktwebsite verwendet und etwas falsches erkennt, bis die Sommerzeit
umgestellt wurde
1

PHP , 90 Bytes

for([,$s,$e,$n]=$argv;$s<=$e;)$n-count(count_chars($d=date(Ymd,86400*$s++),1))||print$d._;

Probieren Sie es online!

Dies ist mit führenden 0en. Eingaben sind Befehlsargumente ( $argv) und Datumsangaben sind Unix-Zeitstempel in Tagen (im Grunde Standardsekunden / 86400). Ich habe dieses Format verwendet, da wir bei dieser Herausforderung keine Zeit benötigen und 1 Byte mehr Golf spielen konnten. Fügt einen Tag hinzu, der beginnt, bis das Ende erreicht ist, und druckt alle Daten mit $neindeutigen Ziffern, die durch _im YmdFormat getrennt sind.

Verwenden Sie auch eine 89-Byte-Alternative, die Datumsangaben im gleichen Format wie die Eingabe ausgibt (Unix-Zeitstempel in Tagen).

Night2
quelle
1

Java (JDK) , 86 Byte

(s,e,n)->s.datesUntil(e.plusDays(1)).filter(d->(""+d).chars().distinct().count()==n+1)

Probieren Sie es online!

Ich entschied mich für führende 0s.

Credits

Olivier Grégoire
quelle
1
Vielleicht hätte ich es nicht an beiden Enden inklusive machen sollen, dann hättest du Java 9 datesUntilfür 103 Bytes verwenden können . ;) Gute Antwort. Ich sehe nichts, was man persönlich golfen könnte.
Kevin Cruijssen
1
@ KevinCruijssen Nun, eigentlich hast du eine sehr schöne Art zu Golfen gegeben! Fügen Sie einfach das hinzu .plusDays(1)und entfernen Sie .forEach(System.out::println)es. Es ist eine sehr gelungene Antwort, denn wie Sie geschrieben haben, können Daten zurückgegeben werden, da Wertobjekte und Streams zulässig sind. ;-) Ich hatte keine Ahnung, dass es datesUntilüberhaupt existiert! Vielen Dank dafür :-)
Olivier Grégoire
Woops, hab meine eigenen Regeln vergessen, die Stream-Returns erlauben, haha ​​XD, ich bin ein Idiot. Aber froh, dass ich dir mit meinem Schwachsinn helfen konnte. ; p
Kevin Cruijssen
1

Ruby -rdate , 54 Bytes

Nimmt 2 Datumsobjekte und eine Zahl als Eingabe und gibt eine Liste von Datumsobjekten als Ausgabe zurück. Verarbeitet Schaltjahre und verwendet führende Nullen.

->a,b,n{(a..b).select{|d|d.to_s.chars.uniq.size==n+1}}

Probieren Sie es online!

Wert Tinte
quelle
1

C # (Visual C # Interactive Compiler)

Ohne führende 0en 104 , 103 Bytes

(s,e,n)=>new int[(e-s).Days+1].Select((x,i)=>s.AddDays(i)).Where(x=>$"{x:yyyMd}".Distinct().Count()>=n)

Probieren Sie es online!

Mit führenden 0en 106 105 Bytes

(s,e,n)=>new int[(e-s).Days+1].Select((x,i)=>s.AddDays(i)).Where(x=>$"{x:yyyMMdd}".Distinct().Count()>=n)

Probieren Sie es online!

Innat3
quelle
Sie können das Leerzeichen x =>$"in beiden Versionen für -1 entfernen . :)
Kevin Cruijssen
@ KevinCruijssen ah fuck danke x) Ich bin sicher, jemand kann sich auch eine kürzere Lösung einfallen lassen, ich bin nicht zufrieden mit dieser
Innat3
0

Kotlin, 119 Bytes

fun f(a:LocalDate,b:LocalDate,c:Long)=a.datesUntil(b.plusDays(1)).filter{it.toString().chars().distinct().count()==c+1}

Ohne führende Nullen nimmt a zwei java.time.LocalDateund Longgibt a Streamvon LocalDates zurück

AUsername
quelle
Hallo, willkommen bei CCGC! Könnten Sie vielleicht einen Online- Testlink mit Testcode hinzufügen , um zu überprüfen, ob er funktioniert? Auch ich weiß nicht , Kotlin, aber ist es möglich , zu ersetzen , it.toString()mit (it+"")ein paar Bytes speichern? Ich weiß, dass dies in einigen anderen Sprachen wie Java oder .NET C # möglich ist.
Kevin Cruijssen