それは語彙ですか?


20

入力がプログラミング言語を使用する語彙であるかどうかを確認する最も短い方法は何ですか?

wordinianは、長さ1から元の単語の長さまでの単語を含む単語です。例えば、

ビン

「I」は単語
「in」は単語
「bin」は単語

または、

ステージ

「a」は単語
「ta」は単語(はい
「age」は単語
「stag」は単語
「stage」は単語

入力

コードは、妥当な形式の単語と辞書を入力として使用する必要があります。

出力

出力はtrueまたはfalseを示す値である必要があり、単語がwordinianであるかどうかがわかります。

wordiniansの詳細については、ここをクリックしてください

これは、入力およびサブワードとして使用する単語のリストです。また、@ xnorに応答して、サブワードのチェーンではなく、各長さのサブワードを含める必要があります。1つの単語のみが入力として使用されることに注意してください。


@FryAmTheEggmanここに辞書全体を載せることはできません。単語が存在する場合はどうなりますか?
ジャックマレ

6
入力として辞書を渡すことをお勧めします。そうすれば、テストケースを簡単に作成できます(独自の小さな辞書を作成できるため)
Nathan Merrill

2
各長さのサブワードを含める必要があるだけですか、それとも各サブワードが前に1文字を追加するチェーンである必要がありますか?
-xnor

@FryAmTheEggman質問を編集して、すべての単語のリストを提供しました。
ジャックマレ

1
コンセプトは言葉取ることです@JacquesMarais (辞書による)単語がwordinianがある場合は辞書をし、trueを返す
ネイサンメリル

回答:


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

Python、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
ダニエル

@Dopappの[代わりに使用すると機能しません{{...}セット内包表記です(と同じですset([...]))。
mbomb007

@ mbomb007、そうそう、セットが必要です
ダニエル

@xnor ...この答えを選択しないため申し訳ありませんが、それは、コードゴルフだと、私は最短を選択する必要があります
ジャック・マレ

4

Python 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として、辞書を文字列のリストとして入力し、Trueまたはを返す無名関数False

使い方

最初のステップは、リスト内包表記法で、w除外するすべての部分文字列のリストのリストをw、長さでグループ化して生成します。たとえば、の'stage'場合、リスト[['s', 't', 'a', 'g', 'e'], ['st', 'ta', 'ag', 'ge'], ['sta', 'tag', 'age'], ['stag', 'tage']]が生成されます。これはi、各部分文字列の長さのすべての有効な開始インデックスをループし、を使用してすべての長さの部分文字列をsスライスすることで実現されます。このリストの各リストについて、辞書内の各部分文字列の存在がチェックされます。呼び出しは、指定された長さの一致が少なくとも1つ見つかった場合にヒットを返します。最後に、呼び出しはすべての部分文字列の長さが一致するかどうかを確認し、その結果が返されます。sw[i:i+s]anyall

Ideoneでお試しください


4

ルビー、44バイト

  • @NotThatCharlesと彼のセットオペレータートリックのおかげで7バイトオフ!
  • 2は、Ruby 2.3安全運航事業者のトリックと@Jordanのおかげでオフバイトw[x]&.size:)
->w,d{[*1..w.size]-d.map{|x|w[x]&.size}==[]}

これは、単語wと辞書(単語の配列)を受け取る匿名関数dです。2つの配列を作成します。最初の配列は、1までの長さをw含む; の長さを含みます。2番目の配列はd、サブワードがの場合、各単語がサイズにマップされwますnil。次に、減算を設定して、2番目の配列に最初の配列のすべての要素が含まれているかどうかを確認します。


1
Ruby 2.3の「安全なナビゲーション演算子」を使用すると、のw[x]&.size==i代わりに数バイトを節約できますx.size==i&&w[x]
ヨルダン

ああすごい、@ジョーダンに感謝します。それを知らなかった、素晴らしい:)
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及び辞書を$d期待し、$dアレイとして(下記の例を参照)。全体をループし、$da Where-Objectを実行して、現在の単語$_-match入力単語に対する正規表現である$a(つまり、現在の単語が入力単語の部分文字列である)エントリを引き出します。

私たちは、これらのサブストリングに単語やパイプ、それらをすべてを集めるSelect-Object上のlengthパラメータと-Unique制約。それは各部分文字列の一意の長さを引き出します。たとえば、入力wordのcomb場合、これは(4,2)forの配列になり('comb','om')ます。

.countその結果の配列を取得し、それを入力ワードと比較し.lengthます。等しい場合、それはすべての部分文字列の長さが辞書にあることを意味し$TRUEます。そうでなければ、少なくとも1つが欠落しています$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

Perl、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の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

Perl、42 41バイト

+2を含む -p0

STDINの辞書に続く単語を与えます:

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

(Unixでテストするときは\n、dictionary.txtがでなく、行末記号として使用されていることを確認してください\r\n

wordinian.pl

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

1

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

最初の入力としての単語、2番目の入力としての辞書リスト。

オンラインそれを試してみたり、さらにいくつかのテストケースを検証します

説明:

Π        # 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.