Corrcey il mio Soellign


10

Introduciton

Alcuni di voi potrebbero aver capito che io sono un tifone sciatto quando uso il mio telefono. Ecco perché voglio che tu scriva un programma che corregga i miei errori di battitura.

Chalkrnge

Data una parola errata, produce tutte le possibili parole che intendevo scrivere.

Typso

La causa principale dei miei errori di battitura è dovuta al fatto che ho premuto le chiavi sbagliate e spesso ho colpito la chiave della porta accanto. Quello che segue è il mio layout di tastiera:

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 ] .

Si noti che la riga inferiore , [ space ] .non verrà mai utilizzata in questa sfida

Per qualche ragione, faccio solo errori in orizzontale: non colpirei mai n invece di j , ma potrei colpire una f invece di una d .

Ad esempio, potrei finire per scrivere la parola sciatta come:

akioot

Dove sono andato a sinistra di ogni chiave.

Tuttavia, non dimenticare che potrei non fare necessariamente un errore su ogni lettera della parola.

Ezsmple

Diciamo che l'input è:

vid

Le possibilità che la parola avrebbe potuto essere sono:

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

Di questi, i seguenti sono nel dizionario:

cod
cud
bid
bud
bus

Quindi dovrebbe essere il tuo risultato.

Rulws

Dovresti usare solo il file di testo trovato qui come dizionario: http://mieliestronk.com/corncob_lowercase.txt . Non è necessario contare questo file come parte del conteggio dei byte.

Tutti gli input saranno una sola parola. È possibile visualizzare l'output nel modo desiderato (purché sia ​​presente un tipo di separatore).

Supponiamo che con tutti gli input, troverai una variante che si trova nel dizionario.

Wibninf

Vince il codice più breve in byte.


11
Quando ho visto il titolo, ho pensato che sarebbe stata un'altra sfida per il gallese ...
Martin Ender,

Presumo che comprimere il dizionario sia parte della sfida e che se scelgo di leggere il dizionario da un file dovrei contare la sua lunghezza per il mio punteggio, ma ciò dovrebbe essere reso esplicito a beneficio delle persone che non hanno letto il intero di meta. PS Se hai intenzione di pubblicare qualcosa nella sandbox, lascialo lì abbastanza a lungo per ottenere un feedback.
Peter Taylor,

@PeterTaylor Beh, non proprio, è principalmente l'analisi del dizionario che può essere eseguita non compressa.
Decadimento beta

Quindi se inserisco il file, cosa conto? Due byte per la delimitazione ""?
Peter Taylor,

@PeterTaylor Beh sì
Decadimento beta

Risposte:


1

Japt, 50 47 byte

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

L'input è la parola da correggere e il dizionario come stringa. Provalo online! (Nota: dovrai incollare manualmente il dizionario nella stringa.)

Come funziona

;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

2

Python 2.7, 161 159 byte

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())

versione leggibile

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
  • Salvato 1 byte grazie a @TuukkaX

Hai uno spazio bianco inutile a .strip() for.
Yytsi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.