Rango de fecha de dígitos

15

NOTA: Como soy holandés, todas las fechas están en dd-MM-yyyyformato holandés en la descripción del desafío y los casos de prueba.

Desafío:

Entradas:
Fecha de inicio s ; Fecha de finalización e ; Dígito n

Salidas:
todas las fechas dentro del rango [s,e] (incluso en ambos lados), que contienen norte cantidad de dígitos únicos en su fecha.

Ejemplo:

Entradas: Fecha de inicio: 12-11-1991; Fecha de finalización: 02-02-1992; Dígito:4

Salidas:
con ceros a la izquierda por días / meses:

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

Sin ceros a la izquierda por días / meses:

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

Reglas de desafío:

  • Las fechas de entrada y salida pueden estar en cualquier formato razonable (fecha). Puede ser una cadena en cualquier dMyformato (incluidos los separadores opcionales), una lista de tres enteros, el objeto de fecha nativo de su idioma, etc. La salida puede ser una lista / matriz / secuencia, impresa en STDOUT, una sola cadena delimitada, etc.
  • Puede incluir o excluir los ceros a la izquierda durante días / meses en sus resultados. Especifique cuál de los dos utiliza en su respuesta , ya que causará resultados diferentes. Es decir, 1-1-1991tiene 2 dígitos únicos, pero 01-01-1991como 3 dígitos únicos.
  • No tiene que lidiar con los años bisiestos y las diferencias entre los calendarios gregoriano y juliano. Puede suponer que los rangos de fechas dados en los casos de prueba nunca superarán el 28 de febrero / 1 de marzo por años divisibles por 4.
  • n[1,8]n=0 0

Reglas generales:

  • Este es el , por lo que la respuesta más corta en bytes gana.
    No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolfing. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación.
  • Las reglas estándar se aplican a su respuesta con las reglas de E / S predeterminadas , por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
  • Las lagunas predeterminadas están prohibidas.
  • Si es posible, agregue un enlace con una prueba para su código (es decir, TIO ).
  • Además, se recomienda agregar una explicación para su respuesta.

Casos de prueba:

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
fuente
Sé que específicamente no es el formato exigido aquí, pero acabo de comentar aquí para "correr la voz": hay un estándar internacional que los programadores deberían tratar de usar para fechas (en registros, nombres de archivos, etc.): en.wikipedia.org / wiki / ISO_8601 . (usa una 'T' para desambiguate (sin la T la fecha + hora podría ser algo completamente diferente) y especifica los separadores a usar, y cuando uno no puede usar separadores [es decir, propone una variante diferente (de corta a larga) de la misma estándar]: el principal es:, YYYY-MM-DDThh:mm:ss.mmm +hh:mmel + hh: mm es el desplazamiento de hora de su localidad desde UTC.)
Olivier Dulac

Respuestas:

2

Japt , 23 bytes

Toma las entradas de fecha como marcas de tiempo de Unix, genera una serie de cadenas con formato y guiones 0dependientes de su ubicación. Sería 1 byte más corto en Japt v2, pero parece haber un error al convertir Dateobjetos en cadenas.

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

Intentalo

ò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 "-"
Lanudo
fuente
5

R , 81 bytes

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

Pruébalo en línea!

Utiliza el formato de fecha nativo de R y tiene ceros a la izquierda el día y el mes.

Nick Kennedy
fuente
3

Rojo , 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]]

Pruébalo en línea!

Sin ceros a la izquierda por días / meses.

Lástima que Red convierte internamente 09-10-2019a 9-Oct-2019- es por eso que necesitan para extraer el día / mes / año de forma individual.

Galen Ivanov
fuente
No estoy familiarizado con Red, pero parece que hay mucho espacio en blanco que podría eliminarse de esto. Disculpe si me equivoco, sin embargo.
connectyourcharger
@connectyourcharger ¡No hay problema! Aparentemente hay varios espacios en blanco innecesarios, pero son necesarios para separar los tokens. Las palabras (identificadores) en rojo pueden incluir -=+*<>?!~&, por eso (...)[...]"..."se necesita un espacio en blanco (o ).
Galen Ivanov
2

Python 3.8 (prelanzamiento) , 84 bytes

-6 bytes gracias 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 función sin nombre que devuelve una lista de cadenas (contando / incluyendo ceros iniciales) que acepta tres argumentos:

  • s, el comienzo - un datetime.dateobjeto;
  • e, el fin - un datetime.dateobjeto; y
  • n, el número de días: un intobjeto.

