Wprowadzenie
Jesteś przełożonym parkingu, a twój menedżer przygotowuje się do skrajnego zmniejszenia wielkości.
Jest to uproszczona i dostosowana wersja problemu z zeszłorocznego najwyższego poziomu PAT .
Wyzwanie
Zostaniesz poproszony o obliczenie co najwyżej liczby samochodów na partii .
Obowiązują standardowe zasady. A to jest golf golfowy, więc wygrywa najkrótszy kod.
Pierwszy wiersz to ilość wpisów (nie więcej niż 100,000
, twoje wejście może nie zawierać tego wiersza, jeśli chcesz, ponieważ jest to tylko prowizoryczne określenie, gdzie kończy się wejście ). Poniższy tekst zawiera jeden wpis w wierszu. I każdy wpis zawiera trzy liczby:
<Car plate number> <Time (seconds) since open> <0(In) | 1(Out)>
Modyfikacja 2: Można użyć tablicy potrójnych jako danych wejściowych.
Modyfikacja 3: Możesz zmienić kolejność liczb w jednym wpisie. I możesz wybrać, którego użyć. (patrz sekcja Uwagi)
Dane wejściowe są gwarantowane, przy założeniu, że:
Car plate number
jest liczbą całkowitą z zakresu10000
~99999
Time
jest liczbą całkowitą z zakresu0
~86400
I
- Wpisy niekoniecznie są uporządkowane chronologicznie.
- Przed pierwszą sekundą nie ma samochodu.
- Jest niekoniecznie ma samochodu po ostatniej sekundy.
- Samochód nie chciał odjechać, zanim wsiądzie.
Car plate number
jest unikalny. (ale ten sam samochód może odwiedzać więcej niż jeden raz)- Nie ma więc możliwości, aby samochód wjechał na parking, gdy już w nim jest.
- Ten sam samochód nie wsiadałby i wysiadał w tym samym czasie
time
. - Uważa się, że samochód znajduje się na partii w momencie wejścia / wyjścia.
Przykład 1
Wejście
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
Wynik
3
Wyjaśnienie
O 16500
, samochód 12345
i 75487
były na parkingu.
Przykład 2
Zrobiłem to, ponieważ znalazłem wiele błędów na nim.
Wejście (z pominięciem pierwszego wiersza)
12345 16400 0
12345 16500 1
75487 16500 0
75487 16600 1
Wynik
2
Wyjaśnienie
O 16500
, samochód 12345
i 75487
były na parkingu.
Uwagi
W rzeczywistości nie wszystkie trzy są wymagane do wydruku. Przynajmniej potrzebujesz tylko płyty + czas lub wejścia / wyjścia + czas na wynik. Ale algorytm jest nieco inny w dwóch okolicznościach, dlatego wybór krótszego czasu pozostaje nieznany w pewnym języku. I oczywiście możesz użyć wszystkich trzech liczb. Zostawiam ich więc wyzwaniu.
Odpowiedzi:
Mathematica, 33 bajty
Musiałem lepiej przeczytać instrukcję problemu, aby zdać sobie sprawę, że istnieje znacznie prostszy algorytm, który nie wymaga informacji o tablicach rejestracyjnych.
Nienazwana funkcja zwracająca liczbę całkowitą; format wejściowy to lista uporządkowanych trójek w formularzu
{time, 0|1, license plate}
. Zaczynamy odSort
ing, co sprawia, że lista jest chronologiczna, a także przerywa powiązania czasowe, sortując0
s przed1
s; następnie2#2-1&@@@
przechowuje informacje o przyjeździe / wyjeździe i zapomina resztę, a także konwertuje0
s na-1
s.Accumulate
oblicza sumy bieżące tej listy; wynikiem jest lista negatywnych liczb samochodów na parkingu po każdym przyjeździe / wyjeździe. NastępnieMin
wybiera najmniejszą (najbardziej negatywną) z nich, a znak ujemny jest usuwany.Mathematica, 56 bajtów
Oryginalne zgłoszenie (kilka pierwszych komentarzy odnosi się do tego zgłoszenia). Nienazwana funkcja zwracająca liczbę całkowitą; format wejściowy to lista uporządkowanych trójek w formularzu
{time, 0|1, license plate}
.Powodem, dla którego wybraliśmy umieszczenie wpisu czasu na pierwszym miejscu, a wpisu wejścia / wyjścia na drugim miejscu, jest to, że
Sort@#
sortuje listę chronologicznie i rejestruje przyjazdy przed odlotami, jeśli są one jednoczesne. Następnie#3->#2&@@@
zwraca listę „reguł” formularzalicense plate -> 0|1
, wciąż posortowanych chronologicznie.Następnie
FoldList[List,{},...]
tworzy listę wszystkich początkowych segmentów tej listy reguł. Właściwie to naprawdę psuje te początkowe segmenty; zk
th początkowe końce segmentu góry być lista z jednej reguły na głębokości 2, jeden z reguły na głębokości 3, ..., i jedną regułę na głębokościk
+1. (FoldList[Append,{},...]
dałby bardziej naturalny wynik). Jednak<|#|>
zamienia każdy z tych początkowych segmentów w „skojarzenie”, które ma dwa pożądane efekty: po pierwsze, całkowicie spłaszcza utworzoną właśnie strukturę listy zagnieżdżonej; a po drugie, wymusza późniejsze reguły, aby zastąpić wcześniejsze reguły, czego dokładnie tutaj potrzebujemy - w przypadku każdego samochodu, który opuścił parking, zapis jego pierwszego wjazdu już całkowicie zniknął (i podobnie w przypadku samochodów, które ponownie wjeżdżają) .Pozostało więc tylko
Count
ustalić, ile0
jest w każdym z tych skojarzeń i wziąćMax
.źródło
Haskell,
76 6361 bajtów2 bajty zapisane przez odmianę sugestii @ nich.
Oczekuje argumentu jako listy potrójnych w kolejności podanej w instrukcji problemu.
Dla każdego możliwego czasu (i kilku innych) szukamy najpierw przybycia, a następnie opuszczenia imprez samochodowych i zmieniamy je na listę dodatnich lub ujemnych. Bierzemy częściowe sumy z tej listy, a następnie maksimum tych częściowych sum.
źródło
import
i użyj[(-1)^c|i<-[1..86400],(_,b,c)<-l,i==b]
.PHP 7.1,
126117 bajtówpobiera dane z pliku
i
, ignoruje pierwszą linię. Uruchom z-r
.Wymaga wprowadzenia nowego wiersza w danych wejściowych. Wymienić
-2
z-3
Windows.awaria
źródło
$d
jako dane wejściowe lub posortowane (według czasu i wejścia / wyjścia). I to wymagałoby zbyt wiele od wyzwania. Wyrównanie danych wejściowychttttt i plate
pozwoliłoby zaoszczędzić 17 bajtów, o 19 więcej, z liczbą dopasowaną do numeru rejestratora.C, 147 bajtów
Kompletny program odczytuje dane wejściowe z
stdin
.Wypróbuj na ideone .
źródło
%d
scanf
wystarczająco dużo.cin
. LOLOktawa,
50,6438 bajtówTaki sam jak odpowiedź Mathematica @Greg Martin
Funkcja otrzymuje tablicę z 3 kolumnami
[time, i/o,plateN]
poprzednia odpowiedź:
Funkcja ma tylko dwa wejścia
t
: czas iO
: I / O z pierwszych dwóch elementów tablicy komórkowej,A
która zawiera potrójne wejścia!Rzadka macierz stworzona do liczenia dla każdej zarejestrowanej liczby istniejących samochodów. W tym celu brany jest pod uwagę czas wyjścia + 1 dla wyjścia z samochodu, a odpowiednia 1 zmiana na -1 i 0 zmieniona na 1.
Użycie rzadkiego tutaj jest bardzo ważne, ponieważ wiele samochodów może przyjechać lub odjechać w tym samym czasie.
Następnie obliczana jest skumulowana suma reprezentująca liczbę obecnych samochodów w partii i jej maksimum.
źródło
JavaScript (ES6),
637371 bajtówAkceptuje to dane wejściowe jako tablicę uporządkowanych wpisów
[time, inout, plate]
. Niestety z uwagi na fakt, że identyczne czasy bezczynności oznaczają, że oba samochody są obecnie rozpatrywane w partii, algorytm sortowania musi zamówić0
wcześniej1
, co kosztowało 11 bajtów.Kredyty
Próbny
źródło
d=[[16400,75487,0],[16500,75487,1],[16500,99999,0],[16600,99999,1]];
. Powinienem wydrukować 2?d=>Math.max(...d.sort(([a,b],[c,d])=>a-b||c-d).map(e=>s+=1-e[1]*2,s=0))
JavaScript (ES6),
83…6870 bajtówEDYCJA: naprawiono, aby obsługiwać 2. przykład
Pobiera dane wejściowe jako tablicę
[in_out, time, plate]
tablic. Aleplate
kolumna jest faktycznie ignorowana.Test
Pokaż fragment kodu
źródło
in_out
kolumnę zamiastplate
kolumny powinny zaoszczędzić sześć bajtów:v=>n+=1-v[2]*2
.