Apakah ini seorang wordinian?

20

Apa cara terpendek untuk melihat apakah input adalah wordinian menggunakan bahasa pemrograman apa pun?

Wordinian adalah kata yang berisi kata-kata dengan panjang 1 hingga panjang kata aslinya. Sebagai contoh,

tempat sampah

'I' adalah kata
'in' adalah kata
'bin' adalah kata

Atau,

tahap

'a' adalah kata
'ta' adalah kata ( ya itu )
'usia' adalah kata
'rusa jantan' adalah kata
'tahap' adalah kata

Memasukkan

Kode Anda harus mengambil kata dan kamus sebagai input, dalam format apa pun yang masuk akal.

Keluaran

Outputnya harus berupa nilai untuk menunjukkan benar atau salah, untuk memberi tahu kami jika kata tersebut adalah wordinian.

Untuk info lebih lanjut tentang wordinians klik di sini .

Berikut adalah daftar kata yang akan saya gunakan sebagai input dan subword. Juga, sebagai respons terhadap @xnor, harus berisi subwords dari setiap panjang, bukan rantai subwords. Perhatikan bahwa hanya satu kata yang akan digunakan sebagai input.

Jacques Marais
sumber
@FryAmTheEggman Saya tidak bisa meletakkan seluruh kamus di sini. Bagaimana jika itu kata yang ada?
Jacques Marais
6
Saya sarankan memasukkan kamus sebagai masukan. Dengan begitu, mudah untuk membuat test case (seperti Anda dapat membuat kamus kecil Anda sendiri)
Nathan Merrill
2
Apakah itu hanya harus berisi subwords dari masing-masing panjang, atau apakah mereka harus menjadi rantai di mana setiap subword menambahkan satu huruf ke sebelumnya?
xnor
@FryAmTheEggman Saya mengedit pertanyaan saya untuk memberikan daftar semua kata.
Jacques Marais
1
@JacquesMarais konsepnya adalah untuk mengambil kata dan kamus, dan mengembalikan true jika kata itu adalah wordinian (sesuai dengan kamus)
Nathan Merrill

Jawaban:

4

Pyth, 20 16 15 13 11 byte

Terima kasih kepada Leaky Nun karena telah menghemat 4 byte! Sayangnya, saya mengubah seluruh metode setelahnya, tetapi masih membantu.

gl{lM}#zQlz

Diharapkan input sebagai kamus diikuti oleh kata. Output Benar atau Salah.

Coba di sini!

Penjelasan:

        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.

Ini tidak berfungsi jika string kosong ""adalah kata yang valid.

Steven H.
sumber
1
.Edapat diganti dengans
Leaky Nun
1
m}kHdapat diganti dengan}RH
Leaky Nun
1
Saya hanya akan memberi Anda kode golf
Leaky Nun
11

Python, 52 byte

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

Fungsi anonim yang menggunakan kata wdan kamus d. Dibutuhkan kata-kata dyang merupakan substring dari w, membuat seperangkat panjangnya, dan kemudian memeriksa bahwa ada panjang yang berbeda sebanyak ada huruf di dalamnya w.

