Bir wordinian mı?


20

Bir girdinin herhangi bir programlama dili kullanan bir wordinian olup olmadığını görmenin en kısa yolu nedir?

Bir wordinian, orijinal kelimenin uzunluğuna 1 uzunluktaki kelimeler içeren bir kelimedir. Örneğin,

çöp Kutusu

'Ben' bir kelime
'in' bir kelime
'bin' bir kelime

Veya,

sahne

'a' bir kelimedir
'ta' bir kelimedir ( evet öyle )
'yaş' bir kelimedir
'erkek' bir kelimedir
'sahne' bir kelimedir

Giriş

Kodunuz bir kelimeyi ve sözlüğü uygun bir biçimde girdi olarak almalıdır.

Çıktı

Çıktı, kelimenin bir wordinian olup olmadığını bize bildirmek için true veya false değerini gösteren bir değer olmalıdır.

Kelime uzmanları hakkında daha fazla bilgi için buraya tıklayın .

İşte girdi ve alt anahtar olarak kullanacağım kelimelerin listesi . Ayrıca, @xnor'a yanıt olarak, bir alt kelime zincirini değil, her uzunluktaki alt kelimeleri içermelidir. Giriş olarak yalnızca bir kelimenin kullanılacağını unutmayın.


@FryAmTheEggman Buraya tam bir sözlük koyamıyorum. Var olan herhangi bir kelime varsa ne olur?
Jacques Marais

6
Giriş olarak bir sözlükten geçmenizi tavsiye ederim. Bu şekilde, test senaryoları bulmak kolaydır (kendi küçük sözlüğünüzü yapabileceğiniz gibi)
Nathan Merrill

2
Her uzunluktaki alt sözcükleri içermesi mi yoksa her alt sözcüğün öncekine bir harf eklediği bir zincir olması mı gerekiyor?
xnor

@FryAmTheEggman Bütün kelimelerin bir listesini sağlamak için sorumu düzenledim.
Jacques Marais

1
@JacquesMarais kavram bir kelime ve sözlük almak ve eğer kelime bir wordinian ise doğruya dönmektir (sözlüğe göre)
Nathan Merrill

Yanıtlar:


4

Pyth, 20 16 15 13 11 bayt

Leaky Nun'e 4 bayt kazandığı için teşekkürler! Ne yazık ki, daha sonra tüm yöntemi değiştirdim, ama yine de yardımcı oldu.

gl{lM}#zQlz

Sözlüğü ve kelimeyi takip ederek girdiyi bekler. Doğru veya Yanlış çıktılar.

Burada deneyin!

Açıklama:

        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.

Boş dize ""geçerli bir sözcükse bu çalışmaz .


1
.Eile değiştirilebilirs
Leaky Nun

1
m}kHile değiştirilebilir}RH
Leaky Nun


11

Python, 52 bayt

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

Bir kelime wve sözlük alan isimsiz bir fonksiyon d. Bu kelime alır dait altdizgelerin olduklarını wdaha sonra birçok farklı uzunluklarda olarak harfler orada olduğu gibi bu kontrolleri, kendi uzunlukları bir dizi yapar ve w.


