สร้าง Portmantout!


16

พื้นหลัง

สามปีที่ผ่านมาผู้ชายคนนี้ทอมเมอร์ฟี่ได้รับมันเข้ามาในหัวของเขาที่จะขยายความคิดของกระเป๋าหิ้วถ้อยคำในภาษาหนึ่งและเรียกนี้portmantout ( กระเป๋าหิ้วบวกทัวร์ [ภาษาฝรั่งเศสทั้งหมด ]) การกำหนดภาษาอังกฤษให้เป็นรายการจาก 108,709 คำเขาสามารถค้นหาลำดับ 611,820 ตัวอักษรโดยมีคุณสมบัติสองอย่างต่อไปนี้:

  • คำภาษาอังกฤษทุกคำมีอยู่ในสตริง
  • บางพื้นที่ใกล้เคียงที่มีตัวอักษรสองตัวที่ติดกันในสตริงเป็นคำภาษาอังกฤษ

ต่อไปนี้เป็นลิงก์ไปยังหน้าซึ่งสามารถค้นหาพอร์ตนี้ (พร้อมด้วยคำอธิบายวิดีโอ)

portmantout

คุณสมบัติแรกของทั้งสองพอร์ตเป็นสิ่งที่เข้าใจได้ง่าย ครั้งที่สองอาจต้องการคำอธิบายบางอย่าง

โดยทั่วไปคำจะต้องทับซ้อนกัน "golfcode" จะไม่ปรากฏในพอร์ตภาษาอังกฤษเนื่องจากไม่มีคำที่มี "fc" อย่างไรก็ตามคุณอาจพบ "codegolf" ใน portmantout สำหรับ "ego" เชื่อมช่องว่าง (และตัวอักษรอื่น ๆ ทั้งหมดอยู่ใน "code" หรือ "golf")

งานของคุณ:

เขียนโปรแกรมหรือฟังก์ชั่นที่รับรายการสตริงและส่งกลับพอร์ตใด ๆ ของรายการ

รหัส Python 3นี้จะตรวจสอบพอร์ตพอร์ต

กรณีทดสอบ

รายการทั้งหมดไม่มีการเรียงลำดับ นั่นคือ,

{"code", "ego", "golf"} -> "codegolf"
{"more", "elm", "maniac"} -> "morelmaniac" or "morelmorelmaniac" or "morelmorelmorelmaniac" or...
    Would a morelmaniac be some sort of mycologist?
{"ab", "bc", "cd", "de", "ef", "fg", "gh", "hi", "ij", "jk", "kl", "lm", "mn", "no", "op", "pq", "qr", "rs", "st", "tu", "uv", "vw", "wx", "xy", "yz", "za"} -> "abcdefghijklmnopqrstuvwxyza" or "rstuvwxyzabcdefghijklmnopqrstuvwxyzabcdef" or any 27+ letters in order

แล้วทำไมไม่ได้ล่ะ? สิ่งที่ยิ่งใหญ่บนเว็บไซต์ของเมอร์ฟีถ้ารหัสของคุณดำเนินการภายในเวลาอันสมควร

กฎระเบียบ

  • รหัสของคุณจะต้องหยุด
  • คุณไม่จำเป็นต้องส่งคืนพอร์ตเดียวกันกับการดำเนินการแต่ละครั้ง
  • คุณอาจจะสมมติสตริงทั้งหมดประกอบด้วยตัวอักษรตัวพิมพ์เล็กผ่านaz
  • หากไม่สามารถทำได้พอร์ตโปรแกรมของคุณอาจทำอะไรก็ได้ Ex:{"most", "short", "lists"}
  • กฎระเบียบมาตรฐานสำหรับI / Oและช่องโหว่ใช้

นี่คือดังนั้นทางออกที่สั้นที่สุด (เป็นไบต์) ในแต่ละภาษาชนะ! มีความสุขในการเล่นกอล์ฟ!



1
อาจจะมีบางกรณีทดสอบ?
อดัม

{"sic", "bar", "rabbits", "cradle"} -> "barabbitsicradle" {"mauve", "elated", "cast", "electric", "tame"} -> "mauvelectricastamelated"(กรณีทดสอบเพิ่มเติม)
sundar - Reinstate Monica

2
ใช่อาจเป็น testcase ที่จำเป็นต้องใช้คำสองครั้ง
ASCII- เท่านั้น

2
เราจะได้คำ 1 ตัวอักษรหรือไม่?

คำตอบ:


3

Python 2 , 204 202 ไบต์

def f(l,s=''):
 if all(w in s for w in l):return s
 for i,w in enumerate(l):
	a=next((s+w[i:]for i in range(len(w)-1,0,-1)if s[-i:]==w[:i]),0)if s else w;x=a and f(l[:i]+l[i+1:]+[l[i]],a)
	if x:return x

ลองออนไลน์!


ที่บันทึกไว้

  • -2 ไบต์ขอบคุณซ้ำ

คุณสามารถใช้แท็บในสองบรรทัดสุดท้ายเพื่อบันทึก 2 ไบต์
เรียกซ้ำ

200 ไบต์
Jonathan Frech

["ab", "ba", "ca"]นี้ไม่ได้ผลิตที่ถูกต้องสำหรับการส่งออก วิธีการแก้ปัญหาของฉันมีข้อผิดพลาดเดียวกัน
เรียกซ้ำ

1

Pyth, 39 ไบต์

JQW}_1mxbdQ=+J|=b*qKOQ<=T+OP._KOJlKTY)b

ลองที่นี่

คำอธิบาย

JQW}_1mxbdQ=+J|=b*qKOQ<=T+OP._KOJlKTY)b
JQ                                        Get a copy of the input.
  W}_1mxbdQ                          )    While there are words in the input
                                          that aren't in b (initially space)...
                   KOQ    OP._KOJ         ... get a random input word, a random
                                          prefix, and a random joined word...
                       =T+                ... stick them together...
                  q   <          lKT      ... and check if joining them together
                                          is valid...
               =b*                        ... then update b accordingly...
           =+J|                     Y     ... and stick the new word into J.
                                      b   Output the final result.

1

Stax , 39 36 ไบต์

ä▬│•.k=╠lƒ☺╜00║¿~,▓╕╠7ÉΔB<e┼>☼Θ²└ô┴\

เรียกใช้และแก้ไขข้อบกพร่อง

ดำเนินการกรณีทดสอบทั้งหมดกำหนดขึ้นอย่างรวดเร็วภายในเวลาประมาณหนึ่งวินาที

นี่เป็นอัลกอริทึมแบบเรียกซ้ำ

  • เริ่มต้นด้วยการป้อนคำแต่ละคำในฐานะผู้สมัคร
  • ในแต่ละขั้นตอนเรียงลำดับคำตามจำนวนครั้งที่เกิดขึ้นเป็นสตริงย่อยของผู้สมัคร
  • สำหรับแต่ละคำที่เข้ากันได้กับตอนท้ายของผู้สมัครปัจจุบันเข้าร่วมคำเพื่อสร้างผู้สมัครใหม่และโทรซ้ำ

นี่คือโปรแกรมที่คลายบีบอัดไม่โหลดและแสดงความคิดเห็น

FG              for each word in input, call target block
}               unbalanced closing brace represents call target
  x{[#o         sort input words by their number of occurrences in the current candidate
  Y             store it in register Y
  h[#{,}M       if all of the words occur at least once, pop from input stack
                input stack is empty, so this causes immediate termination,
                followed by implicitly printing the top of the main stack
  yF            for each word in register y, do the following
    [n|]_1T|[|& intersect the suffixes of the candidate with prefixes of the current word
    z]+h        get the first fragment in the intersection, or a blank array
    Y           store it in register Y
    %t+         join the candidate with the current word, eliminating the duplicate fragment
    y{G}M       if the fragment was non-blank, recursively call to the call target
    d           pop the top of stack

เรียกใช้อันนี้

แก้ไข:สิ่งนี้ล้มเหลวสำหรับคลาสของอินพุตที่มีลูปเช่น["ab", "ba", "ca"]เดียวกับคำตอบที่โพสต์อื่น ๆ ส่วนใหญ่


0

JavaScript (ES6), 138 130 ไบต์

f=a=>a[1]?a.map((c,i)=>a.map((w,j,[...b])=>i!=j&&!/0/.test(m=(c+0+w).split(/(.+)0\1/).join``)?t=f(b,b[i]=m,b.splice(j,1)):0))&&t:a

ส่งคืนข้อผิดพลาดสำหรับรายการที่ไม่สามารถย้ายพอร์ตได้อย่างสมบูรณ์

Ungolfed:

f = a =>
  a[1] ?                                        //if more than one element ...
    a.map((c, i)=>                              // for each element
      a.map((w, j, [...b])=>                    //  for each element
        i != j &&                               //   if not the same element
        !/0/.test(m=(c+0+w).split(/(.+)0\1/).join``) &&  //   and the elements overlap
        (t = f(b,                               //   and f recursed is true when
               b[i] = m,    //    replacing the ith element with the 2-element portmanteau
               b.splice(j, 1)                   //    and removing the jth element
              )
        )
      )
    ) &&
    t :                                         //return the recursed function value
    a                                           //else return a

โค้ดช้าตัวอย่างเลือดเต็มตัว (ไม่รวมอยู่ในตัวอย่างข้างต้น)

นั่นคือการแก้ไขโดยการเปลี่ยนmaps เป็นsomes สำหรับการสูญเสีย 2 ไบต์:

f=a=>a[1]?a.some((c,i)=>a.((w,j,[...b])=>i!=j&&!/0/.test(m=(c+0+w).split(/(.+)0\1/).join``)?t=f(b,b[i]=m,b.splice(j,1)):0))&&t:a


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