Czy to wordianian?

20

Jaki jest najkrótszy sposób, aby sprawdzić, czy dane wejściowe to wordinian przy użyciu dowolnego języka programowania?

Wordinian to słowo, które zawiera słowa o długości od 1 do pierwotnego słowa. Na przykład,

kosz

„Ja” to słowo
„w” to słowo
„bin” to słowo

Lub,

etap

„a” to słowo
„ta” to słowo ( tak to jest )
„wiek” to słowo
„jeleń” to słowo
„etap” to słowo

Wejście

Twój kod powinien przyjmować słowo i słownik jako dane wejściowe, w dowolnym rozsądnym formacie.

Wynik

Wynik powinien być wartością wskazującą na prawda lub fałsz, aby powiedzieć nam, czy słowo jest słowem.

Aby uzyskać więcej informacji o Wordinians, kliknij tutaj .

Oto lista słów , których będę używać jako danych wejściowych i słów podrzędnych. Ponadto w odpowiedzi na @xnor musi zawierać słowa podrzędne każdej długości, a nie ciąg słów podrzędnych. Pamiętaj, że tylko jedno słowo zostanie użyte jako dane wejściowe.

Jacques Marais
źródło
@FryAmTheEggman Nie mogę tutaj umieścić całego słownika. Co jeśli to jakieś słowo istnieje?
Jacques Marais,
6
Polecam przekazywanie słownika jako danych wejściowych. W ten sposób łatwo jest wymyślić przypadki testowe (ponieważ można stworzyć własny mały słownik)
Nathan Merrill
2
Czy musi zawierać tylko słowa podrzędne każdej długości, czy też musi to być łańcuch, w którym każde słowo podrzędne dodaje jedną literę do poprzedniej?
xnor
@FryAmTheEggman Zredagowałem moje pytanie, aby dostarczyć listę wszystkich słów.
Jacques Marais,
1
@JacquesMarais koncepcja polega na przyjęciu słowa i słownika oraz zwróceniu wartości true, jeśli słowo jest słowiańskim (zgodnie ze słownikiem)
Nathan Merrill

Odpowiedzi:

4

Pyth, 20 16 15 13 11 bajtów

Dzięki Leaky Nun za zaoszczędzenie 4 bajtów! Niestety później zmieniłem całą metodę, ale nadal pomogło.

gl{lM}#zQlz

Oczekuje wprowadzenia jako słownika, po którym następuje słowo. Wyprowadza wartość True lub False.

Wypróbuj tutaj!

Wyjaśnienie:

        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.

Nie działa to, jeśli pusty ciąg ""jest prawidłowym słowem.

Steven H.
źródło
1
.Emożna zastąpić przezs
Leaky Nun
1
m}kHmożna zastąpić przez}RH
Leaky Nun
1
Dałbym ci tylko kod do gry w golfa
Leaky Nun
11

Python, 52 bajty

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

Anonimowa funkcja, która pobiera słowo wi słownik d. Bierze słowa, dktóre są podciągami w, tworzy zestaw ich długości, a następnie sprawdza, czy jest tyle różnych długości, ile jest liter w.

