Cifra Intervallo di date


15

NOTA: dal momento che sono olandese, tutte le date sono nel dd-MM-yyyyformato olandese nella descrizione della sfida e nei casi di test.

Sfida:

Ingressi:
Data di inizio S ; Data di fine e ; Cifra n

Output:
tutte le date all'interno dell'intervallo [S,e] (incluso su entrambi i lati), che contengono n quantità di cifre uniche nella loro data.

Esempio:

Ingressi: Data di inizio: 12-11-1991; Data di fine: 02-02-1992; digit:4

Uscite:
con 0 iniziali per giorni / mesi:

[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]

Senza 0 iniziali per giorni / mesi:

[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]

Regole della sfida:

  • Le date di input e output possono essere in qualsiasi formato (data-) ragionevole. Può essere una stringa in qualsiasidMy formato (inclusi i separatori opzionali), un elenco di tre numeri interi, l'oggetto Date nativo della tua lingua, ecc. L'output può essere un elenco / matrice / flusso, stampato su STDOUT, una singola stringa delimitata, ecc.
  • Puoi includere o escludere 0 iniziali per giorni / mesi nelle tue uscite. Si prega di specificare quale dei due si utilizza nella risposta , poiché provocherà risultati diversi. Cioè 1-1-1991ha 2 cifre uniche, ma 01-01-1991come 3 cifre uniche.
  • Non devi occuparti degli anni bisestili e delle differenze tra i calendari gregoriano e giuliano. Puoi presumere che gli intervalli di date indicati nei casi di test non andranno mai oltre il 28 febbraio / 1 marzo per anni divisibili per 4.
  • La cifra di input n è garantita nell'intervallo [1,8] , quindi trattare con n=0 non è specificato (restituire un elenco vuoto sarebbe molto ragionevole, ma dare un errore o anche un risultato errato va bene; hai vinto non avere a che fare con quell'input).

Regole generali:

  • Questo è , quindi vince la risposta più breve in byte.
    Non lasciare che le lingue di code-golf ti scoraggino dal pubblicare risposte con lingue non codegolfing. Prova a trovare una risposta il più breve possibile per "qualsiasi" linguaggio di programmazione.
  • Per la risposta si applicano le regole standard con le regole I / O predefinite , quindi puoi usare STDIN / STDOUT, funzioni / metodo con i parametri corretti e tipo di ritorno, programmi completi. La tua chiamata.
  • Le scappatoie predefinite sono vietate.
  • Se possibile, aggiungi un link con un test per il tuo codice (ad es. TIO ).
  • Inoltre, si consiglia vivamente di aggiungere una spiegazione per la risposta.

Casi test:

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]

