¿Qué entrada es?

15

Objetivo

En vista de que la Serie Mundial está a la vuelta de la esquina, necesito un programa que pueda leer los puntajes del cuadro y decirme qué entrada es. Esto es un poco complicado porque el béisbol usa un método extraño para registrar el puntaje. No escriben el puntaje del equipo al turno para la entrada hasta que hayan anotado una carrera (y todavía estén en marcha) o hayan terminado su turno al bate. Por lo tanto, un 0 en el marcador siempre significa un final al bate. Por ejemplo:

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)
  • Ejemplo A: Sabemos que estamos en la parte superior de la 7ª porque Us tiene un 0 registrado en la parte inferior de la 6ª y la parte superior de la 7ª está en blanco.
  • Ejemplo B: Puede ser la parte inferior de la sexta o la parte superior de la séptima.
  • Ejemplo C: Puede ser la parte superior o inferior de la 6ta.

Su tarea es devolver qué entrada (s) podría ser.

Entrada

Dos listas de enteros no negativos. Se supondrá que las listas son irregulares, ya que la lista del equipo visitante es del mismo tamaño o un elemento más grande en comparación con el equipo local. Puede tomar los puntajes en cualquier orden pero indicar su respuesta si no usa el valor predeterminado. Es decir, Equipo Visitante y luego Equipo Local (predeterminado), o Equipo Local y luego Equipo Visitante (invertido). También se pueden rellenar con datos ficticios si lo desea, indique su respuesta si lo hace.

Salida

Una cadena o algo equivalente que identifica el número de entrada y si es la parte superior o inferior. Por ejemplo 7B 8T, B7 T8, ['7B','8T']son todos muy bien. Si hay dos respuestas, debe generar ambas. Sin embargo, el formato es bastante flexible.

Reglas

  • La entrada siempre será válida
  • Los juegos pueden entrar en entradas extras indefinidas. Su programa debería ser capaz de soportar hasta 255 entradas.
  • Las lagunas estándar están prohibidas
  • Este es el por lo que el código más corto gana

Casos de prueba

#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
fuente
¿Podemos tomar las dos listas en orden inverso? es decir, ¿abajo y luego arriba?
Jo King
@JoKing Claro, siempre y cuando se indique y la respuesta aún coincida correctamente.
Veskah
¿Es el valor de retorno entero positivo / negativo una salida aceptable?
@Rogem Eso lo está presionando un poco, pero leer su artículo, está bien. Dije que la salida es bastante flexible.
Veskah

Respuestas:

4

C (gcc) , 50 bytes

Toma la entrada como un puntero a una lista intercalada (es decir {them#1, us#1, them#2,...}).

Devuelve una opción por modificación y la otra por valor de retorno.

Los valores negativos indican la parte inferior de la entrada, los valores positivos indican la parte superior de la entrada. Los ceros están "vacíos". El valor absoluto de la salida es el número de la entrada. Entonces, -4,5indica que las posibilidades son la parte superior de la quinta y la parte inferior de la cuarta, e 1,0indica que la única posibilidad es la parte superior de la primera.

El valor de retorno de la macro se puede usar para determinar si hay una o dos entradas posibles; El valor de retorno es 0si no hay otra entrada. De lo contrario, es el número de la entrada.

Cero bytes de código fuente. Use lo siguiente como indicador de preprocesador:

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

Pruébalo en línea!

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.

fuente
Además, esto podría jugarse 4 bytes adicionales si puedo asumir que la lista está en orden inverso (último al primero), o el puntero para apuntar al último elemento en la matriz. No fui por eso, ya que parecía demasiado tramposo.
Me encantaría saber de @veskah si tomar la entrada como lo hiciste está bien, porque parece bastante diferente (y útil) de la especificación original.
BLT
2
@BLT Por convención, el intercalado es cómo se hacen las listas de listas en C; la desreferenciación múltiple es muy exigente con los recursos. Otra opción sería tener una lista tras otra, pero sería muy poco práctico agregar nuevos elementos.
3

Perl 6 , 52 48 45 bytes

-3 bytes gracias a alguna reestructuración de nwellnhof!

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

Pruébalo en línea!

Bloque de código anónimo que toma la entrada como dos listas, arriba y abajo. La salida es una lista de tuplas, donde el primer elemento es el número de entrada y el segundo elemento es Verdadero o Falso, correspondiente a Inferior o Superior.

Explicación:

       {                                    }  # 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
fuente
3

R , 103 96 bytes

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`

Pruébalo en línea!

¡@digEmAll ahorró 7 bytes!

Toma dos vectores de listas como entrada y genera uno o dos enteros que representan las posibles entradas. Los enteros positivos son la parte superior de la entrada, y los enteros negativos son la parte inferior de la entrada.

En R, los enteros positivos son verdaderos, por lo que puedo usar la diferencia de longitudes como primer argumento if().

BLT
fuente
Probablemente tenga mejor suerte [[como ifreemplazo ya que lo usa [en su código.
Giuseppe
@Giuseppe lo probé con <y ^. Creo que [fue el que usé en el ejemplo que recuerdo.
BLT
También puede dar otro nombre a 'if'(y eliminar {}y mover f=fuera): 96 bytes
digEmAll
2

Jalea , 11 bytes

ZẎṖṠṪ$СẈd2

Pruébalo en línea!

Primer elemento: índice de columna basado en 0.
Segundo elemento: 0para arriba, 1para abajo.

La salida es una lista de uno o dos pares como se especifica anteriormente (prettified para mostrarlo mejor). Las entradas de salida están en orden inverso.

Erik el Outgolfer
fuente
2

Python 2 , 135 129 126 125 123 119 bytes

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]

Pruébalo en línea!

-1 con agradecimiento a @ovs

-4 gracias de nuevo a @ovs

ElPedro
fuente
if d else"11BT"[c<1::2]para -3
ovs
if dPuedo ver (¡no debería haberme perdido eso!) Pero else"11BT"[c<1::2]no me sale más corto a menos que me falte algo.
ElPedro
No te preocupes @ovs ya que encontré otra forma inspirada por ti de if dtodos modos.
ElPedro
En lugar de if dhacerlo if b, entonces no es necesario almacenar len(b)en variable.
ovs
@ovs Miré a eso, pero también necesito dpara [d<c]. No puedo ver una forma de evitar eso. ¿Algunas ideas?
ElPedro
1

Python 2 , 65 bytes

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

Pruébalo en línea!

Imprime dos líneas, primero la posibilidad de entrada inferior y luego la superior, como una lista única. Si ninguno de los dos es posible, esa lista está vacía.

xnor
fuente
1

Limpio , 84 75 bytes

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

Pruébalo en línea!

Define la función @ :: [Int] [Int] -> (Int, Int)y algunos ayudantes.
Da salida en la forma (Top, Bottom)donde un cero significa una posibilidad nula.

Οurous
fuente