De quoi s'agit-il?

15

Objectif

Étant donné que les World Series sont à nos portes, j'ai besoin d'un programme capable de lire les scores de la boîte et de me dire de quoi il s'agit. C'est un peu compliqué car le baseball utilise une méthode étrange pour enregistrer le score. Ils n'écrivent pas le score de l'équipe au bâton pour la manche jusqu'à ce qu'ils aient marqué un point (et continuent) ou qu'ils aient terminé leur batte. Ainsi, un 0 sur le tableau de bord signifie toujours une batte terminée. Par exemple:

Example A:
Inning| 1| 2| 3| 4| 5| 6| 7| 8| 9|
  Them| 0| 0| 0| 0| 0| 2|  |  |  |
    Us| 0| 0| 2| 0| 0| 0|  |  |  |

Example B:
Inning| 1| 2| 3| 4| 5| 6| 7| 8| 9|
  Them| 0| 0| 0| 0| 0| 2|  |  |  |
    Us| 0| 0| 2| 0| 0| 1|  |  |  |

Example C:
Inning| 1| 2| 3| 4| 5| 6| 7| 8| 9|
  Them| 0| 0| 0| 0| 0| 2|  |  |  |
    Us| 0| 0| 2| 0| 0|  |  |  |  |

#Them is the Away Team, Us is the Home Team (who are the guys you root for)
  • Exemple A: Nous savons que nous sommes en haut du 7e parce que Us a un 0 enregistré en bas du 6e et le haut du 7e est vide.
  • Exemple B: Il peut s'agir du bas du 6e ou du haut du 7e.
  • Exemple C: Il peut s'agir du haut ou du bas du 6e.

Votre tâche consiste à retourner quelle (s) manche (s) il pourrait s'agir.

Contribution

Deux listes d'entiers non négatifs. Les listes seront supposées irrégulières, la liste de l'équipe extérieure étant de la même taille ou d'un élément plus grand par rapport à celle de l'équipe locale. Vous pouvez prendre les scores dans l'un ou l'autre ordre mais indiquer dans votre réponse si vous n'utilisez pas la valeur par défaut. C'est-à-dire, Équipe à l'extérieur puis Équipe à domicile (par défaut) ou Équipe à domicile puis Équipe à l'extérieur (inversé). Ils peuvent également être complétés avec des données fictives si vous le souhaitez, indiquez dans votre réponse si vous le faites.

Production

Une chaîne ou quelque chose d'équivalent qui identifie le numéro de manche et s'il s'agit du haut ou du bas. Par exemple 7B 8T, B7 T8, ['7B','8T']sont tous très bien. S'il y a deux réponses, vous devez sortir les deux. Le format est cependant assez flexible.

Règles

  • L'entrée sera toujours valide
  • Les matchs peuvent prendre des manches supplémentaires indéfinies. Votre programme devrait pouvoir prendre en charge jusqu'à 255 manches.
  • Les échappatoires standard sont interdites
  • C'est le donc le code le plus court gagne

Cas de test

#Input:
[[], 
 []] 
#Output: 1T

#Input:
[[0], 
 []] 
#Output: 1B

#Input:
[[0,0,0,1], 
 [0,0,0,0]] 
#Output: 5T

#Input:
[[0,0,0,1], 
 [0,0,0,1]] 
#Output: 4B, 5T

#Input:
[[0,0,0,1,0,0,1,0,0,1],
 [0,0,0,0,1,0,0,1,0,1]] 
#Output: 10B, 11T

#Input:
[[0,0,0,1], 
 [0,0,0]] 
#Output: 4T, 4B

#Input:
[[0,0,0,0], 
 [0,0,0]] 
#Output: 4B
Veskah
la source
Pouvons-nous prendre les deux listes dans l'ordre inverse? c'est-à-dire en bas puis en haut?
Jo King
@JoKing Bien sûr, tant qu'il est noté et que la réponse correspond toujours correctement.
Veskah
La valeur de retour entière positive / négative est-elle une sortie acceptable?
@Rogem Ça pousse un peu mais en lisant votre article, ça va. J'ai dit que la sortie est assez flexible.
Veskah

Réponses:

4

C (gcc) , 50 octets

Prend l'entrée comme pointeur vers une liste entrelacée (c. {them#1, us#1, them#2,...}-à-d.).

Renvoie une option via une modification et l'autre via une valeur de retour.

Les valeurs négatives indiquent le bas de la manche, les valeurs positives indiquent le haut de la manche. Les zéros sont "vides". La valeur absolue de la sortie est le numéro de la manche. Ainsi, -4,5indique les possibilités étant en haut du cinquième et en bas du quatrième, et 1,0indique la seule possibilité étant le haut du premier.

La valeur de retour de la macro peut être utilisée pour déterminer s'il y a une ou deux manches possibles; la valeur de retour est 0s'il n'y a pas d'autre manche. Sinon, c'est le numéro de la manche.

Zéro octet de code source. Utilisez ce qui suit comme indicateur de préprocesseur:

-Df(o,n,l)=({o=n%2?~n/2:n/2+1;l[n-1]?-o-~n%2:0;})

Essayez-le en ligne!

Degolf

