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 number
ist eine ganze Zahl im Bereich von10000
~99999
Time
ist eine ganze Zahl im Bereich von0
~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 number
ist 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 12345
und 75487
waren 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 12345
und 75487
waren 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.
Antworten:
Mathematica, 33 Bytes
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 mitSort
ing, wodurch die Liste chronologisch wird und die Zeitbindungen unterbrochen werden, indem0
s vor1
s sortiert werden . dann2#2-1&@@@
behält die Ankunfts- / Abfahrtsinformation und vergisst den Rest und wandelt auch0
s in-1
s um.Accumulate
berechnet die laufenden Summen dieser Liste; Das Ergebnis ist eine Negativliste der Anzahl der Autos auf dem Parkplatz nach jeder Ankunft / Abfahrt. Dann wirdMin
das kleinste (negativste) ausgewählt und das negative Vorzeichen entfernt.Mathematica, 56 Bytes
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ückgegebenlicense 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; Dask
erste Segment ist eine Liste mit einer Regel in Tiefe 2, einer Regel in Tiefe 3, ... und einer Regel in Tiefek
+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,
Count
wie viele0
s in jeder dieser Assoziationen vorhanden sind, und nehmen Sie dieMax
.quelle
Haskell,
76 6361 Bytes2 Bytes, die durch eine Variation von @ nimis Vorschlag gespeichert wurden.
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.
quelle
import
und benutze[(-1)^c|i<-[1..86400],(_,b,c)<-l,i==b]
.PHP 7.1,
126117 BytesNimmt Eingaben aus der Datei
i
und ignoriert die erste Zeile. Laufen Sie mit-r
.Erfordert eine nachgestellte Zeile in der Eingabe. Ersetzen Sie
-2
durch-3
für Windows.Nervenzusammenbruch
quelle
$d
als Eingabe vorbereitete oder sortierte Eingabe (nach Zeit und Ein- / Ausgang). Und das würde der Herausforderung zu viel abnehmen. Eine ausgerichtete Eingabettttt i plate
würde 17 Bytes und 19 weitere Bytes einsparen, wobei die Anzahl mit der Plattennummer übereinstimmt.C 147 Bytes
Ein komplettes Programm, liest Eingaben aus
stdin
.Probiere es auf ideone aus .
quelle
%d
scanf
nehme an, ich benutze nicht genug.cin
. LOLOktave,
50,64,38 BytesGleich wie bei @Greg Martin Mathematica-Antwort von
Die Funktion erhält ein Array mit 3 Spalten
[time, i/o,plateN]
vorherige Antwort:
Die Funktion erhält nur zwei Eingänge
t
: time undO
: I / O von den ersten beiden Elementen eines ZellenarraysA
, 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.
quelle
JavaScript (ES6),
637371 BytesDies 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 bestellt0
vor1
, die 11 Bytes kalkulierten.Credits
Demo
quelle
d=[[16400,75487,0],[16500,75487,1],[16500,99999,0],[16600,99999,1]];
Ich habe angenommen, er sollte 2 ausgeben.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 BytesEDIT: behoben, um das 2. Beispiel zu unterstützen
Übernimmt die Eingabe als Array von
[in_out, time, plate]
Arrays. Dieplate
Spalte wird jedoch ignoriert.Prüfung
Code-Snippet anzeigen
quelle
in_out
Lesespalte anstelle derplate
Spalte sollten Sie sechs Bytes speichern:v=>n+=1-v[2]*2
.