Rentang Tanggal Digit


15

CATATAN: Karena saya sendiri orang Belanda, semua tanggal dalam dd-MM-yyyyformat Belanda dalam deskripsi tantangan dan kasus uji.

Tantangan:

Input:
Tanggal mulai s ; Tanggal akhir e ; Digit n

Keluaran:
Semua tanggal dalam rentang [s,e] (termasuk di kedua sisi), yang berisi n jumlah digit unik dalam tanggalnya.

Contoh:

Input: Tanggal mulai: 12-11-1991; Tanggal End: 02-02-1992; Angka:4

Output:
Dengan 0s terkemuka untuk hari / bulan:

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

Tanpa memimpin 0s selama berhari-hari / bulan:

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

Aturan tantangan:

  • Tanggal input dan output mungkin dalam format (tanggal-) yang masuk akal. Dapat berupa string dalam dMyformat apa pun (termasuk pemisah opsional), daftar tiga bilangan bulat, objek Tanggal asli bahasa Anda, dll. Keluaran dapat berupa daftar / larik / aliran, dicetak ke STDOUT, satu string yang dibatasi, dll.
  • Anda diizinkan untuk memasukkan atau mengecualikan 0s terkemuka selama berhari-hari / bulan dalam output Anda. Silakan tentukan yang mana dari dua yang Anda gunakan dalam jawaban Anda , karena itu akan menyebabkan hasil yang berbeda. Yaitu 1-1-1991memiliki 2 digit unik, tetapi 01-01-1991sebagai 3 digit unik.
  • Anda tidak harus berurusan dengan tahun kabisat dan perbedaan kalender Gregorian vs Julian. Anda dapat mengasumsikan rentang tanggal yang diberikan dalam kasus uji tidak akan pernah melampaui tanggal 28 Februari / 1 Maret selama bertahun-tahun dapat habis dibagi 4.
  • Input-digit n dijamin berada dalam kisaran [1,8] , jadi berurusan dengan n=0 tidak ditentukan (mengembalikan daftar kosong akan paling masuk akal, tetapi memberikan kesalahan atau hasil yang salah juga baik-baik saja; Anda menang harus berurusan dengan input itu).

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'.
  • Aturan standar berlaku untuk jawaban Anda dengan aturan I / O default , sehingga Anda diizinkan untuk menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda (yaitu TIO ).
  • Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.

Kasus uji:

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]

Saya tahu ini secara spesifik bukan format yang diminta di sini, tetapi saya hanya berkomentar di sini untuk "menyebarkan berita": ada standar internasional yang harus dicoba digunakan oleh pemrogram untuk tanggal (dalam log, nama file, dll.): En.wikipedia.org / wiki / ISO_8601 . (menggunakan 'T' untuk desambiguate (tanpa T tanggal + waktu bisa menjadi sesuatu yang sama sekali berbeda) dan menentukan pemisah untuk digunakan, dan ketika seseorang tidak dapat menggunakan pemisah [yaitu mengusulkan varian yang berbeda (dari pendek ke panjang) yang sama standard]: yang utama adalah YYYY-MM-DDThh:mm:ss.mmm +hh:mm:, + hh: mm menjadi waktu lokal Anda diimbangi dari UTC.)
Olivier Dulac

Jawaban:


2

Japt , 23 byte

Mengambil input tanggal sebagai cap waktu Unix, mengeluarkan serangkaian string dengan pemformatan dan kepemimpinan 0bergantung pada lokal Anda. Akan 1 byte lebih pendek di Japt v2 tetapi tampaknya ada bug ketika mengkonversi Dateobjek ke string.

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

Cobalah

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

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

Cobalah online!

Menggunakan format tanggal asli R dan memiliki angka nol di depan pada hari dan bulan.


3

Merah , 93 byte

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

Cobalah online!

Tanpa memimpin 0s selama berhari-hari / bulan.

Sayang sekali Red mengkonversi secara internal 09-10-2019ke 9-Oct-2019- itu sebabnya saya perlu mengekstrak hari / bulan / tahun secara individual.


Saya tidak akrab dengan Red tetapi sepertinya ada banyak ruang kosong yang bisa dihilangkan dari ini. Maafkan saya jika saya salah.
connectyourcharger

@connectyourcharger Anda Tidak masalah! Tampaknya ada beberapa spasi putih yang tidak perlu, tetapi mereka diperlukan untuk memisahkan token. Kata-kata (pengidentifikasi) dalam Red dapat mencakup -=+*<>?!~&, itu sebabnya spasi (atau (...)[...]"...") diperlukan.
Galen Ivanov

2

Python 3.8 (pra-rilis) , 84 byte

-6 byte terima kasih kepada 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]

Fungsi tanpa nama yang mengembalikan daftar string (menghitung / termasuk nol di depan) yang menerima tiga argumen:

  • s, awal - adatetime.date objek;
  • e, akhir - sebuah datetime.dateobjek; dan
  • n, jumlah hari - suatu intobjek.

