Вступление
Вы контролируете парковку, и ваш менеджер готовится к сокращению размера до крайности.
Это упрощенная и адаптированная версия проблемы на прошлогоднем ПАТ верхнего уровня.
Вызов
Вас просят подсчитать, сколько автомобилей в партии одновременно, максимум .
Стандартные правила применяются. И это код-гольф, поэтому выигрывает самый короткий код.
Первая строка - количество записей (не более того 100,000
, ваш ввод может не содержать эту строку, если хотите, поскольку это только временное определение, чтобы определить, где заканчивается ввод ). Следующий текст содержит одну запись в каждой строке. И каждая запись включает три числа:
<Car plate number> <Time (seconds) since open> <0(In) | 1(Out)>
Модификация 2. Можно использовать массив троек в качестве входных данных.
Модификация 3: Вы можете изменить порядок номеров в одной записи. И вы можете выбрать, какой использовать. (см. раздел «Замечания»)
Входные данные гарантированно действительны при условии, что:
Car plate number
целое число в диапазоне10000
~99999
Time
целое число в диапазоне0
~86400
И
- Записи не обязательно в хронологическом порядке.
- До первой секунды машины нет.
- Там не обязательно нет машины после последней секунды.
- Автомобиль не уйдет до того, как сядет.
Car plate number
уникален (но один и тот же автомобиль может посещать более одного раза)- Таким образом, автомобиль не может войти в участок, когда он уже в нем.
- Одна и та же машина не будет входить и выходить одновременно
time
. - Автомобиль считается находящимся в партии во время въезда / выезда.
Пример 1
вход
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
Выход
3
объяснение
На 16500
, автомобиль 12345
и 75487
были на стоянке.
Пример 2
Я сделал это, потому что я обнаружил, что на нем много кода.
Ввод (с пропуском первой строки)
12345 16400 0
12345 16500 1
75487 16500 0
75487 16600 1
Выход
2
объяснение
На 16500
, автомобиль 12345
и 75487
были на стоянке.
замечания
На самом деле, не все три необходимы для вывода. По крайней мере, вам нужен только планшет + время или в / из + время для результата. Но алгоритм немного отличается при двух обстоятельствах, поэтому выбор более короткого остается неизвестным на определенном языке. И, конечно, вы можете использовать все три числа. Поэтому я оставляю их в вызове.
Ответы:
Mathematica, 33 байта
Мне пришлось лучше прочитать постановку задачи, чтобы понять, что существует гораздо более простой алгоритм, который не требует информации о номерных знаках.
Безымянная функция, возвращающая целое число; Формат ввода представляет собой список упорядоченных троек в форме
{time, 0|1, license plate}
. Мы начинаем сSort
ing, который делает список хронологическим, а также разрывает временные связи путем сортировки0
s перед1
s; затем2#2-1&@@@
сохраняет информацию о прибытии / отъезде и забывает остальное, а также преобразует0
s в-1
s.Accumulate
вычисляет промежуточные итоги этого списка; Результатом является список отрицательных чисел автомобилей на стоянке после каждого прибытия / отъезда. ЗатемMin
выбирает самый маленький (самый отрицательный) из них и отрицательный знак удаляется.Mathematica, 56 байт
Первоначальное представление (первые несколько комментариев относятся к этому представлению). Безымянная функция, возвращающая целое число; Формат ввода представляет собой список упорядоченных троек в форме
{time, 0|1, license plate}
.Причина, по которой мы решили поставить запись времени первой, а вторую запись входа / выхода, заключается в том,
Sort@#
что список сортируется в хронологическом порядке и регистрируется прибытие перед отправлением, если они выполняются одновременно. После этого#3->#2&@@@
возвращает список «правил» формыlicense plate -> 0|1
, все еще отсортированных в хронологическом порядке.Затем
FoldList[List,{},...]
создает список всех начальных сегментов этого списка правил. На самом деле, это действительно портит эти начальные сегменты; тоk
й начальные концы сегментов до того , чтобы быть список с одним правилом на глубине 2, одно правило , на глубине 3, ..., и одно правило , на глубинеk
+1. (FoldList[Append,{},...]
приведет к более естественному результату.) Однако,<|#|>
превращает каждый из этих начальных сегментов в «ассоциацию», которая имеет два желаемых эффекта: во-первых, она полностью выравнивает структуру вложенного списка, которую мы только что создали; и во-вторых, это заставляет более поздние правила переопределять более ранние правила, что именно здесь нам нужно - для любого автомобиля, покинувшего парковку, запись о его первоначальном въезде теперь полностью исчезает (и аналогично для автомобилей, которые въезжают повторно) ,Так что все, что осталось сделать, это
Count
сколько0
s есть в каждой из этих ассоциаций, и взятьMax
.источник
Haskell,
76 6361 байт2 байта, сохраненные вариацией предложения @ nimi.
Ожидает аргумент в виде списка троек в порядке, заданном оператором задачи.
Для каждого возможного времени (и некоторых других) мы сначала ищем прибывающие, а затем покидающие автомобильные события и превращаем их в список плюсов или минусов. Мы берем частичные суммы этого списка, а затем максимальную сумму этих частичных сумм.
источник
import
и используй[(-1)^c|i<-[1..86400],(_,b,c)<-l,i==b]
.PHP 7.1,
126117 байтпринимает входные данные из файла
i
, игнорирует первую строку. Беги с-r
.Требуется завершающий символ новой строки при вводе. Заменить
-2
на-3
для Windows.сломать
источник
$d
входные данные или отсортированные входные данные (по времени и входу / выходу). И это слишком много от этого вызовет. Выровненный вводttttt i plate
сэкономит 17 байтов, еще 19 с количеством, выровненным по номеру пластины.C, 147 байтов
Полная программа, читает входные данные от
stdin
.Попробуйте это на Ideone .
источник
%d
scanf
достаточно, я думаю.cin
. LOLОктава,
50,6438 байтТо же, что и ответ @Greg Martin's Mathematica
Функция получает массив с 3 столбцами
[time, i/o,plateN]
предыдущий ответ:
Функция получает только два входа
t
: время иO
: ввод / вывод от первых двух элементов массива ячеек,A
который содержит три входа!Создана разреженная матрица для подсчета для каждого записанного количества времени существующих автомобилей. Для этого время выхода + 1 считается для выхода из машины, и соответствующее 1 изменение на -1 и 0 изменяется на 1.
Использование разреженных здесь очень важно, так как несколько автомобилей могут прибыть или уехать одновременно.
Затем вычисляется накопленная сумма, представляющая количество текущих автомобилей в лоте и максимальное из них.
источник
JavaScript (ES6),
637371 байтЭто принимает входные данные как упорядоченный массив записей
[time, inout, plate]
. К сожалению, из-за того, что одинаковое время ожидания означает, что оба автомобиля учитываются в партии в данный момент времени, алгоритм сортировки должен быть выполнен0
до1
, что стоило 11 байтов.кредиты
демонстрация
источник
d=[[16400,75487,0],[16500,75487,1],[16500,99999,0],[16600,99999,1]];
я предполагал, что он должен напечатать 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 байтРЕДАКТИРОВАТЬ: исправлено для поддержки второго примера
Принимает входные данные в виде массива
[in_out, time, plate]
массивов. Ноplate
столбец фактически игнорируется.Тестовое задание
Показать фрагмент кода
источник
in_out
колонку вместоplate
колонки должны сохранить вам шесть байт:v=>n+=1-v[2]*2
.