Seu desafio hoje é implementar uma funcionalidade do tipo t9 .
Você implementará uma função que terá apenas 2 parâmetros.
Você receberá 1 número de telefone em uma sequência e o conteúdo de um arquivo de texto com uma lista de palavras (não assuma um estilo específico de nova linha).
Você pode usar o link https://raw.githubusercontent.com/eneko/data-repository/master/data/words.txt para testar a funcionalidade ou usar /usr/share/dict/words
(marque Um arquivo de texto com uma lista de palavras [fechada] para mais em formação).
Você pode assumir que sempre receberá pelo menos 2 números.
Dado o número, você lerá uma lista de palavras e retornará as palavras que começam com as letras mapeadas para essas palavras. Isso significa que a entrada deve ser apenas números de 2 a 9.
Você pode fazer o que quiser se receber uma entrada inválida.
Se nenhuma correspondência for encontrada, você poderá retornar uma lista vazia, null
/ nil
ou 0
.
Lembre-se de que as teclas do telefone celular são mapeadas para seus caracteres equivalentes:
- 0 e 1 são inválidos
- 2 correspondências [abc]
- 3 combinados [def]
- 4 correspondências [ghi]
- 5 correspondências [jkl]
- 6 correspondências [mno]
- 7 correspondências [pqrs]
- 8 correspondências [tuv]
- e 9 correspondências [wxyz]
Exemplos:
f('52726')
//returns ["Japan","japan","Japanee","Japanese","Japanesque"...,"larbowlines"]
f('552')
//returns ["Kjeldahl","kjeldahlization","kjeldahlize"...,"Lleu","Llew"]
f('1234')
//makes demons fly out your nose or divide by 0
f('9999')
//returns ["Zyzzogeton"]
f('999999')
//returns [] or null/nil or 0
Depois de executar sua função, você pode imprimi-la da maneira que desejar.
Regras:
- As brechas padrão são INVÁLIDAS
- Você deve retornar algo, mesmo que seja
null
/nil
Javascript retornaráundefined
se você não retornar algo, portanto, esta regra. - Você não pode usar ou reimplementar as respostas de outras pessoas ou copiar minha implementação.
- Você pode assumir, para Javascript, que o navegador já estará aberto e que o
innerText
/textContent
do elemento automático será passado como o segundo parâmetro - Para linguagens compiladas, você não pode passar argumentos especiais para o compilador
- Você pode receber o nome do arquivo pelos argumentos do compilador
- Variáveis, macros, variáveis globais, constantes, classes não padrão e toda a classificação que passa outros valores dentro da função serão consideradas inválidas.
- Em Javascript, variáveis sem a palavra-chave
var
invalidam seu código - Sua função será nomeada
f
- Você pode ter apenas 2 argumentos em sua função
- Tente manter seu código em 500 segundos para executar.
- Você não precisa se preocupar com espaço em branco
- Você deve usar apenas caracteres imprimíveis ASCII .
Exceções são idiomas que usam apenas caracteres não imprimíveis (APL e espaço em branco são 2 exemplos).
Pontuação:
- Menor número de bytes ganhos
- Ter caracteres imprimíveis ASCII inválidos em sua resposta contará como a resposta sendo codificada em UTF-32.
A exceção à codificação fará com que sua resposta seja contada por caracteres . - Apenas o corpo da função conta, não conte mais nada que você faça fora dele
- Bônus de -30% se você criar um sistema de previsão com base na vizinhança ou nas palavras mais comuns
- Bônus de -20% em tamanho, se você retornar apenas as 5 primeiras correspondências para cada letra correspondente ao primeiro número (por exemplo: 245 retornaria 5 palavras começando com 'a', 5 começando com 'b' e 5 começando com 'c' )
Aqui está um exemplo de implementação, usando Javascript:
function f(phone, words)
{
var keypad=['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz'];
var regex='';
for(var i=0,l=phone.length;i<l;i++)
{
regex+='['+keypad[phone[i]]+']';
}
var regexp=new RegExp('\\s('+regex+'[a-z]*)\\s','gi');
return words.match(regexp);
}
Para executá-lo, abra o link da lista e execute, por exemplo:
f('9999',document.getElementsByTagName('pre')[0].innerText);
//returns [" Zyzzogeton "]
Este exemplo foi testado e funciona no Opera 12.17 64bits no Windows 7 Home Edition 64bits.
Respostas:
CJam, 28 bytes
Recebe entrada na forma de
"<number>" [<list of words>]
Exemplo:
Resultado:
Não vou receber nenhum bônus por enquanto.
Experimente o código online aqui, mas para medições de tempo reais, execute-o no compilador Java
Observe que o CJam representa listas vazias como
""
Para converter a lista de palavras bruta em lista CJam, use o seguinte código com a lista de palavras como entrada:
fonte
Java: 395
Isso forma um padrão de regex com base nas letras permitidas para cada número e, em seguida, tachinha um. * No final para corresponder aos caracteres a seguir.
Aqui está a versão do golfe:
E aqui está a versão ungolfed para capacidade de leitura
fonte
f
".([W-Zw-z)]
) deve ser([W-Zw-z])
. E no Code-golf, você não precisa se preocupar com estilos de programação e boas práticas: seu código deve simplesmente funcionar com os parâmetros necessários. Se você verificar a minha resposta, você verá esta linha:$s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];
. Este é um terrível "crime" em PHP. Basicamente, estou forçando o PHP a converter constantes não existentes em strings. Isso é perfeitamente aceitável. Você também vai ver que eu não estou nem definindo a variável$t
para uma matriz antes de usá-la como talC # .NET 4.5 235
Isso deve funcionar:
fonte
foreach
. Se você espera que já existaIEnumerable
, inclua o código usado foraa
var.a
var. Mas realmente vejo melhorias visíveis! Mantenha o bom trabalho.Python 2 (155 bytes)
Também deve funcionar no Python 3 com as substituições apropriadas (
string
->bytes
,b
prefixo nas strings, etc.).Eu não tinha certeza se a
maketrans
chamada fora da função é considerada "justa"; caso contrário, a função terá 134 bytes e será movida para dentro.EDIT: caiu um byte de uma supervisão estúpida.
Com preparado
maketrans
, 67 bytes:Com
maketrans
no corpo, 134 bytes:Com
import
emaketrans
no corpo, 155 bytes:Chamada de teste:
fonte
maketrans
faz parte do corpo da função. Você deveria movê-lo. Não sei se é possível, mas você pode tentar usar diretamente oimport
. Eu acho que vi em algum lugar ... Mas seu código é muito bom!t=(from stirng import maketrans)([...])
. Não faço ideia se é possível. Mas talvez você possa usar ofrom string import as x t=x([...])
que não tenho certeza se é possível também: /__import__('string').maketran
.PHP 5.4+ (
171186-20% = 148,8 bytes):Bem, esta é uma resposta bastante grande, mas bem.
Espero que isso traga mais pessoas para responder.
Esta função espera que o conteúdo bruto esteja sendo lido.
Aqui está o código:
Isso funciona verificando se a letra está na lista de letras permitidas.
Exemplo: a entrada
36
faria para verificar se1abc
tem a primeira letra da palavra e se1def
tem a segunda letra.Acrescento
1
que não verifique se a carta está na 1ª posição (que retornaria0
e que seria avaliada comofalse
).if(!strpos(1..$s[$c],$v[$i]))
ouif(!strpos($c.$s[$c],$v[$i]))
terá o mesmo efeito, mas o primeiro confunde mais e eu gosto.Se não o fizer, removerá a palavra.
Sem palavras, ele retorna uma matriz vazia.
Para testar isso online, acesse http://writecodeonline.com/php/ e crie uma variável simples com uma palavra para linha.
Um exemplo testável:
Isso deve gerar:
Para trabalhar em versões php mais antigas, substitua
$s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];
por$s=array(2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz);
Para o bônus de 20%:
Para reduzir o código, simplesmente adicionei
||$t[$v[0]]++>4
, que verifica quantas vezes a primeira letra foi usada.No php,
$t
não precisa ser definido, ajudando a reduzir um grande pedaço de 37,2 bytes.Para ver esse efeito, use a seguinte variável como o segundo argumento:
fonte