Запущенный конфликт слияния


24

При использовании инструмента, такого как git, для объединения двух файлов, конфликт может быть обнаружен и добавлен к результату объединения.

Слияние этих двух файлов:

мой файл:

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

их файл:

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

приведет к:

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

См. Конфликтующие линии

Разрешение этого конфликта с Mine создаст этот файл:

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

Разрешение этого конфликта с Theirs создаст этот файл:

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

Целью этой задачи является написание исходного файла, который содержит конфликт и все еще компилируется / выполняется.

Напишите исходный файл, который:

  1. содержит один действительный, двусторонний, конфликт , отмеченный соответствующих маркера патча конфликтов ( <<<<<<<, =======, >>>>>>>) Шахтные и ихние дескрипторы после маркеров являются необязательными.
  2. компилирует / выполняет без ошибок / предупреждений, если маркеры остаются частью источника
  3. компилирует / выполняет без ошибок / предупреждений, если конфликт разрешен с помощью шахты
  4. компилирует / выполняет без ошибок / предупреждений, если конфликт разрешается с помощью их
  5. выводит "Hello Conflict" при компиляции / исполнении конфликтующего файла
  6. выводит "Hello Mine" при компиляции / выполнении моей версии
  7. выводит "Hello Theirs" при компиляции / исполнении их версии

Маркеры должны быть расположены в исходном файле таким образом, чтобы kdiff3 распознал конфликт.

Стандартные лазейки запрещены.

Самый короткий код выигрывает.

Оценка - длина конфликтующего источника


Разрешены ли представления функций или только полные программы?
Якоб

@Jakob - должно быть возможно выполнить / запустить его. Так что, если есть REPL, который может выполнить функцию (или просто выражение), конечно.
Эрно

Ответы:


2

Желе , 51 байт

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

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

Попробуйте онлайн!

объяснение

Маркеры конфликта здесь расположены таким образом, что одна из трех строк становится второй строкой программы после разрешения конфликта; это будет константа с именем . Вторая строка оригинальной программы кодирует строку " Conflict"(в сжатой записи Jelly); третья строка кодирует строку " Mine"(она станет второй строкой, если конфликт разрешен как мой); шестая строка кодирует строку " Theirs"(и станет второй строкой, если конфликт разрешен как их).

Основная программа всегда является последней строкой, независимо от того, сколько строк перед ней удалено. Он принимает сжатое кодирование "Hello"и добавляет ;к нему значение ( ) , создавая тем самым желаемый результат.


13

JavaScript (ES6), 102 94 93 90 байт

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

Если конфликт разрешен, шестой строки нет, поэтому вместо нее выводится первая строка. Редактировать: 3 байта сохранены благодаря @nderscore.


Творческое использование регулярных выражений!
Эрно

@ErnodeWeerd Ой, я только что изменил это ...
Нил

:) не беспокойтесь, я был рад видеть это
Эрно

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

10

Brachylog , 68 67 66 байт

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

Попробуйте онлайн!

Попробуйте "Hello Mine"версию здесь

Попробуйте "Hello Theirs"версию здесь

объяснение

К счастью, <<<<<<<, =======и >>>>>>>все действительные определения правил в Brachylog. Они соответственно означают:

  • Ввод меньше, чем неявная переменная, сам меньше чем ... и т. Д., Сам меньше, чем вывод.
  • Все элементы ввода равны, а все элементы ввода равны, и ..., и Input = Output
  • То же, что и первый, но больше, чем вместо.

Если мы удаляем конфликты, мы в конечном итоге получаем "Mine"или "Theirs"во второй строке, что означает, что они становятся предикатом номер 1. Вызов этого предиката с ↰₁первой строкой объединит его ввод и вывод с Mine/ Theirs, который мы затем напечатаем w.

Если мы вызываем ↰₁конфликтующий файл, мы в конечном итоге вызываем <<<<<<<. Поэтому мы вызываем этот предикат со строкой в ​​качестве входных данных (используя ċ₂- coerce to string). <потерпит неудачу со строкой в ​​качестве ввода. Затем мы помещаем дизъюнкцию ∨"Conflict"wв основной предикат, которая гласит, что если предикат 1 не работает, то Conflictвместо этого мы печатаем . ↰₁со строкой в ​​качестве входных данных не будет ошибкой для строк "Mine"или, "Theirs"потому что они являются строками.


9

PHP, 74 65 байт

Примечание: используется кодировка IBM-850

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

Сохраните в файл и запустите так:

php -nf conflict.php

объяснение

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

Двоичный XOR приводит к одному из следующих 3:

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

Tweaks

  • Сохранено 9 байт с использованием двоичной логики в строках.

Когда-нибудь в PHP появится =======оператор, и тогда это будет немного проще.
Якоб

7

Пип , 61 байт

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

Попробуйте онлайн!

Все, что между, ""является строкой. Разобьем большую строку на newlines ( "..."^n) и возьмем 7-й элемент с циклическим индексированием ( (___7)). Для конфликтующей версии есть семь строк, поэтому индекс 7 эквивалентен индексу 0, и мы получаем Conflict. Для разрешенных версий есть три строки, поэтому индекс 7 эквивалентен индексу 1, и мы получаем Mine/ Theirs. Затем конкатенация "Hello "к передней части и автопечать.


Очень креативно, мне нравится циклическая индексация.
Эрно,

6

Пакет, 133 129 байт

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

Объяснение: gotoОператор переходит к следующей метке, которую он может найти. В случае конфликта это просто приводит к пропуску маркеров конфликта и sего окончательному значению. В случае разрешения с помощью Mine, gotos не имеют никакого эффекта, но последний setбольше не существует, поэтому результатом является Mine. В случае разрешения с их помощью начальный gotoобходит оставшееся, setпоэтому результатом является его первоначальное значение. Редактировать: 4 байта сохранены благодаря @DLosc.


Ницца! Вы можете удалить :cи сделать @goto tвместо этого?
DLosc

@DLosc О, так Batch переходит к следующему лейблу, а не к первому? Ухоженная!
Нил

Я не знаю - я не проверял это. Я могу быть совершенно не прав.
DLosc

4

Python 2, 88 87 байт

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

Печатает шестую или (сейчас) первую строку в зависимости от ситуации.


1
Это не печатает часть "Привет" ...
Эрно

@ErnodeWeerd Извините, я допустил эту ошибку и в другом своем ответе и забыл исправить это.
Нил

Есть ли пробел между Hello и тем, что следует?
Эрно

@ErnodeWeerd Оператор Python 2 printвсегда использует пробел в качестве разделителя (и завершающий символ новой строки; printфункция Python 3 позволяет выбирать разделитель и терминатор).
Нил

3

.COM код операции, 77 байт

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

Если пробел после <<<<<<<допустимого, 75 байтов

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

Хороший! Можете ли вы добавить сборочные версии, я бы с удовольствием прочитал инструкцию :). Да, пространство, похоже, разрешено (спецификации не так ясны, как хотелось бы)
Erno

2

Сетчатка , 57 байт


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

Попробуйте онлайн!

Попробуйте версию "Моя"

Попробуйте версию "Их"

Объяснение программы Конфликт

Как это часто бывает с Retina, эта программа содержит множество этапов замены.


Hello 

Замените пустой / несуществующий вход на Hello .

$
<<<<<<<

Заменить конец рабочей строки на <<<<<<<

Mine
=======

Заменить Mineна =======. Так Mineкак нигде в рабочей строке не появляется, это ничего не делает.

Theirs
>>>>>>>

Заменить Theirsна >>>>>>>. Та же сделка, что и с Mine; Theirsне появляется, поэтому замена ничего не делает.

<+
Conflict

Заменить последовательность <с Conflict. Мы добавили <<<<<<<в конец строки при первой замене, чтобы Hello Conflictполучилась рабочая строка , которая неявно выводится в конце программы.

Объяснение моих / их программ

Когда конфликт разрешен, код будет выглядеть так:


Hello 
$
Mine
<+
Conflict

Hello 

То же, что и раньше, начиная со строки Hello.

$
Mine

Теперь вместо добавления <<<<<<<к Hello , мы добавляемMine .

<+
Conflict

Далее мы заменим последовательность <сConflict . Но <в строке нет s, поэтому ничего не происходит.

Рабочая строка, Hello Mineнеявно выводится. Программа «Их» работает так же.


1

НЕФТЬ , 88 80 77 байт

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

4 2печатает строку 2 ( Hello), 10проверяет, 4совпадает ли строка 0 ( ) со строкой 16 (той, которая содержит, 4когда существует конфликт) и переходит к строке 16 или строке 8 в зависимости от результата. Если он существовал, 4 4печатает строку 4 ( Conflict). Если это не так, 4 11печатает либо, Mineлибо Theirs, в зависимости от того, что было объединено, и 3выходит.


1

Java 145 байт

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

В Java нет многострочных строк, поэтому понадобился трюк с комментариями


В чем причина лишнего *на третьей строчке? Я думаю, что */s+="Mine";/*это сработает.
CAD97

остаток от того, когда строки комментариев были отдельными строками, чтобы избежать идентичных строк (перед тем как опубликовать и переделать их), спасибо за эту подсказку и 3 байта
masterX244

1

Баш, 76 байт

Golfed

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

Как это работает

Использует здесь документ , чтобы подать исходный текст в sed .

Sed добавит к первой строке, которую он прочитал, «Hello», заменит <<<<<<<строку на «Conflict» и выйдет (q ).

Попробуйте онлайн!


1

ES6 (Javascript), 83, 82 байта

Golfed

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

Попытайся

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 байтов

Функция представления.

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

Подход, основанный на Java-решении masterX244 .

TIOS


Хороший! Умное использование многострочных комментариев.
Эрно

1

Perl 5 , 68 байт

Обновляется после понимания того, что версия с 6 каждым разделителем работает, как и предполагалось, но с фактическими 7 разделителями это не ... Ой ...

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

Попробуйте конфликт в Интернете!

Попробуйте мой онлайн!

Попробуйте онлайн!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.