Menemukan Kesenjangan dalam Rentang Tanggal


15

Diberikan daftar rentang tanggal rsebagai input, output atau kembalikan rentang apa pun yang tidak ditemukan di r.

Demi contoh ini, input akan dalam YYYY-MM-DDformat.

Katakanlah Anda memiliki tiga rentang tanggal:

[2019-01-01, 2019-02-01]
[2019-02-02, 2019-04-05]
[2019-06-01, 2019-07-01]

Anda dapat melihat bahwa ada celah di antara 2019-04-05dan 2019-06-01.

Output akan menjadi celah itu: [2019-04-06, 2019-05-31]

Aturan

  • Input dan output dapat dalam format tanggal atau pengumpulan yang wajar, asalkan konsisten.
  • Asumsikan input tidak dipesan.
  • Rentang tanggal Anda tidak harus [latest, earliest], tetapi harus mengikuti aturan 2.
  • Asumsikan tidak ada tanggal yang tumpang tindih dalam input

Kasus uji:

Memasukkan: [[2019-01-01, 2019-02-01],[2019-02-02, 2019-04-05],[2019-06-01, 2019-07-01]]

Keluaran: [[2019-04-06, 2019-05-31]]


Memasukkan: [[2019-01-01, 2019-02-01],[2018-02-02, 2018-04-05],[2019-06-01, 2019-07-01]]

Keluaran: [[2018-04-06, 2018-12-31], [2019-02-02, 2019-05-31]]


Memasukkan: [[2019-01-01, 2019-02-01],[2019-02-02, 2019-03-02],[2019-03-03, 2019-07-01]]

Keluaran: []


Memasukkan: [[2019-01-01, 2019-02-01], [2019-11-02, 2019-11-20]]

Keluaran: [[2019-02-02, 2019-11-01]]


Memasukkan: [[2019-01-01, 2019-02-01],[2019-02-03, 2019-04-05]]

Keluaran: [[2019-02-02, 2019-02-02]]atau[[2019-02-02]]


5
Saya menyarankan pengerjaan ulang semua tanggal contoh ke format ISO, YYYY-MM-DDkarena format saat ini sama-sama asing bagi banyak orang, dan membuat lebih sulit untuk diuraikan karena menggunakan hari-bulan-bulan≤12 yang kecil.
Adám

@ Adám Ide bagus, diperbarui.
Oliver

Bolehkah kita mengambil input sebagai .NET OLE Automation Dates?
Adám

@ Adám Ya. Format tanggal yang wajar dapat diterima.
Oliver

1
Apakah tanggal akan dipesan? Juga, dalam sepasang tanggal, akankah yang terakhir menjadi yang terakhir?
Perwujudan Ketidaktahuan

Jawaban:


4

APL (Dyalog Extended) , 28 25 24 byte

Fungsi awalan diam-diam anonim. Argumen dan hasil adalah matriks 2 kolom dari angka hari sejak zaman, setiap baris mewakili rentang.

1 ¯1+⍤1∘{⍵⌿⍨1<-⍨/⍵}1⌽⍢,∧

Cobalah online! Fungsi Inpra-prosesor dikonversi dari daftar pasangan daftar 3-elemen (tanggal dalam urutan ISO) ke matriks 2-kolom IDNs, Nomor Hari Internasional (hari sejak 1899-12-31). Fungsi Outpost-prosesor mengkonversi dari matriks IDNs ke matriks daftar 3-elemen.

 urutkan baris naik

1⌽ putar tanggal satu langkah ke kiri secara siklikal
⍢, sambil diratakan (diratakan) - setelah itu, bentuk kembali ke bentuk semula

1 ¯1+ tambahkan satu dan negatif
⍤1 menggunakan daftar itu untuk setiap baris
 hasil
{... } lambda berikut:
 argumen
-⍨/ kurangi tanggal di sebelah kiri dari tanggal di sebelah kanan,
1< topeng di mana perbedaan melebihi satu (yaitu di mana rentang tidak berdekatan)
⍵⌿⍨ filter baris oleh topeng itu


3

C # (Visual C # Interactive Compiler) , 108 byte

n=>{n.Sort();for(int i=0;;)Write(n[i].b.AddDays(1)==n[++i].a?"":n[i-1].b.AddDays(1)+""+n[i].a.AddDays(-1));}

Output dengan mencetak dalam format DD/MM/YYYY 12:00:00 AMDD/MM/YYYY 12:00:00 AM. Akan menyebabkan pengecualian IndexOutOfRange, yang tidak masalah per konsensus meta.

Cobalah online!

Jika kita mengambil input dalam bentuk hari sejak zaman unix, kita bisa mendapatkan ini ke ...

83 byte

n=>{n.Sort();for(int i=0;;)Print(n[i].b+1==n[++i].a?"":n[i-1].b+1+" "+(n[i].a-1));}

Cobalah online!

Kita dapat menurunkan ini lebih jauh dengan /u:System.Arraybendera, untuk ...

78 byte

n=>{Sort(n);for(int i=0;;)Print(++n[i].b==n[++i].a--?"":n[i-1].b+" "+n[i].a);}

Cobalah online!


2

Perl 5, 130 byte

/-(\d+)-/,$_=strftime"%Y-%m-%d",0,0,0,$'+($|--||-1),$1-1,$`-1900 for@F=sort@F;$,lt$;&&say"$, $;"while($,,$;)=@F[++$i,$i+1],++$i<@F

