Це словослова?


20

Який найкоротший спосіб дізнатися, чи є вхідним словом, використовуючи будь-яку мову програмування?

Слововий слово - це слово, яке містить слова довжиною 1 до початкової довжини слова. Наприклад,

бункер

'Я' - це слово
'в' - це слово
'бін' - це слово

Або,

етап

'a' - це слово
'ta' - це слово ( так, це так )
'age' - це слово
'stag' - це слово
'stage' - це слово

Вхідні дані

Ваш код повинен використовувати слово та словник як вхідні дані у будь-якому розумному форматі.

Вихідні дані

Вихід повинен бути значенням, яке вказує на істинне чи хибне, щоб сказати нам, чи є словом слово.

Для отримання додаткової інформації про Wordians натисніть тут .

Ось список слів, які я буду використовувати як введення та підслови. Також у відповідь на @xnor він повинен містити підслови кожної довжини, а не ланцюжок підслов. Зауважте, що лише одне слово буде використано як введення.


@FryAmTheEggman Я не можу тут поставити цілий словник. Що робити, якщо це якесь слово існує?
Жак Маре

6
Я б рекомендував ввести словник як введення. Таким чином, можна легко придумати тестові справи (як ви можете скласти власний невеликий словник)
Nathan Merrill

2
Чи потрібно просто містити підслови кожної довжини, чи вони повинні бути ланцюжком, де кожне підслово додає одну букву до попередньої?
xnor

@FryAmTheEggman Я відредагував своє запитання, щоб надати список усіх слів.
Жак Маре

1
@JacquesMarais концепція полягає в тому, щоб взяти слово і словник, і повернути істину, якщо слово є слов'янським (згідно словника)
Nathan Merrill

Відповіді:


4

Pyth, 20 16 15 13 11 байт

Дякуємо Leaky Nun за збереження 4 байтів! На жаль, я змінив весь метод згодом, але це все-таки допомогло.

gl{lM}#zQlz

Очікує введення як словник, а за ним слово. Виводи точні чи помилкові.

Спробуйте тут!

Пояснення:

        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
Я просто дав би вам код для гольфу
Leaky Nun

11

Пітон, 52 байти

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

Анонімна функція, яка бере слово wта словник d. Він бере слова в dпідрядках w, складає набір їх довжин, а потім перевіряє, чи існує стільки різних довжин, скільки є літер w.


Тьфу я тільки що написав те саме , за винятком того, що я мав W замість x і [замість {. +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та нарізки кожної довжини sпідрядки за допомогою w[i:i+s]. Для кожного списку цього списку перевіряється наявність кожної підрядки у словнику; виклик anyповертає хіт, якщо знайдено хоча б одну відповідність для заданої довжини. Нарешті, виклик allперевіряє, чи знайдено збіг на всі довжини підрядків, і результат цього повертається.

Спробуйте це на Ideone


4

Рубін, 44 байти

  • 7 байт вимкнено завдяки @NotThatCharles та його наборам операторів набору!
  • 2 байти від @Jordan завдяки трюку оператора безпечної навігації Ruby 2.3 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. Не знав цього, дивовижно :)
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як масив (див. Приклади нижче). Проводить цикл через цілість $dі виконує a, Where-Objectщоб витягнути записи, де поточне слово $_є регулярним виразом -matchпроти введеного слова $a(тобто, поточне слово є підрядком вхідного слова).

Ми збираємо всі ці подстроку слова і труби , щоб вони Select-Objectпо lengthпараметру і -UNique обмеження. Це дозволить витягнути унікальну довжину кожної підрядки. Наприклад, для вхідного слова combце буде масив (4,2)для ('comb','om').

Ми беремо .countцей результуючий масив і порівнюємо його з вхідним словом .length. Якщо вона дорівнює, це означає, що кожна довжина підрядок є у словнику, то $TRUE, інакше нам не вистачає хоча б однієї, так $FALSE. Булеве значення залишається на конвеєрі, а вихідний сигнал неявний.

Примітка. Це має працювати в 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

Математика, 90 байт

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

Використовує вбудовану програму MathematicaDictionaryWordQ .

Введення dсловника як словника на 5 байт коротше, але набагато повільніше для довгих списків:

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

2

MATL , 15 байт

1 байт збережено за допомогою ідеї з відповіді @ xnor .

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 переконайтеся, що Dictionary.txt використовує \nяк термінатор рядка, а не \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

Слово як перший вхід, список словників як другий.

Спробуйте в Інтернеті або перевірте ще кілька тестових випадків .

Пояснення:

Π        # 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 - [""])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.