Chạy xung đột hợp nhất


24

Khi sử dụng một công cụ như git để hợp nhất hai tệp, một xung đột có thể được phát hiện và thêm vào kết quả của việc hợp nhất.

Hợp nhất hai tệp này:

tập tin của tôi:

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

tập tin của họ:

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

sẽ dẫn đến:

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

Xem các dòng đánh dấu xung đột

Giải quyết xung đột với Mine sẽ tạo tệp này:

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

Giải quyết xung đột này với Họ sẽ tạo ra tệp này:

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

Mục tiêu của thách thức này là viết một tệp nguồn chứa xung đột và vẫn biên dịch / thực thi.

Viết một tập tin nguồn:

  1. chứa một hợp lệ, hai chiều, mâu thuẫn đánh dấu bằng cột mốc xung đột vá thích hợp ( <<<<<<<, =======, >>>>>>>) Mine và Của họ mô tả tập tin sau khi đánh dấu là không bắt buộc.
  2. biên dịch / thực thi mà không có lỗi / cảnh báo nếu các điểm đánh dấu vẫn là một phần của nguồn
  3. biên dịch / thực thi mà không có lỗi / cảnh báo nếu xung đột được giải quyết bằng cách sử dụng của tôi
  4. biên dịch / thực thi mà không có lỗi / cảnh báo nếu xung đột được giải quyết bằng cách sử dụng chúng
  5. xuất ra "Xin chào xung đột" khi biên dịch / thực thi tệp bị xung đột
  6. xuất ra "Hello Mine" khi biên dịch / thực thi phiên bản khai thác
  7. xuất ra "Hello Itss" khi biên dịch / thực thi phiên bản của họ

Các điểm đánh dấu phải được đặt trong tệp nguồn theo cách mà kdiff3 nhận ra xung đột.

Sơ hở tiêu chuẩn bị cấm.

Mã ngắn nhất sẽ thắng.

Điểm là độ dài của nguồn xung đột


Là đệ trình chức năng được phép, hoặc chỉ chương trình đầy đủ?
Jakob

@Jakob - phải có khả năng thực thi / chạy nó. Vì vậy, nếu có một REPL có thể thực thi chức năng (hoặc chỉ biểu thức), chắc chắn.
Erno

Câu trả lời:


2

Thạch , 51 byte

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

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

Hãy thử trực tuyến!

Giải trình

Các điểm đánh dấu xung đột ở đây được định vị sao cho một trong ba dòng trở thành dòng thứ hai của chương trình sau khi xung đột được giải quyết; đây sẽ là một hằng số, được đặt tên . Dòng thứ hai của chương trình gốc mã hóa chuỗi " Conflict"(theo ký hiệu nén của Jelly); dòng thứ ba mã hóa chuỗi " Mine"(điều này sẽ trở thành dòng thứ hai nếu xung đột được giải quyết như của tôi); dòng thứ sáu mã hóa chuỗi " Theirs"(và sẽ trở thành dòng thứ hai nếu xung đột được giải quyết như của họ).

Chương trình chính luôn là dòng cuối cùng, bất kể có bao nhiêu dòng trước khi bị xóa. Nó nhận mã hóa nén "Hello"và nối thêm (; ) giá trị của nó, do đó tạo ra đầu ra mong muốn.


13

JavaScript (ES6), 102 94 93 90 byte

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

Nếu xung đột đã được giải quyết, thì không có dòng thứ sáu, vì vậy nó sẽ in dòng đầu tiên ngay bây giờ. Chỉnh sửa: Đã lưu 3 byte nhờ @nderscore.


Sử dụng sáng tạo các biểu thức thông thường!
Erno

@ErnodeWeerd Rất tiếc, tôi vừa thay đổi nó ...
Neil

:) không phải lo lắng, tôi rất vui khi thấy nó
Erno

-3 byte:console.log('Hello',(a=`...`)[6]||a[1])
nderscore 23/2/2017

10

Brachylog , 68 67 66 byte

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

Hãy thử trực tuyến!

Hãy thử "Hello Mine"phiên bản tại đây

Hãy thử "Hello Theirs"phiên bản tại đây

Giải trình

