Birleştirme Çakışmasını Çalıştırma


24

İki dosyayı birleştirmek için git gibi bir araç kullanıldığında, bir çakışma algılanabilir ve birleştirme sonucuna eklenebilir.

Bu iki dosyanın birleştirilmesi:

benim dosyam:

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

onların dosyası:

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

sonuçlanırdı:

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

Çatışma İşaretleyici Çizgileri görün

Bu çatışmayı Mine ile çözmek bu dosyayı oluşturur:

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

Bu çatışmanın Theirs ile çözülmesi bu dosyayı oluşturur:

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

Bu zorluğun amacı bir çatışma içeren ve hala derleyen / yürütülen bir kaynak dosya yazmaktır.

Kaynak bir dosya yazın:

  1. Uygun yama çatışma belirteçleri damgasını bir geçerli, iki yönlü, çatışmayı içeren ( <<<<<<<, =======, >>>>>>>) Maden ve belirteçler sonra VKG dosya tanımlayıcıları isteğe bağlıdır.
  2. İşaretçiler kaynağın bir parçası olarak kalırsa, derleme / hatasız bir uyarı / uyarılar
  3. ihtilaf mayın kullanılarak çözülürse, derleme / hatasız / uyarısız olarak yürütülür
  4. Uyuşmazlık kendileri kullanılarak çözülürse derlenir / hatasız / uyarısız olarak çalıştırılır
  5. Çakışan dosyayı derlerken / çalıştırırken "Hello Conflict" çıktı veriyor
  6. mayın sürümünü derlerken / çalıştırırken "Merhaba Madeni" çıktılar
  7. kendi versiyonunu derlerken / çalıştırırken "Hello Theirs" yazıyor

İşaretçiler, kaynak dosyada kdiff3'ün çatışmayı tanıyacağı şekilde yerleştirilmelidir.

Standart boşluklar yasaktır.

En kısa kod kazanır.

Puan, çakışan kaynağın uzunluğu


İşlev gönderimlerine izin veriliyor mu yoksa yalnızca tam programlar mı var?
Jakob

@ Jakob - yürütmek / çalıştırmak mümkün olmalıdır. Bu nedenle, işlevi (veya sadece ifadeyi) çalıştırabilecek bir REPL varsa, elbette.
Erno

Yanıtlar:


2

Jöle , 51 bayt

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

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

Çevrimiçi deneyin!

açıklama

Buradaki çatışma belirteçleri, üç çizgiden biri, çatışma çözüldükten sonra programın ikinci çizgisi olacak şekilde konumlandırılmıştır; adında bir sabit olacak . Orijinal programın ikinci satırı dizgiyi kodlar " Conflict"(Jelly'in sıkıştırılmış gösteriminde); üçüncü satır dizeyi kodlar " Mine"(çatışma mayın olarak çözülürse bu ikinci satır olur); altıncı çizgi, dizeyi kodlar " Theirs"(ve çakışma onların olduğu gibi çözülürse ikinci satır olur).

Ana program, silinmeden önce kaç satır olursa olsun, her zaman son satırdır. Sıkıştırılmış kodlamasını alır ve değerini "Hello"ekler ( ;) , böylece istenen çıktıyı üretir.


13

JavaScript (ES6), 102 94 93 90 bayt

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

Çatışma çözüldüyse, o zaman altıncı çizgi yoktur, bu yüzden şimdi ilk satırı yazdırır. Düzenleme: @ nderscore sayesinde 3 bayt kaydedildi.


Düzenli ifadelerin yaratıcı kullanımı!
Erno

@ErnodeWeerd Oops, Ben sadece değiştirdim ...
Neil

:) endişelenmeyin, onu görmekten mutlu oldum
Erno

-3 bayt:console.log('Hello',(a=`...`)[6]||a[1])
nderscore

10

Brachylog , 68 67 66 bayt

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

Çevrimiçi deneyin!

"Hello Mine"Burada sürümünü deneyin