Pruébalo en línea!

Nota: Como la función acepta datetime.dateobjetos, no he contado el código de importación para eso (y he trabajado para importar el datetime.timedeltaobjeto ya que es accesible indirectamente mediante la resta de estos objetos de entrada).

Jonathan Allan
fuente
1
type(obj)es 3 bytes más corto que obj.__class__.
Gloweye
@ Gloweye increíble gracias!
Jonathan Allan
@Gloweye ahorra 6 al final (el punto se va y los corchetes ya están presentes)
Jonathan Allan
1
Todavía no había analizado a esa profundidad, solo vi el __class__e hice un comentario rápido. Siempre me alegro de ayudar.
Gloweye
1

JavaScript (ES6), 91 bytes

Toma la entrada como (n)(end)(start), donde las fechas se esperan como marcas de tiempo Unix en milisegundos. Devuelve una lista de fechas separadas por espacios en formato yyyy-mm-dd.

Se incluyen los ceros a la izquierda.

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

Pruébalo en línea!

Arnauld
fuente
1
Este fragmento probablemente fallará si se produce un cambio de horario de verano (a + 864e5 puede no ser mañana en ese caso). Pero afortunadamente, tio usa la zona horaria UTC que no tiene horario de verano. - de alguien que usa la misma lógica en el sitio web del producto y se da cuenta de que algo anda mal hasta que el horario de verano cambió ...
tsh
1

PHP , 90 bytes

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

Pruébalo en línea!

Esto es con ceros a la izquierda. Las entradas son argumentos de comando ( $argv) y las fechas son marcas de tiempo Unix en días (básicamente segundos estándar / 86400), utilicé este formato ya que no necesitamos el tiempo en este desafío y me permitió jugar 1 byte más. Sigue agregando un día para comenzar hasta que llegue al final e imprime cualquier fecha con$n dígitos únicos en ella, separadas por _en Ymdformato.

También tiene una alternativa de 89 bytes que imprime fechas para imprimir en el mismo formato que la entrada (marcas de tiempo Unix en días).

Noche2
fuente
1

Java (JDK) , 86 bytes

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

Pruébalo en línea!

Elegí usar los 0s principales .

Créditos

  • -24 gracias a Kevin Cruijssen que no sabía que podía jugar golf tanto: p
Olivier Grégoire
fuente
1
Tal vez no debería haberlo incluido en ambos extremos, entonces podrías haber usado Java 9 datesUntilpara 103 bytes . ;) Buena respuesta. No veo nada que pueda jugar golf personalmente.
Kevin Cruijssen
1
@KevinCruijssen Bueno, en realidad, ¡diste una muy buena forma de jugar al golf! Simplemente agregue .plusDays(1)y elimine el .forEach(System.out::println)y es una respuesta muy precisa porque, como escribió, las fechas se pueden devolver como objetos de valor y secuencias permitidas. ;-) ¡No tenía ni idea de que datesUntilexistía! Gracias por eso :-)
Olivier Grégoire
Woops, se olvidó de mis propias reglas que permiten el retorno de la transmisión, jaja XD Soy un idiota. Pero me alegro de poder ayudarte con mi idiotez. ; p
Kevin Cruijssen
1

Rubí -rdate , 54 bytes

Toma 2 objetos Date y un número como entrada, y devuelve una lista de objetos Date como salida. Maneja los años bisiestos y utiliza ceros a la izquierda.

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

Pruébalo en línea!

Tinta de valor
fuente
1

C # (compilador interactivo de Visual C #)

Sin ceros a la izquierda, 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)

Pruébalo en línea!

Con ceros a la izquierda, 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)

Pruébalo en línea!

Innat3
fuente
Puede eliminar el espacio x =>$"en ambas versiones para -1. :)
Kevin Cruijssen
@KevinCruijssen ah joder gracias x) Estoy seguro de que alguien puede encontrar una solución más corta también, no estoy satisfecho con esta
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}

Sin ceros a la izquierda, toma dos java.time.LocalDatey a Long, devuelve a Streamde LocalDates

AUnombre de usuario
fuente
Hola, bienvenido a CCGC! ¿Podría agregar un enlace Probar en línea con un código de prueba para verificar que funciona? Además, no sé Kotlin, pero ¿es posible sustituir it.toString()con (it+"")ahorrar unos pocos bytes? Sé que esto es posible en algunos otros lenguajes como Java o .NET C #.
Kevin Cruijssen