В ассоциативном футболе (также известном как футбол) пенальти является второй мерой тай-брейка, которая может использоваться в матче, который не может закончиться вничью после дополнительного времени (т. Е. Сверхурочного футбольного матча).
В серии пенальти главный судья бросает монетку, чтобы определить, с какой целью произошла перестрелка, а затем бросает еще одну монету, чтобы определить, какая команда стартует первой. Однако единственное, что имеет отношение к этой проблеме, - это то, что происходит потом, описано ниже.
Каждая команда имеет 5 штрафных очков, доступных на старте, и штрафной балл 0-0. Если в какой-то момент оставшихся штрафов команды недостаточно для смены победившей в настоящее время команды, перестрелка прекращается.
Если оставшихся штрафных очков нет, но очки обеих команд равны, обе команды получают дополнительный штраф. Это повторяется до тех пор, пока очки не будут равны.
После остановки перестрелки команда с наибольшим штрафным счетом побеждает в игре.
Вызов
Ваша задача состоит в том, чтобы, учитывая два списка A
и B
определить, какие штрафные очки команда А и В забили соответственно, определить, представляют ли они действительный пенальти. Перестрелка действительна, если может быть достигнуто состояние, представленное входом, независимо от того, может ли быть определена команда-победитель. Обратите внимание, что вам, возможно, придется тестировать оба сценария (запуск команды A, запуск команды B), поскольку, если состояние, описанное во входных данных, достижимо хотя бы для одного сценария, входные данные действительны. Если длина списков различна, команда, представленная более длинным, начинается первой (у нее может быть только один элемент больше, чем у другого, и команда более короткого списка не может стартовать, так как тогда команда более длинного списка будет снимать два штрафа). подряд, так как более короткий список будет преждевременно исчерпан).
Подробные примеры
Вы можете перейти к разделу « Правила » ниже, это только для решения проблемы.
Предположим, вы получили этот перестрелку в качестве входных данных, где -
означает, что ни один гол не был забит и X
означает, что гол был забит (это недействительно):
Team A: - X X X X
Team B: - - - - X
Assuming team A starts first:
Team A: - (0 - 0) (max possible score 4 - 5)
Team B: - (0 - 0) (max possible score 4 - 4)
Team A: X (1 - 0) (max possible score 4 - 4)
Team B: - (1 - 0) (max possible score 4 - 3)
Team A: X (2 - 0) (max possible score 4 - 3)
Team B: - (2 - 0) (max possible score 4 - 2)
Team A: X (3 - 0) (max possible score 4 - 2)
Team A already has a higher score than B could ever have, but the input hasn't
ended yet, so it's invalid if team A is first.
Assuming team B starts first:
Team B: - (0 - 0) (max possible score 5 - 4)
Team A: - (0 - 0) (max possible score 4 - 4)
Team B: - (0 - 0) (max possible score 4 - 3)
Team A: X (1 - 0) (max possible score 4 - 3)
Team B: - (1 - 0) (max possible score 4 - 2)
Team A: X (2 - 0) (max possible score 4 - 2)
Team B: - (2 - 0) (max possible score 4 - 1)
Team A already has a higher score than B could ever have, but the input hasn't
ended yet, so it's invalid if team B stars first.
The input is invalid no matter which team starts first, so it's considered
invalid.
Напротив, вот правильный пример:
Team A: X X X
Team B: - - -
Assuming team A starts first:
Team A: X (1 - 0) (max possible score 5 - 5)
Team B: - (1 - 0) (max possible score 5 - 4)
Team A: X (2 - 0) (max possible score 5 - 4)
Team B: - (2 - 0) (max possible score 5 - 3)
Team A: X (3 - 0) (max possible score 5 - 3)
Team B: - (3 - 0) (max possible score 5 - 2)
It can be determined that team A wins, however the input has ended, so it's
valid if team A starts first. Therefore, the input is valid.
Другой пример, на этот раз с дополнительными штрафами:
Team A: X - X - - - X -
Team B: - X X - - - X X
Assuming team A starts first:
Team A: X (1 - 0) (max possible score 5 - 5)
Team B: - (1 - 0) (max possible score 5 - 4)
Team A: - (1 - 0) (max possible score 4 - 4)
Team B: X (1 - 1) (max possible score 4 - 4)
Team A: X (2 - 1) (max possible score 4 - 4)
Team B: X (2 - 2) (max possible score 4 - 4)
Team A: - (2 - 2) (max possible score 3 - 4)
Team B: - (2 - 2) (max possible score 3 - 3)
Team A: - (2 - 2) (max possible score 2 - 3)
Team B: - (2 - 2) (max possible score 2 - 2)
First 5 penalties result in a tie, so we move on to extra penalties.
Team A: -, Team B: - (2 - 2)
Team A: X, Team B: X (3 - 3)
Team A: -, Team B: X (3 - 4)
It can be determined that team B wins, however the input has ended, so it's
valid if team A starts first. Therefore, the input is valid.
Вот правильный вход, где еще рано определять победителя:
Team A: X X - -
Team B: - X - X
Assuming team A starts first:
Team A: X (1 - 0) (max possible score 5 - 5)
Team B: - (1 - 0) (max possible score 5 - 4)
Team A: X (2 - 0) (max possible score 5 - 4)
Team B: X (2 - 1) (max possible score 5 - 4)
Team A: - (2 - 1) (max possible score 4 - 4)
Team B: - (2 - 1) (max possible score 4 - 3)
Team A: - (2 - 1) (max possible score 3 - 3)
Team B: X (2 - 2) (max possible score 3 - 3)
The input has ended before the winner can be determined, so it's valid if team A
starts first. Therefore, the input is valid.
Наконец, вот вход, где длины списков отличаются:
Team A: - - -
Team B: X X - X
Since team B shot more penalties, it starts first:
Team B: X (0 - 1) (max possible score 5 - 5)
Team A: - (0 - 1) (max possible score 4 - 5)
Team B: X (0 - 2) (max possible score 4 - 5)
Team A: - (0 - 2) (max possible score 3 - 5)
Team B: - (0 - 2) (max possible score 3 - 4)
Team A: - (0 - 2) (max possible score 2 - 4)
Team B: X (0 - 3) (max possible score 2 - 4)
It can be determined that team B wins, however the input has ended, so it's
valid.
правила
- Команда, которая стреляет первой, может быть либо А, либо Б, вы не можете предполагать, что она всегда будет стрелять первой.
- Списки либо будут иметь одинаковую длину, либо их длины будут отличаться на один.
- Вы можете выбрать любые два отличных и непротиворечивых значения для представления штрафов / невыигранных штрафов.
- Списки также могут быть представлены в виде целых чисел, преобразованных из биективной базы 2, строк или родного формата списка вашего языка. Если выбран формат биективного основания 2, правила ввода применяются к числам, преобразованным в биективное основание 2 (таким образом, цифры
1
и2
могут означать как забитые и не оцененные, так и не оцененные и оцененные соответственно). Обычный двоичный код не допускается , так как невозможно определить наличие лидирующих нулей в предполагаемом двоичном представлении. - Это код-гольф , поэтому выигрывает самое короткое решение. Тем не менее, не отчаивайтесь от ответа, даже если кажется, что ваш язык не может "превзойти специализированные".
Контрольные примеры
В этих тестовых случаях 0
будет представлять не цель, а 1
будет представлять цель.
Формат:
[Team A], [Team B]
Допустимые входные данные:
[], []
[0], [0]
[0], [1]
[1], [1]
[0], []
[1, 1, 1, 1], [0, 0, 1, 1]
[0, 1, 1, 1, 1], [0, 1, 1, 0]
[0, 0, 0, 0, 1], [0, 0, 0, 1, 0]
[0, 0, 0, 0, 1], [0, 0, 0, 1]
[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1]
[0, 1, 1, 1, 1], [0, 1, 1, 0, 1]
[1, 1, 1], [0, 0, 0]
[1, 1, 1, 1], [0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Неверные данные:
[0, 1, 1, 1, 1], [0, 1, 1, 0, 0]
[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1]
[1, 1, 1, 0], [0, 0, 0]
[1, 1, 1, 1], [0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
[1, 0, 1, 0, 1], [0, 1, 0, 1, 0, 1]
[0, 0, 0, 0, 1], [0, 1, 1, 1, 0]
источник
[[0,0],[1,1]]
(или любой тестовый случай, когда один из двух внутренних списков имеет 2 элемента) правдив, поскольку игра все еще продолжается (точно так же, как тестовые случаи с[[0],[1]]
или[[0],[]]
все еще находятся в процессе)?Ответы:
JavaScript (ES6),
117 112109 байт(a)(b)
Попробуйте онлайн!
комментарии
источник
Python 2 ,
176169171169 байт-2 байта благодаря @Kevin Cruijssen
Попробуйте онлайн! (Включая некоторые дополнительные контрольные примеры, не перечисленные выше.)
Создает функцию,
f
которая принимает два аргумента (два списка штрафных / невыбранных штрафов) и возвращает,True
если оценки возможны, и вFalse
противном случае.Частичное объяснение:
Прежде всего,exec
конструкция - это просто способ сэкономить несколько байтов, не повторяя выражениеlen(a+b)
более одного раза. Приведенный выше фрагмент кода эквивалентен следующему:Обновление: новый и улучшенный ответ имеет одинаковое количество байтов сexec
хитростью или без нее, поэтому в интересах простоты я удалил ее.Обновление 2: новая версия с исправленными ошибками включает еще большее сжатие строк с помощью подстановки и
exec
. Да, я использую%
форматирование и a.replace
в одной строке. Код выше эквивалентен:Основная идея этого ответа состоит в том, чтобы сформулировать вопрос в терминах «пол-очков»: каждый удачный удар - это пол-очка, а каждый неудачный - отрицательный. Для набора партитур с длиной< = 5 чтобы быть продолжаемым (
not len(a+b)>10
), общее количество оставленных ударов должно быть больше или равно разнице в пол-очка между двумя командами. Когда одна команда выбила дополнительное время, по разным причинам из поля нужно вычесть пол-очка, так что это можно упростить, целочисленно разделив обе части уравнения на две. Это функцияh
в коде (с аргументом,m
равным 6).Однако, чтобы быть действительным набором баллов, ввод не обязательно должен быть строго продолжаемым, но он должен быть продолжаемым до того, как был сделан последний удар. Это условие равносильно тому, что оно должно: 1) быть продолжаемым в последний раз, когда обе стороны пинали одинаковое количество раз, и 2) в настоящее время находиться в пределах двух полуточек продолжения - вот где
h
вступает последний аргумент :h(a[:~-len(a+b)/2],b[:~-len(a+b)/2],6)
проверяет условие 1) иh(a,b,7)
(7
представляющий дополнительные два допустимых полуточки на полях) проверяет условие 2).Таким образом, дело, в котором каждая команда пинала максимум пять раз, было урегулировано. (Продолжение объяснения для другого случая.)
С точки зрения игры в гольф на низком уровне, я сомневаюсь, что есть слишком много, чтобы побриться, но алгоритмически это, вероятно, можно было бы сделать немного проще.
источник
(%s-1)/2
в гольф,~-%s/2
чтобы сэкономить 2 байта.Желе ,
625449 байтПопробуйте онлайн!
Обратите внимание, что код нижнего колонтитула в tio предназначен только для обработки нескольких тестовых случаев и вывода результатов на входы.
Спасибо @EriktheOutgolfer за отыгрывание 8 байтов
источник
Perl 6 , 123 байта
Попробуйте онлайн!
Возвращает фальси за действительные перестрелки, правду за недействительные.
объяснение
источник