Tìm khoảng trống trong phạm vi ngày


15

Đưa ra một danh sách các phạm vi ngày rlàm đầu vào, đầu ra hoặc trả về bất kỳ phạm vi nào không tìm thấy trong r.

Vì lợi ích của ví dụ này, đầu vào sẽ có YYYY-MM-DDđịnh dạng.

Giả sử bạn có ba phạm vi ngày:

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

Bạn có thể thấy rằng có một khoảng cách ở giữa 2019-04-052019-06-01.

Đầu ra sẽ là khoảng cách đó: [2019-04-06, 2019-05-31]

Quy tắc

  • Đầu vào và đầu ra có thể ở bất kỳ định dạng ngày hoặc bộ sưu tập hợp lý nào, miễn là phù hợp.
  • Giả sử đầu vào không được đặt hàng.
  • Phạm vi ngày của bạn không cần phải có [latest, earliest], nhưng nó phải tuân theo quy tắc 2.
  • Giả sử không có ngày trùng lặp trong đầu vào

Các trường hợp thử nghiệm:

Đầu vào: [[2019-01-01, 2019-02-01],[2019-02-02, 2019-04-05],[2019-06-01, 2019-07-01]]

Đầu ra: [[2019-04-06, 2019-05-31]]


Đầu vào: [[2019-01-01, 2019-02-01],[2018-02-02, 2018-04-05],[2019-06-01, 2019-07-01]]

Đầu ra: [[2018-04-06, 2018-12-31], [2019-02-02, 2019-05-31]]


Đầu vào: [[2019-01-01, 2019-02-01],[2019-02-02, 2019-03-02],[2019-03-03, 2019-07-01]]

Đầu ra: []


Đầu vào: [[2019-01-01, 2019-02-01], [2019-11-02, 2019-11-20]]

Đầu ra: [[2019-02-02, 2019-11-01]]


Đầu vào: [[2019-01-01, 2019-02-01],[2019-02-03, 2019-04-05]]

Đầu ra: [[2019-02-02, 2019-02-02]]hoặc[[2019-02-02]]


5
Tôi khuyên bạn nên làm lại tất cả các ngày mẫu cho định dạng ISO, YYYY-MM-DDvì định dạng hiện tại vừa xa lạ với nhiều người, và thậm chí còn khó phân tích hơn do sử dụng các ngày nhỏ trong tháng 12.
Adám

@ Adám Ý hay, cập nhật.
Oliver

Chúng tôi có thể nhận đầu vào là Ngày tự động hóa .NET OLE không?
Adám

@ Adám Có. Bất kỳ định dạng ngày hợp lý đều được chấp nhận.
Oliver

1
Ngày sẽ được đặt hàng? Ngoài ra, trong một cặp ngày, ngày cuối cùng sẽ là cuối cùng?
Hiện thân của sự thiếu hiểu biết

Câu trả lời:


4

APL (Dyalog mở rộng) , 28 25 24 byte

Chức năng tiền tố ẩn danh. Đối số và kết quả là ma trận 2 cột của các số ngày kể từ một epoch, mỗi hàng đại diện cho một phạm vi.

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

Hãy thử trực tuyến! Hàm Intiền xử lý chuyển đổi từ danh sách các cặp danh sách 3 phần tử (ngày theo thứ tự ISO) thành ma trận 2 cột IDN, Số ngày quốc tế (ngày từ 1899-12-31). Hàm Outxử lý sau chuyển đổi từ ma trận IDN thành ma trận danh sách 3 phần tử.

 sắp xếp các hàng tăng dần

1⌽ xoay vòng theo chu kỳ một bước còn lại
⍢, trong khi bị phá hủy (làm phẳng) - sau đó, định hình lại về hình dạng ban đầu

1 ¯1+ thêm một và một tiêu cực
⍤1 sử dụng danh sách đó cho mỗi hàng
 về kết quả
{... } các lambda sau:
 đối số
