기차역에 필요한 최소 플랫폼 수

Sep 09 2020

도전

기차역에 도착하는 모든 열차의 매일 도착 및 출발 시간을 감안할 때 기차가 기다리지 않도록 기차역에 필요한 최소 플랫폼 수를 찾으십시오.

즉, 역에 동시에 존재하는 최대 열차 수를 ​​찾으십시오.

입력

  • 한 쌍의 시간 목록 : 도착 및 출발; 두 목록의 길이는 같습니다. 도착 i은 출발과 동일한 열차에 해당합니다 i.
  • 대안 적으로 , 시간의 쌍, 또는 임의의 등가의리스트.
  • 시간은 0, 포함 및 24제외 사이의 숫자 입니다.
  • 날짜는없고 시간 만 : 입력은 일일 일정이며 매일 반복됩니다.
  • 기차의 출발 시간은 도착 시간보다 낮을 있습니다. 이 경우 기차는 하루에 도착하고 다음날 출발하는 것으로 이해됩니다. 그 기차는 자정 이전과 자정 이후에 플랫폼이 필요합니다.
  • 도착 시간이 출발 시간보다 낮을 경우 열차는 당일 도착 및 출발하는 것으로 이해됩니다.
  • 입력은 정수로 제한 될 수 있습니다.

산출

  • 하나의 정수, 필요한 최소 플랫폼 수입니다.

테스트 케이스


arrivals   = [10, 13, 16]
departures = [12, 15, 18]
out = 1

arrivals   = [10, 11]
departures = [12, 13]
out = 2

arrivals   = [ 1, 3, 7, 9,10,10,19,23]
departures = [11, 4,11,10,11, 2, 2, 2]
out = 5

arrivals   = [1, 2]
departures = [2, 3]
out = 2

arrivals   = [1, 2]
departures = [3, 2]
out = 2

arrivals   = [2, 22]
departures = [5,  6]
out = 2

규칙

  • 이것은 코드 골프입니다. 바이트 단위의 가장 짧은 코드가 이깁니다!

관련 과제

  • 기간 계산

답변

7 xnor Sep 10 2020 at 06:55

Python , 62 바이트

lambda l:max(sum(a-b^b-h^h-a<1for a,b in l)for h in range(24))

온라인으로 시도하십시오!

Golfing Surculose Sputum의 솔루션 . 새로운 부분은 a-b^b-h^h-a<1시간이 주기적 으로 취해지는 h간격에 있는지 , 즉 정렬 된 순서가의 순환 순열인지 확인하는 것입니다 . 이를 위해, 우리는 차이 홀수 여부를 확인 , , 음. 저는 먼저 곱셈으로 이것을했습니다 . 그러나 xor ( )를 사용하면 동일한 작업을 수행하고 더 나은 우선 순위로 괄호를 자릅니다.ab[a,h,b]a-bb-hh-a(a-b)^(b-h)^(h-a)<1^

6 cairdcoinheringaahing Sep 09 2020 at 22:08

젤리 , 19 바이트

1ị>×24+)r/€%24ċþF§Ṁ

온라인으로 시도하십시오!

작동 원리

타임 아웃을 확장하고 시각 자료로 배치하면 다음과 같은 결과를 얻을 수 있습니다 (예 : 세 번째 테스트 사례).

1 2 3 4 5 6 7 8 9 10 11                                       1 2
    3 4     7 8 9 10 11                      19 20 21 22 23 0 1 2
                9 10                                     23 0 1 2 
                  10 11
                  10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2

( 1 2오른쪽 상단의 표시는 다음 날로 이어짐)

이로부터 필요한 플랫폼 수가 매번 반복되는 최대 횟수와 동일하다는 것이 분명합니다. 예를 들어,이 예에서는 범위에 10이 5 번 나타나므로 (최대 값) 출력은 5입니다. 유일한 문제는 여러 날에 걸친 시간에 대한 것입니다.이 값에 24를 더하여 수정합니다.

코드는 다음과 같이 작동합니다 (오래됨).

1ị>×24+)r/€%24ċþF§Ṁ - Main link, takes a list of pairs of times
       )            - Over each pair, map:
