Corrcey meu Soellign


10

Introduciton

Alguns de vocês devem ter percebido que sou um digitador desleixado ao usar meu telefone. É por isso que quero que você escreva um programa que corrija meus erros de digitação.

Chalkrnge

Dada uma palavra incorreta, imprima todas as palavras possíveis que eu pretendia escrever.

Typso

A principal causa dos meus erros de digitação se deve ao fato de eu apertar as teclas erradas e freqüentemente apertar a tecla ao lado. A seguir, é o layout do meu teclado:

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

Observe que a linha inferior , [ space ] .nunca será usada neste desafio

Por alguma razão, eu apenas cometo erros horizontalmente: nunca atingiria n em vez de j , mas poderia atingir um f em vez de um d .

Por exemplo, eu poderia acabar soletrando a palavra desleixada como:

akioot

Onde eu fui à esquerda de cada chave.

No entanto, não esqueça que eu posso não necessariamente cometer um erro em todas as letras da palavra.

Ezsmple

Digamos que a entrada seja:

vid

As possibilidades que a palavra poderia ter sido são:

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

Destes, estão os seguintes no dicionário:

cod
cud
bid
bud
bus

Então essa deve ser sua saída.

Rulws

Você deve usar apenas o arquivo de texto encontrado aqui como seu dicionário: http://mieliestronk.com/corncob_lowercase.txt . Você não precisa contar esse arquivo como parte da sua contagem de bytes.

Toda entrada será uma única palavra. Você pode exibir sua saída da maneira que desejar (desde que exista algum tipo de separador).

Suponha que, com todas as entradas, você encontrará uma variante que está no dicionário.

Wibninf

O código mais curto em bytes vence.


11
Quando vi o título, eu pensei que este ia ser um outro desafio sobre Welsh ...
Martin Ender

Suponho que comprimir o dicionário faz parte do desafio e que, se optar por ler o dicionário de um arquivo, devo contar seu comprimento em relação à minha pontuação, mas isso deve ser explicitado em benefício de pessoas que não leram o toda meta. PS Se você quiser publicar algo na caixa de areia, deixe-a lá o tempo suficiente para obter feedback.
Peter Taylor

@ PeterTaylor Bem, na verdade não, é principalmente apenas a análise do dicionário que pode ser feita sem compressão.
Beta Decay

Então, se eu embutir o arquivo, o que eu conto? Dois bytes para a delimitação ""?
Peter Taylor

@PeterTaylor Bem, sim
Beta Decay

Respostas:


1

Japonês, 50 47 bytes

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

Entrada é a palavra a ser corrigida e o dicionário como uma sequência. Teste online! (Nota: você precisará colar manualmente o dicionário na string.)

Como funciona

;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 bytes

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

versão legível

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
  • Guardado 1 byte graças a @TuukkaX

Você tem um espaço em branco inútil em .strip() for.
Yytsi 14/09/16
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.