t9와 같은 기능 구현


10

오늘날의 과제는 t9 와 유사한 기능 을 구현하는 것입니다.

2 개의 매개 변수 만있는 함수를 구현합니다.
문자열로 된 전화 번호 1 개와 단어 목록이 포함 된 텍스트 파일의 내용을받습니다 (특정 줄 바꿈 스타일을 가정하지 않음). https://raw.githubusercontent.com/eneko/data-repository/master/data/words.txt
링크를 사용하여 기능을 테스트하거나 다음을 사용하십시오 ( 자세한 내용은 [닫힌] 단어 목록이있는 텍스트 파일 확인) . 정보)./usr/share/dict/words

항상 최소 2 개의 숫자를받을 것이라고 가정 할 수 있습니다.

숫자가 주어지면 단어 목록에서 읽고 해당 단어에 해당하는 문자로 시작하는 단어를 반환합니다. 이것은 입력이 2에서 9까지의 숫자 만되어야한다는 것을 의미합니다
. 유효하지 않은 입력을 받으면 원하는대로 할 수 있습니다.

일치하는 항목이없는 경우 빈 목록을 반환 할 수 있습니다 null/ nil또는 0.

휴대폰 키는 해당 문자에 매핑됩니다.

  • 0과 1은 유효하지 않습니다
  • 2 개 일치 [abc]
  • 3 개 일치 [def]
  • 4 건 [ghi]
  • 5 경기 [jkl]
  • 6 건 [mno]
  • 7 건 [pqrs]
  • 8 일치 [tuv]
  • 9 개 일치 [wxyz]

예 :

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

기능을 실행 한 후 원하는 방식으로 인쇄 할 수 있습니다.

규칙 :

  • 표준 허점은 유효하지 않습니다
  • 무언가 를 반환 하지 않으면 무언가를 반환 해야합니다 null/ 무언가를 반환하지 않으면 nil
    자바 스크립트가 반환 되므로이 undefined규칙.
  • 다른 답변을 사용하거나 다시 구현하거나 구현 내용을 복사 할 수 없습니다.
  • Javascript의 경우 브라우저가 이미 열려 있고 자동 요소 의 innerText/ textContent가 두 번째 매개 변수로 전달 된다고 가정 할 수 있습니다.
  • 컴파일 된 언어의 경우 컴파일러에 특수 인수를 전달할 수 없습니다
  • 컴파일러 인수를 통해 파일 이름을받을 수 있습니다
  • 변수, 매크로, 전역 변수, 상수, 비표준 클래스 및 함수 내부의 다른 값을 전달하는 모든 정렬은 유효하지 않은 것으로 간주됩니다.
  • 자바 스크립트에서 키워드가없는 변수는 var코드를 무효화합니다.
  • 당신의 기능은 명명 될 것입니다 f
  • 함수에는 오직 2 개의 인수 만 가질 수 있습니다
  • 코드를 500 초 미만으로 유지하십시오.
  • 공백에 대해 걱정할 필요가 없습니다.
  • ASCII 인쇄 가능 문자 만 사용해야합니다 . 인쇄 수없는 문자 사용
    하는 언어는 예외입니다 (APL 및 공백은 2 가지 예입니다).

채점 :

  • 가장 적은 바이트 수의 승리
  • 답변에 유효하지 않은 ASCII 인쇄 가능 문자가 있으면 UTF-32 로 인코딩 된
    답변으로 계산됩니다 . 인코딩의 예외는 답변을 문자 로 계산 합니다 .
  • 함수 본문 만 계산하고 그 밖의 다른 작업은 계산하지 않습니다
  • 주변 또는 가장 일반적인 단어를 기반으로 예측 시스템을 만드는 경우 -30 %의 보너스
  • 첫 번째 숫자에 해당하는 각 문자에 대해 처음 5 개의 일치 항목 만 반환하면 크기가 -20 % 증가합니다 (예 : 245는 'a'로 시작하는 5 단어, 'b'로 시작하는 5 단어, 'c'로 시작하는 5 단어를 반환 함) ).

다음은 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);
}

이를 실행하려면 목록 링크를 열고 다음과 같이 실행하십시오.

f('9999',document.getElementsByTagName('pre')[0].innerText);
//returns [" Zyzzogeton "]

이 예제는 Windows 7 Home Edition 64 비트의 Opera 12.17 64 비트에서 테스트되었으며 작동합니다.


프로그램에 대한 두 번째 인수는 단어 또는 단어 목록 자체를 포함하는 파일 이름입니까?
Optimizer