-Df(o,n,l)=({
// Define a function-like macro f(o,n,l)
// o is the output variable, n is the size of the list, 
// l is a pointer to the first element of the list.
o=n%2?~n/2:n/2+1;
// If there's an odd number of elements, first possible inning is -(n+1)/2. 
// Else, it is (n/2)+1.
l[n-1]?-o-~n%2:0})
// If the score from the last inning is non-zero, the other possible inning
// needs to be determined; flip the sign of first output value then deduct 
// 1 from it if the number of elements is even.

la source
En outre, cela pourrait être joué 4 octets supplémentaires si je peux supposer que la liste est dans l'ordre inverse (du dernier au premier) ou que le pointeur pointe vers le dernier élément du tableau. N'y est pas allé, car cela ressemblait à trop de triche.
Je serais ravi d'entendre @veskah si la prise de vue comme vous l'avez fait est correcte, car elle semble assez différente (et utile) de la spécification d'origine.
BLT
2
@BLT Par convention, l'entrelacement est la façon dont les listes de listes sont faites en C; le déréférencement multiple est très lourd sur les ressources. Une autre option serait d'avoir une liste après l'autre, mais il serait alors très difficile d'y ajouter de nouveaux éléments.
3

Perl 6 , 52 48 45 octets

-3 octets grâce à une restructuration de nwellnhof!

->\a,\b{(+a,a==b if (b,a)[a>b].tail;b+1,a>b)}

Essayez-le en ligne!

Bloc de code anonyme qui prend l'entrée en deux listes, en haut puis en bas. La sortie est une liste de tuples, où le premier élément est le numéro d'entrée et le deuxième élément est True ou False, correspondant à Bottom ou Top.

Explication:

       {                                    }  # Anonymous code block
->\a,\b   # That takes input lists a and b
        (                                  )   # Return a list of
                                    b+1,a>b    # A list of 
                                               #  The length of the second list plus 1
                                               #  And top/bottom
         +a,a==b     # And the length of the first list
                     # And the other of top/bottom
                 if  # Only if:
                    (b,a)[a>b]      # The current of top/bottom's
                              .tail # Last element exists and is not 0
Jo King
la source
3

R , 103 96 octets

function(a,b,l=sum(a|1),k=sum(b|1))I(l,I(l-k,I(a[l],c(l,-l),-l),I(b[l],c(-l,l+1),l+1)),1)
I=`if`

Essayez-le en ligne!

@digEmAll a enregistré 7 octets!

Prend deux listes de vecteurs en entrée et génère un ou deux entiers représentant les manches possibles. Les entiers positifs sont le haut de la manche et les entiers négatifs sont le bas de la manche.

Dans R, les entiers positifs sont vrais, donc je peux utiliser la différence de longueur comme premier argument if().

BLT
la source
Vous auriez probablement plus de chance de [[le ifremplacer car vous l'utilisez [dans votre code.
Giuseppe
@Giuseppe Je l'ai essayé avec <et ^. Je pense que [c'était celui utilisé dans l'exemple dont je me souviens.
BLT
Vous pouvez également donner un autre nom à 'if'(et supprimer {}et déplacer à l' f=extérieur): 96 octets
digEmAll
2

Gelée , 11 octets

ZẎṖṠṪ$СẈd2

Essayez-le en ligne!

Premier élément: index de colonne basé sur 0.
Deuxième élément: 0pour le haut, 1pour le bas.

La sortie est une liste d'une ou deux paires comme spécifié ci-dessus (optimisé pour mieux le montrer). Les manches de sortie sont dans l'ordre inverse.

Erik le Outgolfer
la source
2

Python 2 , 135 129 126 125 123 119 octets

a,b=input()
c=len(a)
e,f=`c+1`+"T",`c`+"B"
print((f+e,e)[b[-1]<1],(`c`+"T"+f,f)[a[-1]<1])[len(b)<c]if b else"1"+"TB"[c]

Essayez-le en ligne!

-1 avec merci à @ovs

-4 merci encore à @ovs

ElPedro
la source
if d else"11BT"[c<1::2]pour -3
ovs
if dJe peux voir (ne devrait pas avoir manqué ça!) Mais else"11BT"[c<1::2]ne sort pas plus court pour moi à moins que je manque quelque chose.
ElPedro
Pas de soucis @ovs car j'ai trouvé une autre façon inspirée de votre if dfaçon.
ElPedro
Au lieu de if dvous pouvez le faire if b, alors vous n'avez pas besoin de stocker len(b)dans une variable.
2018
@ovs Je regardais cela , mais aussi besoin dpour [d<c]. Je ne vois pas de solution. Des idées?
ElPedro
1

Python 2 , 65 octets

a,b=input()
exec"a,b=[0]+b,a;print[len(b)][a[-1]<len(a+b)%2:];"*2

Essayez-le en ligne!

Imprime deux lignes, d'abord la possibilité de manche inférieure puis la première, sous forme de liste singleton. Si l'un ou l'autre n'est pas possible, cette liste est vide.

xnor
la source
1

Nettoyer , 84 75 octets

import StdEnv
$ =length
?v|last[0:v]>0= $v=0
@a b| $b< $a=(?a,$a)=($a+1,?b)

Essayez-le en ligne!

Définit la fonction @ :: [Int] [Int] -> (Int, Int)et certains assistants.
Donne la sortie sous la forme (Top, Bottom)où un zéro signifie une possibilité nulle.

Οurous
la source