Запуск конфлікту злиття


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

Брахілог , 68 67 66 байт

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

Спробуйте в Інтернеті!

Спробуйте "Hello Mine" версію тут

Спробуйте "Hello Theirs" версію тут

Пояснення

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

  • Вхід менший, ніж неявна змінна, сам менший, ніж ... і т.д., сам менший, ніж вихід.
  • Усі елементи вводу рівні, і всі елементи вводу рівні, і ..., і Input = вихід
  • Те саме, що перше, але більше, ніж замість цього.

Якщо ми усунемо конфлікти, ми закінчимось на другому рядку "Mine"або "Theirs"на другому рядку, що означає, що вони стають предикатом № 1. Виклик цього предиката з ↰₁першого рядка уніфікує його вхід і вихід з Mine/ Theirs, з яким ми друкуємо потімw .

Якщо ми зателефонуємо ↰₁в конфліктний файл, ми закінчимо дзвінок <<<<<<<. Тому ми називаємо цей присудок рядком як вхідним (використовуючи ċ₂- примусовий до рядка). <не вдасться із рядком як вхідним. Потім ми ставимо диз'юнкцію ∨"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)

Налаштування

  • Збережено 9 байт за допомогою двійкової логіки на рядках

Колись PHP матиме =======оператора, і тоді це буде трохи простіше.
Якоб

7

Піп , 61 байт

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

Спробуйте в Інтернеті!

Все між собою ""- це рядок. Розбиваємо велику рядок на нові рядки ( "..."^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отримує своє остаточне значення. У випадку розв’язання з Моїм, готос не має ефекту, але останній setбільше не існує, тому результат - Моє. У випадку розв’язання з ними, первісне 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 Вибачте, я помилився і в іншій своїй відповіді, і забув виправити цю.
Ніл

Чи є пробіл між привіт і що далі?
Ерно

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

Хороший! Чи зможете ви додати версію (-ла) складання, я б із задоволенням прочитав інструкції :). Так, пробіл видається дозволеним (характеристики не такі чіткі, як хотілося б)
Ерно,

2

Сітківка , 57 байт


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

Спробуйте в Інтернеті!

Спробуйте версію "Шахта"

Спробуйте версію "Їх"

Пояснення програми 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перевіряє, чи рядок 0 ( 4) ідентичний рядку 16 (той, що містить a, 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

Залишилося від того, коли рядки коментарів були окремими рядками, щоб уникнути однакових рядків (перероблені після публікації та забули про це), thx для цього натяку та 3 байти
masterX244

1

Баш, 76 байт

Гольф

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

Як це працює

Тут використовується doc , щоб подати вихідний текст до sed .

Sed передбачив перший рядок, який він прочитав, "Привіт", замінить <<<<<<<рядок на "Конфлікт", а потім вийде (q ).

Спробуйте в Інтернеті!


1

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

Гольф

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

Perl 5 , 68 байт

Оновлено після того, як зрозумів, що версія з 6 роздільниками працює за призначенням, але з 7-ма роздільниками не відповідає ... На жаль ...

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

Спробуйте конфлікт в Інтернеті!

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.