@ MartinBüttner UTF-8은 불공평하지 않지만 (아직 ASCII 문자를 1 바이트로 계산합니다) 규칙을 변경했습니다.
Ismael Miguel

@Optimizer 두 번째 인수는 단어의 목록입니다. 원하는 경우 파일 이름을 컴파일러 인수로 전달하고 파일을 읽을 수 있습니다. 그러나 중요한 것은 함수 본문입니다.
Ismael Miguel

@ MartinBüttner ASCII로 계산하면 바이트로 계산됩니다. APL 코드의 크기가 8 비트 인 1 바이트를 사용한다고 말하고 싶습니까?
Ismael Miguel

2
부적절한 제한에 대해 -1
AJMansfield

답변:


3

CJam, 28 바이트

q~{el{'h-_9/-D+3/}%s1$#!},p;

의 형태로 입력을받습니다 "<number>" [<list of words>]

예:

"52726" ["Japan" "japan" "Japanee" "Japanese" "Japanesque" "larbowlines" "ablution" "ablutionary" "abluvion" "ably" "abmho" "Abnaki" "abnegate"]

산출:

["Japan" "japan" "Japanee" "Japanese" "Japanesque" "larbowlines"]

지금은 보너스를받지 않을 것입니다.

여기에서 온라인으로 코드를 시도 하지만 실제 시간 측정을 위해서는 Java 컴파일러 에서 실행하십시오.

CJam은 다음과 같은 빈 목록을 나타냅니다. ""

원시 단어 목록을 CJam 목록으로 변환하려면 단어 목록을 입력으로 다음 코드를 사용하십시오.

qN/p

"문자열에 1 개의 전화 번호와 단어 목록이있는 텍스트 파일의 내용을받습니다"-> 다른 블록에서 파일을 사용 가능한 목록으로 읽는 데 필요한 코드를 구현할 수 있습니까?
Ismael Miguel

@IsmaelMiguel이 코드의 일부가 아니라 목록을 올바른 형식으로 변환하는 도우미 코드 만 의미합니까?
Optimizer

바로 그거죠. 코드로 충분하지 않은 코드는 제공된 예제로 단어 목록을 사용할 수 있습니다. 그러나 어쨌든 나는 그 도우미 코드를 원했습니다.
Ismael Miguel

답변에 추가 할 수 있습니까? 편집으로, 다른 부분에서
Ismael Miguel

바로 그거죠. 그게 내가 말하는거야! 더 최적화 할 수 있는지 살펴 보자
Ismael Miguel

2

자바 : 395

이것은 각 숫자에 허용되는 문자를 기반으로 정규식 패턴을 형성 한 다음 끝에 다음 문자와 일치하도록 끝에. *를 붙입니다.

골프 버전은 다음과 같습니다.

static ArrayList<String> f(String n,ArrayList<String> d){String[] k={"","","([A-Ca-c])","([D-Fd-f])","([G-Ig-i])","([J-Lj-l])","([M-Om-o])","([P-Sp-s])","([T-Vt-v])","([W-Zw-z])"};String r="";for(int i=0;i<n.length();++i)r+=k[n.charAt(i)-'0'];r += ".*";Pattern p=Pattern.compile(r);ArrayList<String> a=new ArrayList<String>();for(String w:dictionary)if(p.matcher(w).matches())a.add(w);return a;}

그리고 여기에 읽기 기능을위한 ungolfed 버전이 있습니다

public static ArrayList<String> f(String phoneNumber, ArrayList<String> dictionary) {

    String[] KEY_VALUES = {"", "", "([A-Ca-c])", "([D-Fd-f])", "([G-Ig-i])",
                                            "([J-Lj-l])", "([M-Om-o])", "([P-Sp-s])",
                                            "([T-Vt-v])", "([W-Zw-z])"};

    String regex = "";
    for (int i = 0; i < phoneNumber.length(); ++i) {
        regex += KEY_VALUES[phoneNumber.charAt(i) - '0'];
    }
    regex += ".*";
    Pattern p = Pattern.compile(regex);
    ArrayList<String> answers = new ArrayList<String>();
    for (String word : dictionary) {
        if (p.matcher(word).matches()) {
            answers.add(word);
        }
    }
    return answers;
}

코드는 규칙 번호 7에 해당합니다. "변수, 매크로, 전역 변수, 상수, 비표준 클래스 및 함수 내부의 다른 값을 전달하는 모든 정렬은 유효하지 않은 것으로 간주됩니다." 규칙 3 : "다른 사람의 답변을 사용하거나 다시 구현하거나 구현을 복사 할 수 없습니다"라는 규칙에 위배됩니다. 그러나 코드에서는 다소 논쟁의 여지가 있습니다. 또한 규칙 9 : "함수의 이름은 f"입니다.
Ismael Miguel

@IsmaelMiguel 죄송합니다. 함수 내에서 상수를 이동하면 규칙 7을 쉽게 수정할 수 있습니다. 더 나은 프로그래밍 스타일을 위해 함수 외부로 가져 왔습니다. 규칙 9도 쉽게 고칠 수 있습니다. 나는 당신의 대답을 읽지 않았다고 고백하기 때문에 의도적으로 복사하려고 시도하지 않았습니다. 컨테스트에 너무 가깝다고 생각되면 답변을 제거 할 수 있습니다.
Brian J

당신의 대답은 괜찮습니다. 코드에 버그가 있습니다. 마지막 상수 ( ([W-Zw-z)])에 있어야합니다 ([W-Zw-z]). 또한 Code-golf에서는 프로그래밍 스타일과 모범 사례에 대해 걱정할 필요가 없습니다. 코드는 필요한 매개 변수를 사용하여 간단하게 수행해야합니다. 내 답변을 확인하면 다음 줄이 표시 $s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];됩니다. 이것은 PHP에서 끔찍한 '범죄'입니다. 기본적으로 PHP는 존재하지 않는 상수를 문자열로 변환하도록 강요합니다. 이것은 완벽하게 허용됩니다. 또한 변수 $t를 사용하기 전에 배열로 변수 를 설정하지도 않음을 알 수 있습니다
Ismael Miguel

@IsmaelMiguel 정규식 오류를 잘 잡습니다. 지적 해 주셔서 감사합니다. 나는 실제로 내일 골프를하려고 노력할 것이다. 이 사이트에서 Java 예제를 찾을 수 있습니다.
Brian J

나는 자바 프로그래머는 아니지만 몇 가지를 말해줍니다. codegolf.stackexchange.com/questions/6671/… 를 확인 하여 몇 가지 팁을 얻을 수 있습니다 . 일반적인 팁에는 쓸모없는 공백 (줄 바꿈, 공백, 탭), 한 글자 길이의 변수 이름을 제거하고 가능한 한 코드 크기를 줄이기 위해 가능한 모든 작업을 수행하는 것이 포함됩니다.
Ismael Miguel

1

C # .NET 4.5 235

이것은 작동해야합니다 :

IEnumerable<string>F(string n,string d){IEnumerable<string>w=d.Split(null).ToList();string[]a={"","","abc","def","ghi", "jkl","mno","pqrs","tuv","wxyz"};foreach(var i in n){w=w.Where(x=>x.IndexOfAny(a[i-'0'].ToArray())>0);}return w;}

PPCG에 오신 것을 환영합니다. 코드는 작동하지만 여전히 더 많이 줄여야합니다. 쓸모없는 공백 (공백, 탭, 줄 바꿈)을 모두 제거하여 코드를 167 바이트로 줄였습니다. 이 코드는 훨씬 더 줄어들 수 있습니다. 확실합니다. 더 많은 코드를 줄이려면 codegolf.stackexchange.com/questions/173/… 을 읽는 것이 좋습니다 . 약간의 도움을주기 위해 단어 목록은 줄 바꿈으로 구분 된 문자열이며 이미 단어를 사용할 수 있다고 가정 foreach합니다. 이미 IEnumerable
Ismael Miguel

@IsmaelMiguel TY 나는 그것을 볼 것이다. List는 IEnumerable이며 내가 게시 한 외부의 코드는 없습니다.
Chaossie

함수의 사양을 보면 두 번째 매개 변수도 문자열임을 알 수 있습니다. (인용 : "문자열에 1 개의 전화 번호와 단어 목록이있는 텍스트 파일의 내용을받습니다 (특정 줄 바꿈 스타일을 가정하지 않음).") 그리고 avar 에 쓸모없는 공백이 1 개 있습니다 .
Ismael Miguel

귀하의 질문에 대한 개선 사항을 확인한 후 공감했습니다. 그러나 여전히 avar에 바이트를 저장할 수 있습니다 . 그러나 눈에 띄게 개선되었습니다! 좋은 일을 계속하십시오.
Ismael Miguel

1

파이썬 2 (155 바이트)

적절한 대체 ( string-> bytes, b문자열 접두어 등) 와 함께 Python 3에서도 작동해야 합니다.

maketrans함수 외부에서 호출하는 것이 "공정한"것으로 간주 되는지 확실하지 않았습니다 . 그렇지 않은 경우 함수는 내부로 이동 한 134 바이트입니다.

편집 : 바보 같은 감독에서 1 바이트를 떨어 뜨 렸습니다.

준비된 상태 maketrans에서 67 바이트 :

from string import maketrans
t=maketrans('abcdefghijklmnopqrstuvwxyz','22233344455566677778889999')

def f(n,w):
    return[x for x in w.split()if x.lower().translate(t).startswith(n)]

함께 maketrans신체에서 134 바이트 :

from string import maketrans

def f(n,w):
    return[x for x in w.split()if x.lower().translate(maketrans('abcdefghijklmnopqrstuvwxyz','22233344455566677778889999')).startswith(n)]

import하고 maketrans본문에 155 바이트 :

def f(n,w):
    return[x for x in w.split()if x.lower().translate(__import__('string').maketrans('abcdefghijklmnopqrstuvwxyz','22233344455566677778889999')).startswith(n)]

테스트 호출 :

print f('9999',open('words.txt','rt').read())

maketrans함수 본문의 일부이다. 당신은 그것을 이동해야합니다. 가능한지 모르겠지만 직접을 사용할 수 있습니다 import. 어딘가에서 본 것 같아요 ...하지만 코드가 정말 좋습니다!
Ismael Miguel

가져 오기 호출하고 본문으로 호출 하시겠습니까? 네, 그렇게 할 수 있다고 생각합니다.
criptych는 Monica와 함께

에 대해 생각하고 t=(from stirng import maketrans)([...])있었습니다. 나는 그것이 가능한지 전혀 모른다. 그러나 아마도 당신은 from string import as x t=x([...])그것이 가능하다면 확실하지 않은 것을 사용할 수 있습니다 : /
Ismael Miguel

올바른 버전이 마지막 버전입니다. 그러나 대답은 그대로입니다. 일에 대한 __import__('string').maketran.
Ismael Miguel

알았어 고마워. 잘못된 답변을 삭제했습니다.
criptych는 Monica

0

PHP 5.4+ (171 186-20 % = 148.8 바이트) :

글쎄, 이것은 꽤 큰 대답이지만, 잘합니다.

이것이 더 많은 사람들이 대답하기를 바랍니다.

이 함수는 원시 내용을 읽습니다.

코드는 다음과 같습니다.

function f($_,$a){$s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];$a=preg_split('@\r\n|\r|\n@',$a);for($i=0;$c=$_[$i];++$i)foreach($a as$k=>$v)if(!strpos(1..$s[$c],$v[$i])||$t[$v[0]]++>4)unset($a[$k]);return$a;}

