Belirli bir dizeye sığacak sözcükleri sipariş etme


10

Bir dizi harf ve bir kelime kümesi verildiğinde, kelimelerin bir dizgesini çıktılar, böylece dizede gerekli olmayan harfleri bırakarak bulunabilirler. Sözcükler, sözcük kümesinde bir kereden fazla oluşabilir. Giriş dizesi ve tüm kelimeler, her biri 1 ila 1000 küçük harften oluşur. Bırakılacak harfler kelimelerin içinde veya kelimeler arasında olabilir.

Programınız veya işleviniz harf dizesini ve sözcükleri liste, dize veya STDIN biçiminde kabul edebilir ve tüm sözcükleri liste veya dize çıktısı olarak doğru sırada vermelidir. Birden fazla doğru çözüm varsa, bunlardan yalnızca birini alın. Doğru bir çözüm yoksa, boş bir liste veya boş bir dize alın.

Örnekler:

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)

Bu kod golf. En az bayt kazanır.

Düzenleme: Ek karakterlerin kelimelerin içinde olabileceği açıklandı.


Girdi biçimi bir dize sonra da kalan dize listesi olabilir mi?
Kapı tokmağı

@Doorknob, evet, sorun değil. Giriş ve çıkış yapıları esnektir. Meydan okumak için eklendi.
Mantık Şövalyesi

Test durumlarından, bırakılan harflerin her zaman kelimeler arasında olduğu anlaşılıyor. Öyle mi? Bu meydan okumada belirtmelisiniz veya bir kelimeye bırakılan harfleri içeren bir test örneği eklemelisiniz
Luis Mendo

Üçüncü test vakasını anlamıyorum; cevabınız daha ccönce belirtilir, bbancak bbve ccalt dizeleri yalnızca bir kez ve bbalt dize önce görünür.
Neil

@Neil, ccbcbdizenin bir kısmında, ortayı düşürdükten ccsonra çıktıyı bbçıkardık c.
Mantık Şövalyesi

Yanıtlar:


5

Pyth, 20 24 bayt

Pyth ile ilgili ilk denemem :)

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

Nasıl çalışır:

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

Notlar: üçüncü örnekte ( dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc) uzun zaman alır .


5

Pyth, 10 bayt

h@s./Myz.p

gösteri

Bu program çok kaba bir kuvvettir. Önce girdinin her alt kümesini, sonra alt kümelerin her bölümünü oluşturur, sonra sözcük listesinin yeniden sıralanması olan ilk alt kümeyi denetler. Meta mutabakat tarafından izin verilen stdout'a çıktı olmadan hata yapılamaz. Hata 2 ekstra bayt için kaldırılabilir.

Verilen test durumlarının birçoğu için programın makul bir süre içinde tamamlanmayacağını unutmayın.


İkinci test çantasını kaçırdınız.
Leaky Nun

@KennyLau Bu davayı denediğimde, makul bir süre içinde geri dönmüyor. Ancak yanlış cevap vermez. Bence işe yarıyor. Bir cevap döndürdüğü bir test durumunuz var mı ve bu cevap yanlış mı?
isaacg

Gerçekten güzel bir yöntem.
Leaky Nun

Beni yendin.
Leaky Nun

Cevaba ekleyebilir misiniz?
Leaky Nun

1

JavaScript (ES6), 119 bayt

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

Bir dizeyi ve bir kelime dizisini kabul eder ve bir kelime dizisini veya undefinedhata durumunda döndürür . Hata durumunda boş dizeyi ( ?q:``) döndürmesi gerekiyorsa 2 bayt ekleyin ; bu durumda bu alternatif sürüm yalnızca 120 bayttır ve başarısız olduğunda boş dizeyi döndürür ve hatta hata durumunda 0 döndürmesine izin verilirse 2 bayt kaydedebilir:

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

(Bunu yazdıktan sonra algoritmanın temelde @ KennyLau'nun Pyth cevabı ile aynı olduğunu fark ettim.)

Düzenlenmiş düzenleme: soru açıklandıktan sonra güncellendi, ancak şimdi üçüncü test durumunda gerçekten yavaş; Geçen geceden önce yola çıktım ve bu sabah, çözümü gerçekten bulduğunu fark ettim, 30 ila 40 saat sonra bir yerde. Gerçi gerçekten kastım ve çözümü ona besledim (en iyi şekilde ters çözümle çalışır, anında doğrulayacaktır).


1

Java 7, 256 bayt

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

Farklı bir yaklaşım kullanarak bunu daha fazla golf oynamak kesinlikle mümkün olmalı, ama bu şimdilik olacak.

Test edilmemiş ve test kodu:

Burada deneyin.

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

Çıktı:

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

1

Groovy (44 Bayt)

Bunun için kimsenin regexes kullanmadığına inanamıyorum ...

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

açıklama

/${b.join('|')}/- Bir dizedeki sözcüklerden herhangi birini bulmak için bir normal ifade oluşturun.
.findAll(...)- Dizedeki tüm oluşumları bulun ve bir diziye toplayın.
.join(" ")- Diziye boşluklarla birlikte katılın.

Temel olarak, herhangi bir oluşum yoksa, dizi boştur ve dolaylı olarak boş bir dize döndürür. Örnekleri bulursa, örneklerle birlikte bir dizi nesnesi döndürür ve ardından dizeye düzleştirir.

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.