Ao trabalhar no Boggl poliglota não palindrômico , achei bastante entediante colocar os códigos da maneira mais eficiente possível na placa do Boggle, mesmo com apenas duas seqüências de caracteres. Mas somos programadores, certo? Nós sabemos como automatizar as coisas.
Dada uma lista de strings, você deve gerar um quadro Boggle no qual cada uma dessas strings pode ser encontrada (independentemente das outras). O desafio é tornar o quadro do Boggle o menor possível. Como essa é (espero) uma tarefa bastante difícil, esse é um desafio de código : não há requisito para otimizar - o desafio é fazê-lo da melhor maneira possível.
Regras
- O quadro do Boggle será retangular e conterá apenas letras maiúsculas. Portanto, as seqüências de entrada também conterão apenas letras maiúsculas.
- As regras usuais do Boggle se aplicam: uma string faz parte do quadro se, começando em qualquer lugar, você puder encontrá-la movendo-se repetidamente para caracteres adjacentes (horizontal, vertical ou diagonal). Para formar uma única sequência, você não pode usar nenhuma célula do quadro mais de uma vez. No entanto, os caracteres podem ser reutilizados entre cadeias diferentes.
- Você tem 30 minutos para processar os dados de teste e seu código não deve usar mais de 4 GB de memória. Darei um pouco de margem de manobra no limite de memória, mas se o seu programa usar consistentemente mais de 4 GB ou picos significativamente acima dele, eu o desqualificarei (temporariamente).
- Testarei todos os envios em minha própria máquina, que está executando o Windows 8. Eu tenho uma VM do Ubuntu, mas se tiver que testar, você não poderá usar tanto os 30 minutos quanto o contrário. Inclua um link para um intérprete / compilador gratuito para o idioma escolhido, além de instruções sobre como compilar / executar seu código.
- Sua pontuação será do tamanho do quadro do Boggle para os dados de teste abaixo (sem contar as novas linhas). No caso de empate (por exemplo, porque várias pessoas conseguiram produzir uma solução ideal), o vencedor será o envio que produzirá essa solução ideal mais rapidamente.
- Você não deve otimizar seu código especificamente para os dados de teste. Se eu suspeito que alguém o faça, reservo-me o direito de gerar novos dados de teste.
Exemplo
Dadas as cordas
FOO
BAR
BOOM
Uma vez, você poderia colocá-los trivialmente em uma placa Boggle 4x3:
FOOX
BARX
BOOM
Fazendo uso do fato de que as strings não precisam ser retas, podemos compactá-las para 5x2:
BORFO
OMABO
Mas podemos torná-lo ainda menor reutilizando caracteres entre diferentes cadeias e ajustando-as em 4x2:
FOOM
BARX
Agora o B
é usado para ambos BOOM
e BAR
, e o OO
é usado para ambos BOOM
e FOO
.
Dados de teste
Seu envio será testado nas 50 seqüências a seguir. Para fins de teste, você pode simplesmente usar subconjuntos menores desses dados, que devem ser executados mais rapidamente. Eu acredito que o limite inferior absoluto para esses dados de teste é uma placa com 120 caracteres, embora isso não seja necessariamente possível.
T
WP
GVI
CIHM
EGWIV
QUTYFZ
LWJVPNG
XJMJQWSW
JLPNHFDUW
SWMHBBZWUG
XVDBMDQWDEV
TIUGAVZVUECC
IWDICFWBPSPQR
MMNWFBGMEXMSPY
YIHYXGJXKOUOIZA
BZSANEJNJWWNUJLJ
XTRMGOVPHVZYLLKKG
FLXFVVHNTWLMRRQYFQ
VZKJRAFQIYSBSXORTSH
FNQDIGCPALCHVLHDNZAV
GEAZYFSBSWCETXFKMSWLG
KWIZCEHVBDHEBGDGCJHOID
SKMQPHJAPDQKKHGTIPJCLMH
ZSFQDNYHALSUVWESQVVEUIQC
HXHBESUFCCECHNSTQGDUZPQRB
DSLXVHMOMLUXVHCNOJCBBRPVYB
DVTXKAOYYYRBVAVPSUAOYHIPPWN
PJAIYAWHMTNHTQDZDERPZYQEMLBZ
SYNSHJNOIWESMKWTBIANYUAUNRZOS
WADGUKIHUUFVRVUIBFUXQIOLAWIXAU
LGLXUFIXBEPSOFCKIAHXSHVKZPCXVPI
LIUYFHITTUYKDVQOZPNGZLWOZSRJTCTZ
IZDFTFFPNEBIYGVNTZHINICBXBXLBNBAL
BSKQNTPVUAVBXZGHVZCOUCRGCYISGFGYAS
DPGYYCIKDGCETXQOZGEQQLFQWACMVDTRYAT
RQDNIPGUHRYDRVHIPJLOWKBXMIBFAWCJGFMC
PFKOAGEQLXCMISSVEARWAPVYMRDCLSLPJOMQQ
EQPCNHQPTWABPFBVBXHQTFYELPNMNCWVKDDKGR
RAHTJMGIQJOJVWJBIHVRLJYVCSQJCKMEZRGRJMU
SZBJBPQYVYKDHAJHZMHBEWQEAQQKIEYCFACNLJBC
ANVDUCVXBPIZVRAXEBFEJOHSYKEKBIJELPIWEYXKH
DJUNPRLTISBFMGBEQNXSNUSOGDJNKESVKGAAMTIVXK
TZPUHDSHZFEURBNZTFBKXCDPYRELIAFMUWDIQTYWXGU
FJIKJROQSFSZUCGOOFJIEHBZREEUUSZWOLYFPCYHUSMR
TPMHJEAWVAJOCSDOPMQMHKRESBQSTRBXESYGCDVKLFOVS
ABJCCDJYMYDCYPZSGPGIAIKZQBYTZFDWYUZQBOESDSDGOY
IIHKTVPJNJDBCBOHCIYOPBKOVVKGNAKBDKEEKYIPRPHZOMF
IABGEPCSPNSMLVJBSGLRYNFSSYIALHWWAINTAVZAGJRVMDPW
GFMFVEFYJQJASVRIBLULUEHPMZPEXJMHIEMGJRMBLQLBDGTWT
YPWHLCVHQAVKVGHMLSOMPRERNHVYBECGCUUWTXNQBBTCMVTOVA
Verificador
Você pode usar o seguinte snippet de pilha para verificar se um quadro do Boggle contém todas as seqüências de caracteres em uma determinada lista. Eu portado o código de pesquisa Boggle da resposta do edc65 aqui . Deixe-me saber se algo parece com erros.