xnor
źródło
Ugh, właśnie napisałem dokładnie to samo, tyle że miałem W zamiast x i [zamiast {. +1
Daniel
@Dopapp Nie działałoby, jeśli użyłeś [zamiast {. {...}jest kompletnym rozumieniem (Taki sam jak set([...])).
mbomb007,
@ mbomb007, och racja, potrzebny byłby zestaw
Daniel
@xnor Przepraszam, że nie wybrałem tej odpowiedzi, ale ponieważ jest to golf golfowy, muszę wybrać najkrótszy ...
Jacques Marais
4

Python 3, 108 bajtów

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

Anonimowa funkcja, która pobiera za pomocą argumentu słowo wjako ciąg znaków, a słownik djako listę ciągów znaków i zwraca Truelub False.

Jak to działa

Pierwszym krokiem jest zrozumienie listy, która generuje listę list wszystkich podciągów wwykluczania w, pogrupowanych według długości. Na przykład 'stage'lista [['s', 't', 'a', 'g', 'e'], ['st', 'ta', 'ag', 'ge'], ['sta', 'tag', 'age'], ['stag', 'tage']]jest generowana. Osiąga się to poprzez zapętlenie wszystkich prawidłowych indeksów początkowych idla każdej długości podciągu si pocięcie sza pomocą podciągu każdej długości w[i:i+s]. Dla każdej listy na tej liście sprawdzana jest obecność każdego podłańcucha w słowniku; wywołanie anyzwraca trafienie, jeśli zostanie znalezione co najmniej jedno dopasowanie dla danej długości. Na koniec wywołanie allsprawdza, czy znaleziono dopasowanie dla wszystkich długości podłańcuchów, i wynik jest zwracany.

Wypróbuj na Ideone

TheBikingViking
źródło
4

Rubinowy, 44 bajty

  • 7 Bajtów dzięki @NotThatCharles i jego sztuczkom operatora zestawu!
  • 2 bajty wyłączone dzięki @Jordan z trikiem bezpiecznego operatora nawigacji Ruby 2.3 w[x]&.size:)
->w,d{[*1..w.size]-d.map{|x|w[x]&.size}==[]}

To anonimowe funkcje, które pobierają słowo wi słownik (tablicę słów) d. Tworzy dwie tablice: pierwsza zawierająca liczby od 1 do długości włącznie w; Druga tablica ma dkażde słowo odwzorowane na ich rozmiar, jeśli w wprzeciwnym razie jest podłańcuchem nil. Następnie ustawia odejmowanie, aby sprawdzić, czy druga tablica zawiera wszystkie elementy pierwszej tablicy.

daniero
źródło
1
Dzięki „operatorowi bezpiecznej nawigacji” w Ruby 2.3 możesz zapisać kilka bajtów: w[x]&.size==izamiast x.size==i&&w[x].
Jordania
Och, wow, dzięki @Jordan. Nie wiedziałem o tym, super :)
daniero
1
można zaoszczędzić jeszcze kilka bajtów w swojej anonimowej funkcji (i być może pełny program) przez upuszczenie uniqi -[p]i stosując zestaw odejmowania zamiast:[*1..w.size]-d.map{...}==[]
Nie, że Charles
@NotthatCharles To wspaniale! Dzięki :)
daniero
3

PowerShell v3 + v2 +, 127 110 70 65 bajtów

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

(Widzę teraz, że moje podejście jest podobne do @ xnor, chociaż opracowałem je niezależnie)

Pobiera słowo wejściowe $ai słownik $d, oczekując $djako tablica (patrz przykłady poniżej). Pętle przechodzą przez całość $di wykonują a, Where-Objectaby wyciągnąć wpisy, w których bieżące słowo $_jest wyrażeniem regularnym -matchwzględem słowa wejściowego $a(tj. Jest to bieżące słowo będące podciągiem słowa wejściowego).

Zbieramy wszystkie te słowa i podciąg rury im Select-Objectna lengthparametr i -Unique ograniczeń. To wyciągnie unikalne długości każdego podciągu. Na przykład dla słowa wejściowego combbędzie to tablica (4,2)dla ('comb','om').

Bierzemy .countwynikową tablicę i porównujemy ją ze słowem wejściowym .length. Jeśli jest równy, oznacza to, że każda długość podłańcucha jest w słowniku, więc $TRUEw przeciwnym razie brakuje nam co najmniej jednego, więc $FALSE. Ta wartość logiczna jest pozostawiana w potoku, a dane wyjściowe są niejawne.

NB - Powinno to działać w v2 +, ponieważ -inoperator nie jest już obecny, ale nie przetestowałem tej wersji.

Przykłady

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
źródło
2

Perl, 86 bajtów

Wymaga -Ebez dodatkowych kosztów.

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

Akceptuje wszystkie dane wejściowe przez STDIN. Pierwsze wejście to słowo docelowe, pozostała część to słownik. Drukuje 1po sukcesie, pusty ciąg po awarii.

Stosowanie

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
źródło
2

Mathematica, 90 bajtów

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

Wykorzystuje wbudowane oprogramowanie MathematicaDictionaryWordQ .

Przyjmowanie danych djako słownika jest o 5 bajtów krótsze, ale w przypadku długich list znacznie wolniejsze:

m=MemberQ;Sort[m[d~m~#&/@StringPartition[#,t,1],True]~Table~{t,StringLength@#}][[1]]&
jaskółka oknówka
źródło
2

MATL , 15 bajtów

1 bajt zapisany przy użyciu pomysłu z odpowiedzi @ xnor .

XXgc32>!suz1Gn=

Wyjścia 1lub 0dla prawdy lub fałszu.

Wypróbuj 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
źródło
1

Perl, 42 41 bajtów

Obejmuje +2 za -p0

Podaj słowo, a następnie słownik na STDIN:

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

(Podczas testowania na Uniksie upewnij się, że Dictionary.txt używa \njako terminatora linii, a nie \r\n)

wordinian.pl:

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

JavaScript (Firefox 30-57), 68 bajtów

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

Korzystanie ze zrozumienia generatora pozwala uniknąć tworzenia tablicy pośredniej. 73-bajtowa wersja ES6:

(w,a)=>new Set(a.filter(x=>~w.search(x)).map(x=>x.length)).size==w.length
Neil
źródło
1

05AB1E , 8 bajtów

ŒÃ€gZLåP

Słowo jako pierwsze wejście, lista słownikowa jako drugie wejście.

Wypróbuj online lub sprawdź kilka innych przypadków testowych .

Wyjaśnienie:

Œ         # 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
źródło
1

Kotlin , 51 bajtów

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

Wypróbuj online!

ślimak_
źródło
0

SQF , 147 bajtów

Używając formatu pliku jako funkcji:

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

Zadzwoń jako: ["WORD", DICTIONARY] call NAME_OF_COMPILED_FUNCTION

Nie golfowany:

//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 - [""])
Obrzydliwe
źródło