Plage de dates de chiffres


16

REMARQUE: puisque je suis moi-même néerlandais, toutes les dates sont au dd-MM-yyyyformat néerlandais dans la description du défi et les cas de test.

Défi:

Entrées:
date de début s ; Date de fin e ; Chiffren

Sorties:
toutes les dates dans la plage [s,e] (y compris des deux côtés), qui contiennentn quantité de chiffres uniques dans leur date.

Exemple:

Contributions: Date de début: 12-11-1991; Date de fin: 02-02-1992; Chiffre:4

Les sorties:
avec 0 en tête pour les jours / mois:

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

Sans 0 en tête pour les jours / mois:

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

Règles du défi:

  • Les dates d'entrée et de sortie peuvent être dans n'importe quel format raisonnable (date-). Peut être une chaîne dans n'importe queldMy format (y compris des séparateurs facultatifs), une liste de trois entiers, l'objet Date natif de votre langue, etc. La sortie peut être une liste / tableau / flux, imprimé sur STDOUT, une seule chaîne délimitée, etc.
  • Vous êtes autorisé à inclure ou à exclure les premiers 0 pour les jours / mois dans vos sorties. Veuillez spécifier lequel des deux vous utilisez dans votre réponse , car cela entraînera des résultats différents. C'est à dire 1-1-1991a 2 chiffres uniques, mais01-01-1991 comme 3 chiffres uniques.
  • Vous n'avez pas à gérer les années bissextiles et les différences entre les calendriers grégorien et julien. Vous pouvez supposer que les plages de dates données dans les cas de test ne dépasseront jamais le 28 février / 1er mars pour les années divisibles par 4.
  • Le chiffre d'entrée n est garanti dans la plage [1,8] , traitant donc n=0 n'est pas spécifié (renvoyer une liste vide serait plus raisonnable, mais donner une erreur ou un résultat incorrect est très bien aussi; vous avez gagné pas besoin de gérer cette entrée).

Règles générales:

  • C'est le , donc la réponse la plus courte en octets l'emporte.
    Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues non-golfeur de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation.
  • Des règles standard s'appliquent à votre réponse avec des règles d'E / S par défaut , vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés et des programmes complets de type retour. Ton appel.
  • Les failles par défaut sont interdites.
  • Si possible, veuillez ajouter un lien avec un test pour votre code (par exemple TIO ).
  • De plus, l'ajout d'une explication à votre réponse est fortement recommandé.

Cas de 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]

Je sais que ce n'est spécifiquement pas le format demandé ici, mais je commente juste ici pour "passer le mot": il existe une norme internationale que les programmeurs devraient essayer d'utiliser pour les dates (dans les journaux, les noms de fichiers, etc.): en.wikipedia.org / wiki / ISO_8601 . (utilise un «T» pour lever l'ambiguïté (sans le T, la date + l'heure pourrait être autre chose) et spécifie les séparateurs à utiliser, et quand on ne peut pas utiliser de séparateurs [c'est-à-dire propose une variante différente (du court au long] du même) standard]: le principal étant YYYY-MM-DDThh:mm:ss.mmm +hh:mm:, le + hh: mm étant le décalage horaire de votre locale par rapport à UTC.)
Olivier Dulac

Réponses:


2

Japt , 23 octets

Prend les entrées de date sous forme d'horodatages Unix, génère un tableau de chaînes avec un formatage et des 0s principaux en fonction de votre environnement local. Serait de 1 octet plus court dans Japt v2 mais il semble y avoir un bug lors de la conversion d' Dateobjets en chaînes.

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

Essayez-le

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

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

Essayez-le en ligne!

Utilise le format de date natif de R et comporte des zéros non significatifs le jour et le mois.


3

Rouge , 93 octets

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

Essayez-le en ligne!

Sans 0 en tête pour les jours / mois.

Dommage que Red convertit en interne 09-10-2019à 9-Oct-2019- c'est la raison pour laquelle je dois extraire le jour / mois / année individuellement.


Je ne connais pas Red, mais il semble qu'il y ait beaucoup d'espace blanc qui pourrait être coupé de cela. Pardonnez-moi si je me trompe.
connectyourcharger

@connectyourcharger Aucun problème! Apparemment, il existe plusieurs espaces blancs inutiles, mais ils sont nécessaires pour séparer les jetons. Les mots (identificateurs) en rouge peuvent inclure -=+*<>?!~&, c'est pourquoi un espace (ou (...)[...]"...") est nécessaire.
Galen Ivanov

2

Python 3.8 (pré-version) , 84 octets

-6 octets grâce à 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]

