Introducción
Usted es supervisor de un estacionamiento y su gerente se está preparando para reducir el tamaño al extremo.
Es una versión simplificada y adaptada de un problema en el nivel superior PAT del año pasado .
Desafío
Se le pide que calcule cuántos automóviles hay en el lote al mismo tiempo, como máximo .
Aplican reglas estándar. Y este es un código de golf, por lo que gana el código más corto.
La primera línea es la cantidad de entradas (no más de 100,000
, su entrada puede no contener esta línea si lo desea, ya que es solo una improvisación para determinar dónde termina la entrada ). El siguiente texto contiene una entrada por línea. Y cada entrada incluye tres números:
<Car plate number> <Time (seconds) since open> <0(In) | 1(Out)>
Modificación 2: está bien usar una matriz de triples como entrada.
Modificación 3: puede cambiar el orden de los números en una entrada. Y puedes elegir cuál usar. (ver la sección de Comentarios)
Se garantiza que la entrada sea válida, suponiendo que:
Car plate number
es un número entero en el rango de10000
~99999
Time
es un número entero en el rango de0
~86400
Y
- Las entradas no están necesariamente ordenadas cronológicamente.
- No hay coche antes del primer segundo.
- No necesariamente hay automóvil después del último segundo.
- Un automóvil no se iría antes de entrar.
Car plate number
es único. (pero un mismo automóvil puede visitarlo más de una vez)- Por lo tanto, es imposible que un automóvil ingrese al lote cuando ya está en él.
- Un mismo auto no entraba y salía al mismo tiempo
time
. - Se considera que un automóvil está en el lote en el momento de la entrada / salida.
Ejemplo 1
Entrada
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
Salida
3
Explicación
En 16500
, coche 12345
y 75487
estaban en el estacionamiento.
Ejemplo 2
Hice esto porque encontré muchos códigos fallidos en él.
Entrada (con la primera línea omitida)
12345 16400 0
12345 16500 1
75487 16500 0
75487 16600 1
Salida
2
Explicación
En 16500
, coche 12345
y 75487
estaban en el estacionamiento.
Observaciones
En realidad, no se requieren los tres para la salida. Al menos, solo necesita placa + tiempo o entrada / salida + tiempo para el resultado. Pero el algoritmo es ligeramente diferente en dos circunstancias, por lo que la elección de ser más corto permanece desconocida en un idioma determinado. Y, por supuesto, puedes usar los tres números. Entonces los dejo en el desafío.
Respuestas:
Mathematica, 33 bytes
Tuve que leer la declaración del problema mejor para darme cuenta de que hay un algoritmo mucho más simple que no requiere la información de la placa.
Función sin nombre que devuelve un entero; El formato de entrada es una lista de triples ordenados en el formulario
{time, 0|1, license plate}
. Comenzamos porSort
ing, que hace que la lista sea cronológica y también rompe los lazos de tiempo al ordenar0
s antes que1
s; luego2#2-1&@@@
guarda la información de llegada / salida y olvida el resto, y también convierte0
s en-1
s.Accumulate
calcula los totales acumulados de esa lista; El resultado es una lista de los aspectos negativos de la cantidad de automóviles en el estacionamiento después de cada llegada / salida. LuegoMin
elige el más pequeño (el más negativo) de estos y el signo negativo se elimina.Mathematica, 56 bytes
La presentación original (los primeros comentarios se refieren a esta presentación). Función sin nombre que devuelve un entero; El formato de entrada es una lista de triples ordenados en el formulario
{time, 0|1, license plate}
.La razón por la que elegimos poner la entrada de tiempo primero y la entrada de entrada / salida en segundo lugar es para
Sort@#
ordenar la lista cronológicamente y registrar las llegadas antes de las salidas si son simultáneas. Después de eso,#3->#2&@@@
devuelve una lista de "reglas" del formulariolicense plate -> 0|1
, aún ordenadas cronológicamente.Luego,
FoldList[List,{},...]
crea una lista de todos los segmentos iniciales de esa lista de reglas. En realidad, realmente arruina esos segmentos iniciales; elk
segmento inicial termina siendo una lista con una regla en profundidad 2, una regla en profundidad 3, ... y una regla en profundidadk
+1. (FoldList[Append,{},...]
produciría el resultado más natural). Sin embargo,<|#|>
convierte cada uno de estos segmentos iniciales en una "asociación", que tiene dos efectos deseables: primero, aplana completamente la estructura de la lista anidada que acabamos de crear; y en segundo lugar, obliga a las reglas posteriores a anular las reglas anteriores, que es exactamente lo que necesitamos aquí: para cualquier automóvil que haya abandonado el estacionamiento, el registro de su entrada inicial ya no existe (y de manera similar para los automóviles que vuelven a entrar) .Entonces, todo lo que queda por hacer es
Count
cuántos0
s hay en cada una de estas asociaciones, y tomar elMax
.fuente
Haskell,
76 6361 bytes2 bytes guardados por una variación de la sugerencia de @ nimi.
Espera el argumento como una lista de triples en el orden dado por el enunciado del problema.
Para cada tiempo posible (y algo más), buscamos primero los eventos que vienen y luego los que salen del automóvil y los convertimos en una lista de más o menos eventos. Tomamos las sumas parciales de esta lista y luego el máximo de estas sumas parciales.
fuente
import
y usa[(-1)^c|i<-[1..86400],(_,b,c)<-l,i==b]
.PHP 7.1,
126117bytestoma la entrada del archivo
i
, ignora la primera línea. Corre con-r
.Requiere una nueva línea final en la entrada. Reemplazar
-2
con-3
para Windows.Descompostura
fuente
$d
como entrada o entrada ordenada (por tiempo y entrada / salida). Y eso tomaría demasiado del desafío. La entrada alineadattttt i plate
ahorraría 17 bytes, 19 más con el recuento alineado con el número de placa.C, 147 bytes
Un programa completo, lee la entrada de
stdin
.Pruébalo con ideone .
fuente
%d
scanf
suficiente, supongo.cin
. LOLOctava,
50,6438 bytesIgual que la respuesta de Mathematica de @Greg Martin
La función obtiene una matriz con 3 columnas.
[time, i/o,plateN]
respuesta anterior:
¡La función solo obtiene dos entradas
t
: tiempo yO
: E / S del primer elemento de una matriz de celdasA
que contiene entradas triples!Una matriz dispersa creada para contar para cada número de tiempo registrado de automóviles existentes. Para ello, se considera el tiempo de salida + 1 para la salida del automóvil y el cambio correspondiente de 1 a -1 y 0 cambiado a 1. El
uso de disperso aquí es muy importante ya que varios automóviles pueden llegar o salir al mismo tiempo.
Luego se calcula la suma acumulada que representa el número de automóviles actuales en el lote y el máximo de este.
fuente
JavaScript (ES6),
637371 bytesEsto acepta entradas como un conjunto de entradas ordenadas
[time, inout, plate]
. Desafortunadamente, debido al hecho de que tiempos de salida idénticos significa que ambos autos se consideran en el lote en el momento, el algoritmo de clasificación debe ordenar0
antes1
, lo que costó 11 bytes.Créditos
Manifestación
fuente
d=[[16400,75487,0],[16500,75487,1],[16500,99999,0],[16600,99999,1]];
. Supuse que debería imprimir 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 bytesEDITAR: corregido para admitir el segundo ejemplo
Toma datos como una matriz de
[in_out, time, plate]
matrices. Pero laplate
columna es realmente ignorada.Prueba
Mostrar fragmento de código
fuente
in_out
columna en lugar de laplate
columna que debe salvar a seis bytes:v=>n+=1-v[2]*2
.