การผสานความขัดแย้ง


24

เมื่อใช้เครื่องมือเช่นคอมไพล์เพื่อรวมสองไฟล์อาจตรวจพบข้อขัดแย้งและเพิ่มลงในผลลัพธ์ของการรวม

การรวมสองไฟล์เหล่านี้:

ไฟล์ของฉัน:

Common line of code 1
Common line of code 2
my lines
Common line of code 3
Common line of code 4

ไฟล์ของพวกเขา:

Common line of code 1
Common line of code 2
their lines
Common line of code 3
Common line of code 4

จะส่งผลให้:

Common line of code 1
Common line of code 2
<<<<<<< Mine
my lines
=======
their lines
>>>>>>> Theirs
Common line of code 3
Common line of code 4

ดูบรรทัดเครื่องหมายความขัดแย้ง

การแก้ไขข้อขัดแย้งนี้กับMineจะสร้างไฟล์นี้:

Common line of code 1
Common line of code 2
my lines
Common line of code 3
Common line of code 4

การแก้ไขข้อขัดแย้งนี้กับพวกเขาจะสร้างไฟล์นี้:

Common line of code 1
Common line of code 2
their lines
Common line of code 3
Common line of code 4

วัตถุประสงค์ของการท้าทายนี้คือการเขียนไฟล์ต้นฉบับที่มีข้อขัดแย้งและยังคงรวบรวม / ดำเนินการ

เขียนไฟล์ต้นฉบับซึ่ง:

  1. มีคนหนึ่งที่ถูกต้องสองทางความขัดแย้งการทำเครื่องหมายโดยเครื่องหมายแพทช์ที่เหมาะสมความขัดแย้ง ( <<<<<<<, =======, >>>>>>>) เหมืองแร่และไฟล์สำหรับพวกเขาอธิบายหลังจากเครื่องหมายเป็นตัวเลือก
  2. รวบรวม / ดำเนินการโดยไม่มีข้อผิดพลาด / คำเตือนหากเครื่องหมายยังคงเป็นส่วนหนึ่งของแหล่งที่มา
  3. รวบรวม / ดำเนินการโดยไม่มีข้อผิดพลาด / คำเตือนหากมีการแก้ไขข้อขัดแย้งโดยใช้ของฉัน
  4. รวบรวม / ดำเนินการโดยไม่มีข้อผิดพลาด / คำเตือนหากมีการแก้ไขข้อขัดแย้งโดยใช้พวกเขา
  5. เอาต์พุต "Hello Conflict" เมื่อทำการคอมไพล์ / เรียกใช้ไฟล์ที่ขัดแย้ง
  6. เอาท์พุต "Hello Mine" เมื่อทำการคอมไพล์ / สั่งงานเวอร์ชั่นของ Mine
  7. เอาท์พุท "Hello พวกเขา" เมื่อรวบรวม / ดำเนินการรุ่นของพวกเขา

เครื่องหมายควรอยู่ในไฟล์ต้นฉบับในลักษณะที่ kdiff3 ตระหนักถึงความขัดแย้ง

ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

รหัสที่สั้นที่สุดชนะ

คะแนนคือความยาวของแหล่งที่มาที่ขัดแย้งกัน


อนุญาตให้ส่งฟังก์ชั่นหรือเพียงแค่โปรแกรมเต็มรูปแบบหรือไม่
Jakob

@ Jakob - จะต้องสามารถรัน / รันได้ ดังนั้นหากมี REPL ที่สามารถใช้งานฟังก์ชั่น (หรือเพียงแค่การแสดงออก) แน่นอน
Erno

คำตอบ:


2

เยลลี่ , 51 ไบต์

<<<<<<<
“½&;»
“£<Ø»
=======

“8ẉI»
>>>>>>>
“¢5Ṛ»;2£

ลองออนไลน์!

คำอธิบาย

เครื่องหมายความขัดแย้งที่นี่อยู่ในตำแหน่งเพื่อให้หนึ่งในสามบรรทัดกลายเป็นบรรทัดที่สองของโปรแกรมหลังจากแก้ไขข้อขัดแย้งแล้ว นี้จะเป็นค่าคงที่ชื่อ บรรทัดที่สองของโปรแกรมต้นฉบับเข้ารหัสสตริง" Conflict"(ในรูปแบบที่ถูกบีบอัดของ Jelly); บรรทัดที่สามเข้ารหัสสตริง" Mine"(ซึ่งจะกลายเป็นบรรทัดที่สองหากความขัดแย้งได้รับการแก้ไขในฐานะของฉัน); บรรทัดที่หกเข้ารหัสสตริง" Theirs"(และจะกลายเป็นบรรทัดที่สองหากความขัดแย้งได้รับการแก้ไขเป็นของพวกเขา)