So che non è specificamente il formato richiesto qui, ma ho solo un commento qui per "spargere la voce": esiste uno standard internazionale che i programmatori dovrebbero provare a utilizzare per le date (in registri, nomi di file, ecc.): En.wikipedia.org / wiki / ISO_8601 . (usa una 'T' per desambiguare (senza la T la data + ora potrebbe essere qualcos'altro del tutto) e specifica i separatori da usare, e quando uno non può usare i separatori [cioè propone diverse varianti (da breve a lungo) dello stesso standard]: il principale è YYYY-MM-DDThh:mm:ss.mmm +hh:mm:, + hh: mm è il fuso orario del tuo locale rispetto a UTC.)
Olivier Dulac

Risposte:


2

Japt , 23 byte

Prende gli input di data come timestamp Unix, genera una serie di stringhe con formattazione e lead 0che dipendono dalle impostazioni locali. Sarebbe più corto di 1 byte in Japt v2 ma sembra esserci un bug durante la conversione di Dateoggetti in stringhe.

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

Provalo

ò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 byte

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

Provalo online!

Utilizza il formato data nativo di R e presenta zeri iniziali il giorno e il mese.


3

Rosso , 93 byte

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

Provalo online!

Senza 0 iniziali per giorni / mesi.

Peccato che Red converte internamente 09-10-2019a 9-Oct-2019- è per questo che ho bisogno di estrarre il giorno / mese / anno singolarmente.


Non ho familiarità con Red ma sembra che ci sia un sacco di spazio bianco che potrebbe essere tagliato fuori da questo. Perdonami se sbaglio, però.
connectyourcharger

@connectyourcharger Nessun problema! Apparentemente ci sono diversi spazi bianchi non necessari, ma sono necessari per separare i token. Le parole (identificatori) in rosso possono includere -=+*<>?!~&, ecco perché (...)[...]"..."sono necessari uno spazio bianco (o ).
Galen Ivanov,

2

Python 3.8 (pre-release) , 84 byte

-6 byte grazie a 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]

Una funzione senza nome che restituisce un elenco di stringhe (conteggio / inclusi zeri iniziali) che accetta tre argomenti:

  • s, l' inizio - un datetime.dateoggetto;
  • e, la fine - un datetime.dateoggetto; e
  • n, il numero di giorni - un intoggetto.

Provalo online!

Nota: poiché la funzione accetta datetime.dateoggetti, non ho contato il codice di importazione per quello (e ho lavorato sull'importazione datetime.timedeltadell'oggetto in quanto è indirettamente accessibile tramite sottrazione di questi oggetti di input).


1
type(obj)è di 3 byte più breve di obj.__class__.
Gloweye

@ Fantastico grazie grazie!
Jonathan Allan

@Gloweye salva 6 alla fine (il punto va e le parentesi sono già presenti)
Jonathan Allan

1
Non avevo ancora analizzato a tale profondità, ho appena visto __class__e fatto un breve commento. Sono sempre felice di aiutarti.
Gloweye,

1

JavaScript (ES6), 91 byte

Accetta input come (n)(end)(start), dove le date sono previste come timestamp Unix in millisecondi. Restituisce un elenco separato da spazi di date in formato yyyy-mm-dd.

Sono inclusi 0 iniziali.

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

Provalo online!


1
Questo frammento probabilmente fallirà se si è verificato un cambio dell'ora legale (in quel caso un + 864e5 potrebbe non essere domani). Ma per fortuna, tio usa il fuso orario UTC che non ha l'ora legale. - da qualcuno che usa la stessa logica nel sito Web del prodotto e realizza qualcosa di sbagliato fino a quando l'ora legale non si sposta ...
tsh

1

PHP , 90 byte

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

Provalo online!

Questo è con 0 iniziali. Gli input sono argomenti di comando ( $argv) e le date sono timestamp Unix in giorni (sostanzialmente secondi standard / 86400), ho usato questo formato in quanto non abbiamo bisogno di tempo in questa sfida e mi ha permesso di giocare a golf 1 byte in più. Continua ad aggiungere un giorno per iniziare fino a quando non raggiunge la fine e stampa le date con$n cifre univoche al suo interno, separate da _nel Ymdformato.

Hanno anche un 89 byte alternativa che stampa risale al output in stesso formato di ingresso (Unix timestamp in giorni).


1

Java (JDK) , 86 byte

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

Provalo online!

Ho scelto di usare il comando 0 s.

Titoli di coda

  • -24 grazie a Kevin Cruijssen che non sapeva di poter giocare a golf così tanto: p

1
Forse non avrei dovuto includerlo su entrambi i lati, quindi avresti potuto usare Java 9 datesUntilper 103 byte . ;) Bella risposta. Non vedo nulla che possa essere giocato a golf personalmente.
Kevin Cruijssen,

1
@KevinCruijssen Beh, in realtà, hai dato un modo estremamente piacevole di giocare a golf! Basta aggiungere .plusDays(1)e rimuovere .forEach(System.out::println)ed è una risposta molto giocata a golf perché come hai scritto, le date possono essere restituite come oggetti di valore e flussi sono consentiti. ;-) Non avevo idea che datesUntilesistesse! Grazie per questo :-)
Olivier Grégoire

Accidenti, ho dimenticato le mie regole che permettono i ritorni di stream, haha ​​XD Sono un idiota. Ma felice di poterti aiutare con la mia idiozia. ; p
Kevin Cruijssen,

1

Rubino -rdate , 54 byte

Accetta 2 oggetti Date e un numero come input e restituisce un elenco di oggetti Date come output. Gestisce gli anni bisestili e utilizza zero iniziali.

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

Provalo online!


1

C # (compilatore interattivo Visual C #)

Senza 0 iniziali, 104 , 103 byte iniziali

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

Provalo online!

Con 0 iniziali, 106 105 byte

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

Provalo online!


Puoi rimuovere lo spazio x =>$"in entrambe le versioni per -1. :)
Kevin Cruijssen,

@KevinCruijssen ah fuck thanks x) Sono sicuro che qualcuno può trovare anche una soluzione più breve, non sono soddisfatto con questo
Innat3

0

Kotlin, 119 byte

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

Senza 0 iniziali, accetta due java.time.LocalDatee a Long, restituisce a Streamdi LocalDates


Ciao, benvenuto in CCGC! Potresti forse aggiungere un link Provalo online con il codice di prova per verificare che funzioni? Inoltre, non conosco Kotlin, ma è possibile sostituirlo it.toString()con (it+"")per salvare qualche byte? So che questo è possibile in alcune altre lingue come Java o .NET C #.
Kevin Cruijssen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.