Votre défi aujourd'hui est d'implémenter une fonctionnalité de type t9 .
Vous implémenterez une fonction qui n'aura que 2 paramètres.
Vous recevrez 1 numéro de téléphone dans une chaîne et le contenu d'un fichier texte avec une liste de mots (ne supposez pas un style de nouvelle ligne spécifique).
Vous pouvez utiliser le lien https://raw.githubusercontent.com/eneko/data-repository/master/data/words.txt pour tester la fonctionnalité, ou utiliser /usr/share/dict/words
(consultez Un fichier texte avec une liste de mots [fermé] pour en savoir plus information).
Vous pouvez supposer que vous recevrez toujours au moins 2 numéros.
Étant donné le nombre, vous lirez une liste de mots et retournerez les mots commençant par les lettres correspondant à ces mots. Cela signifie que l'entrée ne doit être composée que de 2 à 9.
Vous pouvez faire ce que vous voulez si vous recevez une entrée non valide.
Si aucune correspondance n'est trouvée, vous pouvez renvoyer une liste vide, null
/ nil
ou 0
.
N'oubliez pas que les touches du téléphone portable sont mappées à leurs caractères équivalents:
- 0 et 1 ne sont pas valides
- 2 correspondances [abc]
- 3 appariés [def]
- 4 matchs [ghi]
- 5 correspondances [jkl]
- 6 correspondances [mno]
- 7 correspondances [pqrs]
- 8 correspondances [tuv]
- et 9 correspondances [wxyz]
Exemples:
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
Après avoir exécuté votre fonction, vous pouvez l'imprimer comme vous le souhaitez.
Règles:
- Les failles standard ne sont pas valides
- Vous devez retourner quelque chose, même si c'est
null
/nil
Javascript retourneraundefined
si vous ne retournez pas quelque chose, donc cette règle. - Vous ne pouvez pas utiliser ou réimplémenter les réponses des autres ou copier ma mise en œuvre.
- Vous pouvez supposer, pour Javascript, que le navigateur sera déjà ouvert et que le
innerText
/textContent
de l'élément automatique sera passé comme 2ème paramètre - Pour les langues compilées, vous ne pouvez pas passer d'arguments spéciaux au compilateur
- Vous pouvez recevoir le nom de fichier sur les arguments du compilateur
- Les variables, macros, variables globales, constantes, classes non standard et tout le tri passant d'autres valeurs à l'intérieur de la fonction seront considérés comme invalides.
- En Javascript, les variables sans le mot clé
var
rendent votre code invalide - Votre fonction sera nommée
f
- Vous ne pouvez avoir et seulement que 2 arguments sur votre fonction
- Essayez de garder votre code sous 500 secondes pour l'exécuter.
- Vous n'avez pas à vous soucier des espaces blancs
- Vous devez utiliser uniquement des caractères imprimables ASCII .
Les exceptions sont les langues qui n'utilisent des caractères non-imprimables (APL et espaces blancs sont 2 exemples).
Notation:
- Plus petit nombre d'octets gagne
- La présence de caractères imprimables ASCII invalides dans votre réponse comptera comme la réponse codée en UTF-32.
L'exception au codage fera que votre réponse sera comptée par caractères . - Seul le corps de la fonction compte, ne comptez rien d'autre que vous faites en dehors
- Bonus de -30% si vous faites un système de prédiction basé sur le quartier ou les mots les plus courants
- Bonus de -20% si vous ne renvoyez que les 5 premières correspondances pour chaque lettre correspondant au premier chiffre (par exemple: 245 renvoie 5 mots commençant par «a», 5 commençant par «b» et 5 commençant par «c» ).
Voici un exemple d'implémentation utilisant 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);
}
Pour l'exécuter, ouvrez le lien de liste et exécutez, par exemple:
f('9999',document.getElementsByTagName('pre')[0].innerText);
//returns [" Zyzzogeton "]
Cet exemple a été testé et fonctionne sous Opera 12.17 64bits sur Windows 7 Home Edition 64bits.
Réponses:
CJam, 28 octets
Prend des informations sous la forme de
"<number>" [<list of words>]
Exemple:
Production:
Je ne veux aucun bonus pour l'instant.
Essayez le code en ligne ici, mais pour les mesures de temps réelles, exécutez-le sur le compilateur Java
Notez que CJam représente des listes vides comme
""
Pour convertir la liste de mots bruts en liste CJam, utilisez le code suivant avec la liste de mots en entrée:
la source
Java: 395
Cela forme un modèle d'expression régulière basé sur les lettres autorisées pour chaque numéro, puis clique sur un. * À la fin pour correspondre aux caractères suivants.
Voici la version golfée:
Et voici la version non golfée pour la lisibilité
la source
f
".([W-Zw-z)]
), elle devrait l'être([W-Zw-z])
. Et sur Code-golf, vous n'avez pas à vous soucier des styles de programmation et des bonnes pratiques: votre code doit simplement faire sa chose avec les paramètres requis. Si vous cochez ma réponse, vous verrez cette ligne:$s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];
. C'est un terrible «crime» en PHP. Fondamentalement, je force PHP à convertir des constantes non existantes en chaînes. C'est parfaitement acceptable. Vous verrez également que je ne mets même pas la variable$t
sur un tableau avant de l'utiliser comme telleC # .NET 4.5 235
Cela devrait fonctionner:
la source
foreach
. Si vous vous attendez à ce qu'il soit déjàIEnumerable
, incluez le code utilisé à l'extérieura
var.a
var. Mais je vois vraiment des améliorations notables! Continuez votre bon travail.Python 2 (155 octets)
Devrait également fonctionner en Python 3 avec les remplacements appropriés (
string
->bytes
,b
préfixe sur les chaînes, etc.).Je ne savais pas si avoir l'
maketrans
appel en dehors de la fonction était considéré comme "juste"; sinon, la fonction fait 134 octets avec elle déplacée à l'intérieur.EDIT: Suppression d'un octet d'une erreur stupide.
Avec préparé
maketrans
, 67 octets:Avec
maketrans
dans le corps, 134 octets:Avec
import
etmaketrans
dans le corps, 155 octets:Appel d'essai:
la source
maketrans
fait partie du corps de fonction. Vous devez le déplacer. Je ne sais pas si c'est même possible, mais vous pouvez essayer d'utiliser directement leimport
. Je pense l'avoir vu quelque part ... Mais votre code est vraiment sympa!t=(from stirng import maketrans)([...])
. Je n'ai aucune idée si c'est même possible. Mais peut-être pouvez-vous utiliserfrom string import as x t=x([...])
ce que je ne suis pas sûr si c'est possible aussi: /__import__('string').maketran
.PHP 5.4+ (
171186-20% = 148,8 octets):Eh bien, c'est une réponse assez énorme, mais bon.
J'espère que cela amènera plus de gens à répondre.
Cette fonction attend que le contenu brut soit lu.
Voici le code:
Cela fonctionne en vérifiant que la lettre figure dans la liste des lettres autorisées.
Exemple: l'entrée
36
ferait pour vérifier si1abc
a la première lettre du mot et qui1def
a la 2ème lettre.J'ajoute
1
donc il ne vérifie pas si la lettre est en 1ère position (qui reviendrait0
et qui serait évaluéefalse
).if(!strpos(1..$s[$c],$v[$i]))
ouif(!strpos($c.$s[$c],$v[$i]))
aura le même effet, mais le 1er confond plus et j'aime ça.À défaut, le mot sera supprimé.
Sans aucun mot, il renvoie un tableau vide.
Pour tester cela en ligne, allez sur http://writecodeonline.com/php/ et créez une variable simple avec un mot pour la ligne.
Un exemple testable:
Cela devrait produire:
Pour travailler sur les anciennes versions de php, remplacez
$s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];
par$s=array(2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz);
Pour le bonus de 20%:
Pour réduire le code que j'ai simplement ajouté
||$t[$v[0]]++>4
, qui vérifie combien de fois la première lettre a été utilisée.En php,
$t
n'a pas besoin d'être défini, ce qui permet de réduire un gros morceau de 37,2 octets.Pour voir cet effet, utilisez la variable suivante comme 2e argument:
la source