Dans le football d'association (également connu sous le nom de football), une séance de tirs au but est la deuxième mesure de bris d'égalité qui peut être utilisée dans un match qui ne peut pas se terminer par une égalité, après une prolongation (c'est-à-dire des heures supplémentaires de football d'association).
Lors d'une séance de tirs au but, l'arbitre principal lance une pièce pour déterminer à quel but la fusillade a lieu, puis lance une autre pièce pour déterminer quelle équipe commence en premier. Cependant, la seule chose pertinente pour ce défi est ce qui se passe alors, décrit ci-dessous.
Chaque équipe dispose de 5 pénalités au départ et le score de pénalité est de 0-0. Si, à tout moment, les pénalités restantes d'une équipe ne suffisent pas à changer l'équipe actuellement gagnante, la fusillade s'arrête.
S'il n'y a plus de pénalité, mais que les points des deux équipes sont égaux, une pénalité supplémentaire est accordée aux deux équipes. Ceci est répété jusqu'à ce que les points ne soient pas égaux.
Après les tirs de barrage, l'équipe avec le score de pénalité le plus élevé remporte la partie.
Défi
Votre défi est, étant donné deux listes A
etB
représenter les pénalités que l'équipe A et l'équipe B ont respectivement marquées, à déterminer si elles représentent une fusillade valide. Une fusillade est valide si l'état représenté par l'entrée peut être atteint, que l'équipe gagnante puisse être déterminée ou non. Notez que vous devez éventuellement tester les deux scénarios (démarrage de l'équipe A, démarrage de l'équipe B), car si l'état décrit dans l'entrée est accessible pour au moins un scénario, l'entrée est valide. Si les longueurs des listes sont différentes, l'équipe représentée par la plus longue commence en premier (elle ne peut avoir qu'un élément de plus que l'autre, et l'équipe de la liste la plus courte ne peut pas commencer, car alors l'équipe de la liste la plus longue tirerait deux pénalités d'affilée, car la liste plus courte sera épuisée prématurément).
Exemples détaillés
Vous pouvez passer à la section Règles ci-dessous, ce n'est que pour aider à résoudre le défi.
Supposons que vous obtenez cette fusillade en entrée, où -
signifie qu'aucun but n'a été marqué et X
signifie qu'un but a été marqué (il n'est pas valide):
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.
Au contraire, voici un exemple valable:
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.
Un autre exemple, cette fois avec des pénalités supplémentaires:
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.
Voici une entrée valide où il est trop tôt pour déterminer le gagnant:
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.
Enfin, voici une entrée où les longueurs des listes diffèrent:
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.
Règles
- L'équipe qui tire en premier peut être A ou B, vous ne pouvez pas supposer que l'on tirera toujours en premier.
- Les listes auront soit la même longueur, soit leur longueur différera d'une unité.
- Vous pouvez choisir deux valeurs distinctes et cohérentes pour représenter les pénalités marquées / non marquées.
- Les listes peuvent également être représentées sous forme d'entiers convertis à partir de la base bijective 2, de chaînes ou du format de liste natif de votre langue. Si un format de base bijective 2 est choisi, les règles d'entrée s'appliquent aux nombres convertis en base bijective 2 (donc les chiffres
1
et2
peuvent signifier respectivement notés et non notés ou non notés et notés). Le binaire régulier n'est pas autorisé , car on ne peut pas déterminer la présence de zéros de tête dans la représentation binaire prévue. - C'est le code-golf , donc la solution la plus courte l'emporte. Cependant, ne vous découragez pas de répondre même s'il semble que votre langue ne peut pas «battre les langues spécialisées».
Cas de test
Dans ces cas de test, un 0
testament représente un objectif nul et un 1
testament représente un objectif.
Format:
[Team A], [Team B]
Entrées valides:
[], []
[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]
Entrées non valides:
[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]
la source
[[0,0],[1,1]]
(ou tout cas de test où l'une des deux listes internes contient 2 éléments) est vrai, car le jeu est toujours en cours (tout comme les cas de test avec[[0],[1]]
ou[[0],[]]
sont toujours en cours)?Réponses:
JavaScript (ES6),
117 112109 octets(a)(b)
Essayez-le en ligne!
Commenté
la source
Python 2 ,
176169171 171169 octets-2 octets grâce à @Kevin Cruijssen
Essayez-le en ligne!(Y compris certains cas de test supplémentaires non répertoriés ci-dessus.)
Crée une fonction
f
qui prend deux arguments (les deux listes de pénalités marquées / non marquées) et renvoieTrue
si les scores sont éventuellement valides etFalse
sinon.Explication partielle:
Tout d'abord, laexec
construction n'est qu'un moyen d'économiser quelques octets en évitant de répéter l'expressionlen(a+b)
plus d'une fois. Le morceau de code ci-dessus est équivalent à ce qui suit:Mise à jour: la réponse nouvelle et améliorée est le même nombre d'octets avec ou sansexec
astuce, donc dans un souci de simplicité, je l'ai supprimé.Mise à jour 2: La nouvelle version corrigée de bogues inclut encore plus de compression de chaînes via substitution et
exec
. Oui, j'utilise le%
formatage et un.replace
sur la même chaîne. Le code ci-dessus est équivalent à:L'idée principale de cette réponse est de formuler la question en termes de "demi-points": chaque coup réussi est un demi-point et chaque échec est un demi-point négatif. Pour un ensemble de partitions de longueur< = 5 pour être continuable (
not len(a+b)>10
), le nombre total de coups de pied restants doit avoir été supérieur ou égal à la marge du demi-point entre les deux équipes. Lorsqu'une équipe a donné un coup de pied supplémentaire, un demi-point doit être soustrait de la marge pour diverses raisons, ce qui peut être simplifié en divisant par deux les deux côtés de l'équation. Il s'agit de la fonctionh
dans le code (avec l'argumentm
égal à 6).Cependant, pour être un ensemble de scores valide, une entrée n'a pas besoin d'être strictement continue, mais elle doit avoir été continue avant le dernier coup de pied. Cette condition équivaut à dire qu'elle doit 1) avoir été continue la dernière fois que les deux parties ont donné le même nombre de coups de pied et 2) être actuellement à moins de deux demi-points d'être continuable - c'est là que l'argument final
h
intervient:h(a[:~-len(a+b)/2],b[:~-len(a+b)/2],6)
teste la condition 1) eth(a,b,7)
(7
représentant deux demi-points supplémentaires autorisés dans la marge) teste la condition 2).Le cas où chaque équipe a botté un maximum de cinq fois a ainsi été réglé. (Explication à suivre pour l'autre cas.)
En termes de golf de bas niveau, je doute qu'il y ait trop de choses à raser, mais algorithmiquement, cela pourrait probablement être fait un peu plus simplement.
la source
(%s-1)/2
au golf~-%s/2
pour économiser 2 octets.Gelée ,
625449 octetsEssayez-le en ligne!
Notez que le code de pied de page sur tio est juste pour gérer plusieurs cas de test et imprimer les sorties par rapport aux entrées.
Merci à @EriktheOutgolfer d'avoir joué au golf sur 8 octets
la source
Perl 6 , 123 octets
Essayez-le en ligne!
Renvoie falsey pour les tirs valides, véridique pour les tirs invalides.
Explication
la source