Menjalankan Konflik Gabung

24

Saat menggunakan alat seperti git untuk menggabungkan dua file, konflik dapat dideteksi dan ditambahkan ke hasil gabungan.

Gabungan dari dua file ini:

file saya:

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

file mereka:

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

akan menghasilkan:

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

Lihat Garis Penanda Konflik

Mengatasi konflik dengan Tambang ini akan membuat file ini:

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

Mengatasi konflik ini dengan Mereka akan membuat file ini:

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

Tujuan dari tantangan ini adalah untuk menulis file sumber yang mengandung konflik dan masih mengkompilasi / mengeksekusi.

Tulis file sumber yang:

  1. berisi satu valid, dua arah, konflik ditandai dengan penanda konflik patch yang tepat ( <<<<<<<, =======, >>>>>>>) Tambang dan deskriptor file milik mereka setelah penanda adalah opsional.
  2. mengkompilasi / mengeksekusi tanpa kesalahan / peringatan jika marker tetap menjadi bagian dari sumber
  3. mengkompilasi / mengeksekusi tanpa kesalahan / peringatan jika konflik diselesaikan dengan menggunakan milik saya
  4. mengkompilasi / mengeksekusi tanpa kesalahan / peringatan jika konflik diselesaikan dengan menggunakan milik mereka
  5. menampilkan "Hello Conflict" saat mengkompilasi / mengeksekusi file yang konflik
  6. output "Hello Mine" saat mengkompilasi / mengeksekusi versi tambang
  7. output "Halo Mereka" ketika mengkompilasi / mengeksekusi versi mereka

Marker harus ditempatkan di file sumber sedemikian rupa sehingga kdiff3 mengenali konflik.

Celah standar dilarang.

Kode terpendek menang.

Skor adalah panjang dari sumber yang bertentangan

Erno
sumber
Apakah pengiriman fungsi diperbolehkan, atau hanya program lengkap?
Jakob
@ Jakob - harus dimungkinkan untuk menjalankan / menjalankannya. Jadi jika ada REPL yang dapat menjalankan fungsi (atau hanya ekspresi), tentu saja.
Erno

Jawaban:

2

Jelly , 51 byte

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

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

Cobalah online!

Penjelasan

Penanda konflik di sini diposisikan sehingga salah satu dari tiga baris menjadi baris kedua dari program setelah konflik diselesaikan; ini akan menjadi konstanta, bernama . Baris kedua dari program asli mengkodekan string " Conflict"(dalam notasi terkompresi Jelly); baris ketiga mengkodekan string " Mine"(ini akan menjadi baris kedua jika konflik diselesaikan sebagai milikku); baris keenam mengkodekan string " Theirs"(dan akan menjadi baris kedua jika konflik diselesaikan sebagai milik mereka).

Program utama selalu merupakan baris terakhir, tidak peduli berapa banyak baris sebelum dihapus. Dibutuhkan pengkodean terkompresi dari"Hello" , dan menambahkan ( ;) nilai untuk itu, sehingga menghasilkan output yang diinginkan.


sumber
13

JavaScript (ES6), 102 94 93 90 byte

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

Jika konflik telah diselesaikan, maka tidak ada baris keenam, jadi ia mencetak baris pertama sekarang. Sunting: Disimpan 3 byte berkat @nderscore.

Neil
sumber
Penggunaan kreatif ekspresi reguler!
Erno
@ErnodeWeerd Ups, saya baru saja mengubahnya ...
Neil
:) jangan khawatir, saya senang melihatnya
Erno
-3 byte:console.log('Hello',(a=`...`)[6]||a[1])
nderscore
10

Brachylog , 68 67 66 byte

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

Cobalah online!

Coba "Hello Mine" versinya di sini

Coba "Hello Theirs" versinya di sini

Penjelasan

Syukurlah <<<<<<<,, =======dan>>>>>>> semua definisi aturan yang berlaku di Brachylog. Mereka masing-masing berarti:

  • Input kurang dari variabel implisit, itu sendiri kurang dari ..., dll., Itu sendiri kurang dari output.
  • Semua elemen input sama, dan semua elemen input sama, dan ..., dan Input = Output
  • Sama seperti yang pertama tetapi lebih besar dari pada sebaliknya.

