날짜 범위에서 간격 찾기


15

날짜 범위 목록이 r입력, 출력 또는로 표시되지 않은 범위를 반환합니다 r.

이 예제를 위해 입력 YYYY-MM-DD형식이됩니다.

세 가지 기간이 있다고 가정 해 보겠습니다.

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

2019-04-05와 사이에 간격이 있음을 알 수 있습니다 2019-06-01.

결과는 그 간격이 될 것입니다 : [2019-04-06, 2019-05-31]

규칙

  • 입력 및 출력은 일관된 한 합리적인 날짜 또는 수집 형식 일 수 있습니다.
  • 입력이 주문되지 않았다고 가정하십시오.
  • 기간은 일 필요는 없지만 [latest, earliest]규칙 2를 따라야합니다.
  • 입력에 겹치는 날짜가 없다고 가정하십시오.

테스트 사례 :

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

산출: [[2019-04-06, 2019-05-31]]


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

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


입력: [[2019-01-01, 2019-02-01],[2019-02-02, 2019-03-02],[2019-03-03, 2019-07-01]]

산출: []


입력: [[2019-01-01, 2019-02-01], [2019-11-02, 2019-11-20]]

산출: [[2019-02-02, 2019-11-01]]


입력: [[2019-01-01, 2019-02-01],[2019-02-03, 2019-04-05]]

출력 : [[2019-02-02, 2019-02-02]]또는[[2019-02-02]]


5
YYYY-MM-DD현재 형식이 많은 사람들에게 이질적이며 작은 달 ≤12를 사용하여 구문 분석하기가 더 어려워 졌으므로 모든 예제 날짜를 ISO 형식으로 다시 작성하는 것이 좋습니다 .
Adám

@ Adám 좋은 생각, 업데이트되었습니다.
올리버

.NET OLE 자동화 날짜로 입력 할 수 있습니까?
Adám

@ Adám 예. 합리적인 날짜 형식이 허용됩니다.
올리버

1
날짜가 주문됩니까? 또한 한 쌍의 날짜 내에서 마지막 날짜가 마지막 것입니까?
무지의 실시

답변:


4

APL (Dyalog Extended) , 28 25 24 바이트

익명의 암묵적 접두사 기능. 인수와 결과는 에포크 (epoch) 이후 일수의 2 열 행렬로, 각 행은 범위를 나타냅니다.

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

온라인으로 사용해보십시오! InIDN을하는 2 열의 행렬로 3 요소 목록 (ISO 순서 날짜) 쌍의리스트에서 전처리 함수 변환 국제 주 번호 (1899년 12월 31일 이후). Out3 요소 목록의 IDN이 매트릭스의 매트릭스에서 포스트 프로세서 기능으로 변환한다.

 행을 오름차순으로 정렬

1⌽
⍢, 삐걱 거리는 동안 (평평하게)  날짜를 한 단계 왼쪽으로 주기적으로 회전합니다. 나중에 원래 모양으로 다시 모양을 변경합니다.

1 ¯1+ 하나와 마이너스 하나 추가
⍤1 각 행에 대해 그리스트를 사용
 의 결과
{... } 다음 람다 :
 인수
-⍨/ 빼기 우측 날짜, 행 방향에서 일 손 좌측
1< 차이가 하나의 (즉, 범위는 인접하지 않은 경우)를 초과 마스크
⍵⌿⍨ 필터 그 마스크에 의한 행


3

C # (Visual C # 대화식 컴파일러) , 108 바이트

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

형식으로 인쇄하여 출력합니다 DD/MM/YYYY 12:00:00 AMDD/MM/YYYY 12:00:00 AM. 메타 합의에 따라 IndexOutOfRange 예외가 발생합니다.

온라인으로 사용해보십시오!

유닉스 시대 이후로 며칠의 형태로 입력하면, 우리는 이것을 ...

83 바이트

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

온라인으로 사용해보십시오!

우리는 /u:System.Array깃발 로 이것을 더 아래로 내릴 수 있습니다 .

78 바이트

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

온라인으로 사용해보십시오!


2

펄 5, 130 바이트

/-(\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

배쉬, 125 바이트

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 197190 177 바이트

hunky chunky는 벽에 앉아 있었지만 새로운 접근 방식에는 골프 잠재력이 꽤있었습니다.

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

함수는 ISO 형식으로 범위 [시작, 종료]의 배열을 취해 간격 간격을 인쇄합니다. 온라인으로 사용해보십시오 .


고장

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

젤리 , 13 바이트

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

젤리 (현재)에는 날짜가 내장되어 있지 않기 때문에 days-since-epoch를 사용합니다.
범위 (정수 쌍)의 입력 목록은 혼합 된 순서와 혼합 된 방향 일 수 있습니다.
결과는 오름차순 범위의 오름차순 범위 목록입니다.

온라인으로 사용해보십시오! (빈 목록을으로 표시하기 위해 바닥 글 형식[])

어떻게?

참고 : 이는 규칙에 명시된대로 "입력에 겹치는 날짜가 없습니다"라는 보증에 의존합니다.

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?

흥미롭게도 나는 젤리가 데이트 지원을하지 않았다는 것을 몰랐다. 이것이 일반적인 접근입니까? 시대 이후로 일을 사용하십니까?
dana

신기원부터 며칠은 일부 시스템에서 사용되는 것 같습니다 (Excel). 신기원이 더 흔하기 때문에 초 (예 : 유닉스). 나는 꽤 느슨하게도 요구 사항을 다루는 것으로 보였습니다.
Jonathan Allan

부, 당신은 수동으로 날짜를 계산할 수 있습니다 . ; P 시대 이후의 날짜는 실제로 날짜를 지원하지 않는 언어에 더 자주 사용됩니다. 그래도이 도전이 훨씬 쉬워 진다고 생각합니다.
케빈 Cruijssen

@KevinCruijssen heh는 동의했다.
Jonathan Allan

1

C # (Visual C # 대화식 컴파일러) , 103 바이트

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

온라인으로 사용해보십시오!

입력은 시작 / 종료 날짜 튜플의 목록입니다. 누락 된 각 범위를 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-무지의 구체화처럼 인쇄하면 정말 작아 질 수 있습니다- 온라인으로보십시오!
dana

좋은. 또한 후자에 대한 입력 방법을 wtf
ASCII 전용

사실 ... 그건 정말 잘못된 것 같습니다
ASCII 전용

1
그래, 이제는 괜찮아 보인다
ASCII 전용

1

R , 88 바이트

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

온라인으로 사용해보십시오!

날짜 범위의 데이터 프레임을 입력으로 사용하고 누락 된 범위의 데이터 프레임을 출력합니다. 나는 꽤 확실이 더 golfed 할 수있어,하지만 난 문제로 실행 c, cbind날짜 클래스를 제거하고 다른 사람.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.