Eu tenho um cadeado de combinação que tem letras em vez de números. É assim: http://pictures.picpedia.com/2012/09/Word_Combination_Padlock.jpg Existem 5 cilindros, cada um com 10 letras diferentes.
A maioria das pessoas gosta de usar uma palavra para sua combinação, em vez de uma sequência arbitrária de letras. (Menos seguro, é claro, mas mais fácil de lembrar.) Portanto, ao fabricar a fechadura, seria bom construí-la para ter uma combinação de letras que possam ser usadas para criar o máximo possível de palavras em inglês de 5 letras.
Sua tarefa, se você optar por aceitá-la, é encontrar uma atribuição de letras para as bobinas que permita criar o maior número possível de palavras. Por exemplo, sua solução pode ser
ABCDEFGHIJ DEFGHIJKLM ZYXWVUTSR ABCDEFGHIJ ABCDEFGHIJ
(Se você não estava se sentindo muito imaginativo).
Para obter consistência, use a lista de palavras em http://www.cs.duke.edu/~ola/ap/linuxwords
Qualquer palavra de 5 letras nessa lista está OK, incluindo nomes próprios. Ignore Sino e L'vov e qualquer outra palavra na lista que contenha um caracter não az.
O programa vencedor é aquele que produz o maior conjunto de palavras. No caso de vários programas encontrarem o mesmo resultado, o primeiro a ser publicado vence. O programa deve ser executado em menos de 5 minutos.
Edit: desde que a atividade acabou, e nenhuma solução melhor saiu, declaro Peter Taylor o vencedor! Obrigado a todos por suas soluções criativas.
fonte
Respostas:
1275 palavras simples simples ganancioso
O código é c #. A solução produzida é
Estou usando esse formato de saída porque é realmente fácil de testar:
fonte
Main
método para chamar_Main
métodos diferentes .Python (3), 1273 ≈ 30,5%
Essa é uma abordagem realmente ingênua: mantenha um registro da frequência de cada letra em cada posição e elimine a "pior" letra até que as letras restantes caibam nos rolos. Estou surpreso que pareça se sair tão bem.
O mais interessante é que tenho quase exatamente a mesma saída que a solução C # 1275, exceto que tenho um
N
no meu último rolo em vez deA
. EssaA
foi a minha décima primeira eliminação também, mesmo antes de jogar fora aV
e aG
.Produz:
fonte
Mathematica , 1275 palavras repetidas vezes ...
Este código não é golfado, pois a pergunta não parece exigir isso.
A contagem de palavras rapidamente (menos de 10 segundos) evolui para 1275 na maioria das execuções, mas nunca ultrapassa isso. Tentei perturbar as letras mais de uma por vez, na tentativa de sair do máximo local teórico, mas isso nunca ajudou. Eu suspeito fortemente que 1275 é o limite para a lista de palavras fornecida. Aqui está uma corrida completa:
Aqui estão algumas outras seleções "vencedoras":
Como Peter comenta, essas são realmente a mesma solução em diferentes ordens. Ordenado:
fonte
shortlist
parece longo, e embora este não seja o Golf, eu gostaria de algo mais curto. Você pode ajudar?Python, 1210 palavras (~ 29%)
Supondo que contei as palavras corretamente desta vez, isso é um pouco melhor que a solução de FakeRainBrigand. A única diferença é que eu adiciono cada rolo na ordem e removo todas as palavras da lista que não correspondem ao rolo, para obter uma distribuição um pouco melhor para os próximos rolos. Por esse motivo, fornece exatamente o mesmo primeiro rolo.
O programa gera
fonte
iPython (
273210 bytes, 1115 palavras)1115/4176 * ~ 27%
Eu calculei isso no iPython, mas meu histórico (aparado para remover a depuração) ficou assim.
Se estamos indo para breve; Eu poderia aparar isso.
Encurtado:
Meus resultados foram:
['sbcapfdtmg', 'aoeirulhnt', 'aironeluts', 'etnlriaosc', 'seyrdtnlah']
.* Minha matemática no 4176 pode ser um pouco curta devido a palavras com hífens ou apóstrofos sendo omitidos
fonte
Q
? (todo) words
As palavras devem ser armazenadas em um arquivo chamado
words
Funciona em cerca de 170 ms no meu i7. Ele analisa a lista de palavras, procurando a letra mais comum em cada posição (obviamente filtrando os não candidatos). É uma solução ingênua e preguiçosa, mas produz um resultado razoavelmente bom com código mínimo.
Resultados:
fonte
Editar: Agora que as regras foram modificadas, essa abordagem é desqualificada. Vou deixar aqui, caso alguém esteja interessado, até que eu possa modificá-lo para as novas regras.
Python: 277 caracteres
Tenho certeza de que a versão generalizada desse problema é NP-Hard, e a pergunta não exigia encontrar a solução mais rápida , então aqui está um método de força bruta para fazer isso:
Observe que renomeei o arquivo da lista de palavras para apenas "w" para salvar alguns caracteres.
A saída é o número de palavras possíveis de uma determinada configuração seguida pela própria configuração:
A última linha de saída antes do término do programa é garantida como a solução ideal.
fonte