Jika kita menghapus konflik, kita berakhir dengan "Mine"atau "Theirs"pada baris kedua, yang berarti mereka menjadi predikat nomor 1. Memanggil predikat dengan ↰₁pada baris pertama akan menyatukan input dan outputnya dengan Mine/ Theirs, yang kemudian kita cetak dengan w.

Jika kita memanggil ↰₁file yang konflik, kita akhirnya memanggil <<<<<<<. Karena itu kami menyebut predikat itu dengan string sebagai input (menggunakan ċ₂- memaksa ke string). <akan gagal dengan string sebagai input. Kami kemudian menempatkan disjungsi ∨"Conflict"wdalam predikat utama yang menyatakan bahwa jika predikat 1 gagal, maka kami mencetak Conflictsebagai gantinya. ↰₁dengan string sebagai input tidak akan gagal untuk "Mine"atau "Theirs"baris karena mereka adalah string.

Fatalisasi
sumber
9

PHP, 74 65 byte

Catatan: menggunakan pengkodean IBM-850

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

Simpan ke file dan jalankan seperti ini:

php -nf conflict.php

Penjelasan

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

Biner XOR menghasilkan salah satu dari 3 berikut ini:

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

Tweaks

  • Disimpan 9 byte dengan menggunakan logika biner pada string
aross
sumber
Suatu hari PHP akan memiliki =======operator, dan ini akan menjadi sedikit lebih mudah.
Jakob
7

Pip , 61 byte

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

Cobalah online!

Semuanya ""adalah string. Kami membagi string besar pada baris baru ( "..."^n) dan mengambil elemen ke-7 dengan pengindeksan siklus ((___7) ). Untuk versi yang konflik, ada tujuh baris, jadi indeks 7 setara dengan indeks 0 dan kita dapatkan Conflict. Untuk versi yang diselesaikan, ada tiga baris, jadi indeks 7 setara dengan indeks 1 dan kami mendapatkan Mine/ Theirs. Kemudian gabungkan "Hello "ke depan dan cetak otomatis.

DLosc
sumber
Sangat kreatif, saya suka pengindeksan siklus.
Erno
6

Batch, 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%

Penjelasan: gotoPernyataan pergi ke label berikutnya yang dapat ditemukan. Dalam kasus konflik, ini hanya akan melewatkan penanda konflik, dan smendapatkan nilai akhirnya. Dalam kasus penyelesaian dengan Milik saya, goto tidak memiliki efek, tetapi yang terakhir settidak ada lagi, sehingga hasilnya adalah Milik saya. Dalam kasus penyelesaian dengan milik mereka inital gotomemotong sisanya setsehingga hasilnya adalah nilai awal. Sunting: Disimpan 4 byte berkat @DLosc.

Neil
sumber
Bagus! Bisakah Anda menghapus :cdan melakukannya @goto t?
DLosc
@ Docosc Oh, jadi Batch pergi ke label berikutnya, bukan yang pertama? Rapi!
Neil
Saya tidak tahu - saya belum mengujinya. Saya mungkin benar-benar salah.
DLosc
4

Python 2, 88 87 byte

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

Mencetak baris pertama keenam atau (sekarang) yang sesuai.

Neil
sumber
1
Itu tidak mencetak bagian "Halo" ...
Erno
@ErnodeWeerd Maaf, saya telah membuat kesalahan dalam jawaban saya yang lain juga, dan lupa untuk memperbaiki yang ini.
Neil
Apakah ada ruang antara Hello dan apa pun yang mengikuti?
Erno
@ErnodeWeerd Pernyataan Python 2 printselalu menggunakan spasi sebagai pemisah (dan baris baru; printFungsi Python 3 memungkinkan Anda untuk memilih pemisah dan terminator).
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$'

Jika spasi setelah <<<<<<<diizinkan, 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 '>>>>>>>'     
l4m2
sumber
Yang bagus! Apakah Anda dapat menambahkan versi perakitan, saya akan senang bisa membaca instruksi :). Ya, ruang tampaknya diizinkan (spesifikasinya tidak sejelas yang saya inginkan)
Erno
2

Retina , 57 byte


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

