Parkplatzaufsicht

13

Einführung

Sie betreuen einen Parkplatz und Ihr Vorgesetzter bereitet sich darauf vor, die Größe auf das Äußerste zu reduzieren.

Es ist eine vereinfachte und angepasste Version eines Problems in der PAT- Spitzenversion des letzten Jahres .

Herausforderung

Sie werden gebeten zu berechnen, wie viele Autos sich höchstens gleichzeitig auf dem Grundstück befinden .

Es gelten Standardregeln. Und dies ist ein Code-Golf, so dass der kürzeste Code gewinnt.

Die erste Zeile ist die Anzahl der Einträge (nicht mehr als 100,000, Ihre Eingabe darf diese Zeile nicht enthalten, wenn Sie möchten, da es nur eine Behelfslösung ist, zu bestimmen, wo die Eingabe endet ). Der folgende Text enthält einen Eintrag pro Zeile. Und jeder Eintrag enthält drei Zahlen:

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

Änderung 2: Es ist in Ordnung, ein Array von Tripeln als Eingabe zu verwenden.

Änderung 3: Sie können die Reihenfolge der Nummern in einem Eintrag ändern. Und Sie können wählen, welche Sie verwenden möchten. (siehe Abschnitt Bemerkungen)

Die Eingabe ist garantiert gültig, vorausgesetzt, dass:

  • Car plate numberist eine ganze Zahl im Bereich von 10000~99999
  • Timeist eine ganze Zahl im Bereich von 0~86400

Und

  • Einträge sind nicht unbedingt chronologisch geordnet.
  • Es gibt kein Auto vor der ersten Sekunde.
  • Es gibt nicht unbedingt kein Auto nach der letzten Sekunde.
  • Ein Auto würde nicht fahren, bevor es ankommt.
  • Car plate numberist einzigartig. (aber dasselbe Auto kann mehr als einmal besuchen)
  • So ist es für ein Auto unmöglich, das Los zu betreten, wenn es bereits darin ist.
  • Ein und dasselbe Auto würde nicht gleichzeitig ein- und aussteigen time.
  • Ein Auto gilt zum Zeitpunkt des Ein- / Ausfahrens als auf dem Parkplatz.

Beispiel 1

Eingang

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

Ausgabe

3

Erläuterung

An 16500, Auto 12345und 75487waren auf dem Parkplatz.

Beispiel 2

Ich habe das gemacht, weil ich festgestellt habe, dass viele Codes darauf fehlgeschlagen sind.

Eingabe (mit der ersten Zeile weggelassen)

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

Ausgabe

2

Erläuterung

An 16500, Auto 12345und 75487waren auf dem Parkplatz.

Bemerkungen

Tatsächlich werden nicht alle drei für die Ausgabe benötigt. Zumindest brauchen Sie nur Platte + Zeit oder In / Out + Zeit für das Ergebnis. Der Algorithmus unterscheidet sich jedoch unter zwei Umständen geringfügig, sodass die Wahl, kürzer zu sein, in einer bestimmten Sprache nicht bekannt ist. Und natürlich können Sie alle drei Zahlen verwenden. Also überlasse ich sie der Herausforderung.

Keyu Gan
quelle
Sind Autokennzeichen immer 5-stellig?
Titus
1
@Titus Ich glaube, Nummern von 10000 bis 99999 sind immer 5-stellig.
Keyu Gan
3
Ich bin heute blind.
Titus
Ich gehe davon aus, dass ein Auto nicht vor dem ersten Verlassen wieder einfahren kann. Es scheint nicht explizit angegeben zu sein.
John Dvorak
@ JanDvorak eh sorry. Nein, ich kann nicht. Das Autokennzeichen weist darauf hin, dass es einzigartig ist, da es in Wirklichkeit nicht möglich ist, dass ein und dasselbe Auto das Los betritt, wenn es sich bereits darin befindet.
Keyu Gan

Antworten:

7

Mathematica, 33 Bytes

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