"Hello Theirs"Burada sürümünü deneyin

açıklama

Neyse ki, <<<<<<<, =======ve >>>>>>>Brachylog tüm geçerli kural tanımları bulunmaktadır. Sırasıyla demek:

  • Girdi, örtük bir değişkenden küçük, kendisi de ..., vb.
  • Girişin tüm elemanları eşittir ve girişin tüm elemanları eşittir ve ... ve Giriş = Çıkış
  • İlk ile aynı, fakat bunun yerine daha büyük.

Biz çatışmaları kaldırırsanız, biz ile bitirmek "Mine"veya "Theirs"onlar ile o yüklemi çağırma yüklem sayısı 1. haline anlamına gelen ikinci satırda ↰₁ile giriş ve çıkış birleştirecektir ilk satırda Mine/ Theirsbiz o zaman yazdırmak hangi w.

↰₁Çakışan dosyayı çağırırsak , sonlandırırız <<<<<<<. Bu nedenle, bu yüklemeyi bir dize ile girdi olarak adlandırıyoruz ( ċ₂dize - - coerce kullanarak ). <bir dize ile giriş başarısız olur. Daha sonra, 1 tahmininin ∨"Conflict"wbaşarısız olması durumunda basılacağını belirten ana tahminde bir ayrılma koyduk Conflict. ↰₁Bir dizge ile giriş başarısız olur, "Mine"ya da "Theirs"satırlar başarısız olur çünkü bunlar karakter dizisidir .


9

PHP, 74 65 bayt

Not: IBM-850 kodlamasını kullanır

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

Bir dosyaya depolayın ve şu şekilde çalıştırın:

php -nf conflict.php

açıklama

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

İkili XOR, aşağıdaki 3'ten birine neden olur:

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

Düzenlemeler

  • Dizelerde ikili mantık kullanarak 9 bayt kaydedildi

Bir gün PHP'nin bir =======operatörü olacak ve sonra bu biraz daha kolay olacak.
Jakob

7

Pip , 61 bayt

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

Çevrimiçi deneyin!

Aradaki her şey ""bir dizedir. Büyük dizgiyi newlines ( "..."^n) üzerine bölüyoruz ve 7. öğeyi döngüsel dizinleme ( (___7)) ile alıyoruz . Çakışan sürüm için yedi satır vardır, bu nedenle dizin 7, dizin 0'a eşittir ve elde ederiz Conflict. Çözümlenen sürümler için, üç satır vardır, bu nedenle dizin 7, dizin 1'e eşdeğerdir ve Mine/ Theirs. Sonra "Hello "ön ve otomatik baskı ile birleştirin .


Çok yaratıcı, çevrimsel endekslemeyi seviyorum.
Erno

6

Toplu, 133 129 bayt

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

Açıklama: gotoİfade bulabildiği bir sonraki etikete gider. Çatışma durumunda, bu sadece çatışma belirteçlerini atlayarak sona erer ve snihai değerini alır. Madenle çözülmesi durumunda, gotoların hiçbir etkisi yoktur, ancak sonuncusu setartık mevcut değildir, dolayısıyla sonuç Mine'dir . Theirs ile çözülmesi durumunda, inital gotokalanı atlar, setböylece sonuç başlangıç ​​değeridir. Düzenleme: @DLosc sayesinde 4 bayt kaydedildi.


Güzel! Bunun yerine kaldırabilir :cve yapabilir misiniz @goto t?
DLosc

@DLosc Oh, yani Batch birinciden ziyade bir sonraki etikete gider? Temiz!
Neil

Bilmiyorum - Test etmedim. Tamamen yanlış olabilirim.
DLosc

4

Python 2, 88 87 bayt

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

Altıncı veya (şimdi) ilk satırı uygun şekilde yazdırır.


1
"Merhaba" bölümünü
basmıyor

@ErnodeWeerd Üzgünüm, bu cevabı diğer cevabımda da yaptım ve bunu düzeltmeyi unuttum.
Neil

