Giám sát bãi đỗ xe


13

Giới thiệu

Bạn là người giám sát một bãi đậu xe và người quản lý của bạn đang chuẩn bị thu nhỏ kích thước đến mức cực đoan.

Đây là một phiên bản đơn giản và thích nghi của một vấn đề trong năm ngoái PAT cấp cao nhất.

Thử thách

Bạn được yêu cầu tính toán có bao nhiêu chiếc xe trong cùng một lúc, nhiều nhất .

Quy tắc chuẩn áp dụng. Và đây là một môn đánh gôn nên mã ngắn nhất sẽ thắng.

Dòng đầu tiên là số lượng mục nhập (không quá 100,000, đầu vào của bạn có thể không chứa dòng này nếu bạn muốn, vì nó chỉ là tạm thời để xác định nơi đầu vào kết thúc ). Văn bản sau đây chứa một mục nhập trên mỗi dòng. Và mỗi mục bao gồm ba số:

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

Sửa đổi 2: Bạn có thể sử dụng một mảng ba lần làm đầu vào.

Sửa đổi 3: Bạn có thể thay đổi thứ tự các số trong một mục. Và bạn có thể chọn để sử dụng. (xem phần Ghi chú)

Đầu vào được đảm bảo là hợp lệ, giả sử rằng:

  • Car plate numberlà một số nguyên trong phạm vi 10000~99999
  • Timelà một số nguyên trong phạm vi 0~86400

  • Bài dự thi không nhất thiết phải theo thứ tự thời gian.
  • Không có xe trước giây đầu tiên.
  • Không nhất thiết không có xe sau giây cuối cùng.
  • Một chiếc xe sẽ không rời đi trước khi nó vào.
  • Car plate numberlà duy nhất. (nhưng cùng một chiếc xe có thể ghé thăm nhiều lần)
  • Vì vậy, không thể cho một chiếc xe vào lô khi nó đã ở trong đó.
  • Một chiếc xe giống nhau sẽ không đi vào cùng một lúc time.
  • Một chiếc xe được coi là có rất nhiều tại thời điểm vào / ra.

ví dụ 1

Đầu vào

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

Đầu ra

3

Giải trình

Tại 16500, xe 1234575487đang ở trong bãi đậu xe.

Ví dụ 2

Tôi đã làm điều này bởi vì tôi tìm thấy nhiều mã thất bại trên nó.

Đầu vào (với dòng đầu tiên bên trái)

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

Đầu ra

2

Giải trình

Tại 16500, xe 1234575487đang ở trong bãi đậu xe.

Nhận xét

Trên thực tế, không phải cả ba đều được yêu cầu cho đầu ra. Ít nhất, bạn chỉ cần tấm + thời gian hoặc vào / ra + thời gian cho kết quả. Nhưng thuật toán hơi khác nhau trong hai trường hợp, do đó, sự lựa chọn ngắn hơn vẫn chưa được biết trong một ngôn ngữ nhất định. Và tất nhiên bạn có thể sử dụng tất cả ba số. Vì vậy, tôi để chúng trong thử thách.


Có phải biển số xe luôn dài 5 chữ số?
Tít

1
@Titus Tôi tin rằng các số từ 10000 đến 99999 luôn dài 5 chữ số.
Keyu Gan

3
Gee I hôm nay bị mù.
Tít

Tôi cho rằng một chiếc xe không thể vào lại trước khi rời đi lần đầu tiên? Nó dường như không được tuyên bố rõ ràng.
John Dvorak

@JanDvorak xin lỗi. Không, nó không thể. Nó được ngụ ý bởi biển số xe là duy nhất bởi vì trong thực tế, không thể có một chiếc xe giống nhau nhập vào lô khi nó đã ở trong đó.
Keyu Gan

Câu trả lời:


7

Toán học, 33 byte

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

Tôi đã phải đọc báo cáo vấn đề tốt hơn để nhận ra rằng có một thuật toán đơn giản hơn nhiều mà không yêu cầu thông tin biển số xe.

Hàm không tên trả về một số nguyên; định dạng đầu vào là một danh sách các bộ ba theo thứ tự trong mẫu {time, 0|1, license plate}. Chúng tôi bắt đầu bằng cách Sorting, làm cho danh sách theo thứ tự thời gian và cũng phá vỡ các mối quan hệ thời gian bằng cách sắp xếp 0s trước 1s; sau đó 2#2-1&@@@giữ thông tin đến / đi và quên phần còn lại, đồng thời chuyển đổi 0s thành -1s.

Accumulatetính toán tổng số chạy của danh sách đó; kết quả là một danh sách các tiêu cực của số lượng xe trong bãi đậu xe sau mỗi lần đến / đi. Sau đó Minchọn nhỏ nhất (âm nhất) trong số này và dấu âm bị tước.

Toán học, 56 byte

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

Trình ban đầu (một số ý kiến ​​đầu tiên đề cập đến trình này). Hàm không tên trả về một số nguyên; định dạng đầu vào là một danh sách các bộ ba theo thứ tự trong mẫu {time, 0|1, license plate}.

Lý do chúng tôi chọn đặt mục nhập thời gian lên trước và mục nhập vào / ra thứ hai là để Sort@#sắp xếp danh sách theo thứ tự thời gian và ghi lại các lần đến trước khi khởi hành nếu chúng đồng thời. Sau đó, #3->#2&@@@trả về một danh sách "quy tắc" của biểu mẫu license plate -> 0|1, vẫn được sắp xếp theo thứ tự thời gian.

Sau đó, FoldList[List,{},...]tạo một danh sách tất cả các phân đoạn ban đầu của danh sách quy tắc đó. Trên thực tế, nó thực sự gây rối cho các phân khúc ban đầu; những kthứ ban đầu phân khúc đầu lên được một danh sách với một quy tắc ở độ sâu 2, một quy tắc ở độ sâu 3, ..., và một quy tắc ở độ sâu k1. ( FoldList[Append,{},...]sẽ mang lại kết quả tự nhiên hơn.) Tuy nhiên, <|#|>biến mỗi phân đoạn ban đầu này thành một "liên kết", có hai hiệu ứng mong muốn: thứ nhất, nó làm phẳng hoàn toàn cấu trúc danh sách lồng mà chúng ta vừa tạo; và thứ hai, nó buộc các quy tắc sau đó ghi đè lên các quy tắc trước đó, đó chính xác là những gì chúng ta cần ở đây đối với bất kỳ chiếc xe nào đã rời khỏi bãi đậu xe, hồ sơ nhập cảnh ban đầu của nó đã hoàn toàn biến mất (và tương tự đối với những chiếc xe nhập lại) .

Vì vậy, tất cả những gì còn lại phải làm là có Countbao nhiêu 0s trong mỗi hiệp hội này, và lấy Max.


1
Điều này sẽ luôn luôn làm đúng nếu xe ô tô đến và đi cùng một lúc?
Christian Sievers

Câu trả lời của bạn có thể sai. Tối đa không nhất thiết phải xảy ra khi một chiếc xe nhập lại một lần nữa vì vậy không an toàn để xóa các mục bằng cách sử dụng liên kết. Xem ảnh này: i.imgur.com/D5xUl3z.png Rõ ràng có 3 chiếc xe ở 16500.
Keyu Gan

@KeyuGan: Tôi không cho rằng tối đa xảy ra khi xe vào lại. Lưu ý rằng giải pháp của tôi sẽ đếm số lượng ô tô trong bãi đậu xe tại mỗi lần nhập cảnh / khởi hành và lấy tối đa những chiếc xe đó.
Greg Martin

1
Có lẽ bạn có thể thử ví dụ 2.
Keyu Gan

1
Cá nhân tôi đồng ý với bạn. :) Những gì tôi đã làm là sao chép định nghĩa từ vấn đề ban đầu. Sự khác biệt chính là bản gốc yêu cầu biển số xe được nhận dạng từ hình ảnh và được in là kết quả cuối cùng.
Keyu Gan

5

Haskell, 76 63 61 byte

2 byte được lưu bởi một biến thể của đề xuất @ nimi.

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

Mong đợi đối số là một danh sách các bộ ba theo thứ tự được đưa ra bởi tuyên bố vấn đề.

Đối với mỗi lần có thể (và một số chi tiết khác), trước tiên chúng tôi sẽ tìm kiếm và sau đó rời khỏi các sự kiện xe hơi và biến chúng thành một danh sách cộng hoặc trừ. Chúng tôi lấy tổng một phần của danh sách này và sau đó là tối đa của các khoản tiền một phần này.


Thả importvà sử dụng [(-1)^c|i<-[1..86400],(_,b,c)<-l,i==b].
nimi

Tôi cần những chiếc xe đến trước những chiếc xe đang đi, vì vậy nó phức tạp hơn một chút, nhưng tôi vẫn có thể tiết kiệm 2 byte với ý tưởng của bạn. Cảm ơn!
Christian Sievers

2

PHP 7.1, 126 117 byte

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;

lấy đầu vào từ tập tin i, bỏ qua dòng đầu tiên. Chạy với -r.
Yêu cầu một dòng mới trong đầu vào. Thay thế -2bằng -3cho Windows.

phá vỡ

# 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

Xin lỗi, bạn có thể sử dụng một mảng ba lần làm đầu vào nếu bạn đang viết một hàm. Bạn bè của tôi và tôi tin rằng đó là một cách tốt để làm cho ngôn ngữ không chơi golf trở nên cạnh tranh hơn nếu chúng ta đang nói về một vấn đề mà không có đầu vào phức tạp.
Keyu Gan

@KeyuGan: Cảm ơn bạn đã gợi ý; nhưng với một mảng là đầu vào, tôi dữ liệu cần một hàm và điều đó sẽ tốn hai byte, cả với một mảng ba và với một bộ ba mảng. các hàm, ánh xạ mảng và sắp xếp tùy chỉnh là cồng kềnh trong PHP. Cách duy nhất tôi có thể lưu bất cứ thứ gì sẽ là sự chuẩn bị của tôi $ddưới dạng đầu vào hoặc đầu vào được sắp xếp (theo thời gian và vào / ra). Và thast sẽ mất quá nhiều từ thử thách. Đầu vào được căn chỉnh ttttt i platesẽ tiết kiệm 17 byte, thêm 19 byte với số lượng được căn chỉnh với số tấm.
Tít

2

C, 147 byte

Một chương trình hoàn chỉnh, đọc đầu vào từ 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);}

Hãy thử nó trên ideone .


Tôi tin rằng sẽ an toàn để xóa khoảng cách giữa%d
Keyu Gan

Rất tiếc, cảm ơn. Tôi không sử dụng scanfđủ, tôi đoán.
owacoder

Tôi yêu cin. LOL
Keyu Gan


2

Octave, 50 , 64 38 byte

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

Giống như câu trả lời Mathicala của @Greg Martin

Hàm được một mảng với 3 cột [time, i/o,plateN]

câu trả lời trước:

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

Hàm chỉ nhận được hai đầu vào t: thời gian và O: I / O từ hai phần tử đầu tiên của một mảng ô Acó chứa ba đầu vào!

Một ma trận thưa thớt được tạo ra để đếm cho mỗi số thời gian ghi lại của những chiếc xe hiện có. Đối với thời gian hết + 1 được xem xét cho lối ra xe và 1 thay đổi thành -1 và 0 thay đổi thành 1.
Sử dụng thưa thớt ở đây là rất quan trọng vì nhiều xe có thể đến hoặc rời cùng một lúc.
Sau đó, tổng tích lũy được tính đại diện cho số lượng xe hiện tại trong lô và tối đa của nó được tìm thấy.


Tôi nhớ mảng di động hỗ trợ Octave, có nghĩa là bạn chỉ có thể sử dụng một mảng ba lần làm đầu vào. Hạn chế là theo phiên bản trước M5 và nó tuyên bố 'một loạt ba lần'. Tôi đã làm rõ điều đó trong M5
Keyu Gan

@KeyuGan Tôi nghĩ rằng hạn chế được phát minh mới của bạn là không cần thiết tăng 14 byte mã của tôi. Vì vậy, bạn chưa quen với trang web này, tốt hơn là nên có câu hỏi với số lượng hạn chế tối thiểu để thu hút nhiều người đóng góp hơn.
rahnema1

2

JavaScript (ES6), 63 73 71 byte

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

Điều này chấp nhận đầu vào như một mảng các mục được đặt hàng [time, inout, plate]. Thật không may do thực tế là thời gian vào giống hệt nhau có nghĩa là cả hai chiếc xe đều được xem xét rất nhiều tại thời điểm này, thuật toán sắp xếp phải đặt hàng 0trước 1, có giá 11 byte.

Tín dụng

  • Tôi đã lưu 1 byte bằng cách di chuyển hoàn toàn sự thay đổi và nhân bên trong chức năng bản đồ (cảm ơn Neil).
  • Tôi đã lưu hai byte khác bằng cách sử dụng một đối số bị hủy trong hàm sort (cảm ơn edc65).

Bản giới thiệu

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


Có vẻ như mã của bạn không hoạt động tốt trên d=[[16400,75487,0],[16500,75487,1],[16500,99999,0],[16600,99999,1]];tôi nghĩ nó nên in 2?
Keyu Gan

Vâng, trong trường hợp thử nghiệm 4 mục, chỉ có 2 chiếc xe. Tôi đã định dạng nó để đáp ứng thứ tự đầu vào của bạn.
Keyu Gan

@KeyuGan xin lỗi vì sự hiểu lầm, tôi không nhận ra bạn đang đề cập đến ví dụ thứ hai. Bây giờ nó đã được sửa.
Patrick Roberts

Tôi biết thuật toán của bạn không phụ thuộc vào số tấm. Tuy nhiên tôi đề nghị nên đưa nó vào định nghĩa của thứ tự đầu vào, chỉ để nó đến cuối cùng;)
Keyu Gan

1
@ edc65 thực sự, chỉ có 2 byte, không phải 4. Đây cũng là 71 byte: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

JavaScript (ES6), 83 ... 68 70 byte

EDIT: cố định để hỗ trợ ví dụ thứ 2

Đưa đầu vào như một mảng của [in_out, time, plate]mảng. Nhưng platecột thực sự bị bỏ qua.

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

Kiểm tra


Đọc in_outcột thay vì platecột sẽ giúp bạn tiết kiệm sáu byte : v=>n+=1-v[2]*2.
Neil

Điều này không đúng với ví dụ thứ hai, vì vậy nếu bạn chỉnh sửa lại, bạn sẽ cần tính đến điều đó. (Vì lần chỉnh sửa cuối cùng về điều này là trước khi ví dụ thứ hai được thêm vào, về mặt kỹ thuật được miễn tuân thủ và tôi hoàn toàn không ghen tị!)
Patrick Roberts

@PatrickRoberts Sẽ cố gắng khắc phục điều đó khi tôi quay lại trước máy tính ^^
Arnauld

@Neil Bắt tốt! Tôi đã phải viết lại bằng mọi cách để hỗ trợ ví dụ thứ 2, nhưng cuối cùng tôi đã làm theo lời khuyên của bạn.
Arnauld
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.