Chơi chuỗi từ


15

Khi tôi còn trẻ, tôi thường chơi một trò chơi chữ chuỗi Word . Nó rất đơn giản. Người chơi đầu tiên chọn một từ; người chơi tiếp theo nói một từ khác bắt đầu bằng cùng một chữ cái mà từ trước đó kết thúc bằng. Điều này diễn ra mãi mãi cho đến khi ai đó từ bỏ! Thủ thuật là, bạn không thể sử dụng cùng một từ hai lần (trừ khi mọi người quên từ đó thậm chí đã được sử dụng!). Thông thường chúng ta chơi với một chủ đề nhất định để làm cho nó khó hơn. Nhưng bây giờ, tôi muốn bạn làm một chương trình để làm điều này cho tôi.

Thử thách

Viết một chương trình hoặc hàm đầy đủ để tìm tất cả các chuỗi từ dài nhất có thể bằng cách sử dụng một bộ từ nhất định và từ bắt đầu.

Đây là , vì vậy đoạn mã ngắn nhất sẽ thắng!

Đầu vào

Có hai đầu vào: một danh sách và một từ bắt đầu. Từ bắt đầu sẽ không có trong danh sách. Các đầu vào đều là chữ thường ASCII và danh sách sẽ không chứa các từ trùng lặp.

Đầu ra

Tất cả các chuỗi từ trong danh sách sao cho:

  • Từ bắt đầu là từ đầu tiên trong chuỗi.

  • Mỗi từ tiếp theo bắt đầu bằng cùng một chữ cái với chữ cái cuối cùng của từ trước đó.

  • Độ dài của chuỗi là dài nhất có thể .

Nếu có nhiều chuỗi dài nhất, hãy xuất tất cả chúng.

Trình tự không nhất thiết phải chứa tất cả các từ danh sách. Đôi khi điều đó là không thể (xem thử nghiệm). Một lần nữa, không có từ nào có thể được sử dụng hai lần!

Tủ thử

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 bạn có thể vui lòng giải thích làm thế nào tôi có thể cải thiện câu hỏi của tôi?
TanMath

@ user81655 chắc chắn
TanMath

2
Bạn có thể thêm một trường hợp thử nghiệm với nhiều chuỗi đầu ra?
isaacg

@isaacg Chắc chắn rồi! làm việc trên nó
TanMath

@isaacg Đã thêm! (
Hoàn

Câu trả lời:


8

Bình thường, 25 23 byte

.MlZfqhMtTeMPT+Lzs.pMyQ

Bộ kiểm tra

Một giải pháp vũ phu. Quá chậm cho một số trường hợp thử nghiệm lớn hơn.

Nhập vào dưới dạng:

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

Đầu ra dưới dạng:

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

Giải trình:

.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
Bạn có thể thêm một lời giải thích?
TanMath

Mã của bạn chạy mãi mãi cho ví dụ trình tự nhiều đầu ra
TanMath

3
@TanMath không chỉ là thời gian theo cấp số nhân, nên rất chậm.
isaacg

5
Code golf: Nghệ thuật tạo ra một chương trình nhanh khác chạy theo thời gian theo cấp số nhân chỉ để tiết kiệm một vài byte: P
Arcturus

1
@RikerW Tôi nghĩ rằng cũng đáng để nhớ lại "Đánh giá mã: Làm cho mã ít sai hơn một chút / Code Golf: Làm cho mã hơi dài một chút" nhận xét từ trò chuyện ở đây.
Arcturus

4

JavaScript (ES6), 164 byte

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

Giải trình

Hàm đệ quy kiểm tra danh sách đầu ra sẽ kéo dài bao lâu cho tất cả các lựa chọn có thể.

Trả về một mảng các từ.

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

Kiểm tra

Tham số mặc định không được sử dụng trong thử nghiệm để làm cho nó tương thích nhiều trình duyệt hơn.


Tôi nghĩ bạn có thể sử dụng pop thay vì splice và o[r.length]?thay vì o.length>r.length?.
grc

@grc Cảm ơn, tôi rất thích tiền o[r.length]boa! Tôi không biết làm thế nào tôi có thể sử dụng popmặc dù.
dùng81655

Ah nvm - Tôi nghĩ pop có thể lấy một chỉ số làm đối số đầu tiên của nó như trong python.
grc

Giải pháp này không hợp lệ cho nhiều chuỗi đầu ra
TanMath

@TanMath Đã sửa, mặc dù nó phá vỡ một trong các trường hợp thử nghiệm.
dùng81655

3

Con trăn, 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

Tôi nghĩ nó nên hoạt động ngay bây giờ ...

Hãy thử trực tuyến .


1

Perl 5, 275 byte

Có lẽ không chơi golf nhiều như nó có thể, nhưng, hey, dù sao nó cũng không thắng, phải không?

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

Sử dụng nó như vậy:

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

Cảnh báo! Sử dụng tập lệnh này trong một danh sách dài đòi hỏi nhiều bộ nhớ! Nó làm việc rất tốt cho tôi trên bảy (sáu cộng thêm một) nhưng không phải trên mười ba (mười hai cộng một).

Nó loại bỏ đầu vào cuối cùng, tạo ra một mảng các mảng, trong đó các mảng là tất cả các hoán vị và thêm từ ban đầu trở lại khi bắt đầu. Sau đó, nó đẩy từng hoán vị như vậy lên một mảng khác, đó là giá trị của hàm băm với khóa số lượng của mảng có thuộc tính chuỗi mong muốn. Sau đó, nó tìm thấy khóa tối đa như vậy và in ra tất cả các mảng.


0

C, 373 byte

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(" ; ");}

Tôi tin rằng có lẽ có nhiều golf hơn tôi có thể làm ở đây vì vậy tôi có thể sẽ cập nhật nó.

Bỏ chơi gôn

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;
}

Liên kết Ideone - Nếu tôi không làm điều này đúng, hãy cho tôi biết: D


bạn có thể thêm một liên kết ideone để thử nghiệm?
TanMath

Vâng, tôi sẽ cập nhật câu trả lời của mình với nó @TanMath
Danwakeem

Liên kết phải chứa mã đánh gôn, không phải phiên bản không được chỉnh sửa. Bằng cách đó, chúng tôi có thể xác nhận phiên bản chơi gôn mà bạn đang gửi cho thử thách hoạt động.
TanMath
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.