Cobalah online!

Coba versi "Milikku"

Coba versi "Mereka"

Penjelasan program Konflik

Seperti yang sering terjadi dengan Retina, program ini mengandung banyak tahap penggantian.


Hello 

Ganti input kosong / tidak ada dengan Hello .

$
<<<<<<<

Ganti ujung string kerja dengan <<<<<<<

Mine
=======

Ganti Minedengan =======. Karena Minetidak muncul di manapun di string yang berfungsi, ini tidak melakukan apa-apa.

Theirs
>>>>>>>

Ganti Theirsdengan >>>>>>>. Kesepakatan yang sama dengan Mine; Theirstidak muncul, jadi penggantinya tidak melakukan apa-apa.

<+
Conflict

Ganti urutan <dengan Conflict. Kami menambahkan <<<<<<<ke akhir string pada penggantian pertama, sehingga string yang bekerja menjadi Hello Conflict, yang secara implisit dihasilkan pada akhir program.

Penjelasan program Saya / Mereka

Ketika konflik diselesaikan, kode akan terlihat seperti ini:


Hello 
$
Mine
<+
Conflict

Hello 

Sama seperti sebelumnya, dimulai dengan string Hello.

$
Mine

Sekarang alih-alih menambahkan <<<<<<<ke Hello , kami menambahkan Mine.

<+
Conflict

Selanjutnya, kami mengganti urutan <dengan Conflict. Tetapi tidak ada< s dalam string, jadi tidak ada yang terjadi.

String yang bekerja Hello Mine,, secara implisit menghasilkan. Program "Mereka" bekerja dengan cara yang sama.

Kucing Bisnis
sumber
1

OIL , 88 80 77 byte

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

4 2adalah mencetak baris 2 ( Hello), 10menguji apakah baris 0 ( 4) identik dengan baris 16 (baris yang berisi 4ketika konflik ada) dan melompat ke baris 16 atau baris 8 tergantung pada hasilnya. Jika ada, 4 4cetak baris 4 ( Conflict). Jika tidak, 4 11cetak salah satu Mineatau Theirs, tergantung pada apa yang digabungkan, dan 3keluar.

L3viathan
sumber
1

Java 145 Bytes

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

Java tidak memiliki string multiline sehingga diperlukan beberapa trik Komentar

masterX244
sumber
Apa alasan untuk tambahan *di baris ketiga? Saya akan berpikir itu hanya */s+="Mine";/*akan berhasil.
CAD97
sisa dari ketika baris komentar adalah baris terpisah untuk menghindari baris yang sama (refactored sebelum memposting dan lupa itu), terima kasih untuk petunjuk itu dan 3 byte
masterX244
1

Bash, 76 byte

Golf

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

Bagaimana itu bekerja

Gunakan di sini doc , untuk memberi makan teks sumber ke sed .

Sed akan menambahkan awal baris yang dibacanya dengan "Hello", ganti <<<<<<<string dengan "Conflict" dan kemudian berhenti (q ).

Cobalah secara Online!

zeppelin
sumber
1

ES6 (Javascript), 83, 82 byte

Golf

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

Cobalah

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

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

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

zeppelin
sumber
1

Java 8, 108 byte

Ini adalah lambda menerima input kosong dan tidak mengembalikan apa pun.

n->System.out.print("Hello "+",Mine,Theirs,Conflict".split(",")[/*
<<<<<<<
*/1/*
=======
*/+2/*
>>>>>>>
*/])

Cobalah secara Online

Pendekatan yang terinspirasi oleh solusi Java masterX244 .

Jakob
sumber
1

C (GCC), 110 byte

Pengiriman fungsi.

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

Pendekatan yang terinspirasi oleh solusi Java masterX244 .

TIO

Jakob
sumber
Yang bagus! Cerdas menggunakan komentar multi-line.
Erno
1

Perl 5 , 68 byte

Diperbarui setelah menyadari bahwa versi dengan 6 masing-masing pembatas berfungsi sebagaimana dimaksud, tetapi dengan 7 pembatas yang sebenarnya, itu tidak ... Ups ...

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

Coba konflik online!

Coba milikku online!

Cobalah secara online!

Dom Hastings
sumber