Это словоинское?

20

Каков самый короткий способ узнать, является ли ввод словаинским с использованием какого-либо языка программирования?

Wordinian - это слово, которое содержит слова длиной от 1 до длины исходного слова. Например,

бункер

«Я» - это слово
«в» - это слово
«бин» - это слово

Или,

сцена

«a» - это слово
«ta» - это слово ( да, это так );
«age» - это слово.
«stag» - это слово.
«stage» - это слово.

вход

Ваш код должен принимать слово и словарь в качестве входных данных в любом разумном формате.

Выход

Выходными данными должно быть значение, указывающее true или false, чтобы сказать нам, является ли слово wordinian.

Для получения дополнительной информации о Wordinians нажмите здесь .

Вот список слов, которые я буду использовать в качестве входных данных и подслов. Кроме того, в ответ на @xnor он должен содержать подслова каждой длины, а не цепочку подслов. Обратите внимание, что в качестве входных данных будет использоваться только одно слово.

Жак Марэ
источник
@FryAmTheEggman Я не могу поместить здесь целый словарь. Что если это какое-то слово существует?
Жак Марэ
6
Я бы рекомендовал передать в словарь в качестве входных данных. Таким образом, легко придумать контрольные примеры (так как вы можете создать свой собственный небольшой словарь)
Натан Меррилл
2
Должно ли оно просто содержать подслов каждой длины, или они должны быть цепочкой, где каждое подслово добавляет одну букву к предыдущему?
xnor
@FryAmTheEggman Я отредактировал свой вопрос, чтобы предоставить список всех слов.
Жак Марэ
1
@JacquesMarais концепция состоит в том, чтобы взять слово и словарь и вернуть истину, если слово является словоинианским (согласно словарю)
Натан Меррилл

Ответы:

4

Pyth, 20 16 15 13 11 байт

Спасибо Leaky Nun за сохранение 4 байта! К сожалению, я изменил весь метод впоследствии, но он все же помог.

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

Python, 52 байта

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

Анонимная функция, которая принимает слово wи словарь d. Он принимает слова d, являющиеся подстроками w, устанавливает набор их длин, а затем проверяет, что существует столько разных длин, сколько есть букв w.

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

Попробуйте это на Ideone

TheBikingViking
источник
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. Затем он устанавливает вычитание, чтобы проверить, содержит ли второй массив все элементы первого массива.

daniero
источник
1
С помощью «оператора безопасной навигации» в Ruby 2.3 вы можете сохранить пару байтов: w[x]&.size==iвместо x.size==i&&w[x].
Иордания
Ого, спасибо @ Джордан. Не знал этого,
круто
1
Вы можете сэкономить еще несколько байт в вашей анонимной функции (и , может быть , по полной программе), понижая uniqи -[p]и используя множество вычитания вместо этого:[*1..w.size]-d.map{...}==[]
Не то,
@NotthatCharles Это великолепно! Спасибо :)
Даниеро
3

PowerShell v3 + v2 +, 127 110 70 65 байт

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

(Теперь я вижу, что мой подход похож на @ xnor's, хотя я разработал его независимо)

Принимает входное слово $aи словарь $d, ожидая $dв виде массива (см. Примеры ниже). Перебирает всю полноту $dи выполняет выборку Where-Objectдля извлечения записей, где текущее слово $_является регулярным выражением -matchдля входного слова $a(то есть является ли текущее слово подстрокой входного слова).

Мы собираем все эти слова подстроки и направляем их Select-Objectна lengthпараметр и -Uограничение nique. Это вытянет уникальные длины каждой подстроки. Например, для входного слова combэто будет массив (4,2)для ('comb','om').

Мы берем .countэтот результирующий массив и сравниваем его с входным словом .length. Если оно равно, это означает, что каждая длина подстроки находится в словаре, так что $TRUE, в противном случае мы пропускаем хотя бы одну, поэтому $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
AdmBorkBork
источник
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]]&

Использует встроенную 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

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 - [""])
Οurous
источник