Zakres dat cyfr


16

UWAGA: Ponieważ sam jestem Holendrem, wszystkie daty są w holenderskim dd-MM-yyyyformacie w opisie wyzwania i przypadkach testowych.

Wyzwanie:

Wejścia:
Data rozpoczecia ; Data zakończenia ; Cyfrasen

Dane wyjściowe:
wszystkie daty z zakresu (w tym po obu stronach), które zawierają liczby unikalnych cyfr w swojej dacie.[s,e]n

Przykład:

Wejścia: data rozpoczęcia: 12-11-1991; Data zakończenia: 02-02-1992; Cyfra:4

Wyjścia:
z wiodącymi zerami dla dni / miesięcy:

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

Bez wiodących zer dla dni / miesięcy:

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

Zasady konkursu:

  • Daty wejścia i wyjścia mogą być w dowolnym rozsądnym formacie (data-). Może być ciągiem w dowolnym dMyformacie (w tym opcjonalnymi separatorami), listą trzech liczb całkowitych, rodzimym obiektem daty języka itp. Dane wyjściowe mogą być listą / tablicą / strumieniem, drukowane do STDOUT, pojedynczym ciągiem ograniczającym itp.
  • Możesz włączać lub wyłączać wiodące zera dla dni / miesięcy w swoich wynikach. Podaj, którego z nich użyjesz w odpowiedzi , ponieważ spowoduje to różne wyniki. Tj. 1-1-1991Ma 2 unikalne cyfry, ale 01-01-1991jako 3 niepowtarzalne cyfry.
  • Nie musisz radzić sobie z latami przestępnymi i różnicami między kalendarzami gregoriańskimi a juliańskimi. Możesz założyć, że zakresy dat podane w przypadkach testowych nigdy nie przekroczą 28 lutego / 1 marca dla lat podzielnych przez 4.
  • Cyfra wejściowa ma gwarancję, że mieści się w zakresie , więc radzenie sobie z jest nieokreślone (zwrócenie pustej listy byłoby najbardziej rozsądne, ale podanie błędu lub niepoprawnego wyniku również jest w porządku; wygrałeś nie będę musiał sobie z tym poradzić).n[1,8]n=0

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki kod-golfowe zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły z domyślnymi regułami We / Wy , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i typem zwracanych, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem kodu (tj. TIO ).
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.

Przypadki testowe:

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]

Wiem, że nie jest to wymagany tutaj format, ale po prostu komentuję tutaj, aby „rozpowszechnić informacje”: istnieje międzynarodowy standard, którego programiści powinni używać w przypadku dat (w dziennikach, nazwach plików itp.): En.wikipedia.org / wiki / ISO_8601 . (używa „T” do desambiguate (bez T data + czas może być czymś zupełnie innym) i określa separatory, których należy użyć, a kiedy nie można użyć separatorów [tzn. proponuje inny wariant (od krótkiego do długiego) tego samego standard]: głównym z nich jest YYYY-MM-DDThh:mm:ss.mmm +hh:mm:, + hh: mm to przesunięcie czasu lokalizacji w stosunku do czasu UTC.)
Olivier Dulac

Odpowiedzi:


2

Japt , 23 bajty

Pobiera dane wejściowe jako znaczniki czasu systemu Unix, wyświetla tablicę ciągów znaków z formatowaniem i wiodącymi 0literami zależnymi od ustawień regionalnych. Byłby o 1 bajt krótszy w Japt v2, ale wydaje się, że występuje błąd podczas konwersji Dateobiektów na ciągi.

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

Spróbuj

ò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 bajtów

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

Wypróbuj online!

Używa natywnego formatu daty R i ma wiodące zera w dniu i miesiącu.


3

Czerwony , 93 bajty

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

Wypróbuj online!

Bez wiodących zer dla dni / miesięcy.

Szkoda, że Red przetwarza wewnętrznie 09-10-2019do 9-Oct-2019- Dlatego trzeba wyodrębnić dzień / miesiąc / rok indywidualnie.


Nie znam Reda, ale wygląda na to, że istnieje wiele białych znaków, które można by z tego wyciąć. Wybacz mi jednak, jeśli się mylę.
connectyourcharger

@connectyourcharger Nie ma problemu! Pozornie istnieje kilka niepotrzebnych białych znaków, ale są one potrzebne do oddzielenia tokenów. Słowa (identyfikatory) w kolorze czerwonym mogą zawierać -=+*<>?!~&, dlatego (...)[...]"..."potrzebne są białe znaki (lub ).
Galen Iwanow

2

Python 3.8 (wersja wstępna) , 84 bajtów

-6 bajtów dzięki 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]

Nienazwana funkcja, która zwraca listę ciągów (zliczających / włączając zera wiodące), która akceptuje trzy argumenty:

  • s, początek - datetime.dateobiekt;
  • e, koniec - datetime.dateobiekt; i
  • n, liczba dni - intobiekt.

