Esse desafio é parcialmente um desafio de algoritmos, parcialmente um desafio de otimização e parcialmente um desafio de código mais rápido.
A matriz AT é totalmente especificada por sua primeira linha r
e primeira coluna c
. Cada elemento restante da matriz é apenas uma cópia do elemento que está na diagonal para cima e para a esquerda. Essa é M[i,j] = M[i-1,j-1]
. Permitiremos matrizes T que não são quadradas. No entanto, sempre assumimos que o número de linhas não passa do número de colunas. Por exemplo, considere a seguinte matriz de 3 por 5 T.
10111
11011
11101
Dizemos que uma matriz tem propriedade X se contiver dois conjuntos de colunas não vazios com índices não idênticos que tenham a mesma soma (vetor). A soma vetorial de uma ou mais colunas é simplesmente um somatório elemento-elemento de suas colunas. Essa é a soma de duas ou mais colunas contendo x
elementos, cada uma com outra coluna contendo x
elementos. A soma de uma coluna é trivialmente a própria coluna.
A matriz acima trivialmente possui a propriedade X, pois a primeira e a última coluna são as mesmas. A matriz de identidade nunca tem propriedade X.
Se removermos a última coluna da matriz acima, obteremos um exemplo que não possui a propriedade X e daria uma pontuação de 4/3.
1011
1101
1110
A tarefa
A tarefa é escrever código para encontrar a matriz T de maior pontuação com entradas binárias e que não possui a propriedade X. Para maior clareza, uma matriz com entradas binárias possui a propriedade de que cada uma de suas entradas seja 0 ou 1.
Ponto
Sua pontuação serão as colunas numéricas divididas pelo número de linhas em sua matriz de melhor pontuação.
Desempate
Se duas respostas tiverem a mesma pontuação, a primeira submetida vence.
No caso (muito) improvável de alguém encontrar um método para obter pontuações ilimitadas, a primeira prova válida de tal solução será aceita. No caso ainda mais improvável de encontrar uma prova de otimização de uma matriz finita, é claro que também premiaremos a vitória.
Sugestão
Todas as respostas em Encontrar matriz de pontuação mais alta sem a propriedade X são válidas aqui, mas não são ideais. Existem matrizes T sem propriedade X que não são cíclicas.
Por exemplo, existe uma matriz 7 por 12 T sem propriedade X, mas não existe uma matriz cíclica.
O 21/11 superaria todas as respostas atuais deste e do desafio anterior.
Línguas e bibliotecas
Você pode usar qualquer idioma que tenha um compilador / intérprete disponível gratuitamente / etc. para Linux e quaisquer bibliotecas que também estão disponíveis gratuitamente para Linux.
Bônus A primeira resposta com uma pontuação maior que 2 recebe um prêmio imediato de recompensa de 200 pontos . Ton Hospel já conseguiu isso!
Quadro de líderes atual
- C ++ . Pontuação 31/15 de Ton Hospel
- Java . Pontuação 36/19 de Peter Taylor
- Haskell . Pontuação 14/8 de alexander-brett
fonte
Respostas:
C ++, Pontuação
23/1225/1327/1428/1431/15Finalmente, um resultado com razão> 2:
Eu explorei completamente 1 a 14 linhas. 15 levaria muito tempo para explorar completamente. Os resultados são:
O código fornecido abaixo é uma versão mais antiga do programa. A versão mais recente está em https://github.com/thospel/personal-propertyX .
fonte
Haskell 14/8 = 1,75
Anteriormente 9/6 = 1,5
Eu escrevi isso, depois olhei as respostas para a outra pergunta e fiquei ... desanimado.
fonte
main
, o número (neste caso8
) é a altura da matriz e o programa itera através das larguras[1..]
. Para cada combinação de altura / largura, ela imprime uma matriz de colunas de uma matriz válida.C
Aqui está uma resposta que funciona e é significativamente mais eficiente em termos de memória que o Haskell. Infelizmente, meu computador ainda está lento demais para atingir uma velocidade superior a 14/8 em um período de tempo razoável.
Tente compilar
gcc -std=c99 -O2 -fopenmp -o matrices.exe matrices.c
e executar commatrices.exe width height
ou similar. A saída é um número inteiro, cujos bits formam a base da matriz em questão, por exemplo:Então, desde então
1650223 = 0b110010010111000101111
, a matriz em questão é:Se alguém com 8 núcleos e tempo em suas mãos quiser executar isso por um tempo, acho que algumas coisas boas podem resultar :)
fonte
valid i: 7481
. No python bin (7481) está 0b1110100111001, que não é longo o suficiente. alguma ideia do que está acontecendo?