การผสานสองสตริง


18

บทนำ

สมมติว่าS 1 = a...bและS 2..c.. = ถ้าเราวางมันไว้บนสุดของกันและกันเราจะได้:

a...b
..c..

เรารวมสตริงทั้งสองโดยมีอักขระ.เป็นของเหลว (ซึ่งสามารถทับซ้อนกัน) เราได้รับสิ่งนี้:

a.c.b

หากสตริงตัวใดตัวหนึ่งยาวกว่าอีกตัวเราจะใช้อัลกอริทึมแบบเดียวกัน:

a.....b
..c..  

becomes:

a.c...b

และ

a.....b
..c.......

becomes:

a.c...b...

หากตัวละครสองตัวชนกันเราแค่ใช้ตัวอักษรล่างเช่น

a..b
...c

becomes:

a..c

งาน

กำหนดสตริงที่ไม่ว่างสองสตริงเอาต์พุตสตริงที่ผสาน หมายเหตุคุณสามารถสรุปได้ว่าการป้อนข้อมูลที่มีเพียงระยะเวลาและตัวพิมพ์เล็ก (หรือตัวอักษรพิมพ์ใหญ่ถ้าเป็นความสะดวกมากขึ้น)

กรณีทดสอบ

Input              Output
a....b ..c...      a.c..b
aaaaaa bbbbbb      bbbbbb
ab.ab. b.b.b.      bbbab.
a.......b c        c.......b

นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดจะชนะ!


เป็นa.....b ..c.......ไปได้หรือไม่ เอาท์พุทคืออะไร?
Luis Mendo

@DonMuesli a.c...b...ที่จะกลายเป็น
Adnan

เราสามารถส่งออกรายการอักขระแทนสตริงได้หรือไม่?
Denker

@DenkerAffe ไม่ขอโทษ
Adnan

สายสามารถนำไปในลำดับที่ตรงกันข้าม?
Mego

คำตอบ:


10

เยลลี่ 5 ไบต์

Œu»Œl

อินพุตผ่านอาร์กิวเมนต์บรรทัดรับคำสั่ง

ลองออนไลน์!

คำอธิบาย

นี่คือพอร์ตโดยตรงของคำตอบ CJam ของฉัน (ดูเพื่อดูคำอธิบายว่าทำไมสิ่งนี้ถึงใช้ได้):

Œu     # Convert first argument to upper case.
  »    # Element-wise maximum between both strings.
   Œl  # Convert result back to lower case.

5
NOOO! คุณไม่สามารถปรับใช้เยลลี่ได้! เราจะถูกทิ้งให้อยู่กับ mods ทั้งหมดในฐานะนักกอล์ฟ
Rɪᴋᴇʀ

@rikerw ฮ่า ๆ ทำไมคุณคิดว่าพวกเขาเป็น mods? เพราะพวกเขาเล่นกอล์ฟได้ดี: P
cat

3
@RikerW ฉันเพียงแค่ต้องเอาคนอื่นมาทุบฉันด้วยการแก้ปัญหาของตัวเองกับ Jelly ¯ \ _ (ツ) _ / ¯
Martin Ender

15

CJam, 9 ไบต์

leul.e>el

ทดสอบที่นี่

คำอธิบาย

'.' < upper case letters < lower case lettersทำให้การใช้ความจริงที่ว่า ด้วยวิธีนี้เมื่อรับค่าสูงสุดขององค์ประกอบระหว่างสองสายตัวอักษรใด ๆ จะแทนที่ a .แต่เราสามารถสร้างตัวอักษรจากอินพุตที่สองแทนที่ตัวอักษรตั้งแต่แรกถ้าเราเป็นตัวใหญ่ ทำให้เกิดความสับสน? นี่คือตัวอย่างกรณีทดสอบหนึ่งตัวอย่าง:

ab.ab.
b.b.b.

แปลงเป็นตัวพิมพ์ใหญ่ก่อน:

AB.AB.
b.b.b.

ใช้ค่าสูงสุดขององค์ประกอบ:

bBbAb.

แปลงกลับเป็นตัวพิมพ์เล็ก:

bbbab.

และนี่คือวิธีที่รหัสทำเช่นนั้น:

l    e# Read first line.
eu   e# Convert to upper case.
l    e# Read second line.
.e>  e# Take element-wise maximum. If the lengths are different, the additional elements
     e# from the longer list are just appended.
el   e# Convert back to lower case.

4
ดีeu/ elหลอกลวง!
Luis Mendo

6

Javascript ES6, 52 55 ตัวอักษร

(a,b)=>b.replace(/\./g,(m,i)=>a[i]||m)+a.slice(b.length)

ทดสอบ

f=(a,b)=>b.replace(/\./g,(m,i)=>a[i]||m)+a.slice(b.length)
;`
a....b ..c...      a.c..b
aaaaaa bbbbbb      bbbbbb
ab.ab. b.b.b.      bbbab.
a.......b c        c.......b
c a....b           a....b
`.split('\n').filter(Boolean).map(s=>s.split(/\s+/)).every(a=>f(a[0],a[1])==a[2])

1
สิ่งนี้จะล้มเหลวในการป้อนข้อมูลเช่น:f('c', 'a....b')
andlrc

@ dev-null, fixed
Qwertiy




3

Haskell, 43 42 ไบต์

(a:b)#(c:d)|c<'a'=a:b#d|1<2=c:b#d
a#b=a++b

ตัวอย่างการใช้งาน: ->"ab.ab." # "b.b.b.""bbbab."

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

  • ถ้าทั้งสองรายการไม่ว่างให้เลือกส่วนหัวของรายการที่ 1 ถ้าส่วนหัวของรายการที่สองคือ"."มิฉะนั้นให้เลือกหัวของรายการที่สอง ต่อท้ายการโทรซ้ำด้วยส่วนท้ายของรายการ

  • ถ้าอย่างน้อยหนึ่งรายการว่างให้ผนวกทั้งสองรายการ