Merhaba ve izleyenler arasında boşluk var mı?
Erno

@ErnodeWeerd Python 2 printdeyimi her zaman ayırıcı olarak boşluk kullanır (ve izleyen bir yeni satır; Python 3'ün printişlevi ayırıcı ve sonlandırıcıyı seçmenize izin verir).
Neil

3

.COM opcode, 77 bayt

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

<<<<<<<İzin verilen bir alandan sonra 75 bayt

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

Güzel bir! Montaj versiyonlarını ekleyebiliyor musunuz, talimatları okuyabilmek hoşuma giderdi :). Evet, boşluğa izin veriliyor gibi görünüyor (özellikler istediğim kadar net değil)
Erno

2

Retina , 57 bayt


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

Çevrimiçi deneyin!

"Mine" versiyonunu dene

"Theirs" versiyonunu dene

Çatışma programının açıklaması

Genellikle Retina'da olduğu gibi, bu program birçok değiştirme aşaması içeriyor.


Hello 

Boş / var olmayan girişi değiştirin Hello  .

$
<<<<<<<

Çalışma dizesinin sonunu ile değiştirin <<<<<<<

Mine
=======

Değiştir Mineile======= . Yana Mineçalışan dizede herhangi bir yerde görünmüyor, bu bir şey yapmaz.

Theirs
>>>>>>>

Değiştir Theirsile >>>>>>>. İle aynı anlaşmaMine ; Theirsgörünmüyor, bu yüzden değiştirme hiçbir şey yapmaz.

<+
Conflict

Bir dizi değiştirme <ileConflict . <<<<<<<İlk değişimde dizgenin sonuna ekledik , böylece çalışma dizgisi Hello Conflictdolaylı olarak programın sonunda çıkarılan hale geldi .

Maden İşletme Programlarının Açıklanması

Çatışma çözüldüğünde, kod şöyle görünecektir:


Hello 
$
Mine
<+
Conflict

Hello 

Daha önce olduğu gibi, dize ile başlayan Hello .

$
Mine

Şimdi yerine de ekleyebilirsiniz <<<<<<<üzere Hello , biz eklemekMine .

<+
Conflict

Sonra, <ile bir dizi yerineConflict . Fakat <dizgede s yok , bu yüzden hiçbir şey olmuyor.

Çalışma dizesi, Hello Minedolaylı olarak çıktı. "Theirs" programı aynı şekilde çalışıyor.


1

PETROL , 88 80 77 bayt

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

4 2satır 2 ( Hello) 'yi yazdırıyorsa , 10satır 0 ( 4)' ın satır 16 ile aynı olup olmadığını test eder ( 4çatışma olduğunda bir içeren içeren ) ve sonuca bağlı olarak satır 16 veya satır 8'e atlar. Varsa, 4 4satır 4'ü yazdırır ( Conflict). Olmadığı zaman, 4 11baskılar ya Mineya Theirs, birleştirilmiş ve ne bağlı 3çıkışlar.


1

Java 145 Bayt

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

Java'da çoklu satır dizgisi yoktur, bu nedenle bazı yorum hilelerine ihtiyaç duyuldu


*Üçüncü satırdaki ekstraların sebebi nedir ? Bunun */s+="Mine";/*işe yarayacağını düşünürdüm.
CAD97 19

yorum satırları, aynı satırları (göndermeden önce yeniden düzenlenmiş ve unutmuş) önlemek için ayrı satırlar olduğunda kalanlar, bu ipucu için thx ve 3 bayt
masterX244

1

Bash, 76 bayt

golfed

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

Nasıl çalışır

Burada doc , kaynak metni sed ' e beslemek için kullanır .

Sed , "Merhaba" ile okuduğu ilk satırı hazırlar, <<<<<<<dizeyi "Çakışma" ile değiştirir ve sonra çıkar.q .

Çevrimiçi Deneyin!


1

ES6 (Javascript), 83, 82 bayt

golfed

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

Dene

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

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

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




Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.