Memesan kata-kata agar sesuai dengan string yang diberikan

10

Diberikan string huruf dan serangkaian kata, output urutan kata-kata sehingga mereka dapat ditemukan dalam string dengan menjatuhkan huruf yang tidak diperlukan. Kata-kata dapat muncul lebih dari satu kali di kumpulan kata. String input dan semua kata akan terdiri dari 1 hingga 1000 huruf kecil masing-masing. Huruf yang akan dijatuhkan dapat muncul di dalam kata-kata atau di antara kata-kata.

Program atau fungsi Anda dapat menerima string huruf dan kata-kata sebagai daftar, string, atau dari STDIN, dan harus menampilkan semua kata dalam urutan yang benar sebagai daftar atau string output. Jika ada lebih dari satu solusi yang benar, hanya output salah satunya. Jika tidak ada solusi yang mungkin benar, hasilkan daftar kosong atau string kosong.

Contoh:

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)

Ini golf kode. Jumlah byte terendah menang.

Sunting: Dijelaskan bahwa karakter tambahan dapat di dalam kata-kata.

Ksatria Logika
sumber
Bisakah format input menjadi satu string dan kemudian daftar lain dari string yang tersisa?
Gagang Pintu
@ Doorknob, ya, tidak apa-apa. Struktur input dan output fleksibel. Ditambahkan ke tantangan.
Logic Knight
Dari kasus-kasus uji coba tampak bahwa huruf-huruf yang dijatuhkan selalu di antara kata-kata. Apakah begitu? Anda harus menyatakan itu dalam tantangan, atau memasukkan test case dengan huruf-huruf yang dijatuhkan dalam sebuah kata
Luis Mendo
Saya tidak mengerti kasus tes ketiga; menempatkan jawaban Anda ccsebelum bbtapi bbdan ccsubstring hanya muncul sekali dan bbsubstring muncul pertama kali.
Neil
@ Neil, di ccbcbbagian string kita output cckemudian output bbsetelah menjatuhkan tengah c.
Logic Knight

Jawaban:

5

Pyth, 20 24 byte

Upaya pertama saya di Pyth :)

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

Bagaimana itu bekerja:

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

Catatan: dibutuhkan waktu lama pada contoh ketiga ( dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc).

Biarawati Bocor
sumber
5

Pyth, 10 byte

h@s./Myz.p

Demonstrasi

Program ini sangat kasar. Pertama membangun setiap subset dari input, kemudian setiap partisi dari subset, kemudian memeriksa yang pertama yang merupakan penataan ulang dari daftar kata. Tidak ada kemungkinan ditangani melalui kesalahan tanpa output ke stdout, yang diizinkan oleh konsensus meta. Kesalahan dapat dihapus selama 2 byte tambahan.

Perhatikan bahwa untuk banyak kasus uji yang diberikan, program tidak akan selesai dalam periode waktu yang wajar.

isaacg
sumber
Anda melewatkan testcase kedua.
Leaky Nun
@ KennyLau Ketika saya mencoba kasus itu, itu tidak kembali dalam periode waktu yang masuk akal. Namun itu tidak memberikan jawaban yang salah. Saya pikir itu berhasil. Apakah Anda memiliki test case yang mengembalikan jawaban, dan jawaban itu salah?
isaacg
Metode yang sangat bagus.
Leaky Nun
Anda mengalahkan saya.
Leaky Nun
Bisakah Anda menambahkan itu ke jawabannya?
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)

Menerima string dan array kata dan mengembalikan array kata atau undefinedkegagalan. Tambahkan 2 byte jika harus mengembalikan string kosong pada kegagalan ( ?q:``), dalam hal ini versi alternatif ini hanya 120 byte dan mengembalikan string kosong pada kegagalan, dan bahkan dapat menyimpan 2 byte jika diizinkan untuk mengembalikan 0 pada kegagalan:

(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:``

(Setelah menulis ini saya perhatikan bahwa algoritma pada dasarnya sama dengan jawaban Pyth @ KennyLau.)

Suntingan yang diedit: diperbarui setelah klarifikasi pertanyaan, tetapi sekarang benar-benar lambat pada kasus uji ketiga; Saya mematikannya sebelum malam terakhir dan pagi ini saya baru saja memperhatikan bahwa itu sebenarnya telah menemukan solusinya, di suatu tempat antara 30 dan 40 jam kemudian. Saya benar-benar jahat dan memberi makan solusi untuk itu (itu bekerja paling baik dengan solusi terbalik, yang akan memverifikasi secara instan).

Neil
sumber
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];}

Seharusnya dimungkinkan untuk bermain golf ini lebih banyak dengan menggunakan pendekatan yang berbeda, tetapi ini akan berlaku untuk saat ini ..

Tidak digabungkan & kode uji:

Coba di sini.

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

Keluaran:

dog cat frog 
cat grape fishing 
da ab ba ba ba bb db ac cc aa dd 
Kevin Cruijssen
sumber
1

Groovy (44 Bytes)

Saya tidak percaya tidak ada orang lain yang menggunakan regex untuk ini ...

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

Penjelasan

/${b.join('|')}/- Buat regex untuk menemukan kata dalam string.
.findAll(...)- Temukan dan kumpulkan semua kemunculan dalam string ke dalam array.
.join(" ")- Bergabung dengan array bersama spasi.

Pada dasarnya, jika tidak ada kejadian, array kosong dan mengembalikan string kosong secara implisit. Jika ia menemukan kejadian, ia mengembalikan objek array dengan kejadian kemudian meratakannya menjadi string.

Guci Gurita Ajaib
sumber