Você tem uma matriz de entrada do tamanho m * n. Cada célula da matriz é preenchida com P ou T. A única operação que você pode executar na matriz é inverter colunas. Quando você inverte uma coluna, as letras em todas as células dessa coluna mudam (P se torna T e vice-versa). Se você tiver o número 'x' de linhas com a mesma letra (por exemplo, PPPP), receberá um ponto. Projete um algoritmo que capte a matriz e retorne uma solução (que colunas virar), para que a matriz resultante tenha o número máximo de pontos possível.
Nota: Caso haja várias soluções que produzam a pontuação mais alta, escolha aquela com o menor número de lançamentos. Exemplo:
Matriz de entrada:
PPTPP
PPTPP
PPTTP
PPPTT
PPPTT
Resultado:
3
Explicação:
Uma solução que gera os pontos mais altos: Inverter a coluna no. 3
Então a matriz original seria:
PPPPP // 1 point
PPPPP // 1 point
PPPTP
PPTTT
PPTTT
//Total: 2 points
Observe que também é possível virar as colunas 4 e 5 para obter uma pontuação de dois, mas isso precisa de uma virada adicional.
Você pode usar qualquer formato de entrada conveniente para representar a matriz bidimensional e também dois valores distintos, mas fixos, para representar P
e T
.
Isso é código de golfe, então a resposta mais curta (em bytes) vence.
Respostas:
APL, 37
Exemplo:
Testado aqui.
fonte
Pyth , 28
Recebe entrada na forma de uma lista aninhada, por exemplo
Dá saída indexada 0, por exemplo
^U2lhQ
: Gera todas as listas possíveis de 0s e 1s do comprimento certo._osZ
: Ordena essas listas da maioria dos 1s para a menor.+/QN/Qm!dN
: Conta quantas vezes cada lista (N
) e seu inverso, 0s e 1s trocados (m!dN
) ocorrem na entrada. O primeiro corresponde a uma série de movimentos que deixam todos os zeros, e o último a todos.eo
: Ordena a lista pela chave acima e pega seu último elemento, que será o resultado com as colunas mais correspondentes e, entre elas, a com as menos.f@ ... TUhQ
: Converte essa lista de 1s e 0s em uma lista de índices a serem invertidos.Para a indexação 1, altere
d
para ak
e coloquemhd
no início.fonte
CJam,
5351 bytesIsso lê uma matriz bidimensional de 0s e 1s de STDIN. Por exemplo, o exemplo na pergunta seria
Teste aqui.
Isso primeiro obtém todos os subconjuntos possíveis de colunas, em ordem crescente de comprimento, depois executa os lançamentos para cada subconjunto e os classifica por quantas linhas ainda possuem 0 e 1 s. Finalmente, apenas retornamos o primeiro subconjunto. Isso depende da classificação ser estável, de modo que a ordem inicial de aumento de comprimento cuide do desempate.
fonte
Haskell, 98
formato de entrada é uma lista de lista de entradas. você pode usar uma versão em cadeia para testar:
oh não os espaços! isso dói!
isso funciona iterando sobre as linhas e calculando o número de pontos que obteremos se invertermos as colunas de uma maneira que essa linha ganhe um ponto.
A primeira coisa a notar é que inverter a linha para todos
True
ou para todosFalse
não importa, porque as grades serão exatamente o inverso uma da outra e, portanto, terão exatamente a mesma pontuação.é assim que calculamos a contagem quando uma determinada linha ganha um ponto: iteramos as linhas novamente e somamos os pontos que cada linha nos fornece, usando o fato de que eles fazem exatamente quando as linhas são idênticas ou exatamente inversas.
por exemplo, se a linha que estamos lançando
TPPTP
e a linha atual sobre a qual estamos iterando sãoPTTPT
ouTPPTP
então a linha ganha um ponto, mas quando é qualquer outra linha, ela não ganha pontos.fonte
CJam, 37
Formato de entrada:
fonte
Mathematica - 76
fonte
Python 2, 234
Entrada é uma lista de listas:
Saída é uma tupla de inversões usando a indexação python de 0:
Se a saída precisar ser indexada a partir de 1, o código terá 272 caracteres com 0 indicando que não há inversões:
fonte