Rất may, <<<<<<<, =======>>>>>>>tất cả đều định nghĩa quy tắc hợp lệ trong Brachylog. Chúng có nghĩa tương ứng:

  • Đầu vào nhỏ hơn một biến số ngầm định, bản thân nó nhỏ hơn ..., v.v., chính nó nhỏ hơn đầu ra.
  • Tất cả các yếu tố của đầu vào đều bằng nhau và tất cả các yếu tố của đầu vào đều bằng nhau, và ..., và Đầu vào = Đầu ra
  • Giống như đầu tiên nhưng lớn hơn thay thế.

Nếu chúng tôi loại bỏ xung đột, chúng tôi sẽ kết thúc bằng "Mine"hoặc"Theirs" trên dòng thứ hai, điều đó có nghĩa là chúng trở thành vị ngữ số 1. Gọi vị từ đó với ↰₁dòng đầu tiên sẽ thống nhất đầu vào và đầu ra của nó bằng Mine/ Theirs, sau đó chúng tôi sẽ in bằngw .

Nếu chúng tôi gọi ↰₁vào tệp bị xung đột, chúng tôi sẽ gọi <<<<<<<. Do đó, chúng tôi gọi vị từ đó với một chuỗi là đầu vào (sử dụng ċ₂- ép buộc thành chuỗi). <sẽ thất bại với một chuỗi làm đầu vào. Sau đó, chúng tôi đặt một hàm tách rời ∨"Conflict"wtrong vị từ chính cho biết nếu vị ngữ 1 không thành công, thì chúng tôi sẽ in Conflict. ↰₁với một chuỗi là đầu vào sẽ không thất bại cho "Mine"hoặc"Theirs" dòng vì chúng là các chuỗi.


9

PHP 74 65 byte

Lưu ý: sử dụng mã hóa IBM-850

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

Lưu trữ vào một tập tin và chạy như thế này:

php -nf conflict.php

Giải trình

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

Kết quả XOR nhị phân cho một trong 3 điều sau đây:

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

Tinh chỉnh

  • Đã lưu 9 byte bằng cách sử dụng logic nhị phân trên chuỗi

Một ngày nào đó PHP sẽ có một =======toán tử, và sau đó việc này sẽ dễ dàng hơn một chút.
Jakob

7

Pip , 61 byte

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

Hãy thử trực tuyến!

Tất cả mọi thứ giữa ""là một chuỗi. Chúng tôi chia chuỗi lớn trên dòng mới ( "..."^n) và lấy phần tử thứ 7 với lập chỉ mục theo chu kỳ ( (___7)). Đối với phiên bản bị xung đột, có bảy dòng, vì vậy chỉ số 7 tương đương với chỉ số 0 và chúng tôi nhận được Conflict. Đối với các phiên bản đã giải quyết, có ba dòng, vì vậy chỉ số 7 tương đương với chỉ số 1 và chúng tôi nhận được Mine/ Theirs. Sau đó nối "Hello "với mặt trước và tự động in.


Rất sáng tạo, tôi thích lập chỉ mục theo chu kỳ.
Erno

6

Mẻ, 133 129 byte

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

Giải thích: gotoTuyên bố đi đến nhãn tiếp theo mà nó có thể tìm thấy. Trong trường hợp của cuộc xung đột, điều này cuối cùng chỉ bỏ qua các dấu hiệu xung đột và snhận được giá trị cuối cùng của nó. Trong trường hợp giải quyết với Mine, gotos không có tác dụng, nhưng cuối cùng setkhông còn tồn tại, vì vậy kết quả là Mine. Trong trường hợp giải quyết với họ, bẩm sinh gotobỏ qua phần còn lại setđể kết quả là giá trị ban đầu của nó. Chỉnh sửa: Đã lưu 4 byte nhờ @DLosc.


Tốt đẹp! Bạn có thể loại bỏ :cvà làm @goto tthay thế?
DLosc

@DLosc Ồ, vậy Batch đi đến nhãn tiếp theo chứ không phải đầu tiên? Khéo léo!
Neil

Tôi không biết - tôi chưa thử nó. Tôi có thể sai hoàn toàn.
DLosc

4

Python 2, 88 87 byte

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

In dòng thứ sáu hoặc (bây giờ) nếu thích hợp.


1
Nó không in phần "Xin chào" ...
Erno