Ahh ben sadece yazdım tam yerine x W vardı hariç aynı şeyi ve [yerine {arasında. +1
Daniel

@Dopapp Bunun [yerine kullanırsanız çalışmaz {. {...}bir set kavramadır (ile aynı set([...])).
mbomb007

@ mbomb007, tamam, bir set gerekli olacak
Daniel

@xnor Bu cevabı seçmediğim için özür dilerim, ama bir kod golfü olduğu için en kısa olanı seçmeliyim ...
Jacques Marais

4

Python 3, 108 bayt

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

Bir kelimenin, argüman yoluyla, girdi alır Anonim işlev wbir dize ve bir sözlük olarak ddizeleri ve iadeler listesi olarak Trueveya False.

Nasıl çalışır

İlk adım, whariç tutulan tüm alt dizelerin wuzunluk listesine göre gruplandırılmış bir listesini oluşturan bir liste kavramadır . Örneğin, için 'stage'liste [['s', 't', 'a', 'g', 'e'], ['st', 'ta', 'ag', 'ge'], ['sta', 'tag', 'age'], ['stag', 'tage']]oluşturulur. Bu, iher bir alt dize uzunluğu için geçerli tüm başlangıç ​​indeksleri üzerinde döngü yapılarak sve her suzunluktaki alt dize kullanılarak dilimlenerek elde edilir w[i:i+s]. Bu listedeki her liste için sözlükteki her bir alt dizenin varlığı kontrol edilir; anyBelirli bir uzunluk için en az bir eşleşme bulunursa çağrı isabet döndürür. Son olarak, çağrı alltüm alt dize uzunlukları için bir eşleşme bulunup bulunmadığını kontrol eder ve bunun sonucu döndürülür.

Ideone üzerinde deneyin


4

Ruby, 44 bayt

  • @NotThatCharles ve set operatörü hileleri sayesinde 7 bayt kapalı!
  • Ruby 2.3 güvenli navigasyon operatörü hilesi ile @Jordan sayesinde 2 bayt kapalı w[x]&.size:)
->w,d{[*1..w.size]-d.map{|x|w[x]&.size}==[]}

Bir kelime wve bir sözlük (kelime dizisi) alan anonim bir işlevdir d. İki dizi oluşturur: Birincisi, 1'e kadar olan sayıları ve uzunluğunu içerir w; İkinci dizi , aksi takdirde dbir alt dizesi ise her kelimenin boyutlarına eşlenmesi ile olur . Daha sonra, ikinci dizinin ilk dizinin tüm elemanlarını içerip içermediğini kontrol etmek için çıkarma yapar.wnil


1
Ruby 2.3'teki "güvenli navigasyon operatörü" ile birkaç bayt kaydedebilirsiniz: w[x]&.size==ibunun yerine x.size==i&&w[x].
Ürdün

Oh vay, teşekkürler @Jordan. Bunu bilmiyordum, harika :)
daniero

1
Eğer bırakarak anonim işlevinde bir kaç bayt (ve belki tam programı) kaydedebilir uniqve -[p]bunun yerine seti çıkarma kullanarak:[*1..w.size]-d.map{...}==[]
Değil Charles

@NotthatCharles Bu harika! Teşekkürler :)
daniero

3

PowerShell V3 + V2 +, 127 110 70 65 bayt

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

(Şimdi bağımsız olarak geliştirmeme rağmen yaklaşımımın @ xnor'lara benzediğini görüyorum)

Dizi olarak beklenen giriş kelimesini $ave sözlüğünü alır (aşağıdaki örneklere bakınız). Geçerli sözcüğün tamamı boyunca döngüler oluşturur ve geçerli sözcüğün giriş sözcüğüne karşı normal ifade olduğu girişleri çıkarmak için a gerçekleştirir (yani, geçerli sözcük, giriş sözcüğünün bir alt dizesidir).$d$d$dWhere-Object$_-match$a

Biz bu alt dize kelime ve boru bunları toplamak Select-Objectüzerine lengthparametre ve -Unique kısıtlaması. Bu, her bir alt dizenin benzersiz uzunluklarını ortaya çıkaracaktır. Örneğin, giriş sözcüğü için combbu bir (4,2)for dizisi olacaktır ('comb','om').

.countSonuçta elde edilen diziyi alıyoruz ve onu giriş kelimesi ile karşılaştırıyoruz .length. Eşitse, bu her alt dize uzunluğunun sözlükte olduğu anlamına gelir, bu nedenle $TRUEaksi takdirde en az bir tane eksik demektir $FALSE. Bu Boolean değeri boru hattında kalır ve çıktı örtüktür.

NB - Bu gerektiğini , çünkü v2 + çalışmak -inoperatör artık mevcut olmaması, ancak sürümü olduğunu test ettik.

Örnekler

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 bayt

-EEk ücret ödemeden gerektirir .

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

STDIN üzerinden tüm girişleri kabul eder. İlk girdi hedef kelimedir, geri kalan girdi sözlüktür. 1Başarı üzerine yazdırır , hata durumunda boş bir dize yazdırır .

kullanım

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 bayt

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

Mathematica'nın yerleşimini kullanır DictionaryWordQ.

Girdiyi dsözlük olarak almak 5 bayt daha kısa, ancak uzun listeler için çok daha yavaştır:

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

2

MATL , 15 bayt

@ Xnor yanıtından bir fikir kullanılarak 1 bayt kaydedildi .

XXgc32>!suz1Gn=

Çıktılar 1ya da 0doğruluk ya da sahtelik için.

Çevrimiçi deneyin!

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 bayt

İçin +2 içerir -p0

STDIN'de kelime ve ardından sözlüğü verin:

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

(Unix üzerinde test yaparken dictionary.txt dosyasının \nsatır sonlandırıcı olarak kullanıldığından emin olun \r\n)

wordinian.pl:

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

1

JavaScript (Firefox 30-57), 68 bayt

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

Bir jeneratör kavrayışı kullanmak bir ara dizi oluşturmaktan kaçınır. 73 bayt ES6 sürümü:

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

1

05AB1E , 8 bayt

ŒÃ€gZLåP

İlk girdi olarak kelime, ikinci girdi olarak sözlük listesi.

Çevrimiçi deneyin veya birkaç test vakasını doğrulayın .

Açıklama:

Œ         # 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 bayt

Dosya olarak işlev biçimini kullanma:

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

Çağrı yap: ["WORD", DICTIONARY] call NAME_OF_COMPILED_FUNCTION

Ungolfed:

//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 - [""])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.