Ducttape the Ducttape

11

Votre patron a découvert qu'un bon nombre de ses employés (vous y compris) aiment voler du code aux autres. Il vous a ordonné de lui écrire un programme qu'il peut utiliser pour trouver des gens qui volent du code à d'autres.

Tâche:

Écrivez un programme / une fonction qui détecte si quelqu'un a copié (une partie de) son code ailleurs.

Le programme obtiendra tous les programmes existants et le programme qu'il devrait tester à partir de deux entrées distinctes . Edit: Comme il n'y a pas de réponses jusqu'à présent, vous pouvez utiliser des expressions régulières!

Production

  • Le programme devrait ensuite sortir tous les morceaux de code volés, séparés par un espace ou une nouvelle ligne. (Il peut avoir un espace ou une nouvelle ligne à la fin.)
  • Un morceau de code est considéré comme volé / copié s'il se compose de 10 octets successifs ou plus . (Désolé, fans de Java!)
  • Vous devez sortir autant que possible, mais s'il y en a qui se chevauchent, vous pouvez ignorer l'un d'eux ou les sortir tous les deux.

Torsion:

Comme mentionné précédemment, vous aimez également le codage du ruban adhésif. Cela signifie que tout dans votre code sera copié-collé à partir d'un site d'échange de pile! Vous pouvez copier ce que vous voulez (non limité au code dans des blocs de code) et autant que vous le souhaitez. (Mais au moins 10 octets) (Même règle que ci-dessus concernant ce qui est considéré comme volé / copié.) (Veuillez noter que toutes les réponses qui ont été postées après cette question ne peuvent pas être utilisées.) Veuillez fournir des liens vers où vous avez obtenu votre code de.

Exemples:

Entrée:
x = document.getElementById("ninja'd"); (La première entrée)
y = document.getElementById("id");(La deuxième entrée)

Production:

 = document.getElementById("

Entrée:
foo (La première entrée)
foo+bar(La deuxième entrée)

Sortie:
rien.

Entrée:
public static void main(String[] args) (La première entrée)
public static void main(String[] args)(La deuxième entrée)

Production:

 main(String[] args)

Entrée:
for(var i=0; i<x.length; i++){} (La première entrée)
for(var i=0; i<oops.length; i++){break;}(La deuxième entrée)

Production:

for(var i=0; i<
.length; i++){

ou

for(var i=0; i< .length; i++){
Stefnotch
la source
1
Il manque des règles pour quelles chaînes peuvent être copiées et comment (pour le code).
feersum
4
Les chaînes copiées doivent-elles provenir de blocs de code ou de parties d'une réponse SE? S'il provient d'un bloc de code, doit-il utiliser le bloc entier, ou une sous-chaîne peut-elle être utilisée? Les chaînes peuvent-elles provenir du texte formaté ou de la source Markdown? Peut-on utiliser des blocs de code plus récents que cette question? Les anciennes révisions d'une question peuvent-elles être utilisées?
feersum
3
Vous dites que les sous-chaînes doivent avoir une longueur de 10 ou plus. Puis-je placer une sous-chaîne à l'intérieur d'une autre sous-chaîne? (Les sous-chaînes doivent-elles être continues?)
Bleu
1
@sysreq J'ai décidé d'autoriser les expressions régulières!
Stefnotch
5
Réponse simple: utilisez
Unary

Réponses:

9

Python 2, 224 octets

from difflib import SequenceMatcher
def similar(a, b):
    return SequenceMatcher(None, a, b).get_matching_blocks()
a=raw_input()
b=raw_input()
for start, _, size in similar(a, b):
 if(size > 9):
  print a[start:start+size]

Copié de cette réponse :

from difflib import SequenceMatcher
def similar(a, b):
    return SequenceMatcher(None, a, b).

get_matching_blocks()est copié de cette réponse

a=raw_input()
b=raw_input()

est copié à partir de cette question

for start, _, size inest copié à partir de cette réponse et la deuxième occurrence de similar(a, b)est copiée du même endroit que la première.

if(size > 9)est copié à partir de cette question .

:
    print

est copié à partir de cette question

a[start:est copié de cette réponse .

et enfin, start+size]est copié de cette quête

Enfin répondu après un an et demi ...

pppery
la source
+1 Cependant, stackoverflow.com/questions/37386311/… a été publié après la publication de ce défi. J'ai décidé de supprimer cette restriction, donc votre réponse est bonne. :)
Stefnotch
1
@Stenfoch Vous n'en avez pas besoin; une réponse antérieure contient la même phrase
pppery
2
Une chose que j'ai apprise sur les défis du codage en ruban adhésif : il est difficile de savoir où vous avez obtenu tout votre code.
pppery
Wow, le score de ce post a augmenté très rapidement ...
pppery