Exécution d'un conflit de fusion


24

Lorsque vous utilisez un outil tel que git pour fusionner deux fichiers, un conflit peut être détecté et ajouté au résultat de la fusion.

Une fusion de ces deux fichiers:

mon fichier:

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

leur dossier:

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

entraînerait:

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

Voir Lignes de marqueur de conflit

La résolution de ce conflit avec le mien créerait ce fichier:

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

La résolution de ce conflit avec la leur créerait ce fichier:

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

L'objectif de ce défi est d'écrire un fichier source qui contient un conflit et qui se compile / s'exécute toujours.

Écrivez un fichier source qui:

  1. contient une valide, dans les deux sens, conflit marqué par les marqueurs appropriés de conflit de patch ( <<<<<<<, =======, >>>>>>>) de la mine et leurs descripteurs de fichiers après que les marqueurs sont facultatifs.
  2. compile / s'exécute sans erreurs / avertissements si les marqueurs restent une partie de la source
  3. compile / exécute sans erreurs / avertissements si le conflit est résolu en utilisant le mien
  4. compile / s'exécute sans erreurs / avertissements si le conflit est résolu en utilisant les leurs
  5. affiche "Hello Conflict" lors de la compilation / exécution du fichier en conflit
  6. affiche "Hello Mine" lors de la compilation / exécution de la version mine
  7. affiche "Hello Theirs" lors de la compilation / exécution de la leur

Les marqueurs doivent être situés dans le fichier source de manière à ce que kdiff3 reconnaisse le conflit.

Les failles standard sont interdites.

Le code le plus court gagne.

Le score est la longueur de la source en conflit


Les soumissions de fonctions sont-elles autorisées ou seulement les programmes complets?
Jakob

@Jakob - il doit être possible de l'exécuter / l'exécuter. Donc, s'il existe un REPL qui peut exécuter la fonction (ou simplement l'expression), bien sûr.
Erno

Réponses:


2

Gelée , 51 octets

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

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

Essayez-le en ligne!

Explication

Les marqueurs de conflit ici sont positionnés de sorte que l'une des trois lignes devienne la deuxième ligne du programme après la résolution du conflit; ce sera une constante, nommée . La deuxième ligne du programme d'origine code la chaîne " Conflict"(dans la notation compressée de Jelly); la troisième ligne encode la chaîne " Mine"(cela deviendra la deuxième ligne si le conflit est résolu comme le mien); la sixième ligne code la chaîne " Theirs"(et deviendra la deuxième ligne si le conflit est résolu comme le leur).

Le programme principal est toujours la dernière ligne, quel que soit le nombre de lignes avant sa suppression. Il prend l'encodage compressé de"Hello" , et y ajoute ( ;) la valeur de , produisant ainsi la sortie souhaitée.


13

JavaScript (ES6), 102 94 93 90 octets

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

Si le conflit a été résolu, il n'y a pas de sixième ligne, il imprime donc la première ligne à la place. Edit: enregistré 3 octets grâce à @nderscore.


Utilisation créative des expressions régulières!
Erno

@ErnodeWeerd Oups, je viens de le changer ...
Neil

:) pas de soucis, j'étais content de le voir
Erno

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

10

Brachylog , 68 67 66 octets

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

Essayez-le en ligne!

Essayez la "Hello Mine"version ici

Essayez la "Hello Theirs"version ici

Explication

Heureusement, <<<<<<<, =======et >>>>>>>sont toutes les définitions de règles valables dans Brachylog. Ils signifient respectivement:

  • L'entrée est inférieure à une variable implicite, elle-même inférieure à ..., etc., elle-même inférieure à la sortie.
  • Tous les éléments de l'entrée sont égaux, et tous les éléments de l'entrée sont égaux, et ..., et Input = Output
  • Identique au premier mais supérieur à la place.

Si nous supprimons les conflits, nous nous retrouvons avec "Mine"ou "Theirs"sur la deuxième ligne, ce qui signifie qu'ils deviennent le prédicat numéro 1. L'appel de ce prédicat avec ↰₁sur la première ligne unifiera son entrée et sa sortie avec Mine/ Theirs, avec lequel nous imprimerons ensuite w.

Si nous appelons ↰₁le fichier en conflit, nous finissons par appeler <<<<<<<. Nous appelons donc ce prédicat avec une chaîne en entrée (en utilisant ċ₂- coerce pour chaîne). <échouera avec une chaîne en entrée. Nous mettons ensuite une disjonction ∨"Conflict"wdans le prédicat principal qui indique que si le prédicat 1 échoue, nous imprimons à la Conflictplace. ↰₁avec une chaîne en entrée n'échouera pas pour les lignes "Mine"ou "Theirs"car ce sont des chaînes.


9

PHP, 74 65 octets

Remarque: utilise le codage IBM-850

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

Stockez dans un fichier et exécutez comme ceci:

php -nf conflict.php

Explication

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

Le XOR binaire se traduit par l'un des 3 suivants:

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

Tweaks

  • 9 octets enregistrés en utilisant la logique binaire sur les chaînes

Un jour, PHP aura un =======opérateur, puis ce sera un peu plus facile.
Jakob

7

Pip , 61 octets

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

Essayez-le en ligne!

Tout entre les deux ""est une chaîne. Nous séparons la grande chaîne sur newlines ( "..."^n) et prenons le 7ème élément avec l'indexation cyclique ( (___7)). Pour la version en conflit, il y a sept lignes, donc l'index 7 est équivalent à l'index 0 et nous obtenons Conflict. Pour les versions résolues, il y a trois lignes, donc l'index 7 est équivalent à l'index 1 et nous obtenons Mine/ Theirs. Concaténer ensuite "Hello "au recto et imprimer automatiquement.


Très créatif, j'aime l'indexation cyclique.
Erno

6

Lot, 133 129 octets

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

Explication: L' gotoinstruction passe à l'étiquette suivante qu'elle peut trouver. Dans le cas du conflit, cela finit simplement par sauter les marqueurs de conflit et sobtient sa valeur finale. Dans le cas d'une résolution avec Mine, les gotos n'ont aucun effet, mais le dernier setn'existe plus, donc le résultat est Mine. Dans le cas d'une résolution avec le leur, l'initiale gotocontourne le reste, de setsorte que le résultat est sa valeur initiale. Edit: 4 octets enregistrés grâce à @DLosc.


Agréable! Pouvez-vous supprimer :cet faire à la @goto tplace?
DLosc

@DLosc Oh, alors Batch passe à la prochaine étiquette, plutôt qu'à la première? Soigné!
Neil

Je ne sais pas - je ne l'ai pas testé. Je me trompe peut-être complètement.
DLosc

4

Python 2, 88 87 octets

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

Imprime la sixième ou (maintenant) première ligne selon le cas.


1
Il n'imprime pas la partie "Bonjour" ...
Erno

@ErnodeWeerd Désolé, j'avais aussi fait cette erreur dans mon autre réponse et oublié de corriger celle-ci.
Neil

Y a-t-il un espace entre Hello et tout ce qui suit?
Erno

@ErnodeWeerd L'instruction Python 2 printutilise toujours un espace comme séparateur (et une nouvelle ligne de fin; la printfonction de Python 3 vous permet de choisir le séparateur et le terminateur).
Neil

3

Opcode .COM, 77 octets

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

Si un espace après <<<<<<<autorisé, 75 octets

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

Joli! Pourriez-vous ajouter la ou les versions d'assemblage, je serais ravi de pouvoir lire les instructions :). Oui, l'espace semble être autorisé (les spécifications ne sont pas aussi claires que je le souhaiterais)
Erno

2

Rétine , 57 octets


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

Essayez-le en ligne!

Essayez la version "Mine"

Essayez la version "Theirs"

Explication du programme Conflit

Comme c'est souvent le cas avec Retina, ce programme contient de nombreuses étapes de remplacement.


Hello 

Remplacez l'entrée vide / inexistante par Hello .

$
<<<<<<<

Remplacez l'extrémité de la chaîne de travail par <<<<<<<

Mine
=======

Remplacez Minepar =======. Puisque Minen'apparaît nulle part dans la chaîne de travail, cela ne fait rien.

Theirs
>>>>>>>

Remplacer Theirs par >>>>>>>. Même affaire qu'avec Mine; Theirsn'apparaît pas, donc le remplacement ne fait rien.

<+
Conflict

Remplacer une séquence de < par Conflict. Nous avons ajouté <<<<<<<à la fin de la chaîne lors du premier remplacement, ainsi la chaîne de travail devient Hello Conflict, qui est implicitement sortie à la fin du programme.

Explication des programmes Mine / Theirs

Une fois le conflit résolu, le code ressemblera à ceci:


Hello 
$
Mine
<+
Conflict

Hello 

Comme avant, en commençant par la chaîne Hello.

$
Mine

Maintenant, au lieu d'ajouter <<<<<<<àHello  , nous ajoutons Mine.

<+
Conflict

Ensuite, nous remplaçons une séquence de < avec Conflict. Mais il n'y a pas de <s dans la chaîne, donc rien ne se passe.

La chaîne de travail,, Hello Mineest implicitement sortie. Le programme "Theirs" fonctionne de la même manière.


1

HUILE , 88 80 77 octets

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

4 2imprime la ligne 2 ( Hello), 10teste si la ligne 0 ( 4) est identique à la ligne 16 (celle qui contient un 4lorsque le conflit existe) et passe à la ligne 16 ou à la ligne 8 selon le résultat. S'il existait, 4 4imprime la ligne 4 ( Conflict). Si ce n'est pas le cas, 4 11imprime soit Mineou Theirs, selon ce qui a été fusionné, puis 3quitte.


1

Java 145 octets

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

Java n'a pas de chaînes multilignes, donc une supercherie de commentaires était nécessaire


Quelle est la raison du supplément *sur la troisième ligne? Je pense que */s+="Mine";/*cela fonctionnerait.
CAD97

restes de quand les lignes de commentaires étaient des lignes séparées pour éviter les lignes identiques (refactorisées avant de poster et oublié cela), merci pour cet indice et 3 octets
masterX244

1

Bash, 76 octets

Golfé

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

Comment ça marche

Utilise ici doc , pour alimenter le texte source en sed .

Sed ajoutera la première ligne lue avec "Hello", remplacera la <<<<<<<chaîne par "Conflict" puis quittera (q ).

Essayez-le en ligne!


1

ES6 (Javascript), 83, 82 octets

Golfé

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

Essayez-le

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 octets

Soumission de fonction.

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

Approche inspirée de la solution Java de masterX244 .

TIOs


Joli! Utilisation intelligente des commentaires sur plusieurs lignes.
Erno

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.