Une fonction sans nom qui renvoie une liste de chaînes (comptant / incluant les zéros non significatifs) qui accepte trois arguments:

  • s, le début - undatetime.date objet;
  • e, la fin - un datetime.dateobjet; et
  • n, le nombre de jours - un intobjet.

Essayez-le en ligne!

Remarque: Comme la fonction accepte des datetime.dateobjets, je n'ai pas compté le code d'importation pour cela (et j'ai contourné l'importation de l' datetime.timedeltaobjet car il est indirectement accessible via la soustraction de ces objets d'entrée).


1
type(obj)est 3 octets plus court que obj.__class__.
Gloweye

@Gloweye super merci!
Jonathan Allan

@Gloweye enregistre 6 à la fin (le point disparaît et les parenthèses sont déjà présentes)
Jonathan Allan

1
Je n'avais pas encore analysé à cette profondeur, juste vu le __class__et fait un commentaire rapide. Toujours heureux de vous aider.
Gloweye

1

JavaScript (ES6), 91 octets

Prend l'entrée comme (n)(end)(start), où les dates sont attendues comme horodatages Unix en millisecondes. Renvoie une liste de dates séparées par des espaces au formatyyyy-mm-dd .

Les 0 en tête sont inclus.

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

Essayez-le en ligne!


1
Cet extrait de code échouera probablement si le décalage DST se produit (un + 864e5 peut ne pas être demain dans ce cas). Mais heureusement, tio utilise le fuseau horaire UTC qui n'a pas l'heure d'été. - de quelqu'un qui utilise la même logique dans le site Web du produit et réalise quelque chose de mal jusqu'à ce que l'heure d'été soit décalée ...
tsh

1

PHP , 90 octets

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

Essayez-le en ligne!

C'est avec des 0 en tête. Les entrées sont des arguments de commande ( $argv) et les dates sont des horodatages Unix en jours (essentiellement des secondes standard / 86400), j'ai utilisé ce format car nous n'avons pas besoin de temps dans ce défi et cela m'a permis de jouer 1 octet de plus. Continue d'ajouter un jour pour commencer jusqu'à la fin et imprime toutes les dates avec $ndes chiffres uniques, séparés par _enYmd format.

Possède également une alternative de 89 octets qui imprime les dates à produire au même format que l'entrée (horodatages Unix en jours).


1

Java (JDK) , 86 octets

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

Essayez-le en ligne!

J'ai choisi d'utiliser le leader 0 art.

Crédits


1
Peut-être que je n'aurais pas dû le rendre inclusif aux deux extrémités, alors vous auriez pu utiliser Java 9 datesUntilpour 103 octets . ;) Bonne réponse. Je ne vois rien qui puisse être joué personnellement.
Kevin Cruijssen

1
@KevinCruijssen Eh bien, en fait, vous avez donné une excellente façon de jouer au golf! Ajoutez .plusDays(1)et supprimez simplement le .forEach(System.out::println)et c'est une réponse très intéressante car, comme vous l'avez écrit, les dates peuvent être renvoyées car les objets de valeur et les flux sont autorisés. ;-) Je n'avais aucune idée de l'existence datesUntilmême! Merci pour ça :-)
Olivier Grégoire

Oups, j'ai oublié mes propres règles autorisant les retours de flux, haha ​​XD je suis un idiot. Mais je suis content d'avoir pu t'aider avec mon idiotie. ; p
Kevin Cruijssen

1

Rubis -rdate , 54 octets

Prend 2 objets Date et un nombre en entrée et renvoie une liste d'objets Date en sortie. Gère les années bissextiles et utilise les zéros non significatifs.

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

Essayez-le en ligne!


1

C # (compilateur interactif Visual C #)

Sans 0 en tête, 104 , 103 octets en

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

Essayez-le en ligne!

Avec 0 en tête, 106 105 octets

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

Essayez-le en ligne!


Vous pouvez supprimer l'espace x =>$"dans vos deux versions pour -1. :)
Kevin Cruijssen

@KevinCruijssen ah putain de merci x) Je suis sûr que quelqu'un peut aussi trouver une solution plus courte, je ne suis pas satisfait de celle-ci
Innat3

0

Kotlin, 119 octets

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

Sans 0 en tête, prend deux java.time.LocalDateet a Long, renvoie a Streamde LocalDates


Salut, bienvenue au CCGC! Pourriez-vous peut-être ajouter un lien Essayer en ligne avec un code de test pour vérifier que cela fonctionne? De plus, je ne connais pas Kotlin, mais est-il possible de remplacer it.toString()par (it+"")pour économiser quelques octets? Je sais que cela est possible dans d'autres langages comme Java ou .NET C #.
Kevin Cruijssen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.