Wypróbuj online!

Uwaga: Ponieważ funkcja akceptuje datetime.dateobiekty, nie policzyłem do tego kodu importu (i pracowałem nad importowaniem datetime.timedeltaobiektu, ponieważ jest on pośrednio dostępny poprzez odjęcie tych obiektów wejściowych).


1
type(obj)jest o 3 bajty krótszy niż obj.__class__.
Gloweye,

@Gloweye niesamowite dzięki!
Jonathan Allan,

@Gloweye zapisuje 6 na końcu (kropka idzie, a nawiasy są już obecne)
Jonathan Allan

1
Jeszcze nie analizowałem do tej głębokości, po prostu zobaczyłem __class__i szybko skomentowałem. Zawsze chętnie pomogę.
Gloweye,

1

JavaScript (ES6), 91 bajtów

Pobiera dane wejściowe jako (n)(end)(start), gdzie daty są oczekiwane jako uniksowe znaczniki czasu w milisekundach. Zwraca rozdzieloną spacjami listę dat w formacie yyyy-mm-dd.

Wiodące zera są uwzględnione.

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

Wypróbuj online!


1
Ten fragment kodu prawdopodobnie nie powiedzie się, jeśli nastąpi zmiana DST (w takim przypadku + 864e5 może nie być jutro). Ale na szczęście tio używa strefy czasowej UTC, która nie ma czasu letniego. - od kogoś, kto używa tej samej logiki na stronie produktu i zdaje sobie sprawę, że coś jest nie tak, dopóki DST się nie zmienił ...
tsh

1

PHP , 90 bajtów

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

Wypróbuj online!

Dotyczy to wiodących zer. Dane wejściowe to argumenty poleceń ( $argv), a daty to uniksowe znaczniki czasu w dniach (w zasadzie standardowe sekundy / 86400), użyłem tego formatu, ponieważ nie potrzebujemy czasu na to wyzwanie i pozwoliło mi to zagrać o 1 bajt więcej. Utrzymuje dodanie dzień, by zacząć, dopóki nie dojdzie do końca i drukuje żadnych dat z $nunikalnych cyfr w nim, rozdzielonych _w Ymdformacie.

Mają także 89-bajtową alternatywę, która drukuje daty do wydrukowania w tym samym formacie co dane wejściowe (znaczniki czasu Unix w dniach).


1

Java (JDK) , 86 bajtów

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

Wypróbuj online!

Zdecydowałem się użyć wiodących 0s.

Kredyty


1
Może nie powinienem był uwzględniać obu końców, to mógłbyś użyć Javy 9 datesUntildla 103 bajtów . ;) Niezła odpowiedź. Nie widzę niczego, co można by osobiście zagrać w golfa.
Kevin Cruijssen

1
@KevinCruijssen Cóż, naprawdę dałeś niesamowity sposób gry w golfa! Wystarczy dodać .plusDays(1)i usunąć .forEach(System.out::println)i jest to bardzo golfowa odpowiedź, ponieważ jak napisałeś, daty mogą być zwracane, ponieważ dozwolone są obiekty wartości i strumienie. ;-) Nie miałem pojęcia, że ​​w datesUntilogóle istnieje! Dziękuję za to :-)
Olivier Grégoire,

Ups, zapomniałem o moich własnych zasadach zezwalających na zwrot strumienia, haha ​​XD Jestem idiotą. Ale cieszę się, że mogłem pomóc ci z moim idiotyzmem. ; p
Kevin Cruijssen

1

Rubinowy -rdate , 54 bajty

Pobiera 2 obiekty Data i liczbę jako dane wejściowe i zwraca listę obiektów Data jako dane wyjściowe. Obsługuje lata przestępne i używa wiodących zer.

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

Wypróbuj online!


1

C # (interaktywny kompilator Visual C #)

Bez początkowych zer, 104 , 103 bajtów

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

Wypróbuj online!

Z wiodącymi zerami, 106 105 bajtów

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

Wypróbuj online!


Możesz usunąć miejsce x =>$"w obu wersjach dla -1. :)
Kevin Cruijssen

@KevinCruijssen ah kurwa dzięki x) Jestem pewien, że ktoś może również wymyślić krótsze rozwiązanie, nie jestem z tego zadowolony
Innat3

0

Kotlin, 119 bajtów

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

Bez wiodących zer, przyjmuje dwa java.time.LocalDatei a Long, zwraca a Streamz LocalDates


Cześć, witamy w CCGC! Czy możesz dodać link Wypróbuj online z kodem testowym, aby sprawdzić, czy działa? Również nie wiem, Kotlin, ale jest to możliwe do zastąpienia it.toString()z (it+"")zaoszczędzić kilka bajtów? Wiem, że jest to możliwe w niektórych innych językach, takich jak Java lub .NET C #.
Kevin Cruijssen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.