Aceasta este comanda sim_text care poate fi rulată în furnizorul de găzduire gratuit OnWorks folosind una dintre multiplele noastre stații de lucru online gratuite, cum ar fi Ubuntu Online, Fedora Online, emulator online Windows sau emulator online MAC OS
PROGRAM:
NUME
sim - găsiți asemănări în fișierele C, Java, Pascal, Modula-2, Lisp, Miranda sau text
REZUMAT
sim_c [ -[defFiMnpPRsSTv] -r N -t N -w N -o F ] fișier ... [ [ / | ] fișier ... ]
sim_c ...
sim_java ...
sim_pasc ...
sim_m2 ...
sim_lisp ...
sim_mira ...
sim_text ...
DESCRIERE
Sim_c citește fișierele C fişier ... și caută segmente de text care sunt similare; Două
Segmentele de text ale programului sunt similare dacă diferă doar în aspect, comentariu, identificatori,
și conținutul numerelor, șirurilor și caracterelor. Dacă există curse de lungime suficientă
găsite, sunt raportate la ieșirea standard; numărul de jetoane semnificative în cursă
este dat între paranteze drepte.
Sim_java face același lucru pentru Java, sim_pasc pentru Pascal, sim_m2 pentru Modula-2, sim_mira pentru
Miranda și sim_lisp pentru Lisp. Sim_text lucrează pe text arbitrar și este ocazional
util pentru scripturile shell.
Programul poate fi folosit pentru a găsi bucăți de cod copiate în care se presupune că nu au legătură
programe (cu -s or -S), sau pentru găsirea de cod duplicat accidental în proiecte mai mari
(cu -f or -F).
Dacă un separator / or | este prezent în lista fișierelor de intrare, fișierele sunt împărțite în a
grup de fișiere „noi” (înainte de / or |) și un grup de fișiere „vechi”; dacă nu există / or
|, toate fișierele sunt „noi”. Fișierele vechi nu sunt niciodată comparate între ele. Vezi și
descrierea -s si -S opțiunile de mai jos.
Deoarece testerul de similaritate are nevoie de nume de fișiere pentru a identifica asemănările, nu poate citi
de la intrare standard.
Există următoarele opțiuni:
-d Ieșirea este în a dif(1) în loc de formatul implicit cu 2 coloane.
-e Fiecare fișier este comparat cu fiecare fișier izolat; aceasta va găsi toate asemănările
între toate textele implicate, indiferent de textul repetitiv (vezi `Calcul
Procente' mai jos).
-f Execuțiile sunt limitate la segmente cu paranteze de echilibrare, pentru a izola potențialul
corpuri de rutină (nu în sim_text).
-F Numele rutinelor din apeluri trebuie să se potrivească exact (nu în sim_text).
-i Numele fișierelor de comparat sunt citite din intrarea standard, inclusiv a
posibil separator / or |; numele fișierelor trebuie să fie unul la o linie. Această opțiune
permite specificarea unui număr foarte mare de nume de fișiere; diferă de @
facilitate oferită de unii compilatori prin faptul că se ocupă numai de numele fișierelor și o face
nu recunosc argumentele opțiunii.
-M Informațiile despre utilizarea memoriei sunt afișate pe ieșirea de eroare standard.
-n Asemănările găsite sunt rezumate prin numele fișierului, poziție și dimensiune, mai degrabă decât
afisat integral.
-o F Ieșirea este scrisă în fișierul numit F.
-p Rezultatul este dat în procente de similaritate; vezi „Calculul procentelor” de mai jos;
implică -e si -s.
-P As -p dar se arată doar contribuitorul principal; implică -e si -s.
-r N Lungimea minimă de rulare este setată la N unități; implicit este 24 de jetoane, cu excepția în
sim_text, unde este de 8 cuvinte.
-R Directoarele din lista de intrare sunt introduse recursiv și toate fișierele pe care le conțin
sunt implicați în comparație.
-s Conținutul unui fișier nu este comparat cu el însuși (-s pentru „not self”).
-S Conținutul fișierelor noi este comparat numai cu fișierele vechi - nu între
înșiși.
-t N În combinație cu -p or -P opțiuni, stabilește pragul (în procente) de mai jos
care asemănări nu vor fi raportate; implicit este 1, cu excepția în sim_text,
unde este 20.
-T Se produce o formă mai concisă și uniformă de ieșire, care poate fi mai potrivită pentru
post procesare.
-v Imprimă numărul versiunii și data compilației pe ieșirea standard, apoi se oprește.
-w N Lățimea paginii utilizată este setată la N coloane; implicit este 80.
-- (O opțiune secretă, care tipărește intrarea așa cum o vede verificatorul de similaritate și
apoi se oprește.)
-p opțiunea rezultă în linii ale formularului
F este format pentru x % din materialul G
ceea ce înseamnă că x % din textul lui F poate fi găsit și în G. Rețineți că această relație nu este
simetric; de fapt, este foarte posibil ca un fișier să conțină 100 % text din
alt fișier, în timp ce celălalt fișier constă doar pentru 1 % din textul primului fișier, dacă
lungimile lor diferă suficient. The -P (P majusculă) opțiunea arată principalul contributor pentru
numai fiecare fișier. Aceasta simplifică identificarea unui set de fișiere A[1] ... A[n], unde
este prezentă și concatenarea acestor fișiere. Un prag poate fi setat folosind -t
opțiune; rețineți că granularitatea textului recunoscut este încă guvernată de -r
opțiunea sau implicită.
-r opțiunea controlează numărul de „unități” care constituie o rulare. Pentru programele care
comparați codul limbajului de programare, o unitate este un simbol lexical în limbajul relevant;
comentariul și materialul standard de preambul (includerea fișierelor etc.) sunt ignorate și toate șirurile
sunt considerate la fel. Pentru sim_text o unitate este un „cuvânt” care este definit ca orice secvență
dintr-una sau mai multe litere, cifre sau caractere peste 127 (177 octali), (pentru a se potrivi
litere precum ä, ø etc.).
Sim_text acceptă text spațiat ca text normal.
-s si -S opțiunile controlează ce fișiere să compare. Fișierele de intrare sunt împărțite în două
grupuri, noi și vechi. În absența acestor opțiuni de control, programele compară
fișiere astfel (pentru 4 fișiere noi și 6 vechi):
nou / vechi <- primul fișier
1 2 3 4 5 6 7 8 9 10
|------------/------------
n 1 | c/
e 2 | cc /
w 3 | ccc /
4 | cccc /
al doilea / / / / / / / / / / / / /
fisier -> 5 | cccc /
o 6 | cccc /
l 7 | cccc /
d 8 | cccc /
9 | cccc /
10 | cccc /
unde cs reprezintă comparații de fișiere și / demarcația dintre nou și vechi
fișiere.
Utilizarea -s opțiunea reduce aceasta la:
nou / vechi <- primul fișier
1 2 3 4 5 6 7 8 9 10
|------------/------------
n 1 | /
e 2 | c/
w 3 | cc /
4 | ccc /
al doilea / / / / / / / / / / / / /
fisier -> 5 | cccc /
o 6 | cccc /
l 7 | cccc /
d 8 | cccc /
9 | cccc /
10 | cccc /
-S opțiunea reduce aceasta în continuare la:
nou / vechi <- primul fișier
1 2 3 4 5 6 7 8 9 10
|------------/------------
n 1 | /
e 2 | /
w 3 | /
4 | /
al doilea / / / / / / / / / / / / /
fisier -> 5 | cccc /
o 6 | cccc /
l 7 | cccc /
d 8 | cccc /
9 | cccc /
10 | cccc /
Programele pot gestiona nume de fișiere UNICODE sub Windows. Acest lucru este relevant doar sub
-R opțiunea, deoarece nu există nicio modalitate de a da nume de fișiere UNICODE din linia de comandă.
LIMITAREA
Intrarea repetitivă este strigarea verificării similarității. Dacă avem un fișier care conține 4
copii ale textului identic,
A1 A2 A3 A4
unde numerele servesc doar pentru a distinge copiile identice, există 8 identități:
A1=A2, A1=A3, A1=A4, A2=A3, A2=A4, A3=A4, A1A2=A3A4 și A1A2A3=A2A3A4. Dintre acestea, doar 3
sunt semnificative: A1=A2, A2=A3 și A3=A4. Și pentru un tabel cu 20 de rânduri identice cu fiecare
altele, deloc neobișnuite într-un program, există 715 identități, dintre care cel mult 19 sunt
plin de înțeles. Raportarea tuturor celor 715 este în mod clar inacceptabilă.
Pentru a remedia acest lucru, găsirea identităților se efectuează după cum urmează: Pentru fiecare poziție din
text, se găsește cel mai mare segment, din care apare o copie care nu se suprapune în text
urmând-o. Segmentul respectiv și copia sa sunt raportate și scanarea reia la poziție
imediat după segment. Pentru exemplul de mai sus, rezultă identitățile A1A2=A3A4
și A3=A4, ceea ce este destul de satisfăcător, și pt N segmente identice aproximativ 2 log N
sunt date mesaje.
Acest lucru funcționează bine și atunci când cele patru segmente identice sunt în fișiere diferite:
Fișier 1: A1
Fișier 2: A2
Fișier 3: A3
Fișier 4: A4
Acum segmentele combinate precum A1A2 nu apar, iar algoritmul găsește rulările A1=A2,
A2=A3 și A3=A4, pentru un total de N-1 rulează, toate informative.
De calculat Procente
Abordarea de mai sus nu este potrivită pentru obținerea procentului din conținutul unui fișier care
poate fi găsit într-un alt fișier. Acest lucru necesită compararea separată a fiecărei perechi de fișiere
reprezentat prin ac în matricele de mai sus; asta este ceea ce -e opțiunea face. Sub -e
opțiunea un segment File1:A1, recunoscut în File2, va fi din nou recunoscut în File3 și
Fișier4. În exemplul de mai sus, produce rulările
Fișier1:A1=Fișier2:A2
Fișier1:A1=Fișier3:A3
Fișier1:A1=Fișier4:A4
Fișier2:A2=Fișier3:A3
Fișier2:A2=Fișier4:A4
Fișier3:A3=Fișier4:A4
pentru un total de ½N(N-1) se execută.
TIMP AND SPACE CERINȚE
S-a avut grijă să păstrăm cerințele de timp ale tuturor proceselor interne (aproape)
liniar în lungimile fișierelor de intrare, prin utilizarea diferitelor tabele. Dacă, totuși, există
memorie insuficientă pentru tabele, acestea sunt aruncate în ordinea lipsei de importanță, sub care
condiționează ca algoritmii să revină la natura lor pătratică.
Cerințele de timp sunt pătratice în numărul de fișiere. Aceasta înseamnă că, de exemplu,
un fișier de 64 MB procesează mult mai rapid decât 8000 de fișiere de 8 kB.
Programul necesită 6 octeți de memorie pentru fiecare token din intrare; 2 octeți pe linie nouă
(nu când faci procente); și aproximativ 76 de octeți pentru fiecare rulare găsită.
EXEMPLE
Apelul
sim_c *.c
evidențiază codul duplicat în director. (Este util să eliminați fișierele generate
mai întâi.) Un apel
sim_c -f -F *.c
le pot identifica mai departe.
Un apel
sim_text -e -p -s nou/* / vechi/*
compară fiecare fișier în new/* cu fiecare fișier în new/* și old/*, și dacă vreo pereche are mai mult
20% în comun, acest fapt este raportat. De obicei, o asemănare de 30% sau mai mult este semnificativă;
mai mic de 20% este probabil o coincidență; iar între e îndoielnic.
Un apel
sim_text -e -n -s -r100 nou/* "|" vechi/*
compară aceleași fișiere și raportează segmente mari comune. (Cel | poate fi folosit ca a
separator în loc de / pe sistemele în care / deoarece un parametru de linie de comandă este alterat de
interpretul de comenzi.)
Ambele abordări sunt bune pentru detectarea plagiatului.
Utilizați sim_text online folosind serviciile onworks.net