Tiene una matriz de entrada de tamaño m * n. Cada celda de la matriz se llena con P o T. La única operación que puede hacer en la matriz es voltear columnas. Cuando voltea una columna, las letras en todas las celdas de esa columna cambian (P se convierte en T y viceversa). Si tiene 'x' número de filas con la misma letra (por ejemplo, PPPP), obtendrá un punto. Diseñe un algoritmo que tome la matriz y devuelva una solución (qué columnas voltear) de modo que la matriz resultante tenga el máximo número de puntos posibles.
Nota: En caso de que haya múltiples soluciones que produzcan la puntuación más alta, elija la que tenga el menor número de vueltas. Ejemplo:
Matriz de entrada:
PPTPP
PPTPP
PPTTP
PPPTT
PPPTT
Salida:
3
Explicación:
Una solución que produce los puntos más altos: Voltear la columna no. 3
Entonces la matriz original sería:
PPPPP // 1 point
PPPPP // 1 point
PPPTP
PPTTT
PPTTT
//Total: 2 points
Tenga en cuenta que también se pueden voltear las columnas 4 y 5 para obtener una puntuación de dos, pero eso necesita un giro adicional.
Puede utilizar cualquier formato de entrada conveniente para representar la matriz bidimensional, y también puede representar dos valores distintos, pero fijos, para representar P
y T
.
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Respuestas:
APL, 37
Ejemplo:
Probado aquí.
fuente
Pyth , 28
Toma datos en forma de una lista anidada, por ejemplo
Da salida indexada 0, por ejemplo
^U2lhQ
: Genera todas las listas posibles de 0 y 1 de la longitud correcta._osZ
: Ordena estas listas de la mayoría de los 1s a los menos.+/QN/Qm!dN
: Cuenta cuántas veces cada lista (N
) y su inverso, 0s y 1s intercambiados (m!dN
) ocurren en la entrada. El primero corresponde a una serie de volteos dejando todos los ceros, el último a dejar todos los ceros.eo
: Ordena la lista por la tecla anterior y toma su último elemento, que será el resultado con las columnas más coincidentes, y entre ellas la que tenga menos.f@ ... TUhQ
: Convierte esta lista de 1s y 0s en una lista de índices para voltear.Para la indexación 1, cambie el
d
a ak
, luego coloquemhd
al principio.fuente
CJam,
5351 bytesEsto lee una matriz bidimensional de 0s y 1s de STDIN. Por ejemplo, el ejemplo en la pregunta sería
Pruébalo aquí.
Este primero obtiene todos los subconjuntos posibles de columnas, en orden de longitud creciente, luego realiza los volteos para cada subconjunto y los ordena por la cantidad de filas que aún tienen 0s y 1s en ellos. Finalmente, solo devolvemos el primer subconjunto de este tipo. Esto depende de que la clasificación sea estable, de modo que el orden inicial de aumentar la longitud se encargue del desempate.
fuente
Haskell, 98
El formato de entrada es una lista de la lista de entradas. puedes usar una versión de cadena para probar:
oh no los espacios! ¡duele!
esto funciona iterando sobre las filas y calculando el número de puntos que obtendremos si volteamos las columnas de manera que esta fila nos gane un punto.
Lo primero que debe notar es que cambiar la fila a todo
True
o a todosFalse
no importa, porque las cuadrículas serán exactamente inversas entre sí y, por lo tanto, tendrán exactamente el mismo puntaje.la forma en que calculamos el recuento cuando una fila determinada gana un punto es así: iteramos sobre las filas nuevamente y sumamos los puntos que cada fila nos da, usando el hecho de que lo hacen exactamente cuando las filas son idénticas o exactamente al revés.
por ejemplo, si la fila que estamos volteando es
TPPTP
y la fila actual sobre la que estamos iterando esPTTPT
oTPPTP
entonces la fila nos gana un punto, pero cuando es cualquier otra fila, no nos gana ningún punto.fuente
CJam, 37
Formato de entrada:
fuente
Mathematica - 76
fuente
Pitón 2, 234
La entrada es una lista de listas:
La salida es una tupla de volteos usando la indexación de Python desde 0:
Si la salida debe indexarse desde 1, entonces el código tiene 272 caracteres con 0 que indica que no hay volteos:
fuente