เชื่อมสตริงเข้ากับบริบท


13

สายอักขระที่มีบริบท

สำหรับวัตถุประสงค์ของการท้าทายนี้เป็นสตริงกับบริบทเป็นสามสายที่เรียกว่าบริบทซ้ายที่ส่วนข้อมูลและบริบทที่เหมาะสม เพราะมันหมายถึงซับสตริงของสตริงอีกต่อไป เราใช้ท่อแนวตั้ง|เป็นตัวคั่นดังนั้นตัวอย่างของสตริงกับบริบทถูกcod|e-go|lfที่บริบทด้านซ้ายเป็นcodข้อมูลที่เป็นและบริบทที่เหมาะสมคือe-go lfตัวอย่างนี้แสดงให้เห็นถึงอักขระย่อยของe-gocode-golf

ตอนนี้เพื่อเชื่อมโยงสองสตริงเข้ากับบริบทเราดำเนินการดังนี้ใช้aa|bcc|deeและcc|de|eeeเป็นตัวอย่าง เราจัดเรียงสตริงเช่นเดียวกับในแผนภาพ

a a|b c c|d e e
      c c|d e|e e e

เพื่อให้ส่วนข้อมูลอยู่ติดกัน ส่วนข้อมูลของการต่อข้อมูลคือการต่อข้อมูลส่วนในกรณีbccdeนี้ บริบทด้านซ้ายเป็นส่วนที่ขยายไปทางด้านซ้ายของส่วนข้อมูลแรกในกรณีaaนี้ ในทำนองเดียวกันคือบริบทที่เหมาะสมเพื่อให้เรียงต่อกันเป็นสตริงกับบริบทeee aa|bccde|eeeสำหรับตัวอย่างที่สองให้พิจารณาa|bb|cdและaabb|cd|โดยที่คำที่สองมีบริบทด้านขวาที่ว่างเปล่า แผนภาพการจัดตำแหน่งคือ

  a|b b|c d
a a b b|c d|

ที่บริบทด้านซ้ายของคำที่สองขยายออกไปไกลกว่าบริบทแรก aa|bbcd|เรียงต่อกันเป็น

แต่เดี๋ยวก่อนมี gotcha: ถ้าตัวอักษรของไดอะแกรมการจัดตำแหน่งไม่ตรงกันการเรียงต่อกันไม่มีอยู่! ตัวอย่างเช่นแผนภาพของaa|bb|ccและc|c|cเป็น

a a|b b|c c
      c|c|c

โดยที่bและcในคอลัมน์ที่สี่ไม่เห็นด้วยดังนั้นจึงไม่สามารถต่อกันได้

งาน

งานของคุณคือการเขียนโปรแกรมที่มีสองสายโดยมีบริบทที่ส่วนต่าง ๆ ถูกแยกออกไปตาม|ด้านบนและส่งผลการต่อข้อมูลที่มีอยู่ถ้ามันมีอยู่และอย่างอื่นถ้าไม่ใช่ "อย่างอื่น" สามารถเป็นค่าใด ๆ รวมถึงไม่มีเอาต์พุตตราบใดที่ไม่ใช่สตริงที่ถูกต้องพร้อมบริบทและมันก็เหมือนกันในทุกกรณี อย่างไรก็ตามการโยนข้อผิดพลาดไม่เป็นที่ยอมรับ คุณสามารถให้โปรแกรม STDIN-to-STDOUT หรือฟังก์ชั่นและยอมรับฟังก์ชั่นที่ไม่ระบุชื่อได้เช่นกัน จำนวนไบต์ที่น้อยที่สุดชนะและช่องโหว่มาตรฐานไม่ได้รับอนุญาต

กรณีทดสอบ

aa|bcc|dee cc|de|eee -> aa|bccde|eee
a|bb|cd    aabb|cd|  -> aa|bbcd|
a|b|cccd   aab|cc|c  -> aa|bcc|cd
a|b|c      b||cd     -> a|b|cd
aa|bb|cc   c|c|c     -> None
aaa|b|c    abb|cd|d  -> None
|bb|cd     abb|c|ed  -> None
a|b|c      a||cd     -> None

คำตอบ:


4

Haskell, 184 182 201 199 155