โปรแกรมหลักจะเป็นบรรทัดสุดท้ายเสมอไม่ว่าจะมีกี่บรรทัดก่อนที่จะถูกลบ มันใช้การเข้ารหัสที่ถูกบีบอัดของ"Hello"และผนวก ( ;) ค่าของมันดังนั้นจึงสร้างเอาต์พุตที่ต้องการ


13

JavaScript (ES6), 102 94 93 90 ไบต์

console.log('Hello',(a=`
<<<<<<<
Mine
=======
Theirs
>>>>>>>
Conflict`.split`
`)[6]||a[1])

หากความขัดแย้งได้รับการแก้ไขแล้วจะไม่มีบรรทัดที่หกดังนั้นมันจะพิมพ์บรรทัดแรกในขณะนี้แทน แก้ไข: บันทึกแล้ว 3 ไบต์ขอบคุณ @nderscore


ใช้ความคิดสร้างสรรค์ของการแสดงออกปกติ!
Erno

@ErnodeWeerd โอ๊ะโอฉันเพิ่งเปลี่ยน ...
Neil

:) ไม่ต้องกังวลฉันมีความสุขที่ได้เห็น
Erno

-3 bytes:console.log('Hello',(a=`...`)[6]||a[1])
ขีด

10

Brachylog , 68 67 66 ไบต์

"Hello "wċ₂↰₁w∨"Conflict"w
<<<<<<<
"Mine"
=======
"Theirs"
>>>>>>>

ลองออนไลน์!

ลอง"Hello Mine"รุ่นที่นี่

ลอง"Hello Theirs"รุ่นที่นี่

คำอธิบาย

โชคดี<<<<<<<, =======และ>>>>>>>มีทุกคำจำกัดความกฎที่ถูกต้องใน Brachylog พวกเขาหมายถึง:

  • อินพุตมีค่าน้อยกว่าค่าตัวแปรโดยนัยตัวเองน้อยกว่า ... และอื่น ๆ นั้นมีค่าน้อยกว่าเอาต์พุต
  • องค์ประกอบทั้งหมดของอินพุตมีค่าเท่ากันและองค์ประกอบทั้งหมดของอินพุตมีค่าเท่ากันและ ... และและ = อินพุต
  • เหมือนกับครั้งแรก แต่ดีกว่าแทน

ถ้าเราเอาความขัดแย้งที่เราจบลงด้วย"Mine"หรือ"Theirs"ในบรรทัดที่สองซึ่งหมายความว่าพวกเขากลายเป็นจำนวนกริยา 1. โทรกริยาที่มี↰₁ในบรรทัดแรกจะรวมกันเข้าและส่งออกที่มีMine/ ซึ่งเราแล้วพิมพ์ด้วยTheirsw

ถ้าเราเรียกที่ไฟล์ขัดแย้งเราจบลงด้วยการโทร↰₁ <<<<<<<เราจึงเรียกว่าเพรดิเคตที่มีสตริงเป็นอินพุต (โดยใช้ċ₂- coerce to string) <จะล้มเหลวด้วยสตริงเป็นอินพุต จากนั้นเราจะแยกความแตกต่าง∨"Conflict"wในเพรดิเคตหลักซึ่งระบุว่าหากเพรดิเคต 1 ล้มเหลวเราจะพิมพ์Conflictแทน ↰₁กับสตริงเป็นอินพุตจะไม่ล้มเหลวสำหรับ"Mine"หรือ"Theirs"บรรทัดเพราะพวกเขาเป็นสตริง


9

PHP, 74 65 ไบต์

หมายเหตุ: ใช้การเข้ารหัส IBM-850

Hello<?='
<<<<<<<
2:<?PU_~
=======
+;73"&_~
>>>>>>>
'^~ıǼ¡Ñ»¬áü;

เก็บไฟล์และเรียกใช้ดังนี้:

php -nf conflict.php

คำอธิบาย

