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]

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 "-"

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.


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.


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).


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!


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).


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


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

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!


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


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
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.