แก้ไข: @Lynn บันทึกไบต์ ขอบคุณ!


“ คุณสามารถสันนิษฐานได้ว่าอินพุตมีเพียงเครื่องหมายมหัพภาคและตัวพิมพ์เล็ก”ดังนั้นคุณสามารถตรวจสอบc<'a'เพื่อบันทึกไบต์
Lynn

3

Python 2, 47 ไบต์

lambda s,t:`map(max,s.upper(),t)`[2::5].lower()

กอล์ฟมาก! ฉันกำลังมองหาวิธีกำจัดบน () และล่าง () แต่ไม่มีโชคจนถึง ...
Max

2

จูเลีย 101 ไบต์

f(s,t,r=i->rpad(i,max((n=endof)(s),n(t)),"."))=join([min(a,b)<90?max(a,b):b for(a,b)=zip(r(s),r(t))])

นี่คือฟังก์ชั่นที่ยอมรับสองสตริงและส่งคืนสตริง

เราคำนวณmเป็นความยาวสูงสุดของอินพุตทั้งสองจากนั้นกำหนดฟังก์ชันrที่ด้านขวาของอินพุตด้วย.s ถึงความยาวmและจัดเก็บเป็นอาร์กิวเมนต์ของฟังก์ชัน จากนั้นเราzipใส่อินพุตที่ถูกต้องและตรวจสอบขั้นต่ำ (ตามที่กำหนดโดยรหัส ASCII) ของแต่ละคู่ ถ้าเป็น.เราใช้ตัวอักษรตัวไหนที่มีโค้ดใหญ่กว่ามิฉะนั้นเราจะใช้ตัวไหนก็ได้ที่มาจากอินพุตที่สอง อาร์เรย์ที่เป็นผลลัพธ์จะถูกjoinแปลงเป็นสตริงและส่งคืน



1

จอประสาทตา , 55

$

+ `(.? (\ S *) (\ w) | (\ S) (\ S *).?) (\ S *. *)
$ $ 2 $ 5 $ 6 $ 3 4


บรรทัด 5 คือช่องว่างเดียว บรรทัดที่ 6 เป็นบรรทัดว่าง (โดยไม่มีบรรทัดใหม่ต่อท้าย)

ลองออนไลน์

ฉันเริ่มอันนี้ใน GNU sed, (พร้อมตัวเลือก -r) พอร์ตที่ตรงไปตรงมาเพื่อ Retina เมื่อฉันได้รับการคิดออก รุ่น sed คือ:

s/$/ /
:
s/(.?(\S* )(\w)|(\S)(\S* ).?)(\S* .*)/\2\5\6\3\4/
t
s/ *//

1
รุ่น Retina ล้มเหลวด้วยa..k.f....b c...f.g...g. => .c..kffg...g
randomra

1

Python 2, 70 ไบต์

lambda x,y:"".join([k if k!="."and k else j for j,k in map(None,x,y)])

ลองที่นี่!

ก่อนอื่นเราสร้าง zip ทั้งสองสายเป็นหนึ่งรายการ หากสตริงที่สองยาวกว่าสตริงแรกมันจะถูกเพิ่มด้วยNone( map(None,x,y)ทำอย่างนั้น)
จากนั้นเราจะวนซ้ำรายการนี้ด้วยjการเป็นตัวละครจากสตริงแรกและอีกสตริงkหนึ่งจากสตริงที่สอง เราเลือกถ้ามันไม่ได้เป็นจุดและอื่น ๆ kj

นี่อาจเป็น 61 ไบต์ถ้าฉันสามารถแสดงผลลัพธ์เป็นรายการตัวอักษรแทนที่จะเป็นสตริง


1

Perl, 48 + 3 = 51 ไบต์

s/\./substr($^I,$.=pos,1)||$&/ge;$_.=substr$^I,$.

Bah ไม่สามารถหาวิธีแก้ปัญหาที่สั้นกว่านี้ได้ (วิธีการเช่นเดียวกับคำตอบของ JavaScript @ Qwertiy)
ต้องการ-plและรับข้อมูลจากstdinและ-i

$ perl -i'a...ce' -ple's/\./substr($^I,$.=pos,1)||$&/ge;$_.=substr$^I,$.' <<< '..b.d..f'
a.b.de..f

ขยายสตริงเป้าหมายล่วงหน้า (ซึ่งมีลักษณะที่น่ารักมากเช่นกัน):$_^=$^I^$^I;s/\.|\0/substr$^I,pos,1or$&/ge
Ton Hospel


0

q / kdb +, 43 40 ไบต์

วิธีการแก้:

lower{l:max(#:)each(x;y);upper[l$x]|l$y}

ตัวอย่าง:

q)lower{l:max(#:)each(x;y);upper[l$x]|l$y}["a..b..";"...c"]
"a..c.."

คำอธิบาย:

(#:)                // k equivalent of count
max (#:) each(x;y)  // takes each string, count the length, return maximum
l$x                 // whites-space pad string x to length l
|                   // take the maximum (per Martin's strategy)
upper[...]          // convert padded string 1 to uppercase
lower{...}          // convert result of function to lowercase

หมายเหตุ: ฉันใช้ประโยชน์จาก"กำหนดสองสตริงที่ไม่ว่างเปล่า"และสมมติว่าอินพุตเป็นสตริง ใน kdb "c"คืออะตอม(),"c"มิฉะนั้นจะเป็นสตริงมิฉะนั้นต้องเพิ่ม 6 ไบต์ในคะแนนเนื่องจากเราไม่สามารถใช้$เสริมอะตอม ...

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