Atalhos de menu
Tradicionalmente, os menus do usuário são acessíveis por atalhos de teclado, como Alt + (a letter)
, ou simplesmente pressionando a letra, quando todas as caixas de texto estão fora de foco ( estilo gmail ).
Sua tarefa
Dadas as entradas do menu como uma entrada, sua tarefa é conceder a cada entrada do menu uma letra de atalho adequada.
Escreva uma função ou um programa que aceite um conjunto de palavras - as entradas do menu (como uma matriz de seqüências de caracteres ou seu idioma equivalente) e retorne um dicionário ou um mapa de hash de uma única letra para uma entrada do menu.
Você pode usar um parâmetro e retornar um valor ou usar o STDIN e enviar seus resultados para STDOUT. Você não tem permissão para assumir que uma variável global / escopo já está preenchida com a entrada.
Algoritmo para determinar a letra correta
- Basicamente, é a primeira letra disponível da palavra. Veja suposições e exemplos abaixo.
- Caso todas as letras da entrada não estejam disponíveis, o atalho será
(a letter) + (a number)
. Qual letra você escolhe da entrada é arbitrária. O número deve começar de 0 e ser incrementado por 1 - de modo que todos os atalhos sejam exclusivos. Veja o terceiro exemplo abaixo.
Premissas
- A entrada será um conjunto, ou seja, sem repetições, cada entrada é única.
- O comprimento da entrada pode ser qualquer número inteiro não negativo (até MAX_INT do seu idioma).
- Distinção entre maiúsculas e minúsculas: a entrada diferencia maiúsculas de minúsculas (mas permanecerá exclusiva ao ignorar maiúsculas e minúsculas). Os resultados devem conter as entradas originais com sua caixa original. No entanto, as letras de atalho de saída não diferenciam maiúsculas de minúsculas.
- Todas as palavras de entrada não terminam com números.
- Nenhuma "entrada ruim" será testada. "Entrada incorreta" é tal que você precisa incrementar o contador de uma determinada letra mais de 10 vezes.
Exemplos
Os exemplos abaixo estão em JSON, mas você pode usar o idioma equivalente para uma matriz e um dicionário ou, caso esteja usando STD I / O, qualquer formato legível para sua entrada e saída (como csv ou até espaço). valores separados).
1
Input: ['File', 'Edit', 'View', 'Help']
Output: {f:'File', e:'Edit', v:'View', h:'Help'}
2)
Input: ['Foo', 'Bar', 'FooBar', 'FooBars']
Output: {f:'Foo', b:'Bar', o:'FooBar', a:'FooBars'}
3)
Input: ['a', 'b', 'aa', 'bb', 'bbq', 'bbb', 'ba']
Output: {a:'a', b:'b', a0:'aa', b0:'bb', q:'bbq', b1:'bbb', b2:'ba'}
Condições vencedoras
O menor código vence. Somente ASCII é permitido.
['ab', 'a']
dar{a:'ab', a0:'a'}
ou{b:'ab', a:'a'}
?Respostas:
Javascript ( ES6 )
106105100Essa função recebe entrada como uma matriz e gera um objeto javascript.
Resultados:
Sem Golfe / Comentado:
fonte
['a', 'aa', 'aaa', 'aaaa', 'aaaaa', 'aaaaaa', 'aaaaaaa', 'aaaaaaaa', 'aaaaaaaaa', 'aaaaaaaaaa', 'aaaaaaaaaaa', 'aaaaaaaaaaaa']
, mas acho que podemos ignorar esses casos extremos, não podemos?11
? Você não pode pressionar a tecla de um duas vezes em um atalho de teclado: PPython 2.x -
176 170157114 bytesAbordagem muito simples, mas alguém tem que começar o jogo.
Exemplos:
Eu acho que a única explicação necessária é o código não destruído. (Esta é realmente a versão original)
fonte
JavaScript (ECMAScript 6) - 107 caracteres
Explicação:
Testes:
fonte
PHP> = 5.4 - 149 caracteres
De acordo com os padrões do PHP (insira sniggers aqui) , a entrada não é válida como JSON, pois ela é usada em
'
vez de"
, então eu tenho sido um pouco atrevido e estou usando a Entrada como uma declaração de variável real:Usando os exemplos:
Não-golfificado é bem básico:
fonte
json_encode
chamada).echo
não funciona com matrizes; masprint_r($c);
faria isso, economizando 9 bytes.str_split(strtoupper($w))
eucfirst($w[0])
pode resolver isso (+21); ou$s=strtoupper($w);
(+18)PowerShell ,
9183 bytesExperimente online!
Emite uma exceção se um atalho adequado não for encontrado.
Desenrolado:
fonte
PHP, 153 bytes
executar com
php-r '<code>' <<EOF
+ Enter +<word1>
+ Enter +<word2>
+ Enter + ... +EOF
+ Entertrabalhando no argv por 155 bytes :
correr com
php -r '<code>' <word1> <word2> ...
(-13 bytes com um global definido: em
foreach($i as$w)
vez deforeach($argv as$i=>$w)if($i)
)fonte