1ị                  -   Is the first element...
  >                 -   ...greater than each element?
                    -   This yields [0, 0] for increasing pairs and [0, 1] for decreasing
   ×24              -   Multiply each one by 24
      +             -   Add in to the original pair
                    - This replaces a pair [a, b] with [a, b+24] if b < a
          €         - Over each pair, map:
        r/          -   Convert to a range
           %24      - Modulo all values by 24
                F   - Flatten this list of pairs to get all times a train is at the station
               þ    - Pair each time up with each range, then, over the pairs:
              ċ     - Count how many times the time is in that range (either 1 or 0)
                 §  - Take the sum of all lists, giving the number of times a train is at the station for each time
                  Ṁ - Take the maximum of these sums
5 SurculoseSputum Sep 10 2020 at 02:39

Python 2 , 73 바이트

lambda l:max(sum([a<=h<=b,not b<h<a][a>b]for a,b in l)for h in range(24))

온라인으로 시도하십시오!

입력 : 시간 쌍 목록입니다.

하루 중 한 시간마다 역에 몇 대의 기차가 있는지 확인하십시오. 그런 다음 그 최대 값을 찾으십시오.

5 CongChen Sep 10 2020 at 07:45

R , 111 바이트

Brute force-안타깝게도 TIO는 실행할 수 없지만 데스크톱의 R 4.0.2에는 스택 문제가 없습니다.

{f=pryr::f
`:`=f(a,b,`if`(a<b,a:b,c(a:24,0:b)))
f(a,d,max(sapply(0:24,f(x,sum(mapply(f(u,v,x%in%u:v),a,d))))))}

온라인으로 시도하십시오!

더 간단한 논리를 가진 훨씬 더 짧은 버전 :

R , 72 바이트

function(a,d)max(sapply(0:24,function(x)sum(a<=x&x<=d|a>d&(x>=a|x<=d))))

온라인으로 시도하십시오!

3 Adám Sep 10 2020 at 00:25

APL (Dyalog Extended) , 20 바이트 ( SBCS )

도착을 왼쪽 인수로, 출발을 오른쪽 인수로 취하는 익명의 암묵 중위 함수.

{≢⍉⊢⌸∊⍵}24|⊣…¨⊢+24×>

온라인으로 시도하십시오!

> 도착이 출발 후인 경우 1

24× 그것으로 24를 곱하십시오

⊢+ 그것에 올바른 인수 (출발)를 추가하십시오.

…¨ 각 도착-출발 쌍에 대한 포함 범위

24| 24로 나눈 경우 나눗셈 나머지

{} 다음 람다를 적용합니다 ( 인수, 즉 범위 목록).

∊⍵ϵ nlist (평탄화) 인수

⊢⌸ 각 고유 시간에 대한 인덱스 테이블

 전치 (따라서 각 시간의 수를 나타내는 행이 열이 됨)

 행 수를 계산합니다 (즉, 한 시간의 최대 발생 횟수).

3 KevinCruijssen Sep 09 2020 at 23:36

05AB1E (레거시) , 19 17 바이트

εD¬‹24*+Ÿ24%}˜D¢à

-2 바이트는 @cairdCoinheringaahing 의 첫 번째 부분 ( D¬‹24*+)에 대한 Jelly 답변 에서 영감을 얻었 으므로 그 에게도 찬성 투표 를해야합니다.

시간 쌍 목록으로 입력합니다.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

ε             # Map each pair of the (implicit) input-list to:
 D            #  Duplicate the current pair
  ¬           #  Push the first value of the pair (without popping)
   ‹          #  Check for both whether this value is larger (1 if truthy; 0 if falsey)
    24*       #  Multiply both by 24
       +      #  Add it to the pair we duplicated (at the same positions)
        Ÿ     #  Pop the pair and push a list of integers in that inclusive range
         24%  #  Take modulo-24 on each value
}˜            # After the map: flatten the list of lists of integers
  D           # Duplicate the list
   ¢          # Count how many times each value occurs in the list
    à         # Pop and push the maximum
              # (after which it is output implicitly as result)

05AB1E의 레거시 버전을 사용합니다. 여기서 [2,2]builtin Ÿ[2]사용하면 [2,2].

3 JonathanAllan Sep 10 2020 at 06:07

젤리 , 15 바이트

>/×24+Ṫr%24FĠẈṀ

[arrivals, departures]플랫폼 수를 산출 하는 목록 목록을 허용하는 모나 딕 링크 .

온라인으로 시도하십시오!

어떻게?

