Kelime zinciri oyna


15

Ben küçükken, Word zinciri adlı bir kelime oyunu oynarım . Çok basitti. İlk oyuncu bir kelime seçer; bir sonraki oyuncu bir önceki kelimenin bittiği harfle başlayan başka bir kelime söyler. Biri vazgeçene kadar bu sonsuza kadar devam eder! Hile, aynı kelimeyi iki kez kullanamazsınız (herkes bu kelimenin bile kullanılmasını unutmadıkça!). Genellikle zorlaştırmak için belirli bir konuyla oynarız. Ama şimdi, bunu benim için yapacak bir program yapmanı istiyorum.

Meydan okuma

Belirli bir kelime kümesi ve başlangıç ​​kelimesini kullanarak mümkün olan en uzun kelime zincirlerini bulmak için tam bir program veya işlev yazın.

Bu , bu yüzden en kısa kod kazanır!

Giriş

İki giriş vardır: bir liste ve bir başlangıç ​​sözcüğü. Başlangıç ​​sözcüğü listede olmayacaktır. Girişlerin tümü küçük harf ASCII'dir ve liste yinelenen kelimeler içermez.

Çıktı

Listedeki tüm kelime dizileri şöyle:

  • Başlangıç ​​kelimesi dizideki ilk kelimedir.

  • Sonraki her sözcük, önceki sözcüğün son harfiyle aynı harfle başlar.

  • Dizinin uzunluğu mümkün olan en uzundur .

Birden çok en uzun dizi varsa, bunların tümünü alın.

Dizinin tüm liste kelimelerini içermesi gerekmez. Bazen bu mümkün değildir (bkz. Test vakaları). Yine, hiçbir kelime iki kez kullanılamaz!

testcases

