Ducttape Ducttape

11

Twój szef odkrył, że spora grupa jego pracowników (w tym ty) lubi kraść kod od innych. Nakazał ci napisać mu program, którego może użyć do znalezienia ludzi, którzy kradną kod innym osobom.

Zadanie:

Napisz program / funkcję, która wykrywa, czy ktoś skopiował (część) swojego kodu z innego miejsca.

Program otrzyma wszystkie istniejące programy i program, który powinien przetestować z dwóch osobnych wejść . Edycja: Ponieważ do tej pory nie ma odpowiedzi, możesz używać wyrażeń regularnych!

Wynik

  • Następnie program powinien wypisać wszystkie skradzione fragmenty kodu, oddzielone spacją lub znakiem nowej linii. (Na końcu może być spacja lub nowa linia).
  • Fragment kodu uważa się za skradziony / skopiowany, jeśli składa się z 10 lub więcej kolejnych bajtów. (Przepraszamy, fani Java!)
  • Musisz wypisać jak najwięcej, ale jeśli nakładają się na siebie, możesz zignorować jedno z nich lub wypisać oba.

Skręcać:

Jak wspomniano wcześniej, lubisz także kodowanie taśm klejących. Oznacza to, że wszystko w twoim kodzie zostanie skopiowane z witryny wymiany stosów! Możesz skopiować, co chcesz (nie tylko kod w blokach kodu) i tyle, ile chcesz. (Ale co najmniej 10 bajtów) (Ta sama reguła, co powyżej dotycząca tego, co uważa się za skradzione / skopiowane.) (Należy pamiętać, że wszelkie odpowiedzi, które zostały opublikowane po tym pytaniu, nie mogą być użyte). Podaj linki do miejsca, w którym otrzymałeś kod z.

Przykłady:

Wejście:
x = document.getElementById("ninja'd"); (pierwsze wejście)
y = document.getElementById("id");(drugie wejście)

Wynik:

 = document.getElementById("

Wejście:
foo (pierwsze wejście)
foo+bar(drugie wejście)

Wyjście:
Nic.

Wejście:
public static void main(String[] args) (pierwsze wejście)
public static void main(String[] args)(drugie wejście)

Wynik:

 main(String[] args)

Wejście:
for(var i=0; i<x.length; i++){} (pierwsze wejście)
for(var i=0; i<oops.length; i++){break;}(drugie wejście)

Wynik:

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

lub

for(var i=0; i< .length; i++){
Stefnotch
źródło
1
Brakuje reguł, dla których można skopiować ciągi i jak (dla kodu).
feersum
4
Czy skopiowane ciągi muszą pochodzić z bloków kodu lub z jakiejkolwiek części odpowiedzi SE? Jeśli pochodzi z bloku kodu, czy musi on używać całego bloku, czy może można użyć podłańcucha? Czy ciągi mogą pochodzić ze sformatowanego tekstu lub ze źródła Markdown? Czy można stosować bloki kodu nowsze niż to pytanie? Czy można zastosować stare wersje pytania?
feersum
3
Mówisz, że podciągi muszą mieć długość 10 lub więcej. Czy mogę umieścić podciąg w innym podciągu? (Czy substrings muszą być ciągłe?)
Niebieski,
1
@sysreq Postanowiłem zezwolić na wyrażenia regularne!
Stefnotch
5
Łatwa odpowiedź: użyj Unary
lirtosiast

Odpowiedzi:

9

Python 2, 224 bajty

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]

Skopiowano z tej odpowiedzi :

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

get_matching_blocks()jest kopiowany z tej odpowiedzi

a=raw_input()
b=raw_input()

jest kopiowane z tego pytania

for start, _, size injest kopiowany z tej odpowiedzi, a drugie wystąpienie similar(a, b)jest kopiowane z tego samego miejsca co pierwsze.

if(size > 9)jest kopiowane z tego pytania .

:
    print

jest kopiowane z tego pytania

a[start:jest kopiowany z tej odpowiedzi .

i na koniec start+size]jest kopiowany z tego questipn

Ostatecznie odpowiedział po półtora roku ...

pppery
źródło
+1 Chociaż stackoverflow.com/questions/37386311/... został opublikowany po opublikowaniu tego wyzwania. Postanowiłem usunąć to ograniczenie, więc twoja odpowiedź jest w porządku. :)
Stefnotch,
1
@Stenfoch Nie musisz; wcześniejsza odpowiedź zawiera tę samą frazę
pppery
2
Jednej rzeczy dowiedziałem się o wyzwaniach związanych z kodowaniem taśm klejących : Trudno jest śledzić, skąd masz cały kod.
pppery
Wow, wynik tego postu rośnie bardzo szybko ...
pppery