Розкладіть слова іншими словами (наприклад, "afterglow" = "aft" + "erg" + "low")


13

Ось один для всіх ви, словотворців, там! Напишіть програму або функцію, яка містить список слів і створює список усіх можливих сполучних розкладів для кожного слова. Наприклад:

(Примітка. Це лише невеликий вибірки для ілюстративних цілей. Фактичний результат набагато об’ємніший.)

afterglow = after + glow
afterglow = aft + erg + low
alienation = a + lie + nation
alienation = a + lien + at + i + on
alienation = a + lien + at + ion
alienation = alien + at + i + on
alienation = alien + at + ion
archer = arc + her
assassinate = ass + as + sin + ate
assassinate = ass + ass + in + ate
assassinate = assassin + ate
backpedalled = back + pedal + led
backpedalled = back + pedalled
backpedalled = backpedal + led
goatskin = go + at + skin
goatskin = goat + skin
goatskin = goats + kin
hospitable = ho + spit + able
temporally = tempo + rally
windowed = win + do + wed
windowed = wind + owed
weatherproof = we + at + her + pro + of
yeasty = ye + a + sty

Гаразд, ви зрозуміли ідею. :-)

Правила

  • Використовуйте будь-яку мову програмування на ваш вибір. Найкоротший код за кількістю символів для кожної мови виграє. Це означає, що для кожної мови використовується один переможець. Загальним переможцем буде просто найкоротший код з усіх поданих.
  • Список вводу може бути текстовим файлом, стандартним введенням або будь-якою структурою списку, яку надає ваша мова (список, масив, словник, набір тощо). Слова можуть бути англійською або будь-якою іншою природною мовою. (Якщо в списку є англійські слова, ви хочете ігнорувати або попередньо відфільтрувати однолітерні елементи, за винятком "a" та "i". Так само, як і для інших мов, ви хочете ігнорувати безглузді елементи, якщо вони відображаються у файлі.)
  • Список вихідних даних може бути текстовим файлом, стандартним висновком або будь-якою структурою списку, якою використовується ваша мова.
  • Ви можете використовувати будь-який вхідний словник, який вам подобається, але, ймовірно, ви хочете використовувати той, який забезпечує розважливі слова, а не той, який надає занадто багато незрозумілих, прихованих або необмежених слів. Цей файл, який я використав: Кукурудзяний список із понад 58000 англійських слів

Запитання

Це завдання полягає насамперед у написанні коду для виконання завдання, але також цікаво прочесати результати ...

  1. Які підслови зустрічаються найчастіше?
  2. Яке слово можна розкласти на найбільшу кількість підслов?
  3. Яке слово можна розкласти самими різними способами?
  4. Які слова складаються з найбільших підслів?
  5. Які розклади ви виявили найбільш цікавими?

@Geobits - Ах, дякую! Я пропустив два розклади, alienationколи вирізав і вставив це. Виправлено зараз. Щодо інших, перелік, наведений вище, є лише невеликою вибіркою. Моя програма тестування отримала десятки тисяч відповідей, коли мені дали список кукурудзи.
Тодд Леман

1
"Які підслови трапляються найчастіше?" Викиньте там дику здогадку і скажіть, що "а" може бути біля вершини.
Селлім

@SebastianLamerichs - я не знаю ... Може бути, може і не бути. :)
Тодд Леман

@ToddLehman це речення містить рівно 0 підслів, тож "a" все ще дорівнює першому: P
Sellyme

@SebastianLamerichs, якщо ви посилалися на відповідь Тодда на вас, "dunno" можна розділити на "dun" + "no". ;)
я насторожив прибульця

Відповіді:


3

Пітон 186

a=open(raw_input()).read().split()
def W(r):
 if r:
    for i in range(1,len(r)+1):
     if r[:i]in a:
        for w in W(r[i:]):yield[r[:i]]+w
 else:yield[]
while 1:
 for f in W(raw_input()):print f

Не особливо ефективно, але насправді не страшно повільно. Це просто наївно (я вважаю, що це можливо, хоча я думаю, що малоймовірно, що python робить якісь розумні оптимізації) перевіряє наявність підслів у словнику кукурудзяної качани і рекурсивно знаходить як можна більше слів. Звичайно, цей словник досить обширний, і ви можете спробувати той, який не включає різні абревіатури та абревіатури (що веде до подібних речей bedridden: be dr id den). Також у пов'язаному словнику не здавалося, що слова "A" або "I" вказані як слова, тому я додав їх вручну.

Редагувати:

Тепер перший вхід - це ім'я файлу словника, який слід використовувати, а кожен додатковий - слово.


Варто сказати, що це Python 2, тому що код не працює в Python 3, тому що print fповинен бутиprint(f)

Крім того, як це запустити? echo archer|python2 filename.pyвиводить EOFError для останнього рядка

Деякі речі, які ви все ще можете змінити (я не перевіряв їх, але я впевнений, що це спрацює): for f in W(raw_input()):print f=> ''.join(W(raw_input()); a=open('c').read().split('\n')=>a=open('c').readlines()
ɐɔıʇǝɥʇuʎs

@ ɐɔıʇǝɥʇuʎs Ваш перший буде працювати, але readlinesсимволи нового рядка зберігаються в кінці рядків, тому я зробив це так, як і я.
KSab

@ ɐɔıʇǝɥʇuʎs Насправді, здається, joinпотрібні всі елементи, щоб бути рядками, і я не можу отримати його у формі, меншій, ніж у мене вже є.
KSab

2

Кобра - 160

sig Z(x,y)
def f(b)
    c as Z=do(x,y)
        if x.length<1,print y
        for z in File.readLines('t'),if z==x[:e=z.length].toLower,c(x[e:],y+' '+z)
    for t in b,c(t,'[t]:')

Це функція (сортування з двох функцій), яка приймає List<of String>* та друкує рядки, що містять можливі підрядкові композиції для кожного рядка зі списку аргументів.

* тип є насправді List<of dynamic?>, але надання нічого іншого, крім того List<of String>, можливо, порушить.


2

Скала, 132 129

Правка: трохи коротше, як читання циклу від stdin, ніж функція

while(true)print(readLine.:\(Seq(List(""))){(c,l)=>l.flatMap{m=>Seq(c+""::m,c+m.head::m.tail)}}filter(_.forall(args contains _)))

бігти як

scala decompose.scala aft after erg glow low

(або скористайтеся більш довгим списком слів :))

Оригінал:

def f(s:Seq[String])=s.map{_.:\(Seq(List(""))){(c,l)=>l.flatMap{m=>Seq(c+""::m,c+m.head::m.tail)}}filter(_.forall(args contains _))}

Функція від Seq [String] до Seq [Seq [Список [String]]]. Приймає словник як аргументи командного рядка.

Безголівки:

def decompose(wordList: Seq[String]) =
  wordList.map{ word =>                              // for each word
    word.foldRight(Seq(List(""))){ (char, accum) =>  // for each character
      accum.flatMap{list =>
        Seq(char+""::list,char+list.head::list.tail) // add it as both a new list and 
      }                                              // the to start of the first list
    }.filter(_.forall(args contains _))              // filter out lists w/ invalid words
  }

Підхід полягає у створенні всіх можливих списків підрядків та відфільтруванні тих, що містять рядок, що не міститься у словнику. Зауважте, що деякі з створених підрядів містять зайву порожню рядок, я припускаю, що порожній рядок не буде у словнику (немає ніякого способу передати його в командному рядку).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.