Corrcey my Soellign

10

Introduciton

Certains d'entre vous ont peut-être réalisé que je suis un typer bâclé lorsque j'utilise mon téléphone. C'est pourquoi je veux que vous écriviez un programme qui corrige mes fautes de frappe.

Chalkrnge

Étant donné un mot mal orthographié, affichez tous les mots possibles que je voulais écrire.

Typso

La principale cause de mes fautes de frappe est due au fait que j'ai frappé les mauvaises clés et souvent la clé à côté. Voici ma disposition de clavier:

q w e r t y u i o p
 a s d f g h j k l
   z x c v b n m
   , [ space ] .

Notez que la rangée du bas , [ space ] .ne sera jamais utilisée dans ce défi

Pour une raison quelconque, je ne fais que des erreurs horizontalement: je ne toucherais jamais le n au lieu du j , mais je pourrais toucher un f au lieu d'un d .

Par exemple, je pourrais finir par épeler le mot bâclé comme:

akioot

Où je suis allé à gauche de chaque touche.

Cependant, n'oubliez pas que je ne ferai pas nécessairement une erreur sur chaque lettre du mot.

Ezsmple

Disons que l'entrée est:

vid

Les possibilités que le mot aurait pu être sont:

vid cid bid
vis cis bis
vif cif bif
vod cod bod
vos cos bos
vof cof bof
vud cud bud
vus cus bus
vuf cuf buf

Parmi ceux-ci, les suivants sont dans le dictionnaire:

cod
cud
bid
bud
bus

Cela devrait donc être votre sortie.

Rulws

Vous ne devez utiliser que le fichier texte trouvé ici comme dictionnaire: http://mieliestronk.com/corncob_lowercase.txt . Vous n'avez pas à compter ce fichier dans le cadre de votre décompte d'octets.

Toutes les entrées seront un seul mot. Vous pouvez afficher votre sortie comme vous le souhaitez (tant qu'il existe une sorte de séparateur).

Supposons qu'avec toutes les entrées, vous trouverez une variante qui se trouve dans le dictionnaire.

Wibninf

Le code le plus court en octets gagne.

Beta Decay
la source
11
Quand j'ai vu le titre, je pensais que ça allait être un autre défi pour le gallois ...
Martin Ender
Je suppose que la compression du dictionnaire fait partie du défi, et que si je choisis de lire le dictionnaire à partir d'un fichier, je devrais compter sa longueur dans mon score, mais cela devrait être rendu explicite pour le bénéfice des personnes qui n'ont pas lu le ensemble de méta. PS Si vous allez publier quelque chose dans le bac à sable, laissez-le là assez longtemps pour obtenir des commentaires.
Peter Taylor
@PeterTaylor Eh bien pas vraiment, c'est principalement juste l'analyse du dictionnaire qui peut être fait non compressé.
Beta Decay
Donc, si j'inline le fichier, qu'est-ce que je compte? Deux octets pour la délimitation ""?
Peter Taylor
@PeterTaylor Eh bien oui
Beta Decay

Réponses:

1

Japt, 50 47 octets

;D=R+Dv;W=3pUl¹óW ®s3 s1 £DgDbUgY)-X+1}Ãf@~V·bX

L'entrée est le mot à corriger et le dictionnaire sous forme de chaîne. Testez-le en ligne! (Remarque: vous devrez coller manuellement le dictionnaire dans la chaîne.)

Comment ça fonctionne

;D=R+Dv;W=3pUl¹óW ®s3 s1 £DgDbUgY)-X+1}Ãf@~V·bX  // Implicit: U = input, V = dictionary, R = newline
;                                                // Re-assign preset variables. D = "QWERTYUIOP\nASDFGHJKL\nZXCVBNM";
 D=R+Dv;                                         // Convert D to lowercase and prepend a newline.
        W=3pUl¹                                  // Set W to 3 to the power of U.length.
               óW                                // Create the range [W, W+W).
                  ®                       Ã      // Map each item Z in the range by this function:
                   s3                            //  Take Z.toString(3).
                      s1                         //  Remove the first character.
                                                 //  If the input is two chars long, e.g. "id", the array is now
                                                 //  ["00", "01", "02", "10", "11", "12", "20", "21", "22"].
                         £            }          //  Map each char X and index Y in the string by this function:
                              UgY                //   Get the char at position Y in U.
                            Db   )               //   Take the index of the char in D.
                                  -X+1           //   Subtract X and add 1.
                          Dg                     //   Get the char at that position in D.
                                                 // This maps our array for "id" to:
                                                 // ["of", "od", "os", "if", "id", "is", "uf", "ud", "us"].
                                        f@       // Filter to only the items X where
                                             bX  //  the index of X in
                                           V·    //  the dictionary, split at newlines,
                                          ~      //  is not -1.
                                                 // This filters our array for "id" to:
                                                 // ["of", "if", "id", "is", "us"].
                                                 // Implicit: output last expression
ETHproductions
la source
2

Python 2.7, 161 159 octets

from itertools import*
lambda a,k=' qwertyuiop asdfghjkl zxcvbnm ':set(map(''.join,product(*[k[k.index(l)-1:k.index(l)+2].strip()for l in a])))&set("<dictionary>".split())

version lisible

from itertools import *
dictionary=set("<dictionary>".split())
keyboard=' qwertyuiop asdfghjkl zxcvbnm '
x=[]
for letter in input():
 index=keyboard.index(letter)
 x.append(keyboard[index-1:index+2].strip())

words=set(map(''.join,product(*x)))
print words&dictionary
  • 1 octet enregistré grâce à @TuukkaX
Barre
la source
Vous avez un espace blanc inutile .strip() for.
Yytsi