Rakam Tarih Aralığı


16

NOT: Kendim Hollandalı olduğum için, tüm tarihler dd-MM-yyyymeydan okuma açıklaması ve test senaryolarında Hollandaca biçimindedir.

Meydan okuma:

Girişler:
Başlangıç ​​tarihi ; Bitiş tarihi ; Basamaksen

Çıktılar:
Tarihlerinde benzersiz sayı içeren (her iki taraf dahil) aralığındaki tüm tarihler .[s,e]n

Misal:

Girişler: Başlangıç ​​tarihi 12-11-1991:; Bitiş tarihi 02-02-1992:; Hane:4

Çıktılar:
Günler / aylar için önde gelen 0'lar:

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

Günler / aylar için 0'lar önde olmadan:

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

Zorluk kuralları:

  • Giriş ve çıkış tarihleri ​​makul (tarih) formatta olabilir. Herhangi bir dMybiçimde (isteğe bağlı ayırıcılar dahil), üç tamsayı listesi, dilinizin yerel Tarih nesnesi, vb. Olabilir . Çıktı, STDOUT'a yazdırılan bir liste / dizi / akış, tek bir sınırlandırılmış Dize vb.
  • Çıktılarınıza gün / ay için önde gelen 0'ları dahil etmenize veya hariç tutmanıza izin verilir. Lütfen farklı sonuçlara neden olacağından yanıtınızda hangisini kullandığınızı belirtin . Yani 1-1-19912 benzersiz basamak var, ancak 01-01-19913 benzersiz basamak var.
  • Artık yıllarla ve Gregoryen ile Julian takvimlerinin farklarıyla uğraşmak zorunda değilsiniz. Test davalarında verilen tarih aralıklarının hiçbir zaman 28'e / 1 Mart'ın üzerine çıkmayacağını varsayabilirsiniz.
  • giriş basamağının aralığında olması garanti edilir , bu nedenle ile ilgilenmek belirtilmez (boş bir liste döndürmek en mantıklı olacaktır, ancak bir hata veya yanlış sonuç vermek de iyidir; bu girdiyle uğraşmak zorunda değilsiniz).n[1,8]n=0

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. 'Herhangi bir' programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Varsayılan I / O kuralları ile cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem uygun parametreler ve dönüş tipi, tam programlar ile kullanılabilir. Çağrınız.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için bir test içeren bir bağlantı ekleyin (örn. TIO ).
  • Ayrıca, cevabınız için bir açıklama eklemeniz önemle tavsiye edilir.

Test senaryoları:

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]

