Período de dígitos


15

NOTA: Como eu sou holandês, todas as datas estão no dd-MM-yyyyformato holandês na descrição do desafio e nos casos de teste.

Desafio:

Entradas:
Data de início s ; Data final e ; Dígito n

Saídas:
todas as datas dentro do intervalo [s,e] (incluindo nos dois lados), que contêm n quantidade de dígitos únicos na data.

Exemplo:

Entradas: Data de início: 12-11-1991; Fim: 02-02-1992; Dígito:4

Saídas:
Com 0s iniciais por dias / 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]

Sem 0s iniciais por dias / 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]

Regras do desafio:

  • As datas de entrada e saída podem estar em qualquer formato razoável (data). Pode ser uma string em qualquer dMyformato (incluindo separadores opcionais), lista de três números inteiros, o objeto Date do idioma nativo etc. A saída pode ser uma lista / matriz / fluxo, impressa em STDOUT, uma única String delimitada, etc.
  • Você tem permissão para incluir ou excluir 0s iniciais por dias / meses em suas saídas. Especifique qual dos dois você usa em sua resposta , pois isso causará resultados diferentes. Ou seja, 1-1-1991tem 2 dígitos únicos, mas 01-01-1991com 3 dígitos únicos.
  • Você não precisa lidar com anos bissextos e diferenças de calendários gregoriano x juliano. Você pode supor que os intervalos de datas fornecidos nos casos de teste nunca ultrapassem 28 de fevereiro / 1º de março nos anos divisíveis por 4.
  • É garantido que o dígito de entrada n está no intervalo [1,8] , portanto, lidar com n=0 0 não é especificado (retornar uma lista vazia seria mais razoável, mas fornecer um erro ou resultado incorreto também é bom; você venceu tem que lidar com essa entrada).

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
  • Além disso, é altamente recomendável adicionar uma explicação para sua resposta.

Casos de teste:

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]

Eu sei que especificamente não é o formato exigido aqui, mas apenas comento aqui para "espalhar a palavra": existe um padrão internacional que os programadores devem tentar usar para datas (em registros, nomes de arquivos etc.): en.wikipedia.org / wiki / ISO_8601 . (usa um 'T' para cancelar a ambiguidade (sem o T a data + hora pode ser algo totalmente diferente) e especifica os separadores a serem usados, e quando não é possível usar os separadores [ou seja, propõe uma variante diferente (de curta a longa] da mesma standard]: o principal sendo YYYY-MM-DDThh:mm:ss.mmm +hh:mm:, + hh: mm sendo a hora local do seu local de trabalho em relação ao UTC.)
Olivier Dulac

Respostas:


2

Japonês , 23 bytes

Toma as entradas de data como carimbos de data e hora do Unix, produz uma matriz de seqüências de caracteres com formatação e 0s principais dependendo do seu código do idioma. Seria 1 byte menor no Japt v2, mas parece haver um erro ao converter Dateobjetos em strings.

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

Tente

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

Experimente online!

Usa o formato de data nativo de R e possui zeros à esquerda no dia e no mês.


3

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

Experimente online!

Sem 0s iniciais por dias / meses.

Pena que Red converte internamente 09-10-2019em 9-Oct-2019- é por isso que preciso extrair o dia / mês / ano individualmente.


Não estou familiarizado com Red, mas parece que há muito espaço em branco que poderia ser cortado disso. Perdoe-me se eu estiver errado, no entanto.
connectyourcharger

@connectyourcharger Sem problemas! Aparentemente, existem vários espaços em branco desnecessários, mas eles são necessários para separar os tokens. Palavras (identificadores) em vermelho podem incluir -=+*<>?!~&, é por isso que um espaço em branco (ou (...)[...]"...") é necessário.
Galen Ivanov

2

Python 3.8 (pré-lançamento) , 84 bytes

-6 bytes graças 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]

Uma função sem nome que retorna uma lista de cadeias (contando / incluindo zeros à esquerda) que aceita três argumentos:

  • s, o começo - umdatetime.date objeto;
  • e, o fim - um datetime.dateobjeto; e
  • n, o número de dias - um intobjeto.

