No futebol de associação (também conhecido como futebol), uma disputa de pênaltis é a segunda medida de desempate que pode ser usada em uma partida que não pode terminar em um empate, após o prolongamento (por exemplo, horas extras na associação de futebol).
Em uma disputa de pênaltis, o árbitro principal joga uma moeda para determinar em qual gol o tiroteio acontece e, em seguida, joga outra moeda para determinar qual time começa primeiro. No entanto, a única coisa relevante para esse desafio é o que acontece então, descrito abaixo.
Cada equipe tem 5 pênaltis disponíveis no início e o placar da penalidade é 0-0. Se, a qualquer momento, as penalidades remanescentes de uma equipe não forem suficientes para alterar a equipe vencedora, o tiroteio será interrompido.
Se não houver penalidades restantes, mas os pontos de ambas as equipes forem iguais, uma penalidade adicional será concedida a ambas as equipes. Isso é repetido até que os pontos não sejam iguais.
Após o desempate, a equipe com a maior pontuação de penalidade vence o jogo.
Desafio
Seu desafio é, dadas duas listas A
e B
representando quais penalidades o time A e o time B marcaram respectivamente, para determinar se eles representam um pênalti válido. Um desempate é válido se o estado representado pela entrada puder ser alcançado, independentemente de a equipe vencedora poder ser determinada. Observe que é possível testar os dois cenários (início do Time A, início do Time B), pois, se o estado descrito na entrada estiver acessível para pelo menos um cenário, a entrada será válida. Se os comprimentos das listas forem diferentes, a equipe representada pela mais longa começa primeiro (só pode ter mais um elemento que o outro e a equipe da lista mais curta não pode começar, pois a equipe da lista mais longa aplicaria duas penalidades seguidas, pois a lista mais curta será esgotada prematuramente).
Exemplos detalhados
Você pode pular para a seção Regras abaixo, apenas para ajudar a solucionar o desafio.
Suponha que você receba essa disputa como entrada, onde -
significa que nenhum gol foi marcado e X
significa que um gol foi marcado (é inválido):
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.
Pelo contrário, aqui está um exemplo válido:
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.
Outro exemplo, desta vez com multas extras:
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.
Aqui está uma entrada válida em que é muito cedo para determinar o vencedor:
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.
Finalmente, aqui está uma entrada em que os comprimentos das listas diferem:
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.
Regras
- O time que atira primeiro pode ser A ou B, não se pode presumir que um sempre atire primeiro.
- As listas terão o mesmo comprimento ou diferirão em um.
- Você pode escolher dois valores distintos e consistentes para representar penalidades marcadas / não marcadas.
- As listas também podem ser representadas como números inteiros convertidos da base bijetiva 2, strings ou formato de lista nativa do seu idioma. Se um formato bijetivo de base 2 for escolhido, as regras de entrada se aplicarão aos números convertidos em bijective base 2 (portanto, dígitos
1
e2
podem significar pontuação e sem pontuação ou sem pontuação e pontuação respectivamente). Binário regular não é permitido , pois não é possível determinar a presença de zeros à esquerda na representação binária pretendida. - Isso é código-golfe , então a solução mais curta vence. No entanto, não desanime de responder, mesmo que pareça que seu idioma não possa "superar os especializados".
Casos de teste
Nesses casos de teste, a 0
representará uma meta sem objetivo e a 1
representará uma meta.
Formato:
[Team A], [Team B]
Entradas válidas:
[], []
[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]
Entradas inválidas:
[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]
fonte
[[0,0],[1,1]]
(ou qualquer caso de teste em que uma das duas listas internas tenha 2 itens) seja verdade, pois o jogo ainda está em andamento (assim como os casos de teste com[[0],[1]]
ou[[0],[]]
ainda estão em andamento)?Respostas:
JavaScript (ES6),
117 112109 bytes(a)(b)
Experimente online!
Comentado
fonte
Python 2 ,
176169171169 bytes-2 bytes graças a @Kevin Cruijssen
Experimente online! (Incluindo alguns casos de teste extras não listados acima.)
Cria uma função
f
que recebe dois argumentos (as duas listas de penalidades pontuadas / não pontuadas) e retornaTrue
se as pontuações são possivelmente válidas ouFalse
não.Explicação parcial:
Primeiro, aexec
construção é apenas uma maneira de salvar alguns bytes, não sendo necessário repetir a expressãolen(a+b)
mais de uma vez. O trecho de código acima é equivalente ao seguinte:Atualização: a resposta nova e aprimorada é a mesma contagem de bytes com ou semexec
truques, portanto, por uma questão de simplicidade, eu a removi.Atualização 2: A nova versão corrigida por bug inclui ainda mais compactação de strings via substituição e
exec
. Sim, eu uso%
formatação e a.replace
na mesma string. O código acima é equivalente a:not len(a+b)>10
h
m
No entanto, para ser um conjunto válido de pontuações, uma entrada não precisa ser estritamente continuável, mas deve ter sido continuável antes do último chute a ser feito. Essa condição equivale a dizer que deve 1) ter sido continuável na última vez em que os dois lados chutaram o mesmo número de vezes e 2) estar atualmente dentro de dois meios pontos de continuidade - e é aí que
h
entra o argumento final :h(a[:~-len(a+b)/2],b[:~-len(a+b)/2],6)
testa a condição 1) eh(a,b,7)
(o que7
representa dois pontos extras permitidos na margem) testa a condição 2).O caso em que cada equipe chutou no máximo cinco vezes foi resolvido. (Explicação a ser continuada no outro caso.)
Em termos de golfe de baixo nível, duvido que exista muita coisa para se barbear, mas algoritmicamente isso provavelmente poderia ser feito de maneira um pouco mais simples.
fonte
(%s-1)/2
para~-%s/2
salvar 2 bytes.Geléia ,
625449 bytesExperimente online!
Observe que o código do rodapé é apenas para lidar com vários casos de teste e imprimir saídas nas entradas.
Graças a @EriktheOutgolfer por jogar fora 8 bytes
fonte
Perl 6 , 123 bytes
Experimente online!
Retorna falsey para tiroteios válidos, mas para os inválidos.
Explicação
fonte