นี่คือคำสั่ง sim_lisp ที่สามารถเรียกใช้ในผู้ให้บริการโฮสต์ฟรีของ OnWorks โดยใช้หนึ่งในเวิร์กสเตชันออนไลน์ฟรีของเรา เช่น Ubuntu Online, Fedora Online, โปรแกรมจำลองออนไลน์ของ Windows หรือโปรแกรมจำลองออนไลน์ของ MAC OS
โครงการ:
ชื่อ
sim - ค้นหาความคล้ายคลึงกันในไฟล์ C, Java, Pascal, Modula-2, Lisp, Miranda หรือข้อความ
เรื่องย่อ
ซิม_ซี [ -[defFiMnpPRsSTv] -r N -t N -w N -o F ] ไฟล์ ... [ [ / | ] ไฟล์ ... ]
ซิม_ซี ...
sim_java ...
sim_pasc ...
sim_m2 ...
sim_lisp ...
ซิม_มิร่า ...
ซิม_ข้อความ ...
DESCRIPTION
ซิม_ซี อ่านไฟล์ C ไฟล์ ... และค้นหาส่วนของข้อความที่คล้ายคลึงกัน สอง
ส่วนของข้อความโปรแกรมจะคล้ายกันหากต่างกันเฉพาะเลย์เอาต์ ข้อคิดเห็น ตัวระบุ
และเนื้อหาของตัวเลข สตริง และอักขระ หากการวิ่งใด ๆ ที่มีความยาวเพียงพอคือ
พบว่ามีการรายงานในเอาต์พุตมาตรฐาน จำนวนของโทเค็นที่สำคัญในการรัน
กำหนดไว้ระหว่างวงเล็บเหลี่ยม
Sim_java ทำเช่นเดียวกันสำหรับ Java sim_pasc สำหรับปาสกาล sim_m2 สำหรับโมดูลา-2 ซิม_มิร่า เป็นเวลา
มิแรนด้าและ sim_lisp สำหรับเสียงกระเพื่อม ซิม_ข้อความ ทำงานบนข้อความที่กำหนดเองและเป็นบางครั้ง
มีประโยชน์ในเชลล์สคริปต์
สามารถใช้โปรแกรมเพื่อค้นหาโค้ดที่คัดลอกโดยอ้างว่าไม่เกี่ยวข้อง
โปรแกรม (ด้วย -s or -S) หรือเพื่อค้นหาโค้ดที่ซ้ำกันโดยไม่ได้ตั้งใจในโครงการขนาดใหญ่
(กับ -f or -F).
ถ้าตัวคั่น / or | มีอยู่ในรายการไฟล์อินพุต ไฟล์แบ่งออกเป็น a
กลุ่มของไฟล์ "ใหม่" (ก่อน / or |) และกลุ่มของไฟล์ "เก่า" ถ้าไม่มี / or
|, ไฟล์ทั้งหมดเป็น "ใหม่" ไฟล์เก่าไม่เคยเปรียบเทียบกัน ดูเพิ่มเติมที่
คำอธิบายของ -s และ -S ตัวเลือกด้านล่าง
เนื่องจากตัวทดสอบความคล้ายคลึงต้องการชื่อไฟล์เพื่อระบุความคล้ายคลึง จึงไม่สามารถอ่านได้
จากอินพุตมาตรฐาน
มีตัวเลือกดังต่อไปนี้:
-d เอาต์พุตอยู่ใน a diff(1)-like format แทนที่จะเป็นรูปแบบ 2 คอลัมน์เริ่มต้น
-e แต่ละไฟล์จะถูกเปรียบเทียบกับแต่ละไฟล์โดยแยกกัน นี้จะพบความคล้ายคลึงกันทั้งหมด
ระหว่างข้อความทั้งหมดที่เกี่ยวข้อง โดยไม่คำนึงถึงข้อความซ้ำ (ดู `การคำนวณ
เปอร์เซ็นต์' ด้านล่าง)
-f การรันถูกจำกัดไว้ในส่วนที่มีวงเล็บสมดุล เพื่อแยกศักยภาพ
ร่างกายประจำ (ไม่ใช่ใน ซิม_ข้อความ).
-F ชื่อของรูทีนในการโทรจะต้องตรงกันทุกประการ (ไม่ใช่ใน ซิม_ข้อความ).
-i ชื่อของไฟล์ที่จะเปรียบเทียบจะอ่านจากอินพุตมาตรฐาน รวมถึง a
ตัวคั่นที่เป็นไปได้ / or |; ชื่อไฟล์จะต้องเป็นหนึ่งต่อหนึ่งบรรทัด ตัวเลือกนี้
อนุญาตให้ระบุชื่อไฟล์จำนวนมาก มันแตกต่างจาก@
สิ่งอำนวยความสะดวกที่คอมไพเลอร์บางตัวจัดเตรียมไว้เพื่อจัดการชื่อไฟล์เท่านั้นและไม่ได้
ไม่รู้จักอาร์กิวเมนต์ตัวเลือก
-M ข้อมูลการใช้หน่วยความจำจะแสดงบนเอาต์พุตข้อผิดพลาดมาตรฐาน
-n พบความคล้ายคลึงกันโดยสรุปตามชื่อไฟล์ ตำแหน่งและขนาด แทนที่จะเป็น
ได้แสดงไว้อย่างครบถ้วน
-o F เอาต์พุตถูกเขียนลงในไฟล์ชื่อ F.
-p ผลลัพธ์จะได้รับเป็นเปอร์เซ็นต์ที่คล้ายคลึงกัน ดู `การคำนวณเปอร์เซ็นต์' ด้านล่าง;
หมายถึง -e และ -s.
-P As -p แต่จะแสดงเฉพาะผู้สนับสนุนหลักเท่านั้น หมายถึง -e และ -s.
-r N ตั้งค่าความยาวขั้นต่ำของการวิ่งเป็น N หน่วย; ค่าเริ่มต้นคือ 24 โทเค็น ยกเว้นใน
ซิม_ข้อความโดยที่มันคือ 8 คำ
-R ไดเร็กทอรีในรายการอินพุตจะถูกป้อนซ้ำ และไฟล์ทั้งหมดมี
มีส่วนในการเปรียบเทียบ
-s เนื้อหาของไฟล์ไม่ได้ถูกเปรียบเทียบกับตัวเอง (-s สำหรับ "ไม่ใช่ตัวเอง")
-S เนื้อหาของไฟล์ใหม่จะถูกเปรียบเทียบกับไฟล์เก่าเท่านั้น - ไม่อยู่ระหว่าง
ตัวเอง
-t N ร่วมกับ -p or -P ตัวเลือกตั้งค่าเกณฑ์ (เป็นเปอร์เซ็นต์) ด้านล่าง
ความคล้ายคลึงกันใดจะไม่ถูกรายงาน ค่าเริ่มต้นคือ 1 ยกเว้นใน ซิม_ข้อความ,
มันอยู่ที่ไหน 20
-T มีการผลิตรูปแบบที่กระชับและสม่ำเสมอมากขึ้น ซึ่งอาจเหมาะสำหรับ
ภายหลังการประมวลผล
-v พิมพ์หมายเลขเวอร์ชันและวันที่รวบรวมบนเอาต์พุตมาตรฐาน จากนั้นหยุด
-w N กำหนดความกว้างของหน้าที่ใช้เป็น N คอลัมน์; ค่าเริ่มต้นคือ 80
-- (ตัวเลือกลับซึ่งพิมพ์อินพุตตามที่ตัวตรวจสอบความคล้ายคลึงกันเห็นและ
แล้วหยุด)
เทศกาล -p ตัวเลือกผลลัพธ์ในบรรทัดของแบบฟอร์ม
F ประกอบด้วย x % ของวัสดุ G
หมายความว่า x % ของข้อความ F สามารถพบได้ในภาษา G โปรดทราบว่าความสัมพันธ์นี้ไม่ใช่
สมมาตร; เป็นไปได้ทีเดียวที่ไฟล์หนึ่งไฟล์จะประกอบด้วยข้อความจาก . 100%
อีกไฟล์หนึ่ง ในขณะที่อีกไฟล์หนึ่งประกอบด้วยข้อความเพียง 1% ของไฟล์แรก if
ความยาวต่างกันพอสมควร NS -P (ตัวพิมพ์ใหญ่ P) แสดงผู้สนับสนุนหลักสำหรับ
แต่ละไฟล์เท่านั้น สิ่งนี้ช่วยลดความยุ่งยากในการระบุชุดของไฟล์ A[1] ... A[n] โดยที่
มีการต่อไฟล์เหล่านี้ด้วย เกณฑ์สามารถกำหนดได้โดยใช้คำสั่ง -t
ตัวเลือก; โปรดทราบว่าความละเอียดของข้อความที่รู้จักยังคงอยู่ภายใต้ -r
ตัวเลือกหรือค่าเริ่มต้น
เทศกาล -r ตัวเลือกควบคุมจำนวน "หน่วย" ที่ประกอบเป็นการวิ่ง สำหรับโปรแกรมที่
เปรียบเทียบรหัสภาษาโปรแกรม หน่วยเป็นโทเค็นคำศัพท์ในภาษาที่เกี่ยวข้อง
ความคิดเห็นและเนื้อหาคำนำมาตรฐาน (การรวมไฟล์ ฯลฯ ) จะถูกละเว้นและสตริงทั้งหมด
ก็ถือว่าเหมือนกัน สำหรับ ซิม_ข้อความ หน่วยคือ "คำ" ซึ่งถูกกำหนดเป็นลำดับใด ๆ
ตัวอักษร ตัวเลข หรืออักขระตั้งแต่ 127 ตัวขึ้นไป (177 ฐานแปด) (เพื่อรองรับ
ตัวอักษรเช่น ä, ø ฯลฯ)
ซิม_ข้อความ ยอมรับ spacedtext เป็นข้อความปกติ
เทศกาล -s และ -S ตัวเลือกควบคุมไฟล์ที่จะเปรียบเทียบ ไฟล์อินพุตแบ่งออกเป็นสองไฟล์
กลุ่ม ทั้งใหม่และเก่า ในกรณีที่ไม่มีตัวเลือกการควบคุมเหล่านี้ โปรแกรมจะเปรียบเทียบ
ไฟล์ดังกล่าว (สำหรับ 4 ไฟล์ใหม่และ 6 ไฟล์เก่า):
ใหม่ / เก่า <- ไฟล์แรก
1 2 3 4 / 5 6 7 8 9 10
|------------/-------------
n 1 | ค /
อี 2 | ซีซี /
w 3 | ซีซีซี /
4 | cccc /
ที่สอง / / / / / / / / / / / / /
ไฟล์ -> 5 | cccc /
o 6 | cccc /
l 7 | cccc /
d 8 | cccc /
9 | cccc /
10 | cccc /
โดยที่ cs แสดงถึงการเปรียบเทียบไฟล์และ / การแบ่งเขตระหว่างใหม่และเก่า
ไฟล์
การใช้ -s ตัวเลือกลดสิ่งนี้เป็น:
ใหม่ / เก่า <- ไฟล์แรก
1 2 3 4 / 5 6 7 8 9 10
|------------/-------------
น 1 | /
อี 2 | ค /
w 3 | ซีซี /
4 | ซีซีซี /
ที่สอง / / / / / / / / / / / / /
ไฟล์ -> 5 | cccc /
o 6 | cccc /
l 7 | cccc /
d 8 | cccc /
9 | cccc /
10 | cccc /
เทศกาล -S ตัวเลือกลดสิ่งนี้ต่อไปเป็น:
ใหม่ / เก่า <- ไฟล์แรก
1 2 3 4 / 5 6 7 8 9 10
|------------/-------------
น 1 | /
อี 2 | /
ว 3 | /
4 | -
ที่สอง / / / / / / / / / / / / /
ไฟล์ -> 5 | cccc /
o 6 | cccc /
l 7 | cccc /
d 8 | cccc /
9 | cccc /
10 | cccc /
โปรแกรมสามารถจัดการชื่อไฟล์ UNICODE ใน Windows สิ่งนี้มีความเกี่ยวข้องเฉพาะภายใต้
-R ตัวเลือก เนื่องจากไม่มีวิธีให้ชื่อไฟล์ UNICODE จากบรรทัดคำสั่ง
ข้อ จำกัด
การป้อนข้อมูลซ้ำ ๆ เป็นความหายนะของการตรวจสอบความคล้ายคลึงกัน ถ้าเรามีไฟล์ที่มี4
สำเนาข้อความที่เหมือนกัน
A1 A2 A3 A4
โดยที่ตัวเลขใช้เพื่อแยกแยะสำเนาที่เหมือนกันเท่านั้น มีตัวตน 8 ประการ:
A1=A2, A1=A3, A1=A4, A2=A3, A2=A4, A3=A4, A1A2=A3A4 และ A1A2A3=A2A3A4 ในจำนวนนี้เพียง3
มีความหมาย: A1=A2, A2=A3 และ A3=A4 และสำหรับตารางที่มี 20 บรรทัดเหมือนกันทุกประการ
อื่นๆ ที่ไม่ธรรมดาในโปรแกรม มี 715 ตัว มากสุด 19 ตัว
มีความหมาย การรายงานทั้ง 715 รายเป็นเรื่องที่ยอมรับไม่ได้อย่างชัดเจน
ในการแก้ไขปัญหานี้ การค้นหาตัวตนจะดำเนินการดังนี้: สำหรับแต่ละตำแหน่งใน
ข้อความพบส่วนที่ใหญ่ที่สุดซึ่งมีสำเนาที่ไม่ทับซ้อนกันเกิดขึ้นในข้อความ
ตามมันไป ส่วนนั้นและสำเนาจะถูกรายงานและสแกนต่อที่ตำแหน่ง
เพียงหลังจากส่วน สำหรับตัวอย่างข้างต้น ผลลัพธ์ในข้อมูลประจำตัว A1A2=A3A4
และ A3=A4 ซึ่งค่อนข้างน่าพอใจและสำหรับ N ส่วนที่เหมือนกันโดยประมาณ 2 เข้าสู่ระบบ N
ข้อความจะได้รับ
นอกจากนี้ยังใช้งานได้ดีเมื่อสี่ส่วนที่เหมือนกันอยู่ในไฟล์ที่ต่างกัน:
ไฟล์ 1: A1
ไฟล์ 2: A2
ไฟล์ 3: A3
ไฟล์ 4: A4
ตอนนี้กลุ่มที่รวมกันเช่น A1A2 จะไม่เกิดขึ้น และอัลกอริธึมจะค้นหาการรัน A1=A2
A2=A3 และ A3=A4 รวมเป็น N-1 วิ่งข้อมูลทั้งหมด
คิดเลข เปอร์เซ็นต์
วิธีการข้างต้นไม่เหมาะสำหรับการรับเปอร์เซ็นต์ของเนื้อหาของไฟล์ที่
สามารถพบได้ในไฟล์อื่น จำเป็นต้องเปรียบเทียบไฟล์แต่ละคู่แยกกัน
แสดงโดย ac ในเมทริกซ์ด้านบน นี่คือสิ่งที่ -e ตัวเลือกไม่ ภายใต้ -e
ตัวเลือกกลุ่ม File1:A1 ซึ่งรู้จักใน File2 จะรู้จักอีกครั้งใน File3 และ
ไฟล์4. ในตัวอย่างด้านบน มันสร้างการรัน
File1:A1=ไฟล์2:A2
File1:A1=ไฟล์3:A3
File1:A1=ไฟล์4:A4
File2:A2=ไฟล์3:A3
File2:A2=ไฟล์4:A4
File3:A3=ไฟล์4:A4
รวมเป็น ½N(N-1) วิ่ง
เวลา AND SPACE สิ่งที่ต้องมี
ได้ใช้ความระมัดระวังเพื่อรักษาข้อกำหนดด้านเวลาของกระบวนการภายในทั้งหมด (เกือบ)
เชิงเส้นในความยาวของไฟล์อินพุต โดยใช้ตารางต่างๆ แต่ถ้ามี
หน่วยความจำไม่เพียงพอสำหรับตารางพวกเขาจะถูกละทิ้งโดยไม่สำคัญซึ่ง
เงื่อนไขอัลกอริธึมกลับคืนสู่ธรรมชาติกำลังสอง
ข้อกำหนดด้านเวลาเป็นกำลังสองในจำนวนไฟล์ ซึ่งหมายความว่า ตัวอย่างเช่น
ไฟล์ 64 MB หนึ่งไฟล์ประมวลผลได้เร็วกว่าไฟล์ 8000 8 kB
โปรแกรมต้องการหน่วยความจำ 6 ไบต์สำหรับแต่ละโทเค็นในอินพุต 2 ไบต์ต่อการขึ้นบรรทัดใหม่
(ไม่ใช่เมื่อทำเปอร์เซ็นต์); และพบประมาณ 76 ไบต์สำหรับการรันแต่ละครั้ง
ตัวอย่าง
โทร
sim_c *.ค
ไฮไลต์โค้ดที่ซ้ำกันในไดเร็กทอรี (เป็นประโยชน์ในการลบไฟล์ที่สร้างขึ้น
ก่อน.) การโทร
sim_c -f -F *.ค
สามารถระบุเพิ่มเติมได้
โทร
sim_text -e -p -s ใหม่/* / เก่า/*
เปรียบเทียบแต่ละไฟล์ใน new/* กับแต่ละไฟล์ใน new/* และ old/* และหากคู่ใดมีมากกว่านั้น
มีการรายงานข้อเท็จจริงดังกล่าวเหมือนกัน 20% โดยปกติความคล้ายคลึงกัน 30% หรือมากกว่านั้นมีความสำคัญ
ต่ำกว่า 20% อาจเป็นเรื่องบังเอิญ และระหว่างนั้นก็น่าสงสัย
โทร
sim_text -e -n -s -r100 ใหม่/* "|" เก่า/*
เปรียบเทียบไฟล์เดียวกัน และรายงานกลุ่มใหญ่ทั่วไป (NS | สามารถใช้เป็น
ตัวคั่นแทน / ในระบบที่ / เนื่องจากพารามิเตอร์บรรทัดคำสั่งถูกจัดการโดย
ล่ามคำสั่ง)
ทั้งสองวิธีดีสำหรับการตรวจจับการลอกเลียนแบบ
ใช้ sim_lisp ออนไลน์โดยใช้บริการ onworks.net