Cobalah online!

Catatan: Ketika fungsi menerima datetime.dateobjek, saya belum menghitung kode impor untuk itu (dan telah bekerja mengimpor datetime.timedeltaobjek karena dapat diakses secara tidak langsung melalui pengurangan objek input ini).


1
type(obj)lebih pendek 3 byte dari obj.__class__.
Gloweye

@Gloweye, terima kasih, luar biasa!
Jonathan Allan

@Gloweye menyimpan 6 pada akhirnya (titiknya sudah ada dan tanda kurung sudah ada)
Jonathan Allan

1
Saya belum menganalisis sejauh itu, hanya melihat __class__dan membuat komentar cepat. Selalu senang membantu.
Gloweye

1

JavaScript (ES6), 91 byte

Mengambil input sebagai (n)(end)(start), di mana tanggal diharapkan sebagai cap waktu Unix dalam milidetik. Mengembalikan daftar tanggal yang dipisahkan ruang dalam format yyyy-mm-dd.

Leading 0s disertakan.

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

Cobalah online!


1
Cuplikan ini mungkin akan gagal jika DST bergeser terjadi (a + 864e5 mungkin bukan besok dalam kasus itu). Tapi untungnya, tio menggunakan zona waktu UTC yang tidak memiliki DST. - dari seseorang yang menggunakan logika yang sama di situs web produk dan menyadari sesuatu yang salah sampai DST bergeser ...
tsh

1

PHP , 90 byte

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

Cobalah online!

Ini dengan 0s terkemuka. Input adalah argumen perintah ( $argv) dan tanggal adalah cap waktu Unix dalam beberapa hari (pada dasarnya detik standar / 86400), saya menggunakan format ini karena kami tidak memerlukan waktu dalam tantangan ini dan memungkinkan saya untuk bermain 1 byte lebih banyak. Terus menambahkan hari untuk memulai sampai mencapai akhir dan mencetak tanggal dengan$n angka unik di dalamnya, dipisahkan oleh _dalamYmd Format.

Juga memiliki alternatif 89 byte yang mencetak tanggal ke keluaran dalam format yang sama dengan input (cap waktu Unix dalam hari).


1

Java (JDK) , 86 byte

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

Cobalah online!

Saya memilih menggunakan pemimpin 0 s.

Kredit

  • -24 Terima kasih kepada Kevin Cruijssen yang tidak tahu dia bisa bermain golf sebanyak itu: p

1
Mungkin saya seharusnya tidak membuatnya inklusif di kedua ujungnya, maka Anda bisa menggunakan Java 9 datesUntiluntuk 103 byte . ;) Jawaban bagus. Saya tidak melihat apa-apa yang bisa bermain golf secara pribadi.
Kevin Cruijssen

1
@KevinCruijssen Ya, sebenarnya, Anda memberikan cara bermain golf yang sangat bagus! Cukup tambahkan .plusDays(1)dan hapus jawaban .forEach(System.out::println)itu dan ini adalah jawaban yang sangat bagus karena ketika Anda menulis, tanggal dapat dikembalikan karena objek nilai dan aliran diizinkan. ;-) Saya tidak punya petunjuk yang datesUntilbahkan ada! Terima kasih untuk itu :-)
Olivier Grégoire

Woops, lupa tentang aturan saya sendiri yang memungkinkan aliran kembali, haha ​​XD saya idiot. Tapi senang saya bisa membantu Anda dengan kebodohan saya. ; p
Kevin Cruijssen

1

Rubi -rdate , 54 byte

Membawa 2 objek Date dan nomor sebagai input, dan mengembalikan daftar objek Date sebagai output. Menangani tahun kabisat dan menggunakan nol terkemuka.

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

Cobalah online!


1

C # (Visual C # Interactive Compiler)

Tanpa memimpin 0s, 104 , 103 byte

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

Cobalah online!

Dengan 0s awal, 106 105 byte

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

Cobalah online!


Anda dapat menghapus spasi di x =>$"dalam kedua versi Anda untuk -1. :)
Kevin Cruijssen

@KevinCruijssen ah bercinta terima kasih x) Saya yakin seseorang dapat datang dengan solusi yang lebih pendek juga, saya tidak puas dengan yang satu ini
Innat3

0

Kotlin, 119 byte

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

Tanpa 0s terkemuka, mengambil dua java.time.LocalDatedan Long, mengembalikan Streamdari LocalDates


Hai, selamat datang di CCGC! Mungkinkah Anda menambahkan tautan Try it online dengan kode tes untuk memastikannya berfungsi? Juga, saya tidak tahu Kotlin, tetapi apakah mungkin untuk mengganti it.toString()dengan (it+"")untuk menyimpan beberapa byte? Saya tahu ini dimungkinkan dalam beberapa bahasa lain seperti Java atau .NET C #.
Kevin Cruijssen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.