Kelimeleri başka kelimelere ayırın (örneğin, “afterglow” = “kıç” + “erg” + “düşük”)


13

İşte tüm sözler için bir tane! Sözcüklerin listesini alan ve her sözcük için olası tüm birleşik ayrışmaların bir listesini üreten bir program veya işlev yazın. Örneğin:

(Not: Bu yalnızca açıklama amaçlı küçük bir örnekleme yöntemidir. Gerçek çıktı çok daha hacimlidir.)

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

Tamam, fikri anladınız. :-)

kurallar

  • Seçtiğiniz herhangi bir programlama dilini kullanın. Her dil için karakter sayısına göre en kısa kod kazanır. Bu, kullanılan her dil için bir kazanan olduğu anlamına gelir. Genel kazanan, gönderilenlerin en kısa kodu olacaktır.
  • Giriş listesi bir metin dosyası, standart giriş veya dilinizin sağladığı herhangi bir liste yapısı (liste, dizi, sözlük, küme vb.) Olabilir. Kelimeler İngilizce veya başka bir doğal dil olabilir. (Liste İngilizce kelimelerse, "a" ve "i" dışındaki tek harfli öğeleri yoksaymak veya önceden filtrelemek isteyeceksiniz. Benzer şekilde, diğer diller için, saçma olmayan öğeleri yoksaymak istersiniz dosyada görünür.)
  • Çıktı listesi bir metin dosyası, standart çıktı veya dilinizin kullandığı herhangi bir liste yapısı olabilir.
  • Beğendiğiniz herhangi bir giriş sözlüğünü kullanabilirsiniz, ancak muhtemelen çok fazla belirsiz, gizli veya engelli kelime sağlayandan ziyade mantıklı kelimeler sağlayan bir sözlük kullanmak istersiniz. Kullandığım dosya: 58000'den fazla İngilizce kelimenin mısır koçanı listesi

Sorular

Bu zorluk öncelikle görevi yerine getirmek için kod yazmakla ilgilidir , ancak sonuçları taramak da eğlencelidir ...

  1. En sık kullanılan alt kelimeler nelerdir?
  2. Hangi kelime en fazla sayıda alt kelimeye ayrılabilir?
  3. Hangi kelime en farklı yollardan ayrılabilir?
  4. Hangi kelimeler en büyük alt sözcüklerden oluşur?
  5. En eğlenceli olan hangi ayrışmaları buldunuz?

@Geobits - Ah, teşekkür ederim! alienationKesip yapıştırdığımda iki ayrışmayı kaçırdım . Şimdi düzeltildi. Diğerleri açısından, yukarıdaki liste sadece küçük bir örnekleme. Test programım Corncob listesi verildiğinde on binlerce cevap verdi.
Todd Lehman

1
"En çok hangi alt sözcükler görülür?" Oraya çılgın bir tahminde bulunup 'a' tepesinin yakınında olabilir.
Sellyme

@SebastianLamerichs - Bilmiyorum ... Olabilir, olmayabilir. :)
Todd Lehman

@ToddLehman cümle tam olarak 0 alt kelime içeriyor, bu yüzden 'a' hala eşittir: P
Sellyme

@SebastianLamerichs, Todd'un size verdiği cevaba atıfta bulunuyorsanız, "dunno" "dun" + "no" olarak ayrılabilir. ;)
Ben

Yanıtlar:


3

Piton 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

Özellikle verimli değil ama aslında korkunç değil yavaş. Sadece safça (herhalde mümkün olduğunu düşünüyorum, python bazı akıllı optimizasyonlar yapması pek olası değildir) alt kelimelerin mısır koçanı sözlükte olduğunu ve yinelemeli olarak olabildiğince fazla kelime bulduklarını kontrol eder. Tabii ki bu sözlük oldukça geniştir ve çeşitli kısaltmalar ve kısaltmalar içermeyen bir tane deneyebilirsiniz (gibi şeylere yol açar bedridden: be dr id den). Ayrıca bağlantılı sözlükte 'A' veya 'I' kelimesi olarak listelenmemiş gibi göründüğünden bunları manuel olarak ekledim.

Düzenle:

Şimdi ilk girdi kullanılacak sözlüğün dosya adı ve her ek sözcük bir kelimedir.


Kod Python 3'te çalışmaz, çünkü, çünkü bu, Python 2 olduğunu belirten It değerinde print folmalıdırprint(f)

Ayrıca, bunu nasıl çalıştırabilirim? echo archer|python2 filename.pyson satır için bir EOFError çıktısı

Hala değiştirebileceğiniz bazı şeyler (bunları test etmedim, ama işe yarayacağından eminim): 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 İlk readlineskarakteriniz işe yarayacaktı, ancak yeni satır karakterlerini satırların sonunda tutuyor, bu yüzden yaptığım gibi yaptım.
KSab

@ ɐɔıʇǝɥʇuʎs Oh aslında öyle görünüyor ki jointüm öğelerin dize olmasını gerektirir ve zaten sahip olduğumdan daha küçük bir biçimde elde edemiyorum.
KSab

2

Kobra - 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]:')

Bu, List<of String>* alan ve bağımsız değişken listesindeki her dize için olası alt sözcük düzenlemelerini içeren dizeleri yazdıran bir işlevdir (iki işlevden oluşan sıralama) .

* tür aslında List<of dynamic?>, ama başka bir şey sağlamak List<of String>muhtemelen kıracak.


2

Scala, 132 129

Düzenleme: stdin'den bir döngü okuma işlevinden biraz daha kısa

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

olarak çalıştırmak

scala decompose.scala aft after erg glow low

(veya daha uzun bir kelime listesi kullanın :))

Orijinal:

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 _))}

İşlev Seq [Dize] 'den Seq [Seq [Liste [Dize]]]' ye. Sözlüğü komut satırı argümanları olarak alır.

Ungolfed:

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
  }

Yaklaşım tüm olası alt dize listelerini oluşturmak ve sözlükte olmayan bir dize içerenleri filtrelemektir. Oluşturulan alt dizelerin bazıları ekstra boş bir dize içerdiğine dikkat edin, boş dizenin sözlükte olmayacağını varsayalım (yine de komut satırına iletmenin bir yolu yoktur).

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.