Ich musste die Problembeschreibung besser lesen, um zu erkennen, dass es einen viel einfacheren Algorithmus gibt, für den keine Kennzeicheninformationen erforderlich sind.

Unbenannte Funktion, die eine Ganzzahl zurückgibt; Das Eingabeformat ist eine Liste der geordneten Tripel im Formular {time, 0|1, license plate}. Wir beginnen mit Sorting, wodurch die Liste chronologisch wird und die Zeitbindungen unterbrochen werden, indem 0s vor 1s sortiert werden . dann 2#2-1&@@@behält die Ankunfts- / Abfahrtsinformation und vergisst den Rest und wandelt auch 0s in -1s um.

Accumulateberechnet die laufenden Summen dieser Liste; Das Ergebnis ist eine Negativliste der Anzahl der Autos auf dem Parkplatz nach jeder Ankunft / Abfahrt. Dann wird Mindas kleinste (negativste) ausgewählt und das negative Vorzeichen entfernt.

Mathematica, 56 Bytes

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

Die ursprüngliche Einreichung (die ersten Kommentare beziehen sich auf diese Einreichung). Unbenannte Funktion, die eine Ganzzahl zurückgibt; Das Eingabeformat ist eine Liste der geordneten Tripel im Formular {time, 0|1, license plate}.

Der Grund, warum wir uns dafür entscheiden, den Zeiteintrag an die erste Stelle und den Ein- / Aus-Eintrag an die zweite Stelle zu setzen, ist, dass Sort@#die Liste chronologisch sortiert wird und Ankünfte vor Abflügen aufgezeichnet werden, wenn sie gleichzeitig sind. Danach wird #3->#2&@@@eine Liste der "Regeln" des Formulars zurückgegeben license plate -> 0|1, die immer noch chronologisch sortiert sind.

Dann FoldList[List,{},...]erstellt eine Liste aller anfänglichen Segmente dieser Liste von Regeln. Eigentlich bringt es diese anfänglichen Segmente durcheinander; Das kerste Segment ist eine Liste mit einer Regel in Tiefe 2, einer Regel in Tiefe 3, ... und einer Regel in Tiefe k+1. ( FoldList[Append,{},...]Ergibt das natürlichere Ergebnis.) <|#|>Verwandelt jedoch jedes dieser anfänglichen Segmente in eine "Assoziation", die zwei wünschenswerte Effekte hat: Erstens wird die soeben erstellte Struktur verschachtelter Listen vollständig geglättet. und zweitens werden spätere Regeln gezwungen, frühere Regeln zu überschreiben. Genau das ist hier erforderlich. Für jedes Auto, das den Parkplatz verlassen hat, ist die Aufzeichnung der anfänglichen Einfahrt jetzt vollständig verschwunden (und dies gilt auch für Autos, die wieder einfahren). .

Alles, was zu tun bleibt, ist, Countwie viele 0s in jeder dieser Assoziationen vorhanden sind, und nehmen Sie die Max.

Greg Martin
quelle
1
Wird dies immer das Richtige tun, wenn Autos gleichzeitig kommen und gehen?
Christian Sievers
Ihre Antwort ist möglicherweise falsch. Das Maximum muss nicht unbedingt erreicht sein, wenn ein Auto erneut einfährt, sodass das Löschen von Einträgen mithilfe der Zuordnung nicht sicher ist. Siehe dieses Bild: i.imgur.com/D5xUl3z.png Offensichtlich gibt es 3 Autos bei 16500.
Keyu Gan
@KeyuGan: Ich habe nicht behauptet, dass das Maximum passiert, wenn ein Auto wieder einfährt. Beachten Sie, dass meine Lösung die Anzahl der Autos auf dem Parkplatz zum Zeitpunkt jeder einzelnen Einfahrt / Ausfahrt zählt und das Maximum von diesen nimmt.
Greg Martin
1
Vielleicht könnten Sie das Beispiel 2 ausprobieren.
Keyu Gan
1
Persönlich stimme ich Ihnen zu. :) Was ich getan habe, ist die Definition aus dem ursprünglichen Problem zu kopieren. Der Hauptunterschied besteht darin, dass beim Original die Autoschilder anhand der Bilder erkannt und als Endergebnis gedruckt werden müssen.
Keyu Gan
5