Hello       # Print "Hello"
<?='        # Print result of expression
<<<<<<<     # String with merge conflict
2:<?PU_~
=======
+;73"&_~
>>>>>>>
'
^           # XOR that string with...
~ıǼ¡Ñ»¬áü; # ... this string, negated.

ไบนารี XOR เป็นผลลัพธ์อย่างใดอย่างหนึ่งต่อไปนี้ 3:

'
<<<<<<<
' ^ ~'ıǼ¡Ñ»¬áü'
==> ' Conflict' 
--------------------------------------------------------------------------
'
2:<?PU_~' ^ ~'ıǼ¡Ñ»¬áü'
==> ' Mine' (right padded with nul bytes)
--------------------------------------------------------------------------
'
+;73"&_~' ^ ~'ıǼ¡Ñ»¬áü'
==> ' Theirs' (right padded with nul bytes)

การปรับแต่ง

  • บันทึก 9 ไบต์โดยใช้ตรรกะเลขฐานสองบนสตริง

สักวัน PHP จะมี=======โอเปอเรเตอร์แล้วจะง่ายกว่านี้อีกเล็กน้อย
Jakob

7

Pip , 61 ไบต์

"Hello ".("Conflict
<<<<<<<
Mine
=======
Theirs
>>>>>>>
"^n7)

ลองออนไลน์!

ทุกสิ่งระหว่าง""นั้นคือสตริง เราแบ่งสตริงขนาดใหญ่เป็นบรรทัดใหม่ ( "..."^n) และใช้องค์ประกอบที่ 7 ด้วยการทำดัชนีตามวัฏจักร ( (___7)) สำหรับรุ่นขัดแย้งมีสายเจ็ดดังนั้นดัชนี 7 เทียบเท่ากับดัชนี 0 Conflictและเราได้รับ สำหรับรุ่นแก้ไขมีสามเส้นดังนั้นดัชนี 7 เทียบเท่ากับดัชนีที่ 1 และที่เราได้รับ/Mine Theirsจากนั้นเชื่อมต่อ"Hello "กับด้านหน้าและพิมพ์อัตโนมัติ


สร้างสรรค์มากฉันชอบการทำดัชนีตามวัฏจักร
Erno

6

แบตช์, 133 129 ไบต์

@set s=Theirs
@goto t
<<<<<<<
:t
@set s=Mine
@goto m
=======
:m
@set s=Conflict
@goto t
>>>>>>>
:t
:m
echo Hello %s%

คำอธิบาย: gotoคำสั่งจะไปที่ป้ายกำกับถัดไปที่สามารถพบได้ ในกรณีของความขัดแย้งนี่เป็นเพียงการข้ามเครื่องหมายความขัดแย้งและsได้รับค่าสุดท้าย ในกรณีของการคลี่คลายด้วย Mine, gotos ไม่มีผล แต่สุดท้ายsetไม่มีอยู่แล้วดังนั้นผลลัพธ์คือ Mine ในกรณีของการแก้ไขกับพวกเขา inital gotoข้ามส่วนที่เหลือsetดังนั้นผลที่ได้คือค่าเริ่มต้น แก้ไข: บันทึกแล้ว 4 ไบต์ด้วย @DLosc


ดี! คุณสามารถลบ:cและทำ@goto tแทนได้หรือไม่?
DLosc

@DLosc โอ้ Batch ไปที่ป้ายถัดไปแทนที่จะเป็นอันแรก เรียบร้อย!
Neil

ฉันไม่รู้ - ฉันยังไม่ได้ทดสอบ ฉันอาจผิดอย่างสมบูรณ์
DLosc

4

Python 2, 88 87 ไบต์

print 'Hello','''
<<<<<<<
Mine
=======
Theirs
>>>>>>>
Conflict'''.split('\n')[1::5][-1]

พิมพ์บรรทัดแรกที่หกหรือ (ตอนนี้) ตามความเหมาะสม


1
มันไม่ได้พิมพ์ส่วน "Hello" ...
Erno

@ErnodeWeerd ขออภัยฉันทำผิดพลาดในคำตอบอื่น ๆ ของฉันด้วยและลืมแก้ไขด้วย
Neil

มีช่องว่างระหว่าง Hello และสิ่งต่อไปนี้หรือไม่?
เออร์โน

@ErnodeWeerd printคำสั่งPython 2 ใช้ช่องว่างเป็นตัวคั่นเสมอ (และขึ้นบรรทัดใหม่ท้ายprintฟังก์ชั่นของ Python 3 ช่วยให้คุณสามารถเลือกตัวคั่นและตัวยุติ)
Neil

3

.COM opcode ขนาด 77 ไบต์

0000h: B4 09 BA 17 01 CD 21 BA 1F 01 80 3E 1F 01 3C 75 ; ......!....>..<u
0010h: 03 BA 44 01 CD 21 C3 48 65 6C 6C 6F 20 24 0A 3C ; ..D..!.Hello $.<
0020h: 3C 3C 3C 3C 3C 3C 0A 4D 69 6E 65 24 0A 3D 3D 3D ; <<<<<<.Mine$.===
0030h: 3D 3D 3D 3D 0A 54 68 65 69 72 24 0A 3E 3E 3E 3E ; ====.Their$.>>>>
0040h: 3E 3E 3E 0A 43 6F 6E 66 6C 69 63 74 24          ; >>>.Conflict$

        org 100h
        mov ah, 9
        mov dx, str1
        int 21H
        mov dx, str2
        cmp [str2], byte '<'
        jne $+5
        mov dx, str3
        int 21H
        ret

str1    db 'Hello $', 10
str2    db '<<<<<<<', 10
        db 'Mine$', 10
        db '=======', 10
        db 'Their$', 10
        db '>>>>>>>', 10
str3    db 'Conflict$'

หากเว้นวรรคหลังจาก<<<<<<<ได้รับอนุญาตแล้ว 75 ไบต์

0000h: B4 09 BA 0D 01 CD 21 BA 1E 01 CD 21 C3 48 65 6C ; ......!....!.Hel
0010h: 6C 6F 20 24 0A 3C 3C 3C 3C 3C 3C 3C 20 0A 43 6F ; lo $.<<<<<<< .Co
0020h: 6E 66 6C 69 63 74 24 4D 69 6E 65 24 0A 3D 3D 3D ; nflict$Mine$.===
0030h: 3D 3D 3D 3D 0A 2A 2A 2A 2A 2A 2A 2A 2A 54 68 65 ; ====.********The
0040h: 69 72 24 0A 3E 3E 3E 3E 3E 3E 3E                ; ir$.>>>>>>>

        org 100h
        mov ah, 9
        mov dx, str1
        int 21H
        mov dx, str2
        int 21H
        ret

str1    db 'Hello $', 10
        db '<<<<<<< ', 10
str2    db 'Conflict$'
        db 'Mine$', 10
        db '=======', 10
        db '********Their$', 10
        db '>>>>>>>'     

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

2

เรติน่า , 57 ไบต์


Hello 
$
<<<<<<<
Mine
=======
Theirs
>>>>>>>
<+
Conflict

ลองออนไลน์!

ลองใช้รุ่น "Mine"

ลองรุ่น "พวกเขา"

คำอธิบายของโปรแกรมความขัดแย้ง

มักจะเป็นกรณีที่มี Retina, โปรแกรมนี้มีหลายขั้นตอนแทนที่


Hello 

แทนที่ว่าง / input Hello ไม่ได้มีอยู่ด้วย

$
<<<<<<<

แทนที่จุดสิ้นสุดของสตริงการทำงานด้วย <<<<<<<

Mine
=======

แทนที่ด้วยMine =======เนื่องจากMineไม่ปรากฏที่ใดก็ได้ในสตริงการทำงานจึงไม่ทำสิ่งใดเลย

Theirs
>>>>>>>

แทนที่ด้วยTheirs >>>>>>>เช่นเดียวกับMine; Theirsไม่ปรากฏขึ้นดังนั้นการแทนที่จึงไม่ทำอะไรเลย

<+
Conflict

เปลี่ยนลำดับของกับ< Conflictเราเพิ่ม<<<<<<<ส่วนท้ายของสตริงในการแทนที่ครั้งแรกดังนั้นสตริงการทำงานกลายเป็นHello Conflictซึ่งจะถูกส่งออกโดยนัยในตอนท้ายของโปรแกรม

คำอธิบายโปรแกรมของฉัน / พวกเขา

เมื่อแก้ไขข้อขัดแย้งแล้วโค้ดจะมีลักษณะดังนี้:


Hello 
$
Mine
<+
Conflict

Hello 

Helloเช่นเดียวกับก่อนที่เริ่มต้นด้วยสตริง

$
Mine

ตอนนี้แทนการผนวก<<<<<<<เพื่อเราผนวกHello Mine

<+
Conflict

ต่อไปเราจะเปลี่ยนลำดับของกับ< Conflictแต่ไม่มี<สตริงในดังนั้นจึงไม่มีอะไรเกิดขึ้น

สตริงการทำงานHello Mineจะถูกส่งออกโดยปริยาย โปรแกรม "พวกเขา" ทำงานในลักษณะเดียวกัน


1

OIL , 88 80 77 ไบต์

4
2
Hello 
10
Conflict
16
16
8
4
11
3
<<<<<<<
Mine
=======
Theirs
>>>>>>>
4
4

4 2คือการพิมพ์บรรทัดที่ 2 ( Hello) 10ทดสอบว่าบรรทัดที่ 0 ( 4) เหมือนกันกับบรรทัดที่ 16 (อันที่มี4เมื่อมีข้อขัดแย้งอยู่หรือไม่) และข้ามไปที่บรรทัดที่ 16 หรือบรรทัดที่ 8 ขึ้นอยู่กับผลลัพธ์ หากมีอยู่ให้4 4พิมพ์บรรทัดที่ 4 ( Conflict) หากไม่มีให้4 11พิมพ์อย่างใดอย่างหนึ่งMineหรือTheirsขึ้นอยู่กับสิ่งที่ถูกผสานและ3ออก


1

Java 145 Bytes

()->{String s = "Hello ";/*
<<<<<<<
*/s+="Mine";/*
=======
*/s+="Theirs";/*
>>>>>>>
*/if(s.length()>15)s="Hello Conflict";System.out.println(s);}

Java ไม่มีสตริงหลายบรรทัดดังนั้นจึงจำเป็นต้องใช้ Commentery บางอย่าง


อะไรคือสาเหตุของการเพิ่ม*ในบรรทัดที่สาม? ฉันคิดว่า*/s+="Mine";/*คงใช้ได้
CAD97

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

1

Bash, 76 ไบต์

แข็งแรงเล่นกอล์ฟ

sed 's/^/Hello /;s/<\+/Conflict/;q'<<E
<<<<<<<
Mine
=======
Theirs
>>>>>>>
E

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

ใช้ที่นี่ docที่จะเลี้ยงข้อความแหล่งที่มาเพื่อsed

Sedจะเติมบรรทัดแรกที่อ่านด้วย "Hello" แทนที่<<<<<<<สตริงด้วย "Conflict" แล้วออก (q )

ลองออนไลน์!


1

ES6 (Javascript) 83, 82 ไบต์

แข็งแรงเล่นกอล์ฟ

alert("Hello "+((T=`\
<<<<<<<
Mine
=======
Theirs
>>>>>>>
`)[1]>"<"?T:"Conflict"))

ลองมัน

alert("Hello "+((T=`\
<<<<<<<
Mine
=======
Theirs
>>>>>>>
`)[1]>"<"?T:"Conflict"))

alert("Hello "+((T=`\
Mine
`)[1]>"<"?T:"Conflict"))

alert("Hello "+((T=`\
Theirs
`)[1]>"<"?T:"Conflict"))



1

C (GCC), 110 ไบต์

ฟังก์ชั่นการส่ง

f(){char*s[]={0,"Mine","Theirs","Conflict"};printf("Hello %s",s[/*
<<<<<<<
*/1/*
=======
*/+2/*
>>>>>>>
*/]);}

วิธีการแรงบันดาลใจจาก masterX244 ของการแก้ปัญหา Java

TIOS


ทำได้ดีนี่! การใช้ความคิดเห็นอัจฉริยะแบบหลายบรรทัดอย่างชาญฉลาด
Erno

1

Perl 5 , 68 ไบต์

อัปเดตหลังจากทราบว่าเวอร์ชันที่มี 6 ตัวคั่นแต่ละตัวทำงานได้ตามที่ต้องการ แต่ด้วยตัวคั่นที่แท้จริง 7 ตัวจึงไม่ ...

say"Hello ",q
<<<<<<<
!Mine!;0
=======
!Theirs!;0
>>>>>>>
&&Conflict

ลองความขัดแย้งออนไลน์!

ลองของฉันทางออนไลน์!

ลอง itheirs ออนไลน์!

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