fundo
Considere uma cadeia de hastes (fechada), cada uma com comprimento inteiro. Quantos poliaminos distintos sem orifícios você pode formar com uma determinada corrente? Ou, em outras palavras, quantos polígonos diferentes que não se interceptam com lados alinhados ao eixo você pode formar com uma determinada cadeia?
Vejamos um exemplo. Considere uma corrente específica que consiste em 8 hastes de comprimento 1 e 2, que podemos representar como [1, 1, 2, 2, 1, 1, 2, 2]
. Até rotações e traduções, existem apenas 8 possíveis poliomatos (contamos diferentes reflexões):
Essa primeira haste é azul escuro e, em seguida, atravessamos o polígono no sentido anti-horário .
O senso de rotação não afeta o resultado no exemplo acima. Mas vamos considerar outra cadeia [3, 1, 1, 1, 2, 1, 1]
, que produz os seguintes 3 polioquinós:
Observe que não incluímos um reflexo do último poliomino, porque isso exigiria a rotação no sentido horário.
Se tivéssemos uma cadeia mais flexível do mesmo comprimento, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
poderíamos realmente formar ambas as reflexões entre alguns outros polioninos, totalizando 9:
O desafio
Dada a descrição de uma cadeia, como uma matriz ou similar, determine o número de poliomatos distintos que você pode formar (até rotações e translações) usando as hastes em ordem enquanto percorre o perímetro no sentido anti-horário.
Escreva um programa completo e inclua comandos para compilar (se aplicável) e executar seu código na linha de comando. Inclua também um link para um compilador / intérprete gratuito para o seu idioma.
Seu programa deve ler a entrada do STDIN. A primeira linha conterá um número inteiro M . As próximas M linhas serão casos de teste, cada um dos quais com uma lista de comprimentos de haste separados por espaço. Seu programa deve imprimir linhas M em STDOUT, cada uma das quais consiste em um único número inteiro - o número de poliomatos diferentes que podem ser formados.
Você deve usar apenas um único thread.
Seu programa não deve usar mais de 1 GB de memória a qualquer momento. (Esse não é um limite completamente estrito, mas monitorarei o uso da memória do executável e eliminarei qualquer processo que use consistentemente mais de 1 GB ou que atinja significativamente mais do que isso.)
Para evitar quantidades excessivas de pré-cálculo, seu código não deve exceder 20.000 bytes e você não deve ler nenhum arquivo.
Você também não deve otimizar para os casos de teste específicos escolhidos (por exemplo, codificando seus resultados). Se suspeitar que sim, reservo-me o direito de gerar novos conjuntos de benchmarks. Os conjuntos de testes são aleatórios; portanto, o desempenho do seu programa nesses deve ser representativo pelo desempenho em entradas arbitrárias. A única suposição que você pode fazer é que a soma dos comprimentos da haste seja uniforme.
Pontuação
Forneci conjuntos de referência para cadeias de N = 10, 11, ..., 20 hastes. Cada conjunto de testes contém 50 cadeias aleatórias com comprimentos entre 1 e 4, inclusive.
Sua pontuação principal é o maior N para o qual seu programa conclui todo o conjunto de testes em 5 minutos (na minha máquina, no Windows 8). O desempate será o tempo real gasto pelo seu programa nesse conjunto de testes.
Se alguém vencer o maior conjunto de testes, continuarei adicionando outros maiores.
Casos de teste
Você pode usar os seguintes casos de teste para verificar a correção da sua implementação.
Input Output
1 1 0
1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 3
1 1 1 1 1 1 1 1 1 1 9
1 1 1 1 1 1 1 1 1 1 1 1 36
1 1 1 1 1 1 1 1 1 1 1 1 1 1 157
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 758
1 1 2 2 1 1 2 2 8
1 1 2 2 1 1 2 2 1 1 23
1 1 2 2 1 1 2 2 1 1 2 2 69
1 2 1 2 1 2 1 2 3
1 2 1 2 1 2 1 2 1 2 1 2 37
1 2 3 2 1 2 3 2 5
1 2 3 2 1 2 3 2 1 2 3 2 23
3 1 1 1 2 1 1 3
1 2 3 4 5 6 7 1
1 2 3 4 5 6 7 8 3
1 2 3 4 5 6 7 8 9 10 11 5
2 1 5 3 3 2 3 3 4
4 1 6 5 6 3 1 4 2
3 5 3 5 1 4 1 1 3 5
1 4 3 2 2 5 5 4 6 4
4 1 3 2 1 2 3 3 1 4 18
1 1 1 1 1 2 3 3 2 1 24
3 1 4 1 2 2 1 1 2 4 1 2 107
2 4 2 4 2 2 3 4 2 4 2 3 114
Você encontra um arquivo de entrada com estes aqui .
Entre os melhores
User Language Max N Time taken (MM:SS:mmm)
1. feersum C++ 11 19 3:07:430
2. Sp3000 Python 3 18 2:30:181