Uruchamianie konfliktu scalania


24

Podczas używania narzędzia takiego jak git do scalania dwóch plików można wykryć konflikt i dodać go do wyniku scalania.

Scalenie tych dwóch plików:

mój plik:

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

ich plik:

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

spowodowałoby:

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

Zobacz linie znaczników konfliktów

Rozwiązanie tego konfliktu z Mine spowoduje utworzenie tego pliku:

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

Rozwiązanie tego konfliktu z Ich spowodowałoby utworzenie tego pliku:

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

Celem tego wyzwania jest napisanie pliku źródłowego, który zawiera konflikt i nadal kompiluje / wykonuje.

Napisz plik źródłowy, który:

  1. zawiera jedną ważną, dwukierunkową, konflikty oznaczone odpowiednimi markerami konfliktowych łata ( <<<<<<<, =======, >>>>>>>) Kopalnia i ich deskryptory plików po markerów są opcjonalne.
  2. kompiluje / wykonuje bez błędów / ostrzeżeń, jeśli znaczniki pozostają częścią źródła
  3. kompiluje / wykonuje bez błędów / ostrzeżeń, jeśli konflikt zostanie rozwiązany przy użyciu mojego
  4. kompiluje / wykonuje bez błędów / ostrzeżeń, jeśli konflikt zostanie rozwiązany za pomocą ich
  5. wyprowadza „Hello Conflict” podczas kompilacji / wykonywania konfliktu pliku
  6. wyświetla „Hello Mine” podczas kompilacji / wykonywania wersji kopalni
  7. wypisuje „Hello Ich” podczas kompilacji / wykonywania ich wersji

Znaczniki powinny znajdować się w pliku źródłowym w taki sposób, aby kdiff3 rozpoznał konflikt.

Standardowe luki są zabronione.

Najkrótszy kod wygrywa.

Wynik to długość konfliktu źródła


Czy przesyłanie funkcji jest dozwolone, czy tylko pełne programy?
Jakob,

@Jakob - musi być możliwe jego uruchomienie / uruchomienie. Więc jeśli istnieje REPL, który może wykonać funkcję (lub tylko wyrażenie), na pewno.
Erno,

Odpowiedzi:


2

Galaretka , 51 bajtów

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

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

Wypróbuj online!

Wyjaśnienie

Znaczniki konfliktu są tutaj ustawione tak, że jeden z trzech wierszy staje się drugim wierszem programu po rozwiązaniu konfliktu; będzie to stała o nazwie . Drugi wiersz oryginalnego programu koduje ciąg znaków " Conflict"(w skompresowanej notacji Jelly); trzecia linia koduje ciąg " Mine"(stanie się drugą linią, jeśli konflikt zostanie rozwiązany jako mój); szósta linia koduje ciąg " Theirs"(i stanie się drugą linią, jeśli konflikt zostanie rozwiązany jako ich).

Główny program jest zawsze ostatnim wierszem, bez względu na to, ile wierszy przed nim zostanie usuniętych. Bierze skompresowane kodowanie "Hello"i dołącza ;do niego wartość ( ) , tworząc w ten sposób pożądany wynik.


13

JavaScript (ES6), 102 94 93 90 bajtów

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

Jeśli konflikt został rozwiązany, to nie ma szóstej linii, więc wypisuje teraz pierwszą linię. Edycja: Zapisano 3 bajty dzięki @nderscore.


Kreatywne wykorzystanie wyrażeń regularnych!
Erno

@ErnodeWeerd Ups, właśnie to zmieniłem ...
Neil,

:) nie martw się, ucieszyłem się z tego
Erno

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

10

Brachylog , 68 67 66 bajtów

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

Wypróbuj online!

Wypróbuj "Hello Mine"wersję tutaj

Wypróbuj "Hello Theirs"wersję tutaj

Wyjaśnienie