>/×24+Ṫr%24FĠẈṀ - Link: [arrivals, departures] = X
 /              - reduce by
>               -   greater than?
  ×24           - multiply by 24
      Ṫ         - tail (this actually removes the departures from X and yields them,
                        leaving [arivals] as our left argument for the rest of the chain.)
     +          - add (adds 24 to the departures that should be on the next day)
       r        - inclusive range (vectorises)
        %24     - modulo 24 (change to 24 hour times)
           F    - flatten (gets a list of all hours trains are demanding to be at the station)
            Ġ   - group indices by their values
             Ẉ  - length of each (number of trains at the station at each of the utilised hours)
              Ṁ - maximum

또한 arrivals왼쪽과 departures오른쪽에 허용되는 이중 링크로 15 :

>×24+⁹r⁸%24FĠẈṀ

온라인으로 시도하십시오!

3 640KB Sep 10 2020 at 22:23

x86-16 기계 코드, 40 39 바이트

00000000: b217 32db 5156 32f6 ad3a c412 f63a e212  ..2.QV2..:...:..
00000010: f63a d012 f67a 0143 e2ec 3afb 7f02 8afb  .:...z.C..:.....
00000020: 5e59 feca 79dc c3                        ^Y..y..

목록 :

B2 17       MOV  DL, 23             ; loop 23 to 0 hours (h)
        HOUR_LOOP:
32 DB       XOR  BL, BL             ; reset max hour
51          PUSH CX                 ; save array length 
56          PUSH SI                 ; save array pointer 
        TRAIN_LOOP: 
32 F6       XOR  DH, DH             ; clear negatives counter 
AD          LODSW                   ; AL = arrival (a), AH = departure (b) 
3A C4       CMP  AL, AH             ; is a-b negative? 
12 F6       ADC  DH, DH             ; if so, bit-shift 1 into DH 
3A E2       CMP  AH, DL             ; is b-h negative? 
12 F6       ADC  DH, DH             ; if so, bit-shift another 1 
3A D0       CMP  DL, AL             ; is h-a negative? 
12 F6       ADC  DH, DH             ; if so, bit-shift another 1 
7A 01       JP   NOT_AT_STATION     ; was there an odd number of negatives? 
43          INC  BX                 ; if so, increment count of trains at station 
        NOT_AT_STATION: 
E2 EC       LOOP TRAIN_LOOP         ; go to next train 
3A FB       CMP  BH, BL             ; BH = max( BL, BH ) 
7F 02       JG   NOT_MORE           ; if not highest number of trains, continue 
8A FB       MOV  BH, BL             ; BH set to new max 
        NOT_MORE:    
5E          POP  SI                 ; restore array 
59          POP  CX                 ; restore array length 
FE CA       DEC  DL                 ; decrement hour 
79 DC       JNS  HOUR_LOOP          ; if not past zero hour, keep looping 
C3          RET                     ; return to caller

온라인으로 시도하십시오!

호출 가능한 함수로. (A)에서 쌍리스트로서 입력 어레이 SI의 길이 CX에 따라서 BH.

설명:

24 시간을 순환하며 각 시간마다 역에 몇 대의 기차가 있는지 확인합니다.

@xnor의 공식 을 사용 하여 주기적 시간 간격을 확인합니다. 즉 a-b, b-h이고 h-a음수 결과가 홀수이면 h해당 간격 내에 속합니다. 이들 각각을 비교하고 음수이면 캐리 플래그 ( CF)가 설정되고 음수 결과 수를 기록하기 위해 1또는 0로 비트 시프트됩니다 DH.

그런 다음 패리티 플래그 ( PF)가 확인되며 1비트 수가 짝수 이면 설정됩니다 . 홀수 인 경우 해당 시간 동안 카운터가 증가한 다음 이전 최고 카운터와 비교되고 결과에 대해 최대 값이 업데이트됩니다.

2 Arnauld Sep 09 2020 at 22:23

JavaScript (ES6), 75 바이트

시간 쌍 목록이 필요합니다.

a=>(t=24,g=m=>t--?g(a.map(([a,d])=>n+=(t<a)+(t>d)<=(a>d),n=0)|n<m?m:n):m)``

온라인으로 시도하십시오!

2 Jonah Sep 09 2020 at 22:15

J , 42 35 33 바이트