In: [hello, turtle, eat, cat, people] artistic
Out:  [artistic, cat, turtle, eat]
In: [lemonade, meatball, egg, grape] ham 
Out: [ham, meatball, lemonade, egg, grape]
In: [cat, cute, ewok] attic
Out: [attic, cute, ewok]
In:[cat, cute, ewok, kilo, to, otter] attic
Out: [attic, cute, ewok, kilo, otter]
In:[cat, today, yoda, attic] ferret
Out: [ferret, today, yoda, attic, cat]
In: [cancel, loitering, gnocchi, improv, vivic, child, despair, rat, tragic, chimney, rex, xylophone] attic
Out: [[attic, child, despair, rat, tragic, cancel, loitering, gnocchi, improv, vivic, chimney], [attic, cancel, loitering, gnocchi, improv, vivic, child, despair, ra', tragic, chimney]]
In: [cat, today, yoda, artistic, cute, ewok, kilo, to, otter] attic
Out: [attic, cat, today, yoda, artistic, cute, ewok, kilo, otter]

4
@downvoters lütfen sorumu nasıl geliştirebileceğimi açıklayabilir misiniz?
TanMath

@ user81655 emin
TanMath

2
Birden fazla çıkış dizisi içeren bir test senaryosu ekleyebilir misiniz?
isaacg

@isaacg Elbette! üzerinde çalışıyor
TanMath

@isaacg Eklendi! (15 karakter sınırı yerine getirildi ...)
TanMath

Yanıtlar:


8

Pyth, 25 23 bayt

.MlZfqhMtTeMPT+Lzs.pMyQ

Test odası

Kaba kuvvet çözümü. Bazı büyük test vakaları için çok yavaş.

Formdaki giriş:

attic
["cat", "today", "yoda", "to", "otter"] 

Formdaki çıktı:

[['attic', 'cat', 'today', 'yoda'], ['attic', 'cat', 'to', 'otter']]

Açıklama:

.MlZfqhMtTeMPT+Lzs.pMyQ
                           Q = eval(input()) (The list of words)
                           z = input()       (The starting word)
                     yQ    All subsets of the input.
                  .pM      All permutations of the subsets.
                 s         Flatten.
              +Lz          Add the starting word to the front of each list.
                           This is all possible sequences.
    f                      Filter on
     q                     The equality of
      hMtT                 The first character of each word but the first
          eMPT             The last character of each word but the last
.MlZ                       Take only the lists of maximal length.

2
Bir açıklama ekleyebilir misiniz?
TanMath

Kodunuz çoklu çıkış dizisi örneği için sonsuza kadar çalışır
TanMath

3
@TanMath hayır sadece üstel bir zaman, bu yüzden çok yavaş.
isaacg

5
Kod golf: Aksi takdirde hızlı bir program yapmak için sadece birkaç bayt kurtarmak için üstel sürede çalıştırmak sanat: P
Arcturus

1
@RikerW Ben de Martin "Kod İnceleme: kodu biraz daha az yanlış yapma / Code Golf: kodu biraz daha az uzun yapma" yorum hatırlatmaya değer düşünüyorum burada sohbet.
Arcturus

4

JavaScript (ES6), 164 bayt

f=(l,s,r=[[]])=>l.map((w,i)=>w[0]==s.slice(-1)&&(x=l.slice(),x.splice(i,1),o=f(x,w),a=o[0].length,b=r[0].length,r=a>b?o:a<b?r:r.concat(o)))&&r.map(q=>[s].concat(q))

açıklama

Çıktı listesinin tüm olası seçenekler için ne kadar süreceğini kontrol eden özyinelemeli bir işlev.

Bir dizi kelime dizisi döndürür.

f=(l,s,r=[[]])=>            // l = list, s = starting word, r is not passed (it is
                            //     here so that it is not defined globally)
  l.map((w,i)=>             // for each word w at index i
    w[0]==s.slice(-1)&&(    // if the first letter is the same as the last letter:
      x=l.slice(),          // x = clone of the list of words
      x.splice(i,1),        // remove the current word
      o=f(x,w),             // get the list of words starting from the current word
      a=o[0].length,
      b=r[0].length,
      r=a>b?o:              // if o is longer, set r to o
        a<b?r:              // if o is shorter, keep r
        r.concat(o)         // if o is same, add it to r
    )
  )
  &&r.map(q=>[s].concat(q)) // return a list of longest lists with the starting word

Ölçek

Varsayılan parametre, tarayıcılar arasında daha uyumlu olması için testte kullanılmamıştır.


Ben yerine ek yeri ve pop kullanmak düşünüyorum o[r.length]?yerine o.length>r.length?.
grc

@grc Teşekkürler, bahşişi gerçekten beğendim o[r.length]! popYine de nasıl kullanabileceğimi bilmiyorum .
user81655

Ah nvm - Pop'un bir indeksi python'daki gibi ilk argümanı olarak alabileceğini düşündüm.
grc

Bu çözüm birden çok çıkış dizisi için geçersiz
TanMath

@TanMath Test durumlarından birini kırmasına rağmen düzeltildi.
user81655

3

Python, 104

def f(d,w):
 a=[[w]]
 while a:b=a;a=[x+[y]for x in a for y in set(d)-set(x)if x[-1][-1]==y[0]]
 return b

Sanırım şimdi çalışmalı ...

Çevrimiçi deneyin .


1

Perl 5, 275 bayt

Muhtemelen olabildiğince golf oynamamıştı, ama hey, yine de kazanmıyor, değil mi?

use List::Util max;use List::MoreUtils uniq,before;use Algorithm::Permute permute;$i=pop;permute{push@c,[@ARGV]}@ARGV;for$c(@c){unshift@$c,$i;push @{$d{before{(substr$c->[$_],-1)ne(substr$c->[1+$_],0,1)}keys$c}},$c}for$m(max keys%d){say for uniq map{"@$_[0..$m+1]"}@{$d{$m}}}

Bu şekilde kullanın:

$ perl -M5.010 chain.pl cat tin cot arc
arc cat tin
arc cot tin

Uyarı! Bu komut dosyasının uzun bir listede kullanılması çok fazla bellek gerektirir! Yedi (altı artı ekstra bir) benim için harika çalıştı ama on üç (on iki artı bir) değil.

Son girdiyi kaldırır, dizi başvurularının tüm permütasyonlar olduğu bir dizi başvuru dizisi oluşturur ve başlangıçtaki sözcüğü başlangıçta yeniden ekler. Daha sonra, bu tür her bir permütasyonu, zincirleme özelliğine sahip dizinin miktarı ile birlikte bir karma değerinin değeri olan başka bir dizi değerine iter. Daha sonra bu tür maksimum anahtarı bulur ve tüm dizileri yazdırır.


0

C, 373 bayt

g(char*y){printf("%s, ",y);}z(char*w){int i,k=-1,v=0,j=sizeof(c)/sizeof(c[0]);int m[j],b=0;for(i=0;i<j;i++){m[v++]=c[i][0]==w[strlen(w)-1]?2:1;if(u[i]==6)m[v-1]=1;if(strcmp(w,c[i]))k=i;}printf("%s",w);for(i=0;i<j;i++){if(m[i]!=1){if(v+i!=j){g(s);for(;b<j;b++){if(u[b]==6)g(c[b]);}}else printf(", ");u[i]=6;z(c[i]);u[i]=1;}else v+=-1;}if(k!=-1)u[k]=1;if(v==0)printf(" ; ");}

Muhtemelen burada yapabileceğim çok daha fazla golf olduğuna inanıyorum, bu yüzden muhtemelen güncelleyeceğim.

De-golf

char *c[9]={"cat","today","yoda","artistic","cute","ewok","kilo","to","otter"};
u[9]={-1};
char *s="attic";

g(char*y){printf("%s, ",y);}
z(char*w){
   int i,k=-1,v=0,j=sizeof(c)/sizeof(c[0]);
   int m[j],b=0;
   for(i=0;i<j;i++){
      m[v++]=c[i][0]==w[strlen(w)-1]?i:-1;
      if(u[i]==6)m[v-1]=-1;
      if(strcmp(w,c[i]))k=i;
   }
   printf("%s",w);
   for(i=0;i<j;i++){
      if(m[i]!=-1){
         if(v+i!=j){
            g(s);
            for(;b<j;b++){
                if(u[b]==6)g(c[b]);
             }
         }else printf(", ");
         u[i]=6;
         z(c[i]);
         u[i]=-1;
      } else v+=-1;
   }
   if(k!=-1)u[k]=-1;
   if(v==0)printf(" ; ");
}

main(){
   z(s);
   printf("\n");
   return 0;
}

Ideone link - Bunu doğru yapmadıysam bana bildirin: D


test için bir ideone bağlantısı ekleyebilir misiniz ?
TanMath

Evet, cevabımı bununla güncelleyeceğim @TanMath
Danwakeem

Bağlantı, golf edilmemiş sürümü değil, golf kodunu içermelidir. Bu şekilde, meydan okuma işleri için gönderdiğiniz golfçü versiyonu onaylayabiliriz.
TanMath
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.