Na szczęście <<<<<<<, =======i >>>>>>>to wszystkie ważne definicje reguły w Brachylog. Oznacza to odpowiednio:

  • Wejście jest mniejsze niż domniemana zmienna, samo mniejsze niż ... itd., Samo mniejsze niż wyjście.
  • Wszystkie elementy danych wejściowych są równe, a wszystkie elementy danych wejściowych są równe, i ..., a Dane wejściowe = Dane wyjściowe
  • Taki sam jak pierwszy, ale większy niż zamiast.

Jeśli usuniemy konflikty, skończymy z drugą linią "Mine"lub "Theirs"w drugiej linii, co oznacza, że ​​staną się predykatem numer 1. Wywołanie tego predykatu ↰₁w pierwszej linii zunifikuje jego dane wejściowe i wyjściowe za pomocą Mine/ Theirs, z którym następnie drukujemy w.

Jeśli ↰₁wywołamy plik będący w konflikcie, ostatecznie zadzwonimy <<<<<<<. Dlatego nazywamy ten predykat ciągiem wejściowym (używając ċ₂- coerce to string). <zakończy się niepowodzeniem z ciągiem jako wejściem. Następnie umieszczamy rozłączenie ∨"Conflict"ww głównym predykacie, który stwierdza, że ​​jeśli predykat 1 nie powiedzie się, wówczas drukujemy Conflict. ↰₁z ciągiem jako wejściem nie zawiedzie dla linii "Mine"lub "Theirs", ponieważ są łańcuchami.


9

PHP, 74 65 bajtów

Uwaga: używa kodowania IBM-850

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

Zapisz do pliku i uruchom w następujący sposób:

php -nf conflict.php

Wyjaśnienie

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

Binarny XOR daje jeden z następujących 3:

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

Poprawki

  • Zapisano 9 bajtów przy użyciu logiki binarnej na łańcuchach

Kiedyś PHP będzie miało =======operatora, a wtedy będzie to trochę łatwiejsze.
Jakob

7

Pip , 61 bajtów

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

Wypróbuj online!

Wszystko pomiędzy ""jest sznurkiem. Dzielimy duży ciąg znaków na newlines ( "..."^n) i bierzemy siódmy element za pomocą cyklicznego indeksowania ( (___7)). W przypadku wersji będącej w konflikcie jest siedem linii, więc indeks 7 jest równoważny indeksowi 0 i otrzymujemy Conflict. W wersjach rozwiązanych są trzy linie, więc indeks 7 jest równoważny indeksowi 1 i otrzymujemy Mine/ Theirs. Następnie połącz "Hello "z przodu i wydrukuj automatycznie.


Bardzo kreatywny, lubię cykliczne indeksowanie.
Erno

6

Partia, 133 129 bajtów

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

Objaśnienie: gotoInstrukcja przechodzi do następnej etykiety, którą może znaleźć. W przypadku konfliktu kończy się to pomijaniem znaczników konfliktu i sotrzymuje jego ostateczną wartość. W przypadku rozpatrywania za pomocą Mojego, gotos nie mają żadnego efektu, ale ostatni setjuż nie istnieje, więc wynikiem jest Mój. W przypadku rozwiązania razem z nimi początkowy gotoomija pozostałe, setwięc wynikiem jest jego wartość początkowa. Edycja: Zapisano 4 bajty dzięki @DLosc.


Miły! Czy możesz usunąć :ci zrobić @goto tzamiast tego?
DLosc

@DLosc Oh, więc Batch przechodzi do następnej wytwórni, a nie do pierwszej? Schludny!
Neil

Nie wiem - nie przetestowałem tego. Mogę się całkowicie mylić.
DLosc

4

Python 2, 88 87 bajtów

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

Drukuje odpowiednio szósty lub (teraz) pierwszy wiersz.


1
Nie drukuje części „Cześć” ...
Erno,

@ErnodeWeerd Przepraszam, popełniłem ten błąd również w drugiej odpowiedzi i zapomniałem go naprawić.
Neil

Czy pomiędzy Hello a czymś innym jest odstęp?
Erno

@ErnodeWeerd Instrukcja Python 2 printzawsze używa spacji jako separatora (i końcowego nowego wiersza; printfunkcja Python 3 pozwala wybrać separator i terminator).
Neil

3

.COM opcode, 77 bajtów

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

Jeśli odstęp po jest <<<<<<<dozwolony, 75 bajtów

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

Niezłe! Czy możesz dodać wersje asemblera, chętnie przeczytam instrukcję :). Tak, wydaje się, że miejsce jest dozwolone (specyfikacje nie są tak jasne, jak bym tego chciał)
Erno

2

Siatkówka , 57 bajtów


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

Wypróbuj online!

Wypróbuj wersję „Mine”

Wypróbuj wersję „Ich”

Wyjaśnienie programu konfliktu

Jak to często bywa w przypadku Retina, ten program zawiera wiele etapów wymiany.


Hello 

Zamień puste / nieistniejące dane wejściowe na Hello .

$
<<<<<<<

Zamień koniec ciągu roboczego na <<<<<<<

Mine
=======

Wymień Minesię =======. Ponieważ Minenie pojawia się nigdzie w ciągu roboczym, nic to nie robi.

Theirs
>>>>>>>

Wymień Theirssię >>>>>>>. Ta sama oferta jak z Mine; Theirsnie pojawia się, więc zamiana nic nie robi.

<+
Conflict

Zastąpić sekwencję <z Conflict. Dodaliśmy <<<<<<<na końcu łańcucha przy pierwszej zamianie, więc łańcuch roboczy staje się Hello Conflict, który jest domyślnie wyprowadzany na końcu programu.

Wyjaśnienie programów Moje / Ich

Po rozwiązaniu konfliktu kod będzie wyglądał następująco:


Hello 
$
Mine
<+
Conflict

Hello 

Tak jak poprzednio, zaczynając od łańcucha Hello.

$
Mine

Teraz zamiast dołączania <<<<<<<do Hello , możemy dołączyć Mine.

<+
Conflict

Następnie zamieniamy ciąg <z Conflict. Ale nie ma <sznurka, więc nic się nie dzieje.

Ciąg roboczy,, Hello Minejest domyślnie wyprowadzany. Program „Ich” działa w ten sam sposób.


1

OLEJ , 88 80 77 bajtów

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

4 2wypisuje wiersz 2 ( Hello), 10sprawdza, czy wiersz 0 ( 4) jest identyczny z wierszem 16 (tym, który zawiera a, 4gdy istnieje konflikt) i przeskakuje do wiersza 16 lub wiersza 8 w zależności od wyniku. Jeśli istnieje, 4 4drukuje wiersz 4 ( Conflict). Jeśli nie, 4 11drukuje albo, Minealbo Theirsw zależności od tego, co zostało scalone, i 3wychodzi.


1

Java 145 bajtów

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

Java nie ma ciągów wielowierszowych, więc potrzebna była sztuczka związana z komentowaniem


Jaki jest powód dodania *w trzeciej linii? Myślałem, że to po prostu */s+="Mine";/*zadziała.
97 CAD

resztki po tym, jak linie komentarza były oddzielnymi liniami, aby uniknąć identycznych linii (zreformowane przed opublikowaniem i zapomniałem o tym), dziękuję za podpowiedź i 3 bajty
masterX244

1

Bash, 76 bajtów

Grał w golfa

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

Jak to działa

Używa tutaj doc , aby podać tekst źródłowy do sed .

Sed wstawi pierwszy odczytany wiersz słowem „Hello”, zastąpi <<<<<<<ciąg „Conflict”, a następnie quit ( q).

Wypróbuj online!


1

ES6 (JavaScript), 83, 82 bajty

Grał w golfa

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

Spróbuj

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 bajtów

Podanie funkcji.

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

Podejście zainspirowane rozwiązaniem Java masterX244 .

TIO


Niezłe! Inteligentne wykorzystanie komentarzy wieloliniowych.
Erno,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.