TIO


2

Bash, 125 byte

set `sort<<<$1`;shift;for a;{ s=$[x++%2?-1:1]day;c=`date -d$a\ $s +%Y-%m-%d`;[ $p ]&&{ [[ $p < $c ]]&&echo $p $c;p=;}||p=$c;}

TIO



2

PHP, 208 197 190 177 byte

keren keren duduk di dinding ... meskipun pendekatan baru memiliki potensi golf.

function($a){sort($a);for($m=$x=$a[0][0];$f=$m<=$x;$f^$g&&print($g=$f)?"$m/":"$n
",$m=date("Y-m-d",strtotime($n=$m)+9e4))foreach($a as$d)$x=max($x,$d[1|$f&=$m<$d[0]|$m>$d[1]]);}

fungsi mengambil berbagai rentang [mulai, akhir] dalam format ISO, mencetak interval interval. Cobalah online .


kerusakan

function($a){
    sort($a);                           # sort ranges (for easy access to min date)
    for($m=$x=$a[0][0];$f=$m<=$x;       # loop from min date to max date, 1. set flag
        $f^$g&&print($g=$f)?"$m/":"$n\n",       # 4. flag changed: backup flag, print date
        $m=date("Y-m-d",strtotime($n=$m)+9e4)   # 5. backup and increment date
    )foreach($a as$d)
        $x=max($x,$d[1                          # 2. find max date
            |$f&=$m<$d[0]|$m>$d[1]              # 3. date found in ranges: clear flag
        ]);
}

1

Jelly , 13 byte

FṢṖḊs2+Ø+>/Ðḟ

Jelly (saat ini) tidak memiliki tanggal bawaan, jadi ini menggunakan hari sejak zaman.
Daftar input rentang (pasangan bilangan bulat) mungkin dalam urutan campuran dan arah campuran.
Hasilnya adalah daftar rentang naik dalam urutan naik.

Cobalah online!(format footer untuk menampilkan daftar kosong sebagai [])

Bagaimana?

Catatan: Ini bergantung pada jaminan bahwa "tidak ada tanggal yang tumpang tindih dalam input" sebagaimana dinyatakan dalam aturan.

FṢṖḊs2+Ø+>/Ðḟ - Link: list of pairs of integers
F             - flatten
 Ṣ            - sort
  Ṗ           - pop (remove tail)
   Ḋ          - dequeue (remove head)
    s2        - split into twos
       Ø+     - literal [1,-1]
      +       - add (vectorises)
           Ðḟ - filter discard those for which:
          /   -   reduce by:
         >    -     greater than?

Menarik, saya tidak tahu bahwa Jelly tidak memiliki dukungan kencan. Apakah ini pendekatan yang biasa? Gunakan hari sejak zaman?
dana

Saya yakin, berhari-hari sejak zaman, digunakan oleh beberapa sistem (mungkin Excel). Detik sejak zaman lebih umum (misalnya Unix). Saya hanya pergi dengan sesuatu yang tampaknya memenuhi persyaratan, meskipun cukup longgar.
Jonathan Allan

Boo, Anda bisa menghitung tanggal secara manual . ; P Days sejak zaman memang lebih sering digunakan untuk bahasa yang tidak mendukung tanggal. Saya merasa itu membuat tantangan ini BANYAK lebih mudah.
Kevin Cruijssen

@KevinCruijssen heh, setuju.
Jonathan Allan

1

C # (Visual C # Interactive Compiler) , 103 byte

x=>{var(a,_)=x[0];foreach(var(b,c)in x.OrderBy(y=>y)){if(a<b)Print((a,b.AddDays(-1)));a=c.AddDays(1);}}

Cobalah online!

Input adalah daftar tupel tanggal mulai / berakhir. Keluarkan setiap rentang yang hilang ke STDOUT.

// x: input list of start/end date tuples
x=>{
  // variable definitions...
  // a: 1 day after the end date of the previous range
  // b: start of the current range
  // c: end of the current range

  // start by deconstructing the start date of the first tuple
  // into a. a will then be a DateTime and will contain a value
  // at least a large as the smallest start date.
  var(a,_)=x[0];
  // iterate over sorted ranges
  foreach(var(b,c)in x.OrderBy(y=>y)){
    // if the day after the end of the previous range is less
    // than the start of the current range, then print the
    // missing days.
    if(a<b)
      Print((a,b.AddDays(-1)));
    // save the day after the current range to a for next iteration
    a=c.AddDays(1);
  }
}


Hah - jika Anda mencetak seperti Perwujudan Ketidaktahuan, Anda bisa menjadi sangat kecil - Cobalah secara online!
dana

Bagus. Juga dengan metode input mereka untuk dua yang terakhir
hanya ASCII

Yah sebenarnya ... itu terlihat sangat salah
ASCII-satunya

1
Ya itu terlihat baik-baik saja sekarang
ASCII-hanya

1

R , 88 byte

function(a,b=a[order(a$x),],d=c(b$x[-1]-b$y[-nrow(b)],0))data.frame(b$y+1,b$y+d-1)[d>1,]

Cobalah online!

Ini membutuhkan kerangka data rentang tanggal sebagai input dan output bingkai data dengan rentang yang hilang. Saya cukup yakin ini bisa bermain golf lebih banyak, tetapi saya mengalami masalah dengan c, cbinddan yang lainnya menanggalkan kelas kencan.

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.