Sắp xếp các từ để phù hợp với một chuỗi nhất định


10

Đưa ra một chuỗi các chữ cái và một tập hợp các từ, xuất ra một thứ tự các từ để có thể tìm thấy chúng trong chuỗi bằng cách bỏ các chữ cái không cần thiết. Từ có thể xảy ra nhiều hơn một lần trong bộ từ. Chuỗi đầu vào và tất cả các từ sẽ bao gồm từ 1 đến 1000 chữ cái viết thường. Các chữ cái được bỏ có thể xảy ra bên trong các từ hoặc giữa các từ.

Chương trình hoặc chức năng của bạn có thể chấp nhận chuỗi ký tự và từ dưới dạng danh sách, chuỗi hoặc từ STDIN và phải xuất tất cả các từ theo đúng thứ tự dưới dạng danh sách hoặc đầu ra chuỗi. Nếu có nhiều hơn một giải pháp đúng, chỉ xuất một trong số chúng. Nếu không có giải pháp đúng có thể, hãy đưa ra một danh sách trống hoặc một chuỗi trống.

Ví dụ:

dogcatfrog cat frog dog
-> dog cat frog

xxcatfixsxhingonxgrapexxxfishingcxat cat grape catfish fishing
-> catfish grape fishing cat

dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc
-> da ab ba ba ba cc bb aa ac dc db dd

flea antelope
->
(no solution)

Đây là mã golf. Số byte thấp nhất sẽ thắng.

Chỉnh sửa: Giải thích rằng các ký tự phụ có thể nằm trong các từ.


Định dạng đầu vào có thể là một chuỗi và sau đó là một danh sách khác của các chuỗi còn lại không?
Doorknob

@Doorknob, vâng, thế là tốt. Cấu trúc đầu vào và đầu ra là linh hoạt. Thêm vào thử thách.
Logic Knight

Từ các trường hợp kiểm tra, có vẻ như các chữ cái bị rơi luôn nằm giữa các từ. Là vậy sao? Bạn nên nói rằng trong thử thách, hoặc bao gồm một trường hợp thử nghiệm với các chữ cái được bỏ trong một từ
Luis Mendo

Tôi không hiểu trường hợp thử nghiệm thứ ba; puts câu trả lời của bạn cctrước bbnhưng bbccchuỗi con chỉ xuất hiện một lần và các bbchuỗi con xuất hiện đầu tiên.
Neil

@Neil, trong ccbcbphần của chuỗi chúng ta xuất đầu ra ccsau đó bbsau khi thả giữa c.
Logic Knight

Câu trả lời:


5

Bình thường, 20 24 byte

Nỗ lực đầu tiên của tôi về Pyth :)

Jcw;FG.ptJI:hJj".*"G0jdG

Làm thế nào nó hoạt động:

Jcw;FG.ptJI:hJj".*"G0jdG
Jcw                         assign("J",chop(input()))
    FG.ptJ                  for G in permutations(tail(J)):
          I:hJj".*"G0        if match(head(J),join(".*",G)):
                     jdG      print(join(" ",G))

Ghi chú: phải mất một thời gian dài trong ví dụ thứ ba ( dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc).


5

Bình thường, 10 byte

h@s./Myz.p

Trình diễn

Chương trình này là rất nhiều lực lượng vũ phu. Đầu tiên, nó xây dựng mọi tập hợp con của đầu vào, sau đó là mọi phân vùng của các tập hợp con, sau đó kiểm tra cái đầu tiên sắp xếp lại danh sách từ. Không có khả năng nào được xử lý thông qua lỗi không có đầu ra cho thiết bị xuất chuẩn, được cho phép bởi sự đồng thuận meta. Lỗi có thể được loại bỏ cho 2 byte thêm.

Lưu ý rằng đối với nhiều trường hợp thử nghiệm đã cho, chương trình sẽ không hoàn thành trong một khoảng thời gian hợp lý.


Bạn đã bỏ lỡ bài kiểm tra thứ hai.
Leaky Nun

@KennyLau Khi tôi thử trường hợp đó, đơn giản là nó không quay trở lại trong một khoảng thời gian hợp lý. Nó không đưa ra câu trả lời sai, tuy nhiên. Tôi nghĩ rằng nó hoạt động. Bạn có một trường hợp thử nghiệm mà nó trả về một câu trả lời, và câu trả lời đó là sai?
isaacg

Phương pháp thực sự tốt đẹp.
Leaky Nun