-⍨/ trừ trái tay ngày kể từ ngày bên tay phải, hàng khôn ngoan
1< nạ nơi chênh lệch quá một (tức là nơi dãy không liền kề)
⍵⌿⍨ bộ lọc các hàng bằng mặt nạ đó


3

C # (Trình biên dịch tương tác Visual C #) , 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));}

Đầu ra bằng cách in ở định dạng DD/MM/YYYY 12:00:00 AMDD/MM/YYYY 12:00:00 AM. Sẽ gây ra ngoại lệ IndexOutOfRange, điều này tốt cho mỗi sự đồng thuận meta.

Hãy thử trực tuyến!

Nếu chúng tôi nhận đầu vào dưới dạng ngày kể từ thời đại unix, chúng tôi có thể chuyển xuống ...

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));}

Hãy thử trực tuyến!

Chúng ta có thể đánh gôn này xuống hơn nữa với /u:System.Arraycờ, cho ...

78 byte

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

Hãy thử trực tuyến!


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

hunky chunky ngồi trên tường ... mặc dù cách tiếp cận mới có khá nhiều tiềm năng chơi gôn.

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]]);}

Hàm lấy mảng các phạm vi [bắt đầu, kết thúc] ở định dạng ISO, in các khoảng cách. Hãy thử trực tuyến .


phá vỡ

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

Thạch , 13 byte

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

Jelly (hiện tại) không có ngày tích hợp, vì vậy, điều này sử dụng ngày kể từ ngày.
Danh sách đầu vào của phạm vi (cặp số nguyên) có thể theo thứ tự hỗn hợp và hướng hỗn hợp.
Kết quả là một danh sách các phạm vi tăng dần theo thứ tự tăng dần.

Hãy thử trực tuyến! (định dạng chân trang để hiển thị danh sách trống dưới dạng[])

Làm sao?

Lưu ý: Điều này phụ thuộc vào sự đảm bảo rằng "không có ngày trùng lặp trong đầu vào" như đã nêu trong các quy tắc.

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?

Thật thú vị, tôi không biết rằng Jelly không có hỗ trợ ngày. Đây có phải là cách tiếp cận thông thường? Sử dụng ngày kể từ kỷ nguyên?
dana

Ngày kể từ khi epoch là, tôi tin rằng, được sử dụng bởi một số hệ thống (có thể là Excel). Vài giây kể từ epoch là phổ biến hơn (ví dụ Unix). Tôi chỉ đi với một cái gì đó dường như để đáp ứng các yêu cầu, mặc dù khá lỏng lẻo.
Jonathan Allan

Boo, bạn có thể tính toán ngày theo cách thủ công . ; P Days kể từ epoch thực sự được sử dụng thường xuyên hơn cho các ngôn ngữ không hỗ trợ ngày. Mặc dù vậy, tôi cảm thấy như nó làm cho thử thách này RẤT dễ dàng hơn.
Kevin Cruijssen

@KevinCruijssen heh, đồng ý.
Jonathan Allan

1

C # (Trình biên dịch tương tác Visual C #) , 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);}}

Hãy thử trực tuyến!

Đầu vào là một danh sách các bộ dữ liệu ngày bắt đầu / kết thúc. Đầu ra mỗi phạm vi bị thiếu đến 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 - nếu bạn in như Embodiment of Ignorance, bạn có thể trở nên thật nhỏ bé - Hãy thử trực tuyến!
dana

Đẹp. Cũng với phương thức nhập liệu của họ cho hai cái sau
ASCII - chỉ

Thực ra ... điều đó có vẻ không chính xác
ASCII - chỉ

1
Vâng, bây giờ có vẻ ổn
ASCII - chỉ

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

Hãy thử trực tuyến!

Cái này lấy một khung dữ liệu của các phạm vi ngày làm đầu vào và đầu ra một khung dữ liệu với các phạm vi bị thiếu. Tôi khá chắc chắn điều này có thể được golfed hơn, nhưng tôi chạy vào các vấn đề với c, cbindvà những người khác tước lớp ngày.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.