Introdução
Você é supervisor de um estacionamento e seu gerente está se preparando para reduzir o tamanho ao extremo.
É uma versão simplificada e adaptada de um problema no nível superior do PAT do ano passado .
Desafio
Você é solicitado a calcular quantos carros existem no lote ao mesmo tempo, no máximo .
Aplicam-se regras padrão. E este é um código-golfe, para que o código mais curto ganhe.
A primeira linha é a quantidade de entradas (não mais do que 100,000
, sua entrada pode não conter essa linha, se você preferir, pois é apenas improvisado determinar onde a entrada termina ). O texto a seguir contém uma entrada por linha. E cada entrada inclui três números:
<Car plate number> <Time (seconds) since open> <0(In) | 1(Out)>
Modificação 2: Não há problema em usar uma matriz de triplos como entrada.
Modificação 3: você pode alterar a ordem dos números em uma entrada. E você pode escolher qual usar. (consulte a seção Observações)
A entrada é garantida como válida, assumindo que:
Car plate number
é um número inteiro no intervalo de10000
~99999
Time
é um número inteiro no intervalo de0
~86400
E
- As inscrições não são necessariamente ordenadas cronologicamente.
- Não há carro antes do primeiro segundo.
- Não há necessariamente carro após o último segundo.
- Um carro não sairia antes de entrar.
Car plate number
é único. (mas um mesmo carro pode visitar mais de uma vez)- Portanto, é impossível um carro entrar no estacionamento quando já está nele.
- Um mesmo carro não entra e sai ao mesmo tempo
time
. - Um carro é considerado no estacionamento no momento da entrada / saída.
Exemplo 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
Resultado
3
Explicação
No 16500
carro, 12345
e 75487
estávamos no estacionamento.
Exemplo 2
Eu fiz isso porque achei que muitos códigos falharam nele.
Entrada (com a primeira linha deixada de fora)
12345 16400 0
12345 16500 1
75487 16500 0
75487 16600 1
Resultado
2
Explicação
No 16500
carro, 12345
e 75487
estávamos no estacionamento.
Observações
Na verdade, nem todos os três são necessários para a saída. Pelo menos, você só precisa de placa + hora ou entrada / saída + hora para o resultado. Mas o algoritmo é ligeiramente diferente em duas circunstâncias, portanto a escolha de ser mais curta permanece desconhecida em um determinado idioma. E é claro que você pode usar todos os três números. Então eu os deixo no desafio.
Respostas:
Mathematica, 33 bytes
Eu tive que ler melhor a declaração do problema para perceber que existe um algoritmo muito mais simples que não requer as informações da placa.
Função sem nome retornando um número inteiro; o formato de entrada é uma lista de triplos ordenados no formulário
{time, 0|1, license plate}
. Começamos porSort
ing, que torna a lista cronológica e também quebra os intervalos de tempo, classificando0
s antes de1
s; depois2#2-1&@@@
mantém as informações de chegada / partida e esquece o resto, além de converter0
s em-1
s.Accumulate
calcula os totais em execução dessa lista; o resultado é uma lista dos negativos do número de carros no estacionamento após cada chegada / partida. Em seguida,Min
escolhe o menor (mais negativo) deles e o sinal negativo é removido.Mathematica, 56 bytes
A submissão original (os primeiros vários comentários se referem a essa submissão). Função sem nome retornando um número inteiro; o formato de entrada é uma lista de triplos ordenados no formato
{time, 0|1, license plate}
.O motivo pelo qual escolhemos colocar a entrada de tempo em primeiro lugar e a entrada / saída em segundo é para que
Sort@#
classifique a lista cronologicamente e registre as chegadas antes das partidas, se forem simultâneas. Depois disso,#3->#2&@@@
retorna uma lista de "regras" do formuláriolicense plate -> 0|1
, ainda classificadas cronologicamente.Em seguida,
FoldList[List,{},...]
cria uma lista de todos os segmentos iniciais dessa lista de regras. Na verdade, ele realmente atrapalha esses segmentos iniciais; ok
th segmento inicial acaba sendo uma lista com uma regra na profundidade 2, uma regra na profundidade 3, ... e uma regra na profundidadek
+1. (FoldList[Append,{},...]
produziria o resultado mais natural.) No entanto,<|#|>
transforma cada um desses segmentos iniciais em uma "associação", que tem dois efeitos desejáveis: primeiro, aplana completamente a estrutura de lista aninhada que acabamos de criar; e segundo, força as regras posteriores a anular as regras anteriores, que é exatamente o que precisamos aqui - para qualquer carro que saiu do estacionamento, o registro de sua entrada inicial agora está completamente esgotado (e da mesma forma para carros que entram novamente) .Então, tudo o que resta a fazer é
Count
quantos0
s existem em cada uma dessas associações e pegar oMax
.fonte
Haskell,
76 6361 bytes2 bytes salvos por uma variação da sugestão de @ nimi.
Espera o argumento como uma lista de triplos na ordem dada pela declaração do problema.
Para cada tempo possível (e mais alguns), procuramos primeiro a vinda e depois a saída dos eventos do carro e os transformamos em uma lista dos mais ou menos. Tomamos as somas parciais desta lista e depois o máximo dessas somas parciais.
fonte
import
e use[(-1)^c|i<-[1..86400],(_,b,c)<-l,i==b]
.PHP 7.1,
126117 bytesrecebe entrada do arquivo
i
, ignora a primeira linha. Corra com-r
.Requer uma nova linha à direita na entrada. Substitua
-2
por-3
para Windows.demolir
fonte
$d
como entrada ou entrada classificada (por hora e entrada / saída). E isso exigiria muito do desafio. A entrada alinhadattttt i plate
economizaria 17 bytes, mais 19 com a contagem alinhada com o número da placa.C, 147 bytes
Um programa completo, lê as entradas de
stdin
.Experimente em ideone .
fonte
%d
scanf
suficiente, eu acho.cin
. LOLOitava,
50,6438 bytesIgual à resposta do Mathematica de @Greg Martin
A função obtém uma matriz com 3 colunas
[time, i/o,plateN]
resposta anterior:
A função recebe apenas duas entradas
t
: time eO
: I / O dos dois primeiros elementos de uma matriz de célulasA
que contém entradas triplas!Uma matriz esparsa criada para contar para cada número de tempo registrado de carros existentes. Para isso, o tempo de saída + 1 é considerado para a saída do carro e 1 alteração correspondente a -1 e 0 alterado para 1. O
uso de escassos aqui é muito importante, pois vários carros podem chegar ou sair ao mesmo tempo.
A soma acumulada calculada representa o número de carros atuais no lote e o máximo é encontrado.
fonte
JavaScript (ES6),
637371 bytesIsso aceita entrada como uma matriz de entradas solicitadas
[time, inout, plate]
. Infelizmente, devido ao fato de que tempos de inout idênticos significam que os dois carros são considerados no lote no momento, o algoritmo de classificação deve solicitar0
antes1
, o que custou 11 bytes.Créditos
Demo
fonte
d=[[16400,75487,0],[16500,75487,1],[16500,99999,0],[16600,99999,1]];
eu deveria 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 bytesEDIT: corrigido para suportar o segundo exemplo
Recebe a entrada como uma matriz de
[in_out, time, plate]
matrizes. Mas aplate
coluna é realmente ignorada.Teste
Mostrar snippet de código
fonte
in_out
coluna em vez daplate
coluna deve poupar seis bytes:v=>n+=1-v[2]*2
.