Parece haver essa mania contínua de as pessoas aprenderem tediosamente novos layouts de teclado como Dvorak ou Neo, porque supostamente os torna mais produtivos. Argumento que mudar os layouts de teclado é uma péssima idéia, pois pode levar meses para você acelerar, e quando você é 5% mais rápido que o resto, fica ferrado se precisar digitar em um computador que não seja é seu.
Além disso, todas essas pessoas esquecem onde está o verdadeiro gargalo na comunicação moderna - o teclado do telefone.
É assim que o teclado de um telefone comum se parece:
A letra 'r' é a terceira letra no botão 7; portanto, se você digitar a letra 'r' em um celular, pressione o botão 7 três vezes, para 's' pressione 4 vezes e para 'a' pressione o botão 2 uma vez.
Considerando isso, colocar 'e' depois de 'd' provavelmente foi uma má decisão - 'e' é a letra mais usada no alfabeto inglês; portanto, se você rotular o botão 3 "EDF" em vez de "DEF", você economizaria bastante pressionamentos de tecla.
Além disso, você provavelmente já experimentou que digitar 2 letras que compartilham o mesmo botão é um incômodo - se você quiser escrever "TU", não poderá pressionar 8 três vezes, porque isso resultaria em 'V'. Geralmente, você escreve 'T', pressiona o espaço, pressiona o backspace e depois escreve 'U', que é igual a 5 pressionamentos de botão em vez de 3.
TL; DR
Dadas estas duas regras:
- Uma letra é digitada pressionando um botão n vezes, em que n é a posição em que a letra está no rótulo do botão
- Escrever duas letras digitadas usando o mesmo botão requer mais 2 pressionamentos de botão
Qual é o layout do teclado do telefone que requer o menor número de pressionamentos de botão, considerando um texto específico? Você deve usar apenas os botões 2-9, 1 e 0, reservados para símbolos especiais.
Entrada
O texto para o qual você deve encontrar o layout ideal é fornecido via stdin. Você não precisa manipular nada além do alfabeto em minúsculas e pode assumir que a entrada consiste apenas nisso. Você também pode assumir que o texto de entrada é razoavelmente grande e que todas as letras estão lá pelo menos uma vez, se isso ajudar.
Saída
Não quero impor muitas restrições à saída, pois isso às vezes dá vantagens a alguns idiomas em relação a outros; portanto, no entanto, seu idioma mostra que as matrizes são boas. Como alternativa, você pode separar cada rótulo com uma nova linha.
Pode haver vários layouts ideais possíveis, você pode imprimir qualquer um deles. Aqui está um exemplo simples:
>> echo "jackdawslovemybigsphinxofquartz" | foo.sh
ojpt
avhz
cen
skm
dyf
wbq
ixu
lgr
Pontos bônus
-35 se o seu algoritmo não forçar brutalmente todos os layouts possíveis (eu estou vendo as permutações de Haskell aqui)
-3 se o seu código couber em uma mensagem de texto (140 caracteres) e você publica uma foto sua enviando o código a um amigo.
Este é o meu primeiro desafio no StackExchange. Ficaria feliz em saber se você gosta ou tem algum outro feedback sobre isso!
26! / (2! * 6!) = 280,063,514,671,253,913,600,000 > 2^77
permutações únicas, contando reorganizações simples das teclas apenas uma vez.