Özellikle burada istenen biçim olmadığını biliyorum, ama burada sadece "kelimeyi yaymak" için yorum yapıyorum: programcıların tarihler için (günlüklerde, dosya adlarında vb.) Kullanmaya çalışması gereken uluslararası bir standart var: en.wikipedia.org / wiki / ISO_8601 . (desambiguate için bir 'T' kullanır (T + olmadan tarih + saat tamamen başka bir şey olabilir) ve kullanılacak ayırıcıları belirtir ve ayırıcıları ne zaman kullanamazsa (yani farklı bir varyant önerir standart]: asıl olan: YYYY-MM-DDThh:mm:ss.mmm +hh:mm+ hh: mm, yerel ayarınızın UTC'den
sapmasıdır

Yanıtlar:


2

Japt , 23 bayt

Tarih girişlerini Unix zaman damgaları olarak alır, biçimlendirmeye ve 0yerel ayara bağlı olarak önde gelen dizelere bir dizi verir . Japt v2'de 1 bayt daha kısa olurdu, ancak Datenesneleri dizelere dönüştürürken bir hata var gibi görünüyor .

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

Dene

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

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

Çevrimiçi deneyin!

R'nin yerel tarih biçimini kullanır ve gün ve ayda önde gelen sıfırlara sahiptir.


3

Kırmızı , 93 bayt

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

Çevrimiçi deneyin!

Günler / aylar için 0'lar önde olmadan.

Kırmızı'nın dahili 09-10-2019olarak dönüştürmesi çok kötü 9-Oct-2019- bu yüzden günü / ayı / yılı ayrı ayrı çıkarmam gerekiyor.


Red'e aşina değilim ama görünüşe göre bundan kesilebilecek çok fazla boşluk var. Yine de yanılıyorsam affedin.
connectyourcharger

@connectyourcharger Sorun yok! Görünüşe göre birkaç gereksiz beyaz boşluk var, ancak jetonları ayırmak için gerekli. Kırmızı sözcükler (tanımlayıcılar) şunları içerebilir -=+*<>?!~&, bu yüzden boşluk (veya (...)[...]"...") gerekir.
Galen Ivanov

2

Python 3.8 (ön sürüm) , 84 bayt

Gloweye sayesinde -6 bayt

lambda s,e,n:[d for i in range((e-s).days+1)if-len(set(d:=str(s+type(e-s)(i))))==~n]

Üç bağımsız değişkeni kabul eden bir dize listesi (baştaki sıfırlar dahil / sayma dahil) döndüren adsız bir işlev:

  • s, başlangıç - bir datetime.datenesne;
  • e, son - bir datetime.datenesne; ve
  • n, gün sayısı - bir intnesne.

Çevrimiçi deneyin!

Not: İşlev datetime.datenesneleri kabul ettiğinden bunun için içe aktarma kodunu saymadım (ve datetime.timedeltabu girdi nesnelerinin çıkarılmasıyla dolaylı olarak erişilebilir olduğu için nesneyi içe aktarmaya çalıştım ).


1
type(obj)3 bayt daha kısadır obj.__class__.
Gloweye

@Gloweye harika teşekkürler!
Jonathan Allan

@Gloweye sonunda 6 tane kurtardı (nokta gidiyor ve parantez zaten mevcut)
Jonathan Allan

1
Bu derinliğe henüz analiz etmedim, sadece gördüm __class__ve hızlı bir yorum yaptım. Her zaman yardımcı olmaktan mutluluk duyarız.
Gloweye

1

JavaScript (ES6), 91 bayt

(n)(end)(start)Tarihlerin milisaniye cinsinden Unix zaman damgaları olarak beklendiği şekilde girişi alır . Biçimde boşlukla ayrılmış bir tarih listesi döndürür yyyy-mm-dd.

Baştaki 0'lar dahildir.

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

Çevrimiçi deneyin!


1
Bu pasaj muhtemelen DST kayması durumunda başarısız olur (bu durumda + 864e5 yarın olmayabilir). Neyse ki, tio DST içermeyen UTC saat dilimini kullanıyor. - ürün web sitesinde aynı mantığı kullanan ve DST
değişene

1

PHP , 90 bayt

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

Çevrimiçi deneyin!

Bu önde gelen 0 ile. Girişler komut argümanlarıdır ( $argv) ve tarihler gün olarak Unix zaman damgalarıdır (temelde standart saniye / 86400), bu meydan okumada zamana ihtiyacımız olmadığından bu biçimi kullandım ve 1 bayt daha golf yapmama izin verdi. Sonuna ulaşıncaya kadar bir gün eklemeye devam eder ve içinde $nbenzersiz rakamlar bulunan herhangi bir tarihi _, Ymdbiçimiyle ayırarak yazdırır .

Ayrıca, tarihleri ​​girdi ile aynı biçimde çıktıya basan 89 bayt alternatifi vardır (Unix zaman damgaları gün olarak).


1

Java (JDK) , 86 bayt

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

Çevrimiçi deneyin!

Ben önde gelen 0s kullanmayı seçtim .

Kredi


1
Belki de her iki ucunda her şeyi kapsayan yapmış olmamalıdır, o zaman Java 9 's kullanmış olabilir datesUntiliçin 103 bayt . ;) Güzel cevap. Şahsen golf oynayabilecek hiçbir şey göremiyorum.
Kevin Cruijssen

1
@KevinCruijssen Aslında, son derece güzel bir golf yolu verdiniz! Sadece ekleyin .plusDays(1)ve kaldırın .forEach(System.out::println)ve bu çok golfçü bir cevap çünkü yazdıkça, tarihler değer nesneleri ve akışlara izin verildiğinde iade edilebilir. ;-) datesUntilHatta hiçbir ipucu yoktu ! Bunun için teşekkür ederim :-)
Olivier Grégoire

Woops, akışın geri dönmesine izin veren kendi kurallarımı unuttum, haha ​​XD Ben aptalım Ama aptallığımda sana yardım edebildiğim için mutluyum. ; p
Kevin Cruijssen

1

Ruby -rdate , 54 bayt

Giriş olarak 2 Date nesnesi ve bir sayı alır ve çıktı olarak Date nesnelerinin listesini döndürür. Artık yılları yönetir ve baştaki sıfırları kullanır.

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

Çevrimiçi deneyin!


1

C # (Görsel C # Etkileşimli Derleyici)

Başında 0'lar olmadan, 104 , 103 bayt

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

Çevrimiçi deneyin!

Bir 0 ile 106 105 bayt

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

Çevrimiçi deneyin!


Her x =>$"iki sürümünüzdeki alanı -1 için kaldırabilirsiniz . :)
Kevin Cruijssen

@KevinCruijssen ah fuck thanks x) Eminim birisi de daha kısa bir çözüm ile gelebilir, bu memnun değilim
Innat3

0

Kotlin, 119 bayt

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

Lider 0s olmadan, ikiye alır java.time.LocalDateve bir Long, bir döner Streamait LocalDates


Merhaba, CCGC'ye hoş geldiniz! Çalıştığını doğrulamak için test koduyla birlikte bir Çevrimiçi Deneyin bağlantısı da ekleyebilir misiniz ? Ayrıca, ben KOTLIN bilmiyorum ama değiştirmek mümkündür it.toString()ile (it+"")birkaç byte kaydetmek için? Bunun Java veya .NET C # gibi bazı dillerde mümkün olduğunu biliyorum.
Kevin Cruijssen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.