Bạn đã đánh bại tôi.
Leaky Nun

Bạn có thể thêm nó vào câu trả lời?
Leaky Nun

1

JavaScript (ES6), 119 byte

(s,a,t=``,...r)=>a[0]?a.find((w,i)=>(b=[...a],b.splice(i,1),f(s,b,w+t,w,...r)))&&q:~s.search(t.split``.join`.*`)&&(q=r)

Chấp nhận một chuỗi và một mảng các từ và trả về một mảng các từ hoặc undefinedkhông thành công. Thêm 2 byte nếu nó phải trả về chuỗi trống khi fail ( ?q:``), trong trường hợp đó phiên bản thay thế này chỉ có 120 byte và trả về chuỗi trống khi thất bại, và thậm chí có thể lưu 2 byte nếu nó được phép trả về 0 khi thất bại:

(s,a,t=``,...r)=>a[0]?a.reduce((q,w,i)=>q||(b=[...a],b.splice(i,1),f(s,b,w+t,w,...r)),0):~s.search([...t].join`.*`)?r:``

(Sau khi viết bài này, tôi nhận thấy rằng thuật toán về cơ bản giống như câu trả lời @ KennyLau Pyth.)

Chỉnh sửa chỉnh sửa: được cập nhật sau khi làm rõ câu hỏi, nhưng hiện tại thực sự chậm trong trường hợp thử nghiệm thứ ba; Tôi đã tắt nó vào đêm hôm trước và sáng nay tôi mới nhận thấy rằng nó thực sự đã tìm ra giải pháp, ở đâu đó trong khoảng 30 đến 40 giờ sau đó. Tôi thực sự có ý nghĩa và đưa ra giải pháp cho nó (nó hoạt động tốt nhất với giải pháp đảo ngược, nó sẽ xác minh ngay lập tức).


1

Java 7, 256 byte

import java.util.*;String c(String...a){Map s=new HashMap();int j,i=1,l=a[0].length();for(;i<a.length;i++)if((j=a[0].indexOf(a[i]))>-1)s.put(j,s.get(j)!=null?s.get(j)+" "+a[i]:a[i]);a[0]="";for(j=0;j<l;j++)a[0]+=s.get(j)!=null?s.get(j)+" ":"";return a[0];}

Chắc chắn có thể chơi golf này nhiều hơn bằng cách sử dụng một cách tiếp cận khác, nhưng điều này sẽ làm ngay bây giờ ..

Mã thử nghiệm & mã hóa:

Hãy thử nó ở đây.

import java.util.*;
class M{
  static String c(String... a){
    Map s = new HashMap();
    int j,
        i = 1,
        l = a[0].length();
    for(; i < a.length; i++){
      if((j = a[0].indexOf(a[i])) > -1){
        s.put(j, s.get(j) != null
                  ? s.get(j) + " " + a[i]
                  : a[i]);
      }
    }
    a[0] = "";
    for(j = 0; j < l; j++){
      a[0] += s.get(j) != null
               ? s.get(j) + " "
               : "";
    }
    return a[0];
  }

  public static void main(String[] a){
    System.out.println(c("dogcatfrog", "cat", "frog", "dog"));
    System.out.println(c("xxcatfixsxhingonxgrapexxxfishingcxat", "cat", "grape", "catfish", "fishing"));
    System.out.println(
        c("dababbabadbaccbcbaaacdacdbdd ", "aa", "bb", "cc", "dd", "ba", "ba", "ba", "ab", "ac", "da", "db", "dc"));
    System.out.println(c("flea", "antelope"));
  }
}

Đầu ra:

dog cat frog 
cat grape fishing 
da ab ba ba ba bb db ac cc aa dd 

1

Groovy (44 byte)

Tôi không thể tin rằng không ai khác sử dụng regexes cho việc này ...

{a,b->a.findAll(/${b.join('|')}/).join(" ")}

Giải trình

/${b.join('|')}/- Tạo một biểu thức chính quy để tìm bất kỳ từ nào trong chuỗi.
.findAll(...)- Tìm và thu thập tất cả các lần xuất hiện trong chuỗi thành một mảng.
.join(" ")- Tham gia mảng cùng với không gian.

Về cơ bản, nếu không có bất kỳ sự xuất hiện nào, mảng sẽ trống và trả về một chuỗi trống hoàn toàn. Nếu nó tìm thấy sự xuất hiện, nó trả về một đối tượng mảng với các lần xuất hiện sau đó làm phẳng nó thành một chuỗi.

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.