[:>./[:+/(([:~:/1#~[,:]+>*[)>:)"0

온라인으로 시도하십시오!

높은 수준의 아이디어 :

  1. 각 범위를 0-1 목록 (시간당 하나의 슬롯)으로 표시합니다. 1이는 시간이 사용됨을 의미합니다.
  2. 행을 합산하십시오.
  3. 최대를 취하십시오.

1 2 23 f 5 4 2즉, 범위를 취하십시오 .

1 5
2 4
23 2

(([:~:/1#~[,:]+>*[)>:)"00-1 목록을 만들기 위해 (대부분 J 역학)을 적용 합니다.

0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1

23 2다음 날로 이동하기 위해 필요에 따라 범위가 어떻게 확장 되는지 확인하십시오 . 이것은에 의해 달성된다 ]+>*[인수 오른쪽에 추가되는 ]+왼쪽 인수의 [시간 *"올바른 인수 덜하자 이상의 경우 1" >.

다음으로 행별 합계를 수행합니다.

0 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1

그리고 최대를 얻으십시오.

2

보너스, Adam의 APL 접근 방식을 사용하는 34 바이트 버전

[:>./[:#/.~@;([<@-.~&i.1+]+24*>)"0

온라인으로 시도하십시오!

1 ZippyMagician Sep 11 2020 at 05:49

Arn -fs , 36 34 30 바이트

ö·ògT£nžú#│ä♦PüâTPF™,åé@⁻BFÏc-

시도 해봐!

설명

포장 풀기 : :<(({>:}&&[->24 0~:}]:_||=>:}}\):_:@

:<                     Sorted in descending order
  (
    (
      {                Block with key of _
            _          Implied
          >            Is greater than
              _
            :}         Last entry
        &&             Boolean AND
            [          Begin array
                _
              ->       Exclusive range
                24     Literal twenty-four
              0        Literal zero
              ~        1-range
                  _
                :}     
            ]          End sequence
          :_           Flatten
        ||             Boolean OR
            _
          =>           Inclusive range
              _
            :}
      }                End block
      \                Map block over...
        _              ...Variable initialized to STDIN; implied
    )                  End expression
  :_
  :@                   Group based on frequency
)
                       First entry
                       Length
Neil Sep 10 2020 at 06:01

차콜 , 24 바이트

F⮌θF⊕﹪⁻⊟ηι²⁴⊞υ⁺ικI⌈Eυ№υι

온라인으로 시도하십시오! 링크는 자세한 코드 버전입니다. 설명:

F⮌θ

출발 시간을 역순으로 처리하는 것이 더 쉽기 때문에 도착 시간을 역순으로 반복합니다.

F⊕﹪⁻⊟ηι²⁴

이 기차가 역에서 보내는 시간을 계산하세요 ...

⊞υ⁺ικ

...이를 반복하여 시작, 중간 및 종료 시간을 미리 정의 된 빈 목록으로 푸시합니다.

I⌈Eυ№υι

목록에 표시 될 때마다 목록에 표시되는 횟수를 세고 최대 값을 출력합니다.

Neil Sep 10 2020 at 06:19

Retina 0.8.2 , 117 바이트

\d+
$*11 (1+) (?!\1) $&24$* (1+) \1\b $1
+%`^(1+) 1(1+\1)
$1 $2 1$2 1(1{24}) 1 O`1+ (1+)(\s\1\b)* $#2$*11
O^`\d+
\G\d

온라인으로 시도하십시오! 쌍의 목록으로 입력을받습니다. 설명:

\d+
$*11

단항으로 변환하지만 Retina는 0으로 작업하는 데 어려움이 있으므로 모든 숫자를 증가시킵니다.

(1+) (?!\1)
$&24$*

도착 시간보다 짧은 모든 출발 시간에 24를 더합니다.

(1+) \1\b
$1

도착 시간과 출발 시간이 같으면 하나를 삭제하십시오.

+%`^(1+) 1(1+\1)
$1 $2 1$2

그렇지 않으면 중간에 아무 때나 반복해서 입력하십시오.

1(1{24})
1

모든 시간을 "모듈로 24"로 줄입니다 (증가 허용).

O`1+

시간을 정렬하십시오.

(1+)(\s\1\b)*
$#2$*11

각 시간의 발생 수를 (단항으로) 계산합니다.

O^`\d+

내림차순으로 정렬합니다.

\G\d

첫 번째 (즉, 최대 값)를 십진수로 변환합니다.