Merge Conflict ausführen


24

Wenn Sie ein Tool wie git zum Zusammenführen von zwei Dateien verwenden, kann ein Konflikt erkannt und dem Ergebnis der Zusammenführung hinzugefügt werden.

Eine Zusammenführung dieser beiden Dateien:

meine Datei:

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

ihre Akte:

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

würde ergeben:

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

Siehe Konfliktmarkierungslinien

Wenn Sie diesen Konflikt mit Mine lösen , wird folgende Datei erstellt:

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

Wenn Sie diesen Konflikt mit Theirs lösen , wird die folgende Datei erstellt:

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

Ziel dieser Herausforderung ist es, eine Quelldatei zu schreiben, die einen Konflikt enthält und dennoch kompiliert / ausgeführt wird.

Schreiben Sie eine Quelldatei, die:

  1. enthält eine gültige, Zwei-Wege, Konflikte durch den richtigen Patch Konfliktmarken markiert ( <<<<<<<, =======, >>>>>>>) Meiner und Deren Filedeskriptoren nach den Markierungen sind optional.
  2. Kompiliert / führt ohne Fehler / Warnungen aus, wenn die Markierungen ein Teil der Quelle bleiben
  3. kompiliert / führt ohne Fehler / Warnungen aus, wenn der Konflikt mit mine gelöst wird
  4. compiliert / ausführt ohne Fehler / Warnungen , wenn der Konflikt durch die Verwendung aufgelöst wird ihre
  5. gibt "Hello Conflict" aus, wenn die Konfliktdatei kompiliert / ausgeführt wird
  6. gibt "Hello Mine" aus, wenn die Minenversion kompiliert / ausgeführt wird
  7. gibt "Hallo ihr" aus, wenn die ihre Version kompiliert / ausgeführt wird

Die Marker sollten so in der Quelldatei liegen, dass kdiff3 den Konflikt erkennt.

Standardlücken sind verboten.

Der kürzeste Code gewinnt.

Punktzahl ist die Länge der in Konflikt stehenden Quelle


Sind Einreichungen von Funktionen oder nur vollständige Programme zulässig?
Jakob

@ Jakob - es muss möglich sein, es auszuführen / auszuführen. Wenn es also eine REPL gibt, die die Funktion (oder nur den Ausdruck) ausführen kann, ist dies sicher.
Erno

Antworten:


2

Jelly , 51 Bytes

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

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

Probieren Sie es online!

Erläuterung

Die Konfliktmarkierungen sind hier so positioniert, dass eine der drei Zeilen die zweite Zeile des Programms wird, nachdem der Konflikt gelöst wurde. Dies wird eine Konstante namens sein . Die zweite Zeile des ursprünglichen Programms codiert den String " Conflict"(in Jellys komprimierter Notation). Die dritte Zeile kodiert die Zeichenkette " Mine"(dies wird die zweite Zeile, wenn der Konflikt als meiner gelöst wird). Die sechste Zeile codiert die Zeichenfolge " Theirs"(und wird zur zweiten Zeile, wenn der Konflikt wie folgt gelöst wird).

Das Hauptprogramm ist immer die letzte Zeile, egal wie viele Zeilen zuvor gelöscht wurden. Es nimmt die komprimierte Codierung von "Hello"und hängt ( ;) den Wert von an, wodurch die gewünschte Ausgabe erzeugt wird.


13

JavaScript (ES6), 102 94 93 90 Byte

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

Wenn der Konflikt behoben wurde, gibt es keine sechste Zeile, sodass stattdessen die jetzt erste Zeile gedruckt wird. Bearbeiten: 3 Bytes dank @nderscore gespeichert.


Kreativer Umgang mit regulären Ausdrücken!
Erno

@ErnodeWeerd Hoppla, ich habe es gerade geändert ...
Neil

:) keine sorge, ich war froh es zu sehen
erno

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

10

Brachylog , 68 67 66 Bytes

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

Probieren Sie es online!

Probieren Sie die "Hello Mine"Version hier aus

Probieren Sie die "Hello Theirs"Version hier aus

Erläuterung

Zum Glück <<<<<<<, =======und >>>>>>>sind alle gültigen Regeldefinitionen in Brachylog. Sie bedeuten jeweils:

  • Die Eingabe ist kleiner als eine implizite Variable, selbst kleiner als ... usw., selbst kleiner als die Ausgabe.
  • Alle Elemente der Eingabe sind gleich und alle Elemente der Eingabe sind gleich und ... und Eingabe = Ausgabe
  • Gleich wie der erste, aber größer als stattdessen.

Wenn wir Konflikte entfernen, landen wir in "Mine"oder "Theirs"in der zweiten Zeile, was bedeutet, dass sie zu Prädikat Nummer 1 werden. Wenn Sie dieses Prädikat ↰₁in der ersten Zeile aufrufen, wird seine Eingabe und Ausgabe mit Mine/ vereinheitlicht Theirs, mit dem wir dann drucken w.

Wenn wir ↰₁die in Konflikt stehende Datei aufrufen, rufen wir am Ende an <<<<<<<. Wir bezeichnen dieses Prädikat daher als Eingabe (mit ċ₂- coerce to string). <schlägt mit einer Zeichenfolge als Eingabe fehl. Wir setzen dann eine Disjunktion ∨"Conflict"win das Hauptprädikat, die besagt, dass wenn Prädikat 1 fehlschlägt, wir Conflictstattdessen drucken . ↰₁mit einer Zeichenfolge als Eingabe schlagen die Zeilen "Mine"oder nicht fehl "Theirs", da es sich um Zeichenfolgen handelt.


9

PHP, 74 65 Bytes

Anmerkung: Verwendet die IBM-850-Codierung

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

In einer Datei speichern und wie folgt ausführen:

php -nf conflict.php

Erläuterung

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

Das binäre XOR führt zu einer der folgenden 3:

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

Optimierungen

  • 9 Bytes durch Verwendung von Binärlogik für Zeichenfolgen gespeichert

Eines Tages wird PHP einen =======Operator haben, und das wird dann ein bisschen einfacher.
Jakob

7

Pip , 61 Bytes

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

Probieren Sie es online!

Alles dazwischen ""ist eine Zeichenfolge. Wir teilen den großen String in Zeilenumbrüche ( "..."^n) und nehmen das 7. Element mit zyklischer Indizierung ( (___7)). Für die Konfliktversion gibt es sieben Zeilen, also entspricht Index 7 Index 0 und wir erhalten Conflict. Für die aufgelösten Versionen gibt es drei Zeilen, also entspricht Index 7 Index 1 und wir erhalten Mine/ Theirs. Dann "Hello "nach vorne verketten und automatisch drucken.


Sehr kreativ finde ich die zyklische Indizierung.
Erno

6

Batch, 133 129 Bytes

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

Erläuterung: Die gotoAnweisung wechselt zum nächsten Label, das sie finden kann. Im Falle eines Konflikts werden lediglich die Konfliktmarkierungen übersprungen und sder endgültige Wert abgerufen. Bei der Lösung mit Mine haben die Goto-Effekte keine Wirkung mehr, aber die letzte setexistiert nicht mehr. Das Ergebnis ist Meine. Bei der Lösung mit Ihnen gotoumgeht der Anfang den Rest, setso dass das Ergebnis sein Anfangswert ist. Bearbeiten: 4 Bytes dank @DLosc gespeichert.


Nett! Können Sie entfernen :cund @goto tstattdessen tun ?
DLosc

@ DLosc Oh, also geht Batch zum nächsten Label und nicht zum ersten? Ordentlich!
Neil

Ich weiß es nicht - ich habe es nicht getestet. Ich könnte völlig falsch liegen.
DLosc

4

Python 2, 88 87 Bytes

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

Gibt die sechste oder (jetzt) ​​erste Zeile aus.


1
Der Teil "Hallo" wird nicht gedruckt ...
Erno

@ErnodeWeerd Entschuldigung, ich habe diesen Fehler auch in meiner anderen Antwort gemacht und vergessen, diesen Fehler zu beheben.
Neil

Gibt es ein Leerzeichen zwischen Hallo und was auch immer folgt?
Erno

@ErnodeWeerd Die Python 2- printAnweisung verwendet immer ein Leerzeichen als Trennzeichen (und eine nachfolgende Newline; mit der printFunktion von Python 3 können Sie das Trennzeichen und das Abschlusszeichen auswählen).
Neil

3

.COM Opcode, 77 Bytes

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

Wenn ein Leerzeichen danach <<<<<<<erlaubt ist, 75 Bytes

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

Schön! Würden Sie die Assembly-Version (en) hinzufügen können, würde es mir Spaß machen, die Anweisungen zu lesen :). Ja, Platz scheint erlaubt zu sein (die Spezifikationen sind nicht so klar, wie ich es mir wünsche)
Erno

2

Retina , 57 Bytes


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

Probieren Sie es online!

Probieren Sie die "Mine" -Version aus

Probieren Sie die "Theirs" -Version aus

Erklärung des Konfliktprogramms

Wie so oft bei Retina enthält dieses Programm viele Ersetzungsstufen.


Hello 

Ersetzen Sie die leere / nicht vorhandene Eingabe durch Hello .

$
<<<<<<<

Ersetzen Sie das Ende der Arbeitszeichenfolge durch <<<<<<<

Mine
=======

Ersetzen Minedurch =======. Da Minenirgendwo in der Arbeitszeichenfolge angezeigt wird, hat dies keine Auswirkungen.

Theirs
>>>>>>>

Ersetzen Theirsdurch >>>>>>>. Gleiches Angebot wie bei Mine; Theirswird nicht angezeigt, der Ersatz bewirkt also nichts.

<+
Conflict

Ersetzen Sie eine Folge von <durch Conflict. Wir haben <<<<<<<beim ersten Ersetzen das Ende der Zeichenfolge angehängt , damit die Arbeitszeichenfolge wird Hello Conflict, die implizit am Ende des Programms ausgegeben wird.

Erklärung meiner / ihrer Programme

Wenn der Konflikt gelöst ist, sieht der Code folgendermaßen aus:


Hello 
$
Mine
<+
Conflict

Hello 

Gleich wie zuvor, beginnend mit der Zeichenfolge Hello.

$
Mine

Anstatt nun Anhängen <<<<<<<an Hello , hängen wir Mine.

<+
Conflict

Als nächstes ersetzen wir eine Folge von <mit Conflict. <Die Zeichenfolge enthält jedoch keine s, sodass nichts passiert.

Die Arbeitszeichenfolge Hello Minewird implizit ausgegeben. Das "ihnen" -Programm funktioniert genauso.


1

OIL , 88 80 77 Bytes

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

4 2Gibt Zeile 2 ( Hello) aus, 10prüft, ob Zeile 0 ( 4) mit Zeile 16 identisch ist (die Zeile, die einen enthält, 4wenn der Konflikt besteht) und springt je nach Ergebnis zu Zeile 16 oder Zeile 8. Falls vorhanden, wird 4 4Zeile 4 ( Conflict) gedruckt . Wenn dies nicht der 4 11Fall ist, wird entweder Mineoder Theirs, je nachdem, was zusammengeführt wurde , gedruckt und beendet 3.


1

Java 145 Bytes

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

Java hat keine mehrzeiligen Zeichenfolgen, sodass einige Tricks mit Kommentaren erforderlich waren


Was ist der Grund für das Extra *in der dritten Zeile? Ich würde denken, das */s+="Mine";/*würde einfach funktionieren.
CAD97,

Übrig geblieben, als Kommentarzeilen separate Zeilen waren, um identische Zeilen zu vermeiden (vor dem Posten überarbeitet und vergessen), danke für diesen Hinweis und 3 Bytes
masterX244

1

Bash, 76 Bytes

Golf gespielt

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

Wie es funktioniert

Verwendet hier doc , um den Quelltext an sed zu senden .

Sed stellt der ersten gelesenen Zeile "Hallo" voran, ersetzt den <<<<<<<String durch "Konflikt" und beendet dann ( q).

Probieren Sie es online!


1

ES6 (Javascript), 8382 Bytes

Golf gespielt

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

Versuch es

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 Bytes

Funktionsübergabe.

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

Ansatz inspiriert von der Java-Lösung von masterX244 .

TIOs


Schön! Intelligente Verwendung der mehrzeiligen Kommentare.
Erno

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.