그것은 wordinian입니까?


20

입력이 프로그래밍 언어를 사용하는 단어인지 확인하는 가장 짧은 방법은 무엇입니까?

단어는 단어의 길이와 길이가 1 인 단어를 포함하는 단어입니다. 예를 들어

큰 상자

'I'는 단어입니다.
'in'은 단어입니다.
'bin'은 단어입니다.

또는,

단계

'a'는 단어
'ta'는 단어입니다 ( )
'연령'은 단어입니다.
'tag'는 단어입니다.
'stage'는 단어입니다.

입력

코드는 합리적인 형식으로 단어와 사전을 입력으로 가져와야합니다.

산출

출력은 단어가 단어인지를 알려주기 위해 true 또는 false를 나타내는 값이어야합니다.

wordinians에 대한 자세한 내용을 보려면 여기를 클릭하십시오 .

다음은 입력 및 하위 단어 로 사용할 단어 목록입니다 . 또한 @xnor에 응답하여 일련의 하위 단어가 아닌 각 길이의 하위 단어를 포함해야합니다. 한 단어 만 입력으로 사용됩니다.


@FryAmTheEggman 여기에 전체 사전을 넣을 수는 없습니다. 존재하는 단어가 있다면?
Jacques Marais

6
사전을 입력으로 전달하는 것이 좋습니다. 그런 식으로, 쉬운은 (당신이 당신의 자신의 작은 사전을 만들 수) 테스트 케이스와 함께 올
나단 메릴

2
각 길이의 하위 단어 만 포함해야합니까, 아니면 각 하위 단어가 이전에 하나의 문자를 추가하는 체인이어야합니까?
xnor

@FryAmTheEggman 모든 단어의 목록을 제공하기 위해 질문을 편집했습니다.
Jacques Marais

1
@JacquesMarais 개념은 단어 사전 을 가져 와서 단어 가 사전 인 경우에 해당하는 단어 인 경우 true를 반환합니다.
Nathan Merrill

답변:


4

Pyth, 20 16 15 13 11 바이트

4 바이트를 절약 한 Leaky Nun에게 감사합니다! 불행히도 나중에 전체 방법을 변경했지만 여전히 도움이되었습니다.

gl{lM}#zQlz

사전 다음에 단어가 오는 입력을 예상합니다. True 또는 False를 출력합니다.

여기 사용해보십시오!

설명:

        lz   Collects the length of the word  input
g             and compares it to:
 l             The length of the following:
     # Q        Select all words from the dictionary that
    } z         are contained within the input word.
  lM            Map them to their respective lengths, and
 {              then remove any duplicates.

빈 문자열 ""이 유효한 단어 인 경우에는 작동하지 않습니다 .


1
.E대체 가능s
Leaky Nun

1
m}kH대체 가능}RH
Leaky Nun

1

11

파이썬, 52 바이트

lambda w,d:len({len(x)for x in d if x in w})==len(w)

단어 w와 사전 을 취하는 익명 함수d . 의 d하위 문자열 인 단어를 가져 와서 w길이를 설정 한 다음에 글자 수만큼 뚜렷한 길이가 있는지 확인합니다 w.


어쨌든 나는 x 대신 W와 {대신 {를 가지고 있다는 점을 제외하고 는 정확히 똑같은 것을 썼습니다 . +1
Daniel

@Dopapp [대신 사용하면 작동하지 않습니다 {. {...}A는 세트 이해력 (AS 동일 set([...])).
mbomb007

@ mbomb007, 맞아요, 세트가 필요합니다
Daniel

@xnor이 답변을 선택하지 않아서 죄송하지만 코드 골프이기 때문에 가장 짧은 것을 선택해야합니다.
Jacques Marais

4

파이썬 3, 108 바이트

lambda w,d,r=range:all(any(i in d for i in j)for j in[[w[i:i+s]for i in r(len(w)+1-s)]for s in r(1,len(w))])

인수를 통해 단어 w를 문자열 및 사전으로 입력하는 익명 함수d 문자열과 반환 목록으로 TrueFalse.

작동 원리

첫 번째 단계는을 w제외한 모든 하위 문자열의 목록을 w길이별로 그룹화 하는 목록 이해입니다 . 예를 들어의 'stage'경우 목록 [['s', 't', 'a', 'g', 'e'], ['st', 'ta', 'ag', 'ge'], ['sta', 'tag', 'age'], ['stag', 'tage']]이 생성됩니다. 이것은 i각 부분 문자열 길이에 대한 모든 유효한 시작 인덱스 를 반복하고를 사용하여 s모든 s길이 부분 문자열을 슬라이싱 함으로써 달성됩니다 w[i:i+s]. 이 목록의 각 목록에 대해 사전에 각 하위 문자열이 있는지 확인합니다. any주어진 길이에 대해 적어도 하나의 일치하는 것이 있으면 호출 은 적중을 리턴합니다. 마지막으로, 호출 all은 모든 부분 문자열 길이에 일치 하는 것이 있는지 확인하고 그 결과가 반환됩니다.

Ideone에서 사용해보십시오


4

루비, 44 바이트

  • @NotThatCharles와 그의 오퍼레이터 트릭 덕분에 7 바이트가 줄었습니다!
  • @Jordan 덕분에 Ruby 2.3 안전 탐색 연산자 트릭으로 2 바이트가 줄었습니다. w[x]&.size:)
->w,d{[*1..w.size]-d.map{|x|w[x]&.size}==[]}

단어 w와 사전 (단어 배열) 을 취하는 익명 함수입니다 d. 두 개의 배열을 만듭니다. 첫 번째는 1부터 최대 길이까지 포함합니다 w. 두 번째 배열은 d각 단어가 하위 문자열 인 경우 크기에 매핑되고 w그렇지 않은 경우 nil입니다. 그런 다음 두 번째 배열에 첫 번째 배열의 모든 요소가 포함되어 있는지 확인하기 위해 빼기를 설정합니다.


1
Ruby 2.3의 "안전한 탐색 연산자"를 사용하면 w[x]&.size==i대신 몇 바이트를 저장할 수 있습니다 x.size==i&&w[x].
Jordan

오, 감사합니다 @Jordan. 그 멋진 것을 몰랐어요 :)
daniero

1
당신은을 삭제하여 익명 함수의 다른 몇 바이트 (그리고 아마도 전체 프로그램)에 저장할 수 있습니다 uniq-[p]대신 설정 빼기를 사용하여 :[*1..w.size]-d.map{...}==[]
하지 않는 것이 찰스

@NotthatCharles 훌륭합니다! 감사합니다 :)
daniero

3

PowerShell을 V3 + V2 +, 127 (110) 70 65 바이트

param($a,$d)($d|?{$a-match$_}|select length -U).count-eq$a.length

(지금은 내 접근 방식이 @xnor와 유사하지만 독립적으로 개발했지만)

배열로 예상 되는 입력 단어 $a및 사전을 가져 옵니다 (아래 예 참조). 전체를 반복 하고 a 를 수행 하여 현재 단어 가 입력 단어에 대한 정규 표현식 인 항목을 가져옵니다 (즉, 현재 단어가 입력 단어의 하위 문자열 임).$d$d$dWhere-Object$_-match$a

우리는 모든 하위 문자열 단어를 수집 Select-Object하여 length매개 변수와 -Unique 제약 조건에 적용합니다. 각 하위 문자열의 고유 길이를 가져옵니다. 예를 들어, 입력 단어에 대해 comb,이 배열 될 것이다 (4,2)위한('comb','om') .

.count결과 배열을 가져 와서 입력 단어와 비교합니다 .length. 같으면 모든 하위 문자열 길이가 사전에 있음을 의미합니다 $TRUE. 그렇지 않으면 적어도 하나가 누락되었습니다 $FALSE. 해당 부울 값은 파이프 라인에 남아 있으며 출력은 암시 적입니다.

NB- v2 +에서 작동 해야 합니다.-in 운영자가 더 이상 존재하지,하지만 난 버전 것을 테스트하지했습니다.

PS C:\Tools\Scripts\golfing> .\is-it-a-wordinian.ps1 'stage' (gc .\words.txt)
True

PS C:\Tools\Scripts\golfing> .\is-it-a-wordinian.ps1 'metal' (gc .\words.txt)
True

PS C:\Tools\Scripts\golfing> .\is-it-a-wordinian.ps1 'comb' (gc .\words.txt)
False

2

펄, 86 바이트

-E추가 비용없이 필요합니다 .

chop(($s,@d)=<>);for$=(1..($x=length$s)){$-+=!!grep$s=~/$_/,grep$===y///c,@d}say$-==$x

STDIN을 통한 모든 입력을 승인합니다. 첫 번째 입력은 대상 단어이고 나머지 입력은 사전입니다. 1성공시 인쇄 , 실패시 빈 문자열.

용법

perl -E 'chomp(($s,@d)=<>);for$=(1..($x=length$s)){$-+=!!grep$s=~/$_/,grep$===y///c,@d}say$-==$x' <<< 'stage
a
ta
age
stag
stage'
1
perl -E 'chomp(($s,@d)=<>);for$=(1..($x=length$s)){$-+=!!grep$s=~/$_/,grep$===y///c,@d}say$-==$x' <<< 'stage
a
at
age
stag
stage'

perl -E 'chomp(($s,@d)=<>);for$=(1..($x=length$s)){$-+=!!grep$s=~/$_/,grep$===y///c,@d}say$-==$x' <<< 'bin
i
in
bin'
1

2

Mathematica, 90 바이트

Sort[MemberQ[DictionaryWordQ/@StringPartition[#,t,1],True]~Table~{t,StringLength@#}][[1]]&

Mathematica를 사용합니다 내장 기능을DictionaryWordQ .

d사전으로 입력 을 받는 것은 5 바이트는 짧지 만 긴 목록의 경우 훨씬 느립니다.

m=MemberQ;Sort[m[d~m~#&/@StringPartition[#,t,1],True]~Table~{t,StringLength@#}][[1]]&

2

MATL , 15 바이트

@ xnor 's answer의 아이디어를 사용하여 1 바이트가 저장되었습니다 .

XXgc32>!suz1Gn=

출력 1또는 0진실 또는 허위.

온라인으로 사용해보십시오!

XX      % Take the two inputs implicitly. Apply the second as a regex into the
        % first. Since the second input is a cell array, each of its contents is
        % applied separately as a regex. So for each dictionary word ("sub-word") 
        % this outputs the sub-word if found in the original word, or else an 
        % empty array. Gives a cell array of cells of strings
g       % Remove one level of nestedness
c       % Convert to char. This concatenates all found sub-words as rows of a 2D 
        % char array, padding with spaces as needed
32>!s   % For each row, count how many non-space characters there are. This is 
        % the length of each sub-word
uz      % Number of distinct non-zero elements
1Gn     % Push length of the original word
=       % Are they equal? Implicitly display

1

펄, 42 41 바이트

에 +2 포함 -p0

STDIN에서 사전 다음에 단어를 입력하십시오.

(echo stage; cat dictionary.txt) | ./wordinian.pl

(유닉스를 테스트 할 때 dictionary.txt가 \n줄 종결 자로 사용되는지 확인하십시오.\r\n )

wordinian.pl:

#!/usr/bin/perl -p0
s%\G.%!/^.*(.{$+[0]})\H*
\1
/%eg;$_=!//

1

자바 스크립트 (Firefox 30-57), 68 바이트

(w,a)=>new Set((for(x of a)if(~w.search(x))x.length)).size==w.length

생성기 이해를 사용하면 중간 배열을 만들지 않아도됩니다. 73 바이트 ES6 버전 :

(w,a)=>new Set(a.filter(x=>~w.search(x)).map(x=>x.length)).size==w.length

1

05AB1E , 8 바이트

ŒÃ€gZLåP

첫 번째 입력으로 단어, 두 번째 입력으로 사전 목록.

온라인으로 시도 하거나 몇 가지 테스트 사례를 확인하십시오. .

설명:

Œ         # Get all possible substrings of the (implicit) input-string
 Ã        # Only keep the ones which are also in the (implicit) dictionary-list
  g      # Get the length of each remaining string
    Z     # Push the maximum length (without popping the list)
     L    # Pop and push a list in the range [1, maximum-length]
      å   # Check for each value if it's in the list of lengths
       P  # And check if this is truthy for all
          # (then output the result implicitly as result)


0

SQF , 147 바이트

함수로서 파일 형식 사용 :

params["w","d"];a=[];c=count w;for"i"from 1 to c do{a=a+[""];for"j"from 0 to c-i do{q=w select[j,i];if(q in d)then{a set[i-1,q]}}};c==count(a-[""])

다음과 같이 전화하십시오 : ["WORD", DICTIONARY] call NAME_OF_COMPILED_FUNCTION

언 골프 드 :

//name parameters
params["w", "d"];
a = []; c = count w;
//for each length of subword
for "i" from 1 to c do {
    //add entry to the `a`
    a = a + [""];
    //for each starting position for that length
    for "j" from 0 to c - i do {
        //get subword
        q = w select [j, i];
        //check if in dictionary
        if(q in d) then {
            //set the entry to the wubword
            a set [i - 1, q]
        }
    }
};
//check if length of word is equal to number of subwords
c == count (a - [""])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.