Digamos que você tenha uma lista de palavras e deseje usar cartões com letras para soletrar cada palavra. Por exemplo, para soletrar gato , você usaria três cartões rotulados C, A, T.
Supondo que cada cartão tenha dupla face , envie um programa para definir um número mínimo de cartões que podem ser usados para escrever a lista inteira de palavras.
Entrada é a lista de palavras, pode ser baseada em arquivo, codificada, linha de comando, qualquer que seja. Saída é a lista de cartões, formatados e ordenados como achar melhor, desde que fique claro como os cartões são rotulados.
O caso não é significativo: golfe, golfe e golfe são equivalentes.
Algumas dicas:
- o número de cartões não pode ser menor que o comprimento da palavra mais longa
- não faz sentido que um cartão tenha a mesma letra nos dois lados
- Embora o caso não seja significativo, recomende o uso de letras minúsculas para aproveitar certas simetrias
Exemplos, eles tiram vantagem de certas simetrias :
Entrada: ben, pântano, bug, covil, doe, cão, devido, cavado, Ed, final, gob, Deus, Ned, ode, caneta, Poe, pug
Saída: b / d, e / g, o / n
Entrada: um, e, macaco, são, ser, cama, broto, broca, Dan, Deb, dub, orelha, Ed, era, soneca, panela, ervilha, pub, Rae, correu, esfregar
Saída: a / b, d / r, e / n
Tornando-o um concurso de popularidade, é importante a elegância do código, o desempenho em tempo de execução e a inteligência (incluindo quebra de regras e brechas)!
Além disso : alguns perguntaram sobre simetrias "permitidas", se fontes especiais podem ser usadas e se os cartões podem ser dobrados.
Simetrias permitidas são quaisquer letras que se pareçam após rotação de 0, 90, 180 ou 270 graus. Isso inclui b / q, d / p e n / u. Eu também diria M / W, Z / N e, é claro, I / l (maiúscula i, minúscula L). Provavelmente estou arranhando a superfície, então, se houver alguém que você não tenha certeza, basta perguntar.
Para simplificar, restrinja a uma fonte sem serifa padrão, digamos que seja usada no SE.
No que diz respeito ao fold, enquanto você pode fazer algumas substituições incríveis, por exemplo, B pode ser D, E, F, I, P ou R e talvez C ou L, se você dobra de maneira criativa, acho que está dobrando, literalmente, demais !
Eu vim com esse problema enquanto brincava com algumas cartas semelhantes com meus filhos. Observei como era fácil criar cartões de um lado versus como era difícil criar cartões de dois lados.
Adição : Forneceu uma recompensa a ser concedida à resposta mais popular. Se houver um empate, será concedido a quem enviar primeiro.
Outra dica:
- resolver o problema de um lado dá uma idéia do número mínimo de cartões necessário (por exemplo, 20 cartões de um lado se traduz em pelo menos 10 cartões de dois lados necessários)
Adição : Oh, preocupe, eu estava ocupada e esqueci a recompensa expirando. Acabou indo para ninguém porque a única resposta foi enviada antes do início da recompensa! Me desculpe por isso.
n/u
,d/p
? Que talb/q
em/w
? E se eu dobrar umP
cartão em dois para que a metade superior se torneD
?Respostas:
C # - CardChooser
Sumário
Este aplicativo usa um método de força bruta para tentar resolver cada lista. Primeiro, crio uma lista de cartões em potencial para selecionar e, em seguida, determino qual é o melhor ajuste (remove o máximo de caracteres + reduz as palavras longas), adiciono isso a uma lista de resultados e continuo com esse processo até selecionar os cartões em potencial para remover todas as palavras da lista, eu recompensei esses cartões em cada palavra e imprimo a saída.
Se você deseja ver uma versão mais limitada desse código sem fazer o download e criar o aplicativo de formulários do Windows fornecido, pode usar o link fornecido para executar meu programa em conjuntos menores de dados, observe que esta é a versão do aplicativo de console, portanto, o resultado cartões NÃO são rotacionados: http://ideone.com/fork/VD1gJF
Histórico de Revisão
Atual - Adicionado melhor otimização de resultado sugerida por @Zgarb
Atualização 3 - Mais limpeza de código, mais bugs corrigidos, melhores resultados
Atualização 2 - Windows Forms, saída mais detalhada
Atualização 1 - Novo / melhor suporte para simetrias de caracteres
Original - Aplicativo de console
Exemplos
acr, popa, ain, sll, vitória, digamos, disse, rápido, épico
hes, vai, com, não vai, iria, não iria, ainda, você, você, você
aaaa, bbbb, cccc
Código
Ainda preciso combinar isso em um projeto maior com o código ConsoleApp e WindowsForms, todos compartilhando as mesmas classes e métodos, e depois dividir as diferentes regiões no método RunButton_Click para que eu possa escrever unidades em torno delas, de qualquer maneira, sempre que encontrar tempo para fazer isso. Vou, por enquanto é isso que tenho:
fonte
i
cartão?said
a última letra de não é W ou p