Experimente online!

Nota: Como a função aceita datetime.dateobjetos, eu não contei o código de importação para isso (e trabalhei na importação do datetime.timedeltaobjeto, pois ele é indiretamente acessível via subtração desses objetos de entrada).


1
type(obj)é 3 bytes menor que obj.__class__.
Gloweye

@Gloweye awesome thanks!
Jonathan Allan

@Gloweye salva 6 no final (o ponto vai e os suportes já estão presentes)
Jonathan Allan

1
Eu não tinha analisado a essa profundidade ainda, apenas vi o __class__e fiz um comentário rápido. Sempre feliz em ajudar.
Gloweye 10/10

1

JavaScript (ES6), 91 bytes

Recebe entrada como (n)(end)(start), onde as datas são esperadas como carimbos de data e hora do Unix em milissegundos. Retorna uma lista de datas separada por espaço no formato yyyy-mm-dd.

Os 0s principais estão incluídos.

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

Experimente online!


1
Esse snippet provavelmente falhará se o deslocamento do horário de verão acontecer (um + 864e5 pode não ser amanhã nesse caso). Mas, felizmente, você deve usar o fuso horário UTC que não possui horário de verão. - de alguém que usa a mesma lógica no site do produto e perceber algo de errado até DST mudou ...
TSH

1

PHP , 90 bytes

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

Experimente online!

Isso ocorre com os principais 0s. As entradas são argumentos de comando ( $argv) e as datas são carimbos de data e hora do Unix em dias (basicamente segundos padrão / 86400), usei esse formato porque não precisamos do tempo neste desafio e isso me permitiu obter mais um byte. Mantém a adição de um dia para começar até que se atinge o fim e imprime quaisquer datas com $ndígitos únicas em que, separados por _emYmd formato.

Também possui uma alternativa de 89 bytes que imprime as datas para saída no mesmo formato da entrada (registros de data e hora do Unix em dias).


1

Java (JDK) , 86 bytes

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

Experimente online!

Eu escolhi usar 0s principais .

Créditos


1
Talvez eu não devesse tê-lo incluído nos dois extremos, então você poderia ter usado o Java 9 datesUntilpor 103 bytes . ;) Boa resposta. Não vejo nada que possa ser jogado pessoalmente.
Kevin Cruijssen 10/10/1919

1
@KevinCruijssen Bem, na verdade, você deu uma maneira extremamente agradável de jogar golfe! Basta adicionar .plusDays(1)e remover a .forEach(System.out::println)resposta, e é uma resposta muito positiva porque, como você escreveu, as datas podem ser retornadas, pois objetos e fluxos de valor são permitidos. ;-) Eu não tinha ideia de que datesUntilexistia! Obrigado por isso :-)
Olivier Grégoire

Woops, esqueci minhas próprias regras permitindo retornos de stream, haha ​​XD eu sou um idiota. Mas feliz por poder ajudá-lo com minha idiotice. ; p
Kevin Cruijssen 10/10/1919

1

Rubi -rdate , 54 bytes

Leva 2 Data objetos e um número como entrada e retorna uma lista de objetos Date como saída. Lida com anos bissextos e usa zeros à esquerda.

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

Experimente online!


1

C # (compilador interativo do Visual C #)

Sem 0s, 104 , 103 bytes à esquerda

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

Experimente online!

Com 0s iniciais, 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)

Experimente online!


Você pode remover o espaço x =>$"em ambas as versões para -1. :)
Kevin Cruijssen 15/10/19

@KevinCruijssen ah porra graças x) Eu tenho certeza que alguém pode vir até com uma solução mais curto demais, não estou satisfeito com este
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}

Sem 0s iniciais, recebe dois java.time.LocalDatee a Long, retorna a Streamde LocalDates


Olá, seja bem-vindo ao CCGC! Você poderia adicionar um link Experimente o on-line com código de teste para verificar se funciona? Além disso, não conheço o Kotlin, mas é possível substituir it.toString()por (it+"")para salvar alguns bytes? Eu sei que isso é possível em algumas outras linguagens como Java ou .NET C #.
Kevin Cruijssen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.