แรงบันดาลใจจากความคิดเห็นนี้ ...
ขอขอบคุณผู้ใช้Step Hen , Wheat-WizardและDennis ที่ช่วยฉันสร้างความแข็งแกร่งให้กับสเปคของความท้าทายนี้ก่อนโพสต์มัน!
นี่คือหัวข้อของ Cops สำหรับเธรดของ Robbers ให้ไปที่นี่
ในความท้าทายนี้คุณจะได้รับมอบหมายให้ใช้งานโค้ดบางอย่างเพื่อให้ภาษาของคุณไม่เป็นไปตามเกณฑ์การเป็นภาษาการเขียนโปรแกรมอีกต่อไป ในการท้าทายนั้นหมายถึงการทำให้ภาษาไม่สามารถ ...
รับอินพุตและเอาต์พุตตัวเลข
เพิ่มตัวเลขสองตัวเข้าด้วยกัน
ทดสอบว่าจำนวนหนึ่งเป็นจำนวนเฉพาะหรือไม่
นี่เป็นความท้าทายของตำรวจและโจรซึ่งมีความท้าทายสองประการที่แตกต่างกันโดยมีวัตถุประสงค์ที่แตกต่างกันสองประการ: ตำรวจจะพยายามเขียนโค้ดบางอย่างที่ทำให้ภาษาใช้งานไม่ได้เป็นส่วนใหญ่และโจรจะพยายามหาวิธีแก้ปัญหาที่ซ่อนอยู่ เพื่อกู้คืนภาษาของพวกเขา
ในฐานะตำรวจคุณต้องเขียนโค้ดสองตัวอย่าง:
ภาษาที่ทำให้ภาษาของคุณใช้งานไม่ได้เป็นส่วนใหญ่เช่นโดยการลบฟังก์ชั่นในตัวสำหรับการรับอินพุต / เอาต์พุตและการดำเนินการเชิงตัวเลข ยิ่งคุณลบคุณสมบัติมากเท่าไหร่ก็ยิ่งดีเท่านั้น รหัสนี้ไม่ได้รับอนุญาตให้ผิดพลาดหรือออก มันควรจะเป็นไปได้ที่จะเพิ่มรหัสการสิ้นสุดของข้อมูลโค้ดนี้และรหัสที่จะได้รับการประเมิน และ...
... ตัวอย่างของรหัสที่ใช้จำนวนเต็มไม่เป็นลบสองตัวเป็นอินพุตเพิ่มเข้าด้วยกันและแสดงผลรวมของพวกเขา ตัวอย่างนี้จะต้องทำงานอย่างถูกต้องแม้หลังจากเรียกใช้ข้อมูลโค้ดแรกแล้ว เมื่อรวมข้อมูลโค้ดสองรายการเข้าด้วยกันพวกเขาจะต้องสร้างโปรแกรมเต็มรูปแบบที่เพิ่มตัวเลขสองตัวหรือกำหนดฟังก์ชั่นที่เพิ่มตัวเลขสองตัว ตามหลักแล้วตัวอย่างข้อมูลนี้ควรอาศัยพฤติกรรมที่คลุมเครือมากเพื่อให้ค้นหาได้ยากขึ้น
คุณสามารถเลือกวิธีการอินพุตและเอาต์พุตมาตรฐานได้ อย่างไรก็ตามคุณต้องเปิดเผยให้ชัดเจนว่าคุณใช้รูปแบบใด (อินพุตและเอาต์พุต) โจรไม่สามารถถอดรหัสคำตอบของคุณได้เว้นแต่พวกเขาจะใช้รูปแบบเดียวกับคุณ
หลังจากเขียนตัวอย่างโค้ดทั้งสองนี้แล้วคุณต้องโพสต์คำตอบแรกโดยไม่เปิดเผยตัวที่สอง คำตอบของคุณควรมีข้อมูลทั้งหมดต่อไปนี้:
แรกข้อมูลโค้ด (ไม่ชัดที่สอง)
ภาษา (รวมถึงรุ่นรองเนื่องจากการส่งส่วนใหญ่อาจขึ้นอยู่กับกรณีขอบแปลก ๆ )
รูปแบบ IO รวมถึงไม่ว่าจะเป็นฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ โจรต้องใช้รูปแบบเดียวกันเพื่อให้แคร็กของตนใช้งานได้
กรณีขอบแปลก ๆ ที่จำเป็นสำหรับคำตอบของคุณในการทำงาน ยกตัวอย่างเช่นทำงานบนลินุกซ์หรือต้องเชื่อมต่ออินเทอร์เน็ต เห็นได้ชัดว่านี่เป็นอัตนัยเล็กน้อย แต่ถ้าตำรวจมีคดีขอบบางอย่างที่ป้องกันไม่ให้มันร้าวแล้วเผยให้เห็นหลังจากที่ปลอดภัยแล้ว โจรที่อาจเกิดขึ้นควรมีข้อมูลทั้งหมดที่จำเป็นในการถอดรหัสคำตอบของคุณก่อนที่มันจะแตก
คุณไม่จำเป็นต้องเปิดเผยจำนวนไบต์จนกว่าคำตอบของคุณจะปลอดภัย
นี่คือตัวอย่าง สำหรับตัวอย่างแรกคุณสามารถส่งโปรแกรม Python 3 ต่อไปนี้:
Python 3
print=None
รับอินพุตจาก STDIN และเอาต์พุตไปยัง STDOUT
และในฐานะข้อมูลโค้ดที่สองของคุณคุณสามารถเขียน:
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
สิ่งนี้ถูกต้องเพราะมันจะใช้ตัวเลขสองตัวเป็นอินพุทและเอาท์พุทผลรวมของพวกมันแม้ว่าคุณจะรวมตัวอย่างสองอันเข้าด้วยกันเช่น
print=None
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
อย่างไรก็ตามนี่จะเป็นเรื่องง่ายมากที่โจรจะหาทางแก้ไข ตั้งแต่นี้จะแตกง่ายคุณสามารถพยายามแก้ไขวิธีนี้โดยเฉพาะเช่น:
import sys
sys.stdout=None
print=None
อย่างไรก็ตามแม้จะมีวิธีแก้ไขปัญหาที่ง่ายมาก:
del print
a,b=int(input()),int(input())
print(a+b)
ในฐานะตำรวจเป้าหมายของคุณคือการทำให้วิธีการแก้ปัญหาที่ซ่อนอยู่ชัดเจนที่สุดเพื่อป้องกันไม่ให้โจรค้นพบมัน
โจรจะมีลักษณะที่หนึ่งในคำตอบของคุณและพยายามที่จะแตกมัน พวกเขาอาจถอดรหัสโดยการเขียนตัวอย่างที่ถูกต้องใด ๆที่สามารถทำงานเป็นตัวอย่างที่ 2 (เพิ่มสองตัวเลขร่วมกันหลังจากที่ภาษาทำไม่ได้เป็นส่วนใหญ่) สิ่งนี้ไม่จำเป็นต้องเป็นข้อมูลโค้ดเดียวกับที่คุณตั้งใจไว้ หากโจรปล้นคำตอบของคุณพวกเขาจะแสดงความคิดเห็นในคำตอบของคุณและจากนั้นคุณควรแก้ไขเพื่อระบุว่าได้รับการถอดรหัส หากโพสต์ของคุณแตกคุณควรแก้ไขคำตอบของคุณเพื่อแสดงวิธีแก้ปัญหา (ตัวอย่างที่ 2) ที่คุณตั้งใจไว้ นี่ไม่ใช่กฎต่อ seเพียงแค่ข้อเสนอแนะที่เป็นมิตรเพื่อให้เกมสนุก คุณจะได้ไม่ต้อง.
หากคำตอบยังคงไม่ได้ทำการแยกตลอดทั้งสัปดาห์คุณสามารถแก้ไขในตัวอย่างที่สองของคุณและระบุว่าคำตอบของคุณปลอดภัยแล้ว หากคุณไม่แก้ไขหลังจากสิ้นสุดสัปดาห์ผู้ใช้รายอื่นยังสามารถถอดรหัสได้จนกว่าคุณจะทำ หากคุณไม่เปิดเผยตัวอย่างที่สองของคุณคุณไม่สามารถรับคะแนนสำหรับคำตอบของคุณหรือเรียกมันว่าปลอดภัย
ผู้ชนะของเธรดของตำรวจเป็นคำตอบที่สั้นที่สุดที่ปลอดภัยซึ่งรวมถึงตัวอย่างข้อมูลที่นับเป็นไบต์และคำตอบนี้จะได้รับการยอมรับหลังจากผ่านเวลาที่เพียงพอแล้ว คุณไม่จำเป็นต้องเปิดเผยจำนวนไบต์จนกว่าคำตอบของคุณจะปลอดภัยเนื่องจากการนับจำนวนนั้นไม่เกี่ยวข้องกับคะแนนของคุณจนกว่าคำตอบของคุณจะปลอดภัย ในกรณีที่เวลาผ่านไปนานและไม่มีคำตอบใดที่ยังไม่ได้ทำการปลดผู้ชนะจะเป็นคำตอบที่ยังไม่ได้ทำการแยกออกเป็นระยะเวลานานที่สุด
มีความสุข!
การชี้แจงกฎ
ข้อมูลครั้งแรกจะต้องทำงานอย่างถูกต้องโดยไม่ต้องสละป้อนข้อมูลใด ๆ มันอาจส่งออกสิ่งที่คุณต้องการและผลลัพธ์นี้จะถูกละเว้น - ตราบใดที่ข้อมูลโค้ดเสร็จสิ้นแล้วข้อมูลโค้ดที่สองจะทำงานอย่างถูกต้อง
ตัวอย่างที่สองจะต้องดำเนินการจริงเพื่อให้คำตอบของคุณถูกต้อง นี่หมายถึงคำตอบที่ชอบ
import sys sys.exit()
ไม่ถูกต้องเพราะมันไม่ทำลายภาษา มันหยุดทำงาน ในทำนองเดียวกันการป้อนลูปไม่สิ้นสุดไม่ถูกต้องเนื่องจากข้อมูลโค้ดที่สองจะไม่ถูกดำเนินการ
หลังจากเป็นที่ปลอดภัยคะแนนของคุณคือการนับไบต์ทั้งเกร็ดเล็กเกร็ดน้อย
นี้ไปกลับไปกรุณาเปิดเผยกรณีขอบแปลก ๆ ที่จำเป็นสำหรับคำตอบของคุณในการทำงาน ... การส่งของคุณจะต้องมีข้อมูลเพียงพอก่อนที่จะถูกเปิดเผยที่จะทำซ้ำหลังจากที่ถูกเปิดเผย ซึ่งหมายความว่าหากคำตอบของคุณปลอดภัยแล้วคุณแก้ไขใน: นี่คือคำตอบของฉัน อ๊ะ BTW ใช้งานได้ก็ต่อเมื่อคุณเรียกใช้บน Solaris แล้วพูดเล่น ๆ กับคุณ! คำตอบของคุณไม่ถูกต้องและจะถูกลบและไม่ถือว่ามีสิทธิ์ได้รับรางวัล
ตัวอย่างที่สองได้รับอนุญาตให้เกิดความผิดพลาดหลังจากส่งผลรวม - ตราบใดที่ผลลัพธ์ยังคงถูกต้อง (ตัวอย่างเช่นหากคุณเลือกที่จะส่งออกไปยัง STDERR และจากนั้นคุณจะได้รับข้อมูลความผิดพลาดจำนวนมาก
คุณไม่สามารถแก้ไขรหัสของคุณหลังจากส่งคำตอบ
คุณไม่สามารถพึ่งพาฟังก์ชันการเข้ารหัสเช่นการเข้ารหัส, ฟังก์ชันแฮช, CSPRNG เป็นต้น
int main(){ do_evil_stuff(); }
รหัสผู้ใช้ควรไปที่ไหน? ในฟังก์ชั่น? หลังจากงบทั้งหมดในmain
?