(Я хотел опубликовать это в то время, когда 1542 год: Конфликт планирования все еще был текущим xkcd, но у меня был конфликт планирования.)
вход
На входе будет список 3n
элементов, которые представляют n
события. Первым элементом в каждой группе из 3 будет название события; второе и третье, время начала и окончания соответственно. Например:
foo 12 34 bar 56 78
представляет событие, foo
которое начинается в «время 12» (времена представлены просто целыми числами; вы можете думать о них как минуты после полуночи) и заканчивается в 34, а второе событие bar
начинается в 56 и заканчивается в 78.
Имена событий всегда будут состоять только из буквенно-цифровых символов, а время всегда будет целым числом ≥ 0 и <1440. Время окончания всегда будет как минимум на 1 больше, чем время начала. Они не гарантированы, чтобы быть отсортированными в любом случае.
Если вы хотите, вы можете принять это как одну строку через пробел; в противном случае его следует принимать как массив, список, вектор или эквивалент вашего языка.
Выход
Вывод должен быть разделенным пробелами списком имен событий. Правила, для которых имена событий выводятся, следующие:
Ни одно из событий, которые вы выводите, не может конфликтовать друг с другом. Например, при вводе
a 0 10 b 5 15
вы не можете выводить и то,a
и другое,b
поскольку время конфликтует (то есть частично перекрывается). Если событие заканчивается точно так же, как начинается другое, вы можете включить оба.Вы не можете выводить событие под названием
NSCC
(«Конкурс конфликтов по национальному календарному плану»), в котором всегда будет одно из входных данных. Вы также должны вывести хотя бы одно событие, которое конфликтует (частично перекрывается)NSCC
(и всегда будет хотя бы одно из них).Вы должны вывести как можно больше событий, следуя приведенным выше двум правилам. (Это так, что вы выглядите настолько занятым, насколько это возможно, так что отсутствие NSCC кажется более вероятным.)
Это также может быть выведено либо в виде отдельной строки через пробел, либо в виде массива, списка, вектора и т. Д.
Может быть более одного возможного выхода.
Контрольные примеры
Обратите внимание, что перечисленные результаты являются только примерами. Ваш код может выводить что-то другое, если он все еще следует трем правилам, указанным выше (в частности, это означает, что количество событий должно быть таким же, как в примере).
In: UnderwaterBasketWeavingConvention 50 800 NSCC 500 550
Out:UnderwaterBasketWeavingConvention
In: SconeEating 0 50 RegexSubbing 45 110 CodeGolfing 95 105 NSCC 100 200
Out:SconeEating CodeGolfing
In: VelociraptorHunting 0 300 NerdSniping 200 500 SEChatting 400 700 DoorknobTurning 650 750 NSCC 725 775
Out:NerdSniping DoorknobTurning
In: NSCC 110 115 A 100 120 B 120 140 C 105 135 D 100 105 E 135 500
Out:C D E
In: A 800 900 NSCC 700 1000 B 650 750 C 950 1050 D 655 660 E 660 665 F 1030 1040 G 1040 1060
Out:A D E F G
In: A 10 11 B 11 12 C 12 13 D 13 14 NSCC 15 1090 E 10 16
Out:E
Не стесняйтесь добавлять больше тестовых случаев в редактирование, если есть пропущенные грани.
правила
Ваш код должен завершиться в течение 30 секунд для всех предоставленных тестовых случаев (это скорее проверка работоспособности, поскольку, вероятно, он должен завершиться гораздо быстрее для всех тестовых случаев вместе) на приемлемой персональной машине.
Это код-гольф , поэтому выигрывает самый короткий код в байтах.
underwaterBasketWeavingConvention 50 800 nscc 550
вместо вашего примера?Ответы:
Pyth, 45 байт
Этот был довольно жестким для гольфа. Нашел довольно много 45-байтовых решений, это, вероятно, самое экзотическое, так как он использует
A
(pair-assign) и.g
(group-by).Попробуйте онлайн: демонстрация или тестовая привязь
объяснение
источник
SWI-Prolog,
537524516502447436 байтовКраткое объяснение того, что делает каждый предикат:
z(A,B)
проверяет, что событие A не конфликтует ни с одним событием из списка событий Bu(A,B)
проверяет, что каждое событие списка A не конфликтует ни с одним событием списка B (используется для проверки отсутствия конфликтов в списке A путем вызоваu(A,A)
)y(A,B,C)
разбивает список на список триплетов (чтобы преобразовать входные данные в список событий)d(A)
печатает названия событий в списке Al(A,R)
оценивает самый длинный список событий R, содержащийся в списке списков Av(A,NSCC,C,R)
возвращает список R, содержащий каждый список событий в A, которые не имеют внутреннего конфликта и которые конфликтуют с событием NSCCs(A,B)
истина, если B является подмножеством Ax(A)
Основной предикат, А является входом.Тестовые случаи : выполнить
test.
в интерпретаторе после загрузки приведенного выше кода с добавлением следующего:Это заняло у меня больше времени, чем я думал. Это, вероятно, может быть значительно больше. Также вы могли бы использовать различные существующие библиотеки программирования для ограничения, чтобы получить более короткие решения.
Редактировать: Спасибо @Oliphaunt за идею использования
A:B:C
вместо[A,B,C]
триплетов. Сохраняет 14 байтов.Edit2: Еще раз спасибо @Oliphaunt за указание на то, что предикат `` t / 3` бесполезен. Экономит 55 байт
Edit3: получил 11 байтов, используя грамматику окончательного предложения на предикаты
y
иd
.источник
A/B/C
вместо[A,B,C]
триплетов, экономя 10 байтов; 2. Можете ли вы использовать\+
вместоnot
? 3. Не могли бы вы объяснить, почему вам нужен окончательный вариантx(A)
?:
вместо того,/
чтобы извлечь выгоду из правой ассоциативности первого, т. Е. Чтобы я мог писатьA:_
как стенографию дляA:_:_
(ноA+B/C
работает так же хорошо: вы можете использоватьA+_
). Кстати, и в вашем оригинале вы могли бы использовать[A|_]
вместо[A,_,_]
. Наконец, обратите внимание, что моей версии SWI-Prolog не былоnth0/4
, поэтому я использовалselect/3
вместо этого.t(S,T)
но потом забыл. Теперь испытываться: вы можете сохранить больше 55 байт, понижая его целиком и прямой вызовs(E,L)
сsetof/3
.JavaScript ( ES6 ), 228
Вторая попытка, я надеюсь, что это работает.
Моя цель - самая длинная последовательность событий, у которой есть конфликт синхронизации, но нет конфликта синхронизации, когда событие NSCC удалено. Эта измененная последовательность с удаленным NSCC является запрошенным выводом.
Я использую поиск в ширину, исследуя очередь возможных решений, начиная с самого длинного (первый - начальный список). Из возможного решения из n событий я строю и ставлю в очередь n дополнительных решений, удаляя одно из событий и оставляя остальные.
Возможное решение является действительным, если есть конфликт синхронизации «как есть», но когда отфильтровано событие NSCC, конфликт отсутствует. Я использую подфункцию K для проверки конфликтов.
Вероятно, может быть в гольф немного больше ...
Выполните тестовый фрагмент кода ниже (будь то EcmaScript 6, только FireFox)
источник
Java, 828 байт
Вероятно, есть более краткая реализация Java, но вот мой удар:
источник
else return
.Python, 373 символа
Создает все возможные комбинации и проверяет каждую.
Тест
Входные данные:
["NSCC",110,115,"A",100,120,"B",120,140,"C",105,135,"D",100,105,"E",135,500]
Выход:
источник