การสั่งซื้อคำให้พอดีกับสตริงที่กำหนด


10

กำหนดสตริงตัวอักษรและชุดคำเอาท์พุทการเรียงลำดับของคำเพื่อให้พวกเขาสามารถพบได้ในสตริงโดยวางตัวอักษรที่ไม่จำเป็น คำอาจเกิดขึ้นมากกว่าหนึ่งครั้งในชุดคำ สตริงอินพุตและคำทั้งหมดจะประกอบด้วยตัวอักษรตัวพิมพ์เล็ก 1 ถึง 1,000 ตัว ตัวอักษรที่จะถูกปล่อยอาจเกิดขึ้นภายในคำหรือระหว่างคำ

โปรแกรมหรือฟังก์ชั่นของคุณสามารถยอมรับสตริงตัวอักษรและคำเป็นรายการสตริงหรือจาก STDIN และต้องส่งออกคำทั้งหมดในลำดับที่ถูกต้องเป็นรายการหรือเอาท์พุทสตริง หากมีโซลูชันที่ถูกต้องมากกว่าหนึ่งรายการให้ส่งออกหนึ่งรายการเท่านั้น หากไม่มีวิธีที่ถูกต้องที่เป็นไปได้ให้ส่งออกรายการว่างหรือสตริงว่าง

ตัวอย่าง:

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)

นี่คือรหัสกอล์ฟ จำนวนไบต์ต่ำสุดชนะ

แก้ไข: อธิบายว่าอักขระพิเศษสามารถอยู่ในคำได้


รูปแบบอินพุตสามารถเป็นหนึ่งสตริงและจากนั้นรายการอื่นของสตริงที่เหลือได้หรือไม่?
Doorknob

@ Doorknob ใช่ว่าเป็นเรื่องปกติ โครงสร้างอินพุตและเอาต์พุตมีความยืดหยุ่น เพิ่มเข้ามาเพื่อท้าทาย
Logic Knight อัศวิน

จากกรณีทดสอบปรากฏว่าตัวอักษรที่ตกหล่นอยู่ระหว่างคำเสมอ เป็นอย่างนั้นเหรอ? คุณควรระบุว่าในการท้าทายหรือรวมถึงกรณีทดสอบด้วยตัวอักษรที่ลดลงในคำ
Luis Mendo

ฉันไม่เข้าใจกรณีทดสอบที่สาม คำตอบของคุณอยู่ccก่อนแล้วbbแต่bbและccสตริงย่อยจะปรากฏเพียงครั้งเดียวและbbสตริงย่อยจะปรากฏขึ้นก่อน
Neil

@Neil ในccbcbส่วนของการส่งออกสตริงเราที่ccส่งออกแล้วหลังจากที่ลดลงตรงกลางbb c
Logic Knight

คำตอบ:


5

Pyth, 20 24 ไบต์

ความพยายามครั้งแรกของฉันใน Pyth :)

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

มันทำงานอย่างไร:

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

หมายเหตุ: ใช้เวลานานในตัวอย่างที่สาม ( dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc)


5

Pyth, 10 ไบต์

h@s./Myz.p

สาธิต

โปรแกรมนี้ดุร้ายมาก ๆ มันจะสร้างชุดย่อยทุกชุดของอินพุตจากนั้นทุกพาร์ติชันของชุดย่อยจากนั้นตรวจสอบชุดแรกซึ่งเป็นการเรียงลำดับใหม่ของรายการคำ ไม่มีความเป็นไปได้ที่จะจัดการผ่านข้อผิดพลาดโดยไม่มีเอาต์พุตไปยัง stdout ซึ่งได้รับอนุญาตจากฉันทามติเมตา ข้อผิดพลาดสามารถลบได้ 2 ไบต์พิเศษ

โปรดทราบว่าสำหรับกรณีทดสอบที่ได้รับจำนวนมากโปรแกรมจะไม่สมบูรณ์ในระยะเวลาที่เหมาะสม


คุณพลาดการทดสอบครั้งที่สอง
Leun Nun

@ KennyLau เมื่อฉันลองใช้กรณีนี้มันจะไม่กลับมาในช่วงเวลาที่เหมาะสม อย่างไรก็ตามมันไม่ได้ให้คำตอบที่ผิด ฉันคิดว่ามันใช้งานได้ คุณมีกรณีทดสอบที่จะส่งคืนคำตอบและคำตอบนั้นผิดหรือเปล่า?
isaacg

วิธีการที่ดีจริงๆ
Leun Nun

คุณพ่ายแพ้ฉัน
Leun Nun

คุณสามารถเพิ่มคำตอบนั้นได้หรือไม่
Leun Nun

1

JavaScript (ES6), 119 ไบต์

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

ยอมรับสตริงและอาร์เรย์ของคำและส่งคืนอาร์เรย์ของคำหรือundefinedเมื่อเกิดความล้มเหลว เพิ่ม 2 ไบต์หากจะต้องส่งคืนสตริงว่างเปล่าในความล้มเหลว ( ?q:``) ซึ่งในกรณีนี้รุ่นทางเลือกนี้มีเพียง 120 ไบต์และส่งกลับสตริงว่างเปล่าเมื่อเกิดความล้มเหลวและสามารถบันทึก 2 ไบต์หากอนุญาตให้ส่งคืน 0 เมื่อล้มเหลว:

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

(หลังจากเขียนสิ่งนี้ฉันสังเกตว่าอัลกอริทึมนั้นเหมือนกับคำตอบ Pyth ของ @ KennyLau)

แก้ไขแก้ไข: การปรับปรุงหลังจากการชี้แจงของคำถาม แต่ตอนนี้มันช้าในกรณีทดสอบที่สาม ฉันตั้งไว้เมื่อคืนก่อนและเมื่อเช้านี้ฉันเพิ่งสังเกตเห็นว่าจริง ๆ แล้วมันพบวิธีแก้ปัญหาที่ไหนสักแห่งระหว่าง 30 และ 40 ชั่วโมงต่อมา ฉันคิดว่าจริง ๆ แล้วเลี้ยงโซลูชันให้ (มันทำงานได้ดีที่สุดกับโซลูชันที่กลับด้านซึ่งจะตรวจสอบทันที)


1

Java 7, 256 ไบต์

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

แน่นอนว่ามันจะเป็นไปได้ที่จะตีกอล์ฟให้มากขึ้นโดยใช้วิธีการที่ต่างออกไป

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

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

เอาท์พุท:

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

1

Groovy (44 ไบต์)

ฉันไม่อยากจะเชื่อว่าไม่มีใครใช้ regexes สำหรับสิ่งนี้ ...

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

คำอธิบาย

/${b.join('|')}/- สร้าง regex เพื่อค้นหาคำใด ๆ ในสตริง
.findAll(...)- ค้นหาและรวบรวมสิ่งที่เกิดขึ้นทั้งหมดในสตริงลงในอาร์เรย์
.join(" ")- เข้าร่วมอาร์เรย์พร้อมกับช่องว่าง

โดยทั่วไปหากไม่มีเหตุการณ์ใด ๆ อาร์เรย์จะว่างเปล่าและส่งคืนสตริงว่างเปล่าโดยปริยาย หากพบว่าเกิดขึ้นก็จะส่งกลับวัตถุอาร์เรย์ที่เกิดขึ้นแล้วแบนมันเป็นสตริง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.