@ErnodeWeerd Xin lỗi, tôi cũng đã mắc lỗi đó trong câu trả lời khác của mình và quên sửa lỗi này.
Neil

Có một khoảng trống giữa Hello và bất cứ điều gì sau đây?
Erno

@ErnodeWeerd Câu lệnh Python 2 printluôn sử dụng khoảng trắng làm dấu phân cách (và một dòng mới, printhàm của Python 3 cho phép bạn chọn dấu phân cách và dấu kết thúc).
Neil

3

.COM opcode, 77 byte

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$'

Nếu một không gian sau khi <<<<<<<được phép, 75 byte

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

Đẹp quá Bạn có thể thêm (các) phiên bản lắp ráp không, tôi rất thích có thể đọc hướng dẫn :). Có, không gian dường như được cho phép (thông số kỹ thuật không rõ ràng như tôi muốn)
Erno

2

Võng mạc , 57 byte


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

Hãy thử trực tuyến!

Hãy thử phiên bản "Của tôi"

Hãy thử phiên bản "Của họ"

Giải thích về chương trình Xung đột

Như thường thấy với Retina, chương trình này chứa nhiều giai đoạn thay thế.


Hello 

Thay thế đầu vào trống / không tồn tại bằng Hello .

$
<<<<<<<

Thay thế kết thúc chuỗi làm việc bằng <<<<<<<

Mine
=======

Thay thế Minebằng======= . Vì Minekhông xuất hiện ở bất cứ đâu trong chuỗi làm việc, nên điều này không có gì.

Theirs
>>>>>>>

Thay thế Theirsbằng >>>>>>>. Tương tự như vớiMine ; Theirskhông xuất hiện, vì vậy sự thay thế không làm gì cả.

<+
Conflict

Thay thế một chuỗi <bằngConflict . Chúng tôi đã thêm vào <<<<<<<cuối chuỗi trong lần thay thế đầu tiên, do đó, chuỗi làm việc trở thành Hello Conflict, đầu ra hoàn toàn ở cuối chương trình.

Giải thích về chương trình của tôi / của họ

Khi xung đột được giải quyết, mã sẽ trông như thế này:


Hello 
$
Mine
<+
Conflict

Hello 

Tương tự như trước, bắt đầu với chuỗi Hello .

$
Mine

Bây giờ thay vì nối thêm <<<<<<<vào Hello , chúng tôi chắp thêmMine .

<+
Conflict

Tiếp theo, chúng tôi thay thế một chuỗi <vớiConflict . Nhưng không có< s trong chuỗi, vì vậy không có gì xảy ra.

Chuỗi làm việc Hello Mine, là đầu ra ngầm. Chương trình "Của họ" hoạt động theo cùng một cách.


1

DẦU , 88 80 77 byte

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

4 2đang in dòng 2 ( Hello), 10kiểm tra xem dòng 0 ( 4) có giống với dòng 16 (dòng có chứa 4xung đột khi tồn tại không) và nhảy sang dòng 16 hoặc dòng 8 tùy thuộc vào kết quả. Nếu nó tồn tại, 4 4in dòng 4 ( Conflict). Nếu không, hãy 4 11in Minehoặc Theirs, tùy thuộc vào nội dung được hợp nhất và 3thoát.


1

Java 145 byte

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

Java không có chuỗi đa dòng nên cần một số thủ thuật Nhận xét


Lý do cho việc thêm *vào dòng thứ ba là gì? Tôi nghĩ rằng */s+="Mine";/*sẽ làm việc.
CAD97

còn lại từ khi các dòng bình luận là các dòng riêng biệt để tránh các dòng giống hệt nhau (được tái cấu trúc trước khi đăng và quên điều đó), thx cho gợi ý đó và 3 byte
masterX244

1

Bash, 76 byte

Chơi gôn

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

Làm thế nào nó hoạt động

Sử dụng ở đây doc , để cung cấp văn bản nguồn cho sed .

Sed sẽ thêm dòng đầu tiên nó đọc bằng "Xin chào", thay thế <<<<<<<chuỗi bằng "Xung đột" và sau đó thoát (q ).

Dùng thử trực tuyến!


1

ES6 (Javascript), 83, 82 byte

Chơi gôn

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

Thử nó

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

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

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




Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.