이것은 글자가 허용 된 글자 목록에 있는지 확인하여 작동합니다.

예 : 입력 361abc단어의 첫 글자가 있고 두 번째 글자가 있는지 확인합니다 1def.

나는 추가 1는 편지가 (반환되는 첫 번째 위치에 있는지 확인하지 않도록 0하고가 평가하는 것이다 false). if(!strpos(1..$s[$c],$v[$i]))또는 if(!strpos($c.$s[$c],$v[$i]))같은 효과가 있지만 첫 번째는 더 혼란스럽고 좋아합니다.

그렇게하지 않으면 단어가 제거됩니다.

단어가 남아 있지 않으면 빈 배열을 반환합니다.

온라인으로 테스트하려면 http://writecodeonline.com/php/ 로 이동하여 한 줄 단어로 간단한 변수를 만드십시오.

테스트 가능한 예 :

function f($_,$a)
{
    $s=array(2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz);
    $a=preg_split('@\r\n|\r|\n@',$a);

    for($i=0;$c=$_[$i];++$i)
        foreach($a as$k=>$v)
            if(!strpos(1..$s[$c],$v[$i]) || $t[$v[0]]++>4)
                unset($a[$k]);
    return$a;
}

$lines=<<<WORDS
one
two
three
four
five
six
seven
eight
nine
ten
WORDS;

var_dump(f('36',$lines));

출력해야합니다 :

array(1) {
    [3]=>
      string(4) "four"
}

오래된 PHP 버전에서 작동하도록 대체 $s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];에 의해$s=array(2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz);


20 % 보너스 :

내가 추가 한 코드를 줄이기 위해 ||$t[$v[0]]++>4첫 글자가 몇 번 사용되었는지 확인합니다.

PHP에서는 37.2 바이트 $t의 큰 청크를 줄이는 데 도움이되도록 정의 할 필요가 없습니다 .

이 효과를 보려면 다음 변수를 두 번째 인수로 사용하십시오.

$lines=<<<WORDS
one
two
three
four
five
six
seven
eight
nine
ten
twelve
time
tutor
test
truth
WORDS;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.