주차장 관리자


13

소개

귀하는 주차장의 관리자이며 관리자는 크기를 극도로 축소 할 준비를하고 있습니다.

작년의 PAT 최상위 수준 에서 단순화 된 문제 버전입니다 .

도전

당신은 같은 시간에 많이 얼마나 많은 차를 계산하도록 요청 기껏 .

표준 규칙이 적용됩니다. 그리고 이것은 코드 골프이므로 가장 짧은 코드가 승리합니다.

첫 번째 줄은 항목의 양 (이하입니다 100,000, 당신이 좋아하는 경우 입력이 곳에 입력 끝을 결정하는 데에만 임시 변통 인 경우,이 라인을 포함 할 수 없습니다 ). 다음 텍스트는 한 줄에 하나의 항목을 포함합니다. 각 항목에는 세 개의 숫자가 포함됩니다.

<Car plate number> <Time (seconds) since open> <0(In) | 1(Out)>

수정 2 : 트리플 배열을 입력으로 사용하는 것이 좋습니다.

수정 3 : 한 항목에서 숫자 순서를 변경할 수 있습니다. 사용할 것을 선택할 수 있습니다. (비고 섹션 참조)

다음을 가정하여 입력이 유효하다는 것을 보장합니다.

  • Car plate number10000~ 범위의 정수입니다.99999
  • Time0~ 범위의 정수입니다.86400

  • 항목이 반드시 시간순으로 정렬 되는 것은 아닙니다 .
  • 첫 번째 초 전에는 차가 없습니다.
  • 마지막 1 초 후에 반드시 차가있는 것은 아닙니다 .
  • 차는 들어가기 전에 떠나지 않을 것입니다.
  • Car plate number독특합니다. (하지만 같은 차가 여러 번 방문 할 수 있습니다)
  • 따라서 자동차가 이미있는 경우 많은 차량에 진입 할 수 없습니다.
  • 같은 차가 같은 시간에 출입하지 않습니다 time.
  • 자동차는 입 / 출고 시점에 많은 것으로 간주됩니다.

실시 예 1

입력

11
97845 36000 1
75487 16500 1
12345 16 0
75486 3300 0
12345 6500 1
97845 32800 0
12345 16400 0
97846 16501 1
97846 16500 0
75486 8800 1
75487 3300 0

산출

3

설명

에서 16500자동차, 12345그리고 75487주차장에 있었다.

실시 예 2

많은 코드가 실패했기 때문에 이것을 만들었습니다.

입력 (첫 번째 줄이 빠진 상태)

12345 16400 0
12345 16500 1
75487 16500 0
75487 16600 1

산출

2

설명

에서 16500자동차, 12345그리고 75487주차장에 있었다.

비고

실제로 출력에 세 개가 모두 필요한 것은 아닙니다. 적어도 결과에는 plate + time 또는 in / out + time 만 있으면됩니다. 그러나 알고리즘은 두 가지 상황에서 약간 다르므로 더 짧은 선택은 특정 언어에서 알 수 없습니다. 물론 세 개의 숫자를 모두 사용할 수 있습니다. 그래서 나는 그들을 도전에 남겨 둡니다.


자동차 번호판의 길이는 항상 5 자리입니까?
Titus

1
@Titus 10000에서 99999 사이의 숫자는 항상 5 자리 길이라고 생각합니다.
Keyu Gan

3
오늘은 장님입니다.
Titus

나는 처음 떠나기 전에 차를 다시 들어갈 수 없다고 생각합니까? 명시 적으로 언급되지 않은 것 같습니다.
John Dvorak

@JanDvorak 어 죄송합니다. 아닙니다. 실제로 자동차 번호판이 고유 한 경우 하나의 동일한 자동차가 로트에 진입하는 것이 불가능하기 때문에 자동차 번호판 번호가 고유하다는 것을 의미합니다.
Keyu Gan

답변:


7

수학, 33 바이트

-Min@Accumulate[2#2-1&@@@Sort@#]&

번호판 정보를 요구하지 않는 훨씬 간단한 알고리즘이 있다는 것을 깨닫기 위해 문제 설명을 더 잘 읽어야했습니다.

정수를 반환하는 명명되지 않은 함수; 입력 형식은 형식으로 정렬 된 트리플의 목록입니다 {time, 0|1, license plate}. 우리는 Sorting으로 시작 하는데, 이것은 목록을 시간순으로 만들고 0s 앞에 1s 를 정렬하여 시간 관계를 끊는다 . 그런 다음 2#2-1&@@@도착 / 출발 정보 를 유지하고 나머지는 잊고 0s를 -1s 로 변환 합니다.

Accumulate해당 목록의 누적 합계를 계산합니다. 결과는 모든 도착 / 출발 후 주차장에있는 자동차 수의 네거티브 목록입니다 . 그런 다음 Min이들 중 가장 작은 (가장 음수)를 선택하면 음수 부호가 제거됩니다.

매스 매 티카, 56 바이트

Max[<|#|>~Count~0&/@FoldList[List,{},#3->#2&@@@Sort@#]]&

원본 제출 (처음 여러 의견은이 제출을 나타냅니다). 정수를 반환하는 명명되지 않은 함수; 입력 형식은 형식으로 정렬 된 트리플의 목록입니다 {time, 0|1, license plate}.

우리가 시간 항목을 먼저 입력하고 입력 / 출력 항목을 두 번째로 선택하는 이유는 Sort@#목록을 시간순으로 정렬하고 출발 전에 도착을 동시에 기록하기 때문입니다. 그런 #3->#2&@@@다음 양식의 "규칙"목록을 license plate -> 0|1여전히 시간순으로 정렬 하여 반환합니다 .

그런 다음 FoldList[List,{},...]해당 규칙 목록의 모든 초기 세그먼트 목록을 작성하십시오. 실제로, 그것은 초기 세그먼트를 엉망으로 만듭니다. k깊이 2 이상의 규칙, 깊이 3 이상의 규칙, ... 깊이 이상의 규칙리스트 인 것을 번째 초기 세그먼트 단부 k+1. ( FoldList[Append,{},...]보다 자연스러운 결과를 얻을 수 있습니다.) 그러나 <|#|>이러한 각 초기 세그먼트를 "연관"으로 바꾸면 두 가지 바람직한 효과가 있습니다. 먼저 방금 만든 중첩 목록 구조를 완전히 평탄화합니다. 두 번째로, 나중에 규칙을 적용하여 이전 규칙을 재정의합니다.이 규칙은 주차장을 떠난 자동차의 경우 초기 진입 기록이 완전히 사라졌습니다 (그리고 다시 입력하는 자동차의 경우도 마찬가지). .

따라서 남은 일은이 각 협회에 Count0개가 있는지에 대한 것 Max입니다.


1
자동차가 동시에오고가는 경우에 항상 이것이 올바른 일을합니까?
Christian Sievers

대답이 틀렸을 수 있습니다. 자동차를 다시 한 번 입력 할 때 최대 값이 반드시 발생하는 것은 아니므로 연결을 사용하여 항목을 지우는 것이 안전하지 않습니다. 이 사진을보십시오 : i.imgur.com/D5xUl3z.png 16500
Keyu Gan

@ KeyuGan : 자동차가 다시 들어갈 때 최대 값이 발생한다고 주장하지 않았습니다. 내 솔루션은 모든 단일 출입국시 주차장의 자동차 수를 계산하고 그 최대 값을 취합니다.
Greg Martin

1
아마 당신은 예제 2를 시도해 볼 수 있습니다.
Keyu Gan

1
개인적으로 나는 당신에게 동의합니다. :) 내가 한 것은 원래 문제에서 정의를 복사하는 것입니다. 가장 큰 차이점은 원래의 판은 이미지에서 자동차 판을 인식하고 최종 결과로 인쇄해야한다는 것입니다.
Keyu Gan

5

하스켈, 76 63 61 바이트

@nimi의 제안을 변형하여 2 바이트를 절약했습니다.

f l=maximum$scanl1(+)[(-1)^c|i<-[0..8^6],(_,b,c)<-l,i==2*b+c]

문제 설명에서 주어진 순서대로 트리플의 목록으로 인수를 예상합니다.

가능한 시간마다 (그리고 그 이상), 우리는 먼저 와서 떠나는 자동차 이벤트를 검색하여 더하기 또는 빼기 목록으로 바꿉니다. 우리는이리스트의 부분 합을 취한 다음이 부분 합의 최대 값을 취합니다.


를 삭제 import하고 사용하십시오 [(-1)^c|i<-[1..86400],(_,b,c)<-l,i==b].
nimi

나가는 차보다 들어오는 차가 필요하므로 조금 더 복잡하지만 여전히 아이디어로 2 바이트를 절약 할 수 있습니다. 감사!
Christian Sievers

2

PHP 7.1, 126 117 바이트

for(;$s=file(i)[++$i];)$d[+substr($s,6)][$s[-2]]++;ksort($d);foreach($d as$a){$r=max($r,$n+=$a[0]);$n-=$a[1];}echo$r;

file i에서 입력을 받고 첫 번째 줄을 무시합니다. 로 실행하십시오 -r.
입력에 후행 줄 바꿈이 필요합니다. 교체 -2-3Windows 용.

고장

# generate 2-dim array; first index=time, second index=0/1 (in/out);
# values=number of cars arriving/leaging; ignore plate number
for(;$s=file(i)[++$i];) # read file line by line (includes trailing newline)
    $d[+substr($s,6)][$s[-2]]++;    # substring to int=>time, last but one character=>1/0
ksort($d);                      # sort array by 1st index (time)
foreach($d as$a)    # loop through array; ignore time
{
    $r=max($r,                      # 2. update maximum count
        $n+=$a[0]                   # 1. add arriving cars to `$n` (current no. of cars)
    );
    $n-=$a[1];                      # 3. remove leaving cars from `$n`
}
echo$r;                         # print result

함수를 작성하는 경우 트리플 배열을 입력으로 사용할 수 있습니다. 저의 친구들과 저는 복잡한 입력없이 문제에 대해 이야기 할 때 골프가 아닌 언어를 더욱 경쟁력있게 만드는 좋은 방법이라고 생각합니다.
Keyu Gan

@KeyuGan : 힌트를 주셔서 감사합니다. 그러나 배열을 입력으로 사용하려면 함수가 필요합니다. 삼중 배열과 삼중 항 배열 모두 2 바이트가 필요합니다. 함수, 배열 매핑 및 사용자 정의 정렬은 PHP에서 부피가 큽니다. 내가 무엇이든 저장할 수있는 유일한 방법은 준비된 $d입력 또는 정렬 된 입력 (시간 및 입출력)입니다. 그리고 그 도전에서 너무 많은 시간이 걸릴 것입니다. 정렬 된 입력 ttttt i plate은 플레이트 번호와 정렬 된 카운트로 17 바이트를 더 절약 할 수 있습니다.
Titus

2

C, 147 바이트

완전한 프로그램으로부터 입력을 읽습니다 stdin.

int r[86402]={},u,i,n,t;g(s,o){for(;s<86401;n<r[s]?n=r[s]:0,++s)r[s+o]+=o?-1:1;}main(){for(n=0;scanf("%d%d%d",&u,&t,&i)==3;g(t,i));printf("%d",n);}

ideone에서 사용해보십시오 .


나는 사이에 공백을 제거하는 것이 안전하다고 생각합니다%d
Keyu Gan

죄송합니다. 나는 scanf충분히 사용하지 않는다고 생각합니다.
owacoder

나는 사랑한다 cin. LOL
Keyu Gan


2

옥타브, 50 , 64 38 바이트

@(A)-min(cumsum(sortrows(A)(:,2)*2-1))

@Greg Martin의 Mathematica 답변 과 동일

이 함수는 열이 3 개인 배열을 가져옵니다. [time, i/o,plateN]

이전 답변 :

@(A){[t,O]=A{:};max(cumsum(sparse({++t(!O),t}{2},1,!O*2-1)))}{2}

이 함수 는 트리플 입력을 포함하는 셀형 배열의 처음 두 요소에서 t시간과 OI / O의 두 가지 입력 만 가져 옵니다 A!

기존 자동차의 기록 된 각 시간 수를 계산하기 위해 생성 된 희소 행렬입니다. 그것의 시간 초과 + 1은 자동차 출구로 간주되며 해당 1은 -1로, 0은 1로 변경됩니다.
여기서는 여러 대의 자동차가 동시에 도착 또는 출발 할 수 있으므로 스파 스를 사용하는 것이 매우 중요합니다.
그런 다음 로트에있는 현재 자동차의 수를 나타내는 누적 합계를 계산하고 최대 값을 찾습니다.


Octave 지원 셀 배열을 기억합니다. 즉, 트리플 배열을 하나만 입력으로 사용할 수 있습니다. 제한 사항은 M5 이전 버전에 따르며 '3 중 배열'로 표시됩니다. 나는 M5에서 그것을 명확하게했다
Keyu Gan

@KeyuGan 나는 당신의 새로운 발명 제한이 내 코드의 14 바이트 증가 불필요하다고 생각합니다. 따라서이 사이트를 처음 사용하면 더 많은 참가자를 유치하기 위해 최소한의 제한으로 질문을하는 것이 좋습니다.
rahnema1 2012 년

2

자바 스크립트 (ES6), 63 73 71 바이트

d=>Math.max(...d.sort((a,[b,c])=>a[s=0]-b||a[1]-c).map(e=>s+=1-e[1]*2))

이것은 입력을 주문 된 항목의 배열로 받아들 [time, inout, plate]입니다. 불행히도 동일한 inout 시간은 두 자동차가 현재 많은 로트에서 고려된다는 사실 때문에 정렬 알고리즘은 11 바이트 0이전에 주문해야합니다 1.

크레딧

  • 맵 기능 내에서 시프트 및 곱셈을 완전히 이동하여 1 바이트를 절약했습니다 (Neil 덕분에).
  • 정렬 함수에서 구조화 된 인수를 사용하여 또 다른 2 바이트를 저장했습니다 (덕분에 edc65).

데모

// test the two examples
console.log([[[36000,1],[16500,1],[16,0],[3300,0],[6500,1],[32800,0],[16400,0],[16501,1],[16500,0],[8800,1],[3300,0]],[[16400,0],[16500,1],[16500,0],[16600,1]]].map(
// answer submission
d=>Math.max(...d.sort((a,[b,c])=>a[s=0]-b||a[1]-c).map(e=>s+=1-e[1]*2))
));


d=[[16400,75487,0],[16500,75487,1],[16500,99999,0],[16600,99999,1]];2를 인쇄해야한다고 가정하면 코드가 제대로 작동하지 않는 것 같습니다 .
Keyu Gan

4 엔트리 테스트 케이스에는 2 대의 자동차 만 있습니다. 입력 순서에 맞게 형식을 지정했습니다.
Keyu Gan

@KeyuGan 오해에 대해 유감스럽게 생각합니다. 두 번째 예를 언급하고 있음을 알지 못했습니다. 이제 수정되었습니다.
Patrick Roberts

알고리즘이 플레이트 번호에 의존하지 않는다는 것을 알고 있습니다. 그러나 나는 그것이 입력 순서의 정의에 포함되어야한다고 제안한다. 단지 그것을 마지막에 두십시오.)
Keyu Gan

1
@ edc65 실제로 4 바이트가 아닌 2 바이트입니다.d=>Math.max(...d.sort(([a,b],[c,d])=>a-b||c-d).map(e=>s+=1-e[1]*2,s=0))
Patrick Roberts

2

자바 스크립트 (ES6), 8368 70 바이트

편집 : 두 번째 예를 지원하도록 수정되었습니다.

입력을 배열의 [in_out, time, plate]배열로받습니다. 그러나 plate열은 실제로 무시됩니다.

a=>a.sort(([a,b],[c,d])=>b-d||a-c).map(v=>a=(n+=1-v[0]*2)<a?a:n,n=0)|a

테스트


in_out열 대신 열을 읽으면 plate6 바이트가 절약 v=>n+=1-v[2]*2됩니다.
Neil

이것은 두 번째 예에서는 올바르지 않으므로 다시 편집하는 경우이를 고려해야합니다. (이것에 대한 마지막 편집은 두 번째 예제가 추가되기 전에 수행되었으므로 기술적으로이를 준수하지 않으며 전혀 질투하지 않습니다!)
Patrick Roberts

@PatrickRoberts 내가 컴퓨터 앞에 돌아 왔을 때 그 문제를 해결하려고 노력할 것입니다 ^^
Arnauld

@Neil Good catch! 어쨌든 두 번째 예제를 지원하기 위해 다시 작성해야했지만 조언을 따랐습니다.
Arnauld
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.