코렐리 내 Soellign


10

소개

당신 중 일부는 내 전화를 사용할 때 내가 조잡한 입력기임을 깨달았습니다. 그래서 오타를 수정하는 프로그램을 작성하고 싶습니다.

찰크 랑게

철자가 틀린 단어가 주어지면 내가 쓰려고했던 가능한 모든 단어를 출력하십시오.

타이포

오타의 주요 원인은 내가 잘못된 키를 치고 종종 옆집에있는 키를 누르는 사실에 달려 있습니다. 다음은 키보드 레이아웃입니다.

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

맨 아래 줄 , [ space ] .은이 챌린지에서 사용되지 않습니다.

어떤 이유로 든 가로 방향으로 실수 만합니다 .j 대신 n을 절대로 누르지 않지만 d 대신 f 를 칠 수 있습니다 .

예를 들어, 나는 엉성한 단어 를 다음과 같이 철자가 끝날 수 있습니다.

akioot

각 키에서 왼쪽으로갔습니다.

그러나 단어의 모든 글자를 반드시 실수로 잘못하지는 않을 수도 있습니다 .

ezsmple

입력이 있다고 가정 해 봅시다.

vid

단어가 될 수있는 가능성은 다음과 같습니다.

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

그중에서 다음은 사전에 있습니다.

cod
cud
bid
bud
bus

출력이되어야합니다.

룰스

: 당신은 텍스트 파일이 사전으로 여기 사용해야합니다 http://mieliestronk.com/corncob_lowercase.txt . 이 파일을 바이트 수의 일부로 계산할 필요는 없습니다.

모든 입력은 단일 단어입니다. 어떤 종류의 구분 기호가있는 한 원하는 방식으로 출력을 표시 할 수 있습니다.

모든 입력과 함께 사전에있는 변형을 찾을 수 있다고 가정하십시오.

위븐 인프

바이트 단위의 가장 짧은 코드가 이깁니다.


11
제목을 보았을 때 이것이 웨일스 어에 대한 또 다른 도전이 될 것이라고 생각했습니다.
Martin Ender

나는 사전을 압축하는 것이 도전의 한 부분이라고 생각하며, 파일에서 사전을 읽으려면 내 점수까지의 길이를 계산해야하지만 그것을 읽지 않은 사람들의 이익을 위해 명시해야한다고 생각합니다. 메타 전체. PS 샌드 박스에 무언가를 게시하려는 경우 피드백을받을 수 있도록 충분히 오래 두십시오.
피터 테일러

@PeterTaylor 글쎄요, 실제로는 압축되지 않은 채로 할 수있는 사전의 파싱 일뿐입니다.
Beta Decay

따라서 파일을 인라인하면 무엇을 계산합니까? 구분을위한 2 바이트 ""?
피터 테일러

@PeterTaylor 음 그래
베타 부패

답변:


1

apt, 50 47 바이트

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

입력은 고칠 단어이고 사전은 문자열입니다. 온라인으로 테스트하십시오! (참고 : 사전을 문자열에 수동으로 붙여 넣어야합니다.)

작동 원리

;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

파이썬 2.7, 161 159 바이트

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

읽을 수있는 버전

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
  • @TuukkaX 덕분에 1 바이트 절약

에 쓸모없는 공백이 .strip() for있습니다.
Yytsi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.