Tidak
sumber
Ugh Saya baru saja menulis hal yang sama persis kecuali saya memiliki W bukannya x dan [bukan {. +1
Daniel
@Dopapp Ini tidak akan bekerja jika Anda menggunakan [bukan {. {...}adalah seperangkat pemahaman (sama dengan set([...])).
mbomb007
@ mbomb007, oh benar, satu set akan dibutuhkan
Daniel
@ xnor Maaf karena tidak memilih jawaban ini, tetapi karena ini adalah kode golf, saya harus memilih yang terpendek ...
Jacques Marais
4

Python 3, 108 byte

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

Fungsi anonim yang mengambil input, melalui argumen, dari kata wsebagai string dan kamus dsebagai daftar string dan mengembalikan Trueatau False.

Bagaimana itu bekerja

Langkah pertama adalah pemahaman daftar yang menghasilkan daftar daftar semua substring wtidak termasuk w, dikelompokkan berdasarkan panjangnya. Misalnya, untuk 'stage', daftar [['s', 't', 'a', 'g', 'e'], ['st', 'ta', 'ag', 'ge'], ['sta', 'tag', 'age'], ['stag', 'tage']]dibuat. Ini dicapai dengan mengulang semua indeks awal yang valid iuntuk setiap panjang substring s, dan mengiris setiap ssubstring panjang menggunakan w[i:i+s]. Untuk setiap daftar dalam daftar ini, keberadaan setiap substring dalam kamus diperiksa; panggilan anymengembalikan hit jika setidaknya satu kecocokan untuk panjang tertentu ditemukan. Akhirnya, memanggil allcek jika kecocokan telah ditemukan untuk semua panjang substring, dan hasilnya dikembalikan.

Cobalah di Ideone

TheBikingViking
sumber
4

Ruby, 44 byte

  • Diskon 7 Bytes berkat @NotThatCharles dan trik-trik operatornya!
  • 2 byte off berkat @Jordan dengan trik operator navigasi aman Ruby 2.3 w[x]&.size:)
->w,d{[*1..w.size]-d.map{|x|w[x]&.size}==[]}

Ini adalah fungsi anonim yang mengambil kata wdan kamus (array kata) d. Membuat dua array: Yang pertama berisi angka 1 hingga dan termasuk panjang w; Array kedua adalah ddengan setiap kata dipetakan ke ukuran mereka jika mereka adalah substring w, jika tidak nil. Kemudian mengatur substraksi untuk memeriksa apakah array kedua berisi semua elemen dari array pertama.

daniero
sumber
1
Dengan "operator navigasi aman" di Ruby 2.3, Anda dapat menyimpan beberapa byte: w[x]&.size==ialih-alih x.size==i&&w[x].
Jordan
Oh wow, terima kasih @Jordan. Tidak tahu itu, luar biasa :)
daniero
1
Anda dapat menyimpan lain beberapa byte dalam fungsi anonim Anda (dan mungkin program penuh) dengan menjatuhkan uniqdan -[p]dan menggunakan set pengurangan sebagai gantinya:[*1..w.size]-d.map{...}==[]
Bukan berarti Charles
@NotthatCharles Itu brilian! Terima kasih :)
daniero
3

PowerShell v3 + v2 +, 127 110 70 65 byte

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

(Saya melihat sekarang bahwa pendekatan saya mirip dengan @ xnor, meskipun saya mengembangkannya secara independen)

Mengambil input kata $adan kamus $d, mengharapkan $dsebagai array (lihat contoh di bawah). Loop melalui keseluruhan $ddan melakukan Where-Objectuntuk menarik keluar entri di mana kata saat ini $_adalah regex -matchterhadap kata input $a(yaitu, adalah kata saat ini substring dari kata input).

Kami mengumpulkan semua kata-kata substring dan pipa mereka ke Select-Objectpada lengthparameter dan -Ubatasan nique. Itu akan menarik panjang unik dari masing-masing substring. Misalnya, untuk kata input comb, ini akan menjadi array (4,2)untuk ('comb','om').

Kami mengambil .countarray yang dihasilkan dan membandingkannya dengan kata input .length. Jika sama dengan, itu berarti bahwa setiap panjang substring ada di kamus, jadi $TRUE, kalau tidak, kita kehilangan setidaknya satu, jadi $FALSE. Nilai Boolean yang tersisa di pipa dan output tersirat.

NB - Ini harus bekerja di v2 +, karena -inoperator tidak lagi ada, tapi saya belum menguji versi itu.

Contohnya

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
AdmBorkBork
sumber
2

Perl, 86 byte

Membutuhkan -Etanpa biaya tambahan.

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

Menerima semua input melalui STDIN. Input pertama adalah kata target, sisanya input adalah kamus. Mencetak 1pada kesuksesan, mengosongkan string pada kegagalan.

Pemakaian

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
Dom Hastings
sumber
2

Mathematica, 90 byte

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

Menggunakan Mathematica ini builtin DictionaryWordQ.

Mengambil input dsebagai kamus lebih pendek 5 byte, tetapi jauh lebih lambat untuk daftar panjang:

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

MATL , 15 byte

1 byte disimpan menggunakan ide dari jawaban @ xnor .

XXgc32>!suz1Gn=

Keluaran 1atau 0kebenaran atau kepalsuan.

Cobalah online!

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
Luis Mendo
sumber
1

Perl, 42 41 byte

Termasuk +2 untuk -p0

Beri kata diikuti oleh kamus di STDIN:

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

(Saat menguji pada unix, pastikan dictionary.txt menggunakan \nsebagai terminator garis, bukan \r\n)

wordinian.pl:

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

JavaScript (Firefox 30-57), 68 byte

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

Menggunakan pemahaman generator menghindari membuat array perantara. Versi ES6 73 byte:

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

05AB1E , 8 byte

ŒÃ€gZLåP

Kata sebagai input pertama, kamus-daftar sebagai input kedua.

Cobalah secara online atau verifikasi beberapa kasus uji lagi .

Penjelasan:

Œ         # 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)
Kevin Cruijssen
sumber
1

Kotlin , 51 byte

{w,d->w.indices.all{w.windowed(it+1).any{it in d}}}

Cobalah online!

siput_
sumber
0

SQF , 147 byte

Menggunakan format fungsi-sebagai-file:

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-[""])

Panggil sebagai: ["WORD", DICTIONARY] call NAME_OF_COMPILED_FUNCTION

Tidak Terkumpul:

//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 - [""])
Suram
sumber