s&t|(a,'|':b)<-f t,(x,'|':y)<-f$r s,x#b,a#y=r(y!r a)++b!r x|0<1=""
r=reverse
a!b=a++drop(length a-1)b
(#)a=and.zipWith(==)(r a).filter h
f=span h
h=(/='|')

ตัวอย่างการเรียกใช้:

"|a|"&"|b|" -- returns "|ab|"
"|a|x"&"|b|" -- returns ""

หากไม่มีการจับคู่สตริงว่างจะถูกส่งกลับ มิฉะนั้นผลลัพธ์จะถูกส่งคืน

คำอธิบายบางส่วน:

# เป็นฟังก์ชันที่รับสองสตริงและส่งคืนว่าตรงกันหรือไม่

! ได้รับสองสายและส่งกลับครั้งแรกที่เชื่อมต่อกันด้วยตัวละครพิเศษจากที่สอง (ถ้ามี)

ฟังก์ชั่นหลัก&ใช้span (/='|')ในการแยกอินพุตเป็นสองส่วนa|b|cเพื่อa, b|cตรวจสอบว่าบริบทตรงกันหรือไม่จากนั้นใช้!สองครั้งเพื่อรวบรวมเอาต์พุต

แก้ไข:นักเวทย์สายผู้วิเศษดูเหมือนจะค่อนข้างมีประสิทธิภาพ


อืมฉันกลัวว่าการโยนข้อผิดพลาดไม่ใช่วิธีการส่งออกที่ยอมรับได้โดยเฉพาะอย่างยิ่งสำหรับฟังก์ชั่น การเพิ่ม|1<2=""คำจำกัดความของ&ควรแก้ปัญหานั้น ฉันขอโทษฉันไม่ได้ระบุสิ่งนี้อย่างชัดเจนมากขึ้นในรายละเอียดฉันจะแก้ไขได้
Zgarb

@Zgarb จริง ๆ แล้วมันจะไม่แก้ไข การส่งคืนสตริงที่มี'|'สัญญาณมากเกินไปเมื่อสตริงไม่ตรงกันใช่ไหม
ภูมิใจ haskeller

แน่นอนว่าตราบใดที่มันเป็นสตริงเดียวกันสำหรับอินพุตที่ไม่ตรงกันทั้งหมด
Zgarb

3

Python (242 ไบต์)

import itertools as i
s='|'
j=''.join
r=reversed
m=lambda a,b:j(j(*set(p+q))for p,q in i.izip_longest(a,b,fillvalue=''))
def c(A,B):
 u,v,w,x,y,z=(A+s+B).split(s)
 try:return j(r(m(r(u+v),r(x))))[:-len(v)]+s+v+y+s+m(w,y+z)[len(y):]
 except:0

คำอธิบาย

ฟังก์ชั่นแลมบ์ดาmส่งคืนความยาวของสองสตริงได้นานเท่าที่พวกเขาแบ่งปันคำนำหน้าร่วมกัน มันเป็นเช่นนี้โดยการเชื่อมโยงสตริงที่ว่างเปล่า''ในสถานที่ของค่าที่ขาดหายใด ๆ แล้วหันผล (ซึ่งอาจใช้รูปแบบaa, ab, aหรือbในกรณีของการแข่งขัน / ไม่ตรงกัน / ความยาวไม่เท่ากัน) เป็นชุดของตัวละครที่ไม่ซ้ำกันในแต่ละตำแหน่ง คาดว่าจะมีข้อโต้แย้งเดียวดังนั้นการเอาออกชุดที่มีองค์ประกอบมากกว่าหนึ่งจะทำให้เกิดการยกระดับjoinTypeError

ฟังก์ชั่นหลักแล้ว

  • ใช้mเพื่อรวมบริบทด้านซ้ายและส่วนข้อมูลคำแรกกับบริบทด้านซ้ายของสอง (จากขวาไปซ้ายเหนือสตริงที่กลับด้าน)
  • รวมส่วนข้อมูลเข้าด้วยกัน
  • และอีกครั้งใช้mเพื่อรวมบริบทที่ถูกต้องของคำแรกกับส่วนข้อมูลและบริบทด้านขวาของคำที่สอง

ส่วนข้อมูลดั้งเดิมของคำสองคำนั้นถูกตัดแต่งจากด้านขวาและด้านซ้ายของบริบทใหม่

เนื่องจากเรารู้ว่า misalignments ก่อให้เกิดmการยกระดับในกรณีเหล่านี้เราจับข้อยกเว้นและผลตอบแทนโดยปริยายTypeErrorNone

การทดสอบ

TESTCASES = [
    ('aa|bcc|dee', 'cc|de|eee', 'aa|bccde|eee'),
    ('a|bb|cd', 'aabb|cd|', 'aa|bbcd|'),
    ('a|b|cccd', 'aab|cc|c', 'aa|bcc|cd'),
    ('a|b|c', 'b||cd', 'a|b|cd'),
    ('aa|bb|cc', 'c|c|c', None),
    ('aaa|b|c', 'abb|cd|d', None),
    ('|bb|cd', 'abb|c|ed', None),
    ('a|b|c', 'a||cd', None),
]

for A, B, R in TESTCASES:
    print '{:<10} {:<9} -> {}'.format(A, B, c(A, B))

เอาท์พุต

aa|bcc|dee cc|de|eee -> aa|bccde|eee
a|bb|cd    aabb|cd|  -> aa|bbcd|  
a|b|cccd   aab|cc|c  -> aa|bcc|cd 
a|b|c      b||cd     -> a|b|cd    
aa|bb|cc   c|c|c     -> None      
aaa|b|c    abb|cd|d  -> None      
|bb|cd     abb|c|ed  -> None      
a|b|c      a||cd     -> None  
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.