En el fútbol de asociación (también conocido como fútbol), un lanzamiento de penalti es la segunda medida de desempate que se puede usar en un partido que no puede terminar en un empate, después de un tiempo extra (es decir, tiempo extra de fútbol de asociación).
En una tanda de penaltis, el árbitro principal arroja una moneda para determinar en qué objetivo ocurre la tanda de tiros, y luego lanza otra moneda para determinar qué equipo comienza primero. Sin embargo, lo único relevante para este desafío es lo que sucede entonces, que se describe a continuación.
Cada equipo tiene 5 penalizaciones disponibles al inicio, y el puntaje de penalización es 0-0. Si, en algún momento, las penalizaciones restantes de un equipo no son suficientes para cambiar el equipo ganador actual, el tiroteo se detiene.
Si no quedan penalizaciones restantes, pero los puntos de ambos equipos son iguales, se otorga una penalización adicional a ambos equipos. Esto se repite hasta que los puntos no sean iguales.
Después de que el tiroteo se detiene, el equipo con el mayor puntaje de penalización gana el juego.
Desafío
Su desafío es, dadas dos listas A
y B
representando qué penalizaciones anotaron el equipo A y el equipo B, respectivamente, para determinar si representan un penal penal válido. Un tiroteo es válido si se puede alcanzar el estado representado por la entrada, independientemente de si se puede determinar el equipo ganador. Tenga en cuenta que posiblemente tenga que probar ambos escenarios (inicio del Equipo A, inicio del Equipo B), ya que, si el estado descrito en la entrada es accesible para al menos un escenario, la entrada es válida. Si las longitudes de las listas son diferentes, el equipo representado por el más largo comienza primero (solo puede tener un elemento más que el otro, y el equipo de la lista más corta no puede comenzar, ya que el equipo de la lista más larga lanzaría dos penalizaciones) en una fila, ya que la lista más corta se agotará prematuramente).
Ejemplos detallados
Puede saltar a la sección de Reglas a continuación, estas son solo para ayudar a resolver el desafío.
Suponga que obtiene este tiroteo como entrada, donde -
significa que no se marcó ningún gol y X
significa que se marcó un gol (no es vá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.
Por el contrario, aquí hay un ejemplo 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.
Otro ejemplo, esta vez con penalizaciones adicionales:
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.
Aquí hay una entrada válida donde es demasiado pronto para determinar el ganador:
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, aquí hay una entrada donde las longitudes de las listas difieren:
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.
Reglas
- El equipo que dispara primero puede ser A o B, no puedes asumir que uno siempre disparará primero.
- Las listas tendrán la misma longitud o sus longitudes diferirán en una.
- Puede elegir dos valores distintos y consistentes para representar penalizaciones puntuadas / no puntuadas.
- Las listas también se pueden representar como enteros convertidos a partir de la base 2 del bijective , cadenas o el formato de lista nativo de su idioma. Si se elige un formato biyectiva base 2, se aplican las reglas de entrada a los números convertidos a la base biyectiva 2 (de modo dígitos
1
y2
bien puede significar anotada y no precortada o no precortada y obtuvo respectivamente). El binario regular no está permitido , ya que no se puede determinar la presencia de ceros a la izquierda en la representación binaria prevista. - Este es el código de golf , por lo que gana la solución más corta. Sin embargo, no se desanime de responder incluso si parece que su idioma no puede "vencer a los especializados".
Casos de prueba
En estos casos de prueba, un 0
representará un no objetivo y un 1
representará un objetivo.
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]
fuente
[[0,0],[1,1]]
(o cualquier caso de prueba en el que una de las dos listas internas tiene 2 elementos) es verdad, ya que el juego todavía está en curso (al igual que los casos de prueba con[[0],[1]]
o[[0],[]]
aún están en progreso).Respuestas:
JavaScript (ES6),
117 112109 bytes(a)(b)
Pruébalo en línea!
Comentado
fuente
Python 2 ,
176169171169 bytes-2 bytes gracias a @Kevin Cruijssen
Pruébalo en línea! (Incluyendo algunos casos de prueba adicionales no mencionados anteriormente).
Crea una función
f
que toma dos argumentos (las dos listas de penalizaciones con puntaje / sin puntaje) y devuelveTrue
si los puntajes son posiblemente válidos oFalse
no.Explicación parcial:
En primer lugar, laexec
construcción es solo una forma de ahorrar unos pocos bytes al no tener que repetir la expresiónlen(a+b)
más de una vez. El código anterior es equivalente a lo siguiente:Actualización: la respuesta nueva y mejorada es el mismo número de bytes con o sinexec
trucos, por lo que, en aras de la simplicidad, lo he eliminado.Actualización 2: la nueva versión corregida incluye incluso más compresión de cadenas mediante sustitución y
exec
. Sí, uso el%
formato y a.replace
en la misma cadena. El código anterior es equivalente a:not len(a+b)>10
h
m
Sin embargo, para ser un conjunto válido de puntajes, una entrada no necesita ser estrictamente continuable, sino que debe haber sido continuable antes de que se haya realizado la última patada. Esta condición es equivalente a decir que debe 1) haber sido continuable la última vez que ambas partes habían pateado la misma cantidad de veces y 2) estar dentro de dos puntos y medio de ser continuable, que es donde
h
entra el argumento final :h(a[:~-len(a+b)/2],b[:~-len(a+b)/2],6)
prueba la condición 1) yh(a,b,7)
(7
representa los dos medios puntos adicionales permitidos en el margen) prueba la condición 2).El caso en el que cada equipo ha pateado un máximo de cinco veces se ha resuelto. (La explicación continuará para el otro caso).
En términos de golf de bajo nivel, dudo que haya demasiado para afeitarse, pero algorítmicamente probablemente podría hacerse un poco más simple.
fuente
(%s-1)/2
a~-%s/2
salvar 2 bytes.Gelatina ,
625449 bytesPruébalo en línea!
Tenga en cuenta que el código de pie de página en tio es solo para manejar múltiples casos de prueba e imprimir salidas contra entradas.
Gracias a @EriktheOutgolfer por jugar golf en 8 bytes
fuente
Perl 6 , 123 bytes
Pruébalo en línea!
Devuelve falsey para tiroteos válidos, verdad para los inválidos.
Explicación
fuente