Klebeband das Klebeband

11

Ihr Chef hat herausgefunden, dass eine ganze Reihe seiner Mitarbeiter (einschließlich Sie) gerne Code von anderen stehlen. Er hat dir befohlen, ihm ein Programm zu schreiben, mit dem er Leute finden kann, die anderen Code stehlen.

Aufgabe:

Schreiben Sie ein Programm / eine Funktion, die erkennt, ob jemand (einen Teil) seines Codes von einem anderen Ort kopiert hat.

Das Programm erhält alle vorhandenen Programme und das Programm, das es testen soll, von zwei separaten Eingängen . Bearbeiten: Da es bisher keine Antworten gibt, können Sie reguläre Ausdrücke verwenden!

Ausgabe

  • Das Programm sollte dann alle gestohlenen Codeteile ausgeben , die entweder durch ein Leerzeichen oder eine neue Zeile getrennt sind. (Möglicherweise steht am Ende ein Leerzeichen oder eine neue Zeile.)
  • Ein Code gilt als gestohlen / kopiert, wenn er aus 10 oder mehr aufeinanderfolgenden Bytes besteht. (Sorry, Java-Fans!)
  • Sie müssen so viel wie möglich ausgeben, aber wenn es überlappende gibt, können Sie eine davon ignorieren oder beide ausgeben.

Twist:

Wie bereits erwähnt, lieben Sie auch die Klebebandcodierung. Das heißt, alles in Ihrem Code wird von einer Stack-Exchange-Site kopiert! Sie können kopieren, was Sie wollen (nicht nur Code in Codeblöcken) und so viel Sie wollen. (Aber mindestens 10 Bytes) (Dieselbe Regel wie oben, was als gestohlen / kopiert gilt.) (Bitte beachten Sie, dass Antworten, die nach dieser Frage veröffentlicht wurden, möglicherweise nicht verwendet werden.) Bitte geben Sie Links zu dem Ort an, an dem Sie Ihre erhalten haben Code von.

Beispiele:

Eingabe:
x = document.getElementById("ninja'd"); (Die erste Eingabe)
y = document.getElementById("id");(Die zweite Eingabe)

Ausgabe:

 = document.getElementById("

Eingabe:
foo (Die erste Eingabe)
foo+bar(Die zweite Eingabe)

Ausgabe:
Nichts.

Eingabe:
public static void main(String[] args) (Die erste Eingabe)
public static void main(String[] args)(Die zweite Eingabe)

Ausgabe:

 main(String[] args)

Eingabe:
for(var i=0; i<x.length; i++){} (Die erste Eingabe)
for(var i=0; i<oops.length; i++){break;}(Die zweite Eingabe)

Ausgabe:

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

oder

for(var i=0; i< .length; i++){
Stefnotch
quelle
1
Es fehlen Regeln, für welche Zeichenfolgen wie kopiert werden kann (für den Code).
Feersum
4
Müssen die kopierten Zeichenfolgen aus Codeblöcken oder Teilen einer SE-Antwort stammen? Wenn es aus einem Codeblock stammt, muss es den gesamten Block verwenden, oder kann ein Teilstring verwendet werden? Können die Zeichenfolgen entweder aus dem formatierten Text oder aus der Markdown-Quelle stammen? Können Codeblöcke verwendet werden, die neuer als diese Frage sind? Können alte Revisionen einer Frage verwendet werden?
Feersum
3
Sie sagen, die Teilzeichenfolgen müssen 10 oder mehr lang sein. Kann ich einen Teilstring in einen anderen Teilstring einfügen? (Müssen die Teilzeichenfolgen durchgehend sein?)
Blau
1
@sysreq Ich habe beschlossen, reguläre Ausdrücke zuzulassen!
Stefnotch
5
Einfache Antwort: Verwenden Sie
Unary

Antworten:

9

Python 2, 224 Bytes

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]

Von dieser Antwort kopiert :

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

get_matching_blocks()wird aus dieser Antwort kopiert

a=raw_input()
b=raw_input()

wird von dieser Frage kopiert

for start, _, size inwird aus dieser Antwort kopiert und das zweite Vorkommen von similar(a, b)wird von derselben Stelle wie das erste kopiert.

if(size > 9)wird von dieser Frage kopiert .

:
    print

wird von dieser Frage kopiert

a[start:wird aus dieser Antwort kopiert .

und schließlich start+size]wird von dieser Quest kopiert

Endlich beantwortet nach anderthalb Jahren ...

pppery
quelle
+1 Stackoverflow.com/questions/37386311/… wurde jedoch veröffentlicht, nachdem diese Herausforderung veröffentlicht wurde. Ich habe beschlossen, diese Einschränkung aufzuheben, damit Ihre Antwort in Ordnung ist. :)
Stefnotch
1
@Stenfoch Du musst nicht; Eine frühere Antwort enthält den gleichen Satz
pppery
2
Eine Sache, die ich über die Herausforderungen beim Codieren von Klebebändern gelernt habe : Es ist schwierig zu verfolgen, woher Sie Ihren gesamten Code haben.
pppery
Wow, die Punktzahl dieses Beitrags ist sehr schnell gestiegen ...
pppery