Haskell, 76 63 61 Bytes

2 Bytes, die durch eine Variation von @ nimis Vorschlag gespeichert wurden.

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

Erwartet das Argument als eine Liste von Tripeln in der durch die Problemstellung angegebenen Reihenfolge.

Für jede mögliche Zeit (und einige mehr) suchen wir zuerst nach kommenden und dann nach abreisenden Autoereignissen und wandeln sie in eine Liste mit positiven oder negativen Ereignissen um. Wir nehmen die Teilsummen dieser Liste und dann das Maximum dieser Teilsummen.

Christian Sievers
quelle
Lass das fallen importund benutze [(-1)^c|i<-[1..86400],(_,b,c)<-l,i==b].
nimi
Ich brauche die ankommenden Autos vor den abgehenden, daher ist es etwas komplizierter, aber ich könnte mit Ihrer Idee immer noch 2 Bytes einsparen. Vielen Dank!
Christian Sievers
2

PHP 7.1, 126 117 Bytes

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;

Nimmt Eingaben aus der Datei iund ignoriert die erste Zeile. Laufen Sie mit -r.
Erfordert eine nachgestellte Zeile in der Eingabe. Ersetzen Sie -2durch -3für Windows.

Nervenzusammenbruch

# 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
Titus
quelle
Entschuldigung, Sie können ein Array von Tripeln als Eingabe verwenden, wenn Sie eine Funktion schreiben. Meine Freunde und ich sind der Meinung, dass es eine gute Möglichkeit ist, die Wettbewerbsfähigkeit von nicht-golfender Sprache zu steigern, wenn wir über ein Problem ohne komplizierten Input sprechen.
Keyu Gan
@KeyuGan: Danke für den Hinweis; aber mit einem Array als Eingabe würde ich eine Funktion brauchen, und das würde zwei Bytes kosten, sowohl mit einem Array von Triplets als auch mit einem Triplet von Arrays. Funktionen, Array-Mapping und benutzerdefiniertes Sortieren sind in PHP sehr umfangreich. Die einzige Möglichkeit, etwas zu speichern, wäre meine $dals Eingabe vorbereitete oder sortierte Eingabe (nach Zeit und Ein- / Ausgang). Und das würde der Herausforderung zu viel abnehmen. Eine ausgerichtete Eingabe ttttt i platewürde 17 Bytes und 19 weitere Bytes einsparen, wobei die Anzahl mit der Plattennummer übereinstimmt.
Titus
2

C 147 Bytes

Ein komplettes Programm, liest Eingaben aus 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);}

Probiere es auf ideone aus .

owacoder
quelle
Ich glaube, es ist sicher, Leerzeichen zwischen zu entfernen%d
Keyu Gan
Hoppla, danke. Ich scanfnehme an, ich benutze nicht genug.
Owacoder
Ich liebe cin. LOL
Keyu Gan
118 Bytes
Ceilingcat
2

Oktave, 50 , 64, 38 Bytes

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

Gleich wie bei @Greg Martin Mathematica-Antwort von

Die Funktion erhält ein Array mit 3 Spalten [time, i/o,plateN]

vorherige Antwort:

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

Die Funktion erhält nur zwei Eingänge t: time und O: I / O von den ersten beiden Elementen eines Zellenarrays A, das dreifache Eingänge enthält!

Eine dünne Matrix, die erstellt wird, um für jede aufgezeichnete Zeitanzahl vorhandener Autos zu zählen. Die Zeit von out + 1 wird für die Ausfahrt des Autos berücksichtigt und die entsprechende Änderung von 1 zu -1 und von 0 zu 1.
Die sparsame Verwendung ist hier sehr wichtig, da mehrere Autos gleichzeitig ankommen oder abfahren können.
Dann wird die kumulative Summe berechnet, die die Anzahl der aktuellen Autos in dem Los und die maximale Anzahl davon darstellt.

rahnema1
quelle
Ich erinnere mich, dass Octave Zellenarrays unterstützt, was bedeutet, dass Sie nur ein Array von Tripeln als Eingabe verwenden können. Die Einschränkung bezieht sich auf die Ausgabe vor M5 und gibt "eine Reihe von Tripeln" an. Ich habe es in M5
Keyu Gan am
@KeyuGan Ich denke, Ihre neu erfundene Einschränkung ist unnötig erhöht 14 Bytes meines Codes. Sie sind neu auf dieser Website. Es ist daher besser, Fragen mit einer minimalen Anzahl von Einschränkungen zu haben, um mehr Mitwirkende anzulocken.
rahnema1
2

JavaScript (ES6), 63 73 71 Bytes

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

Dies akzeptiert Eingaben als ein Array von Einträgen, die bestellt wurden [time, inout, plate]. Leider ist aufgrund der Tatsache , dass identischen inout mal bedeutet , dass beiden Autos auf dem Parkplatz im Moment in der Zeit betrachtet werden, muss der Sortieralgorithmus bestellt 0vor1 , die 11 Bytes kalkulierten.

Credits

  • Ich habe 1 Byte gespart, indem ich die Verschiebung und Multiplikation innerhalb der Kartenfunktion komplett verschoben habe (danke Neil).
  • Ich habe weitere zwei Bytes gespart, indem ich ein destrukturiertes Argument in der Sortierfunktion verwendet habe (danke edc65).

Demo

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

Patrick Roberts
quelle
Es sieht so aus, als würde Ihr Code nicht gut funktionieren. d=[[16400,75487,0],[16500,75487,1],[16500,99999,0],[16600,99999,1]];Ich habe angenommen, er sollte 2 ausgeben.
Keyu Gan
Naja im 4-Einsteiger-Testfall gibt es nur 2 Autos. Ich habe es formatiert, um Ihre Eingabereihenfolge zu erfüllen.
Keyu Gan
@KeyuGan Entschuldigung für das Missverständnis, ich wusste nicht, dass Sie sich auf das zweite Beispiel beziehen. Es ist jetzt behoben.
Patrick Roberts
Ich weiß, dass Ihr Algorithmus nicht von der Plattennummer abhängt. Allerdings schlage ich vor, es sollte in der Definition der Eingabereihenfolge enthalten sein, lassen Sie es einfach bis zum letzten;)
Keyu Gan
1
@ edc65 eigentlich nur 2 Bytes, nicht 4. Dies ist auch 71 Bytes: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), 8368 70 Bytes

EDIT: behoben, um das 2. Beispiel zu unterstützen

Übernimmt die Eingabe als Array von [in_out, time, plate]Arrays. Die plateSpalte wird jedoch ignoriert.

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

Prüfung

Arnauld
quelle
Die in_outLesespalte anstelle der plateSpalte sollten Sie sechs Bytes speichern: v=>n+=1-v[2]*2.
Neil
Dies ist für das zweite Beispiel falsch. Wenn Sie dies also erneut bearbeiten, müssen Sie dies berücksichtigen. (Da die letzte Änderung vor dem Hinzufügen des zweiten Beispiels vorgenommen wurde, ist es technisch gesehen von der Einhaltung ausgenommen, und ich bin überhaupt nicht eifersüchtig!)
Patrick Roberts
@PatrickRoberts Will versuchen, das zu beheben, wenn ich wieder vor einem Computer bin ^^
Arnauld
@Neil Guter Fang! Ich musste es trotzdem umschreiben, um das 2. Beispiel zu unterstützen, aber am Ende bin ich deinem Rat gefolgt.
Arnauld