ภารกิจ
ในฐานะที่เป็นที่รู้จักกันดีสารพันธุกรรมของสิ่งมีชีวิตที่รู้จักทั้งหมดบนโลกถูกเข้ารหัสใน DNA ใช้นิวคลีโอไทด์สี่ adenine, thymine, cytosine และ guanine (ATGC ตัวแทนทั่วไป)
นักชีวสารสนเทศศาสตร์ต้องการเก็บจีโนมทั้งหมดแน่นอนว่าไม่ต้องการเก็บไว้เป็น ASCII เพราะแต่ละตัวเลือกสามารถแสดงได้เพียงสองบิต!
สเปค
ภารกิจของคุณคุณควรเลือกที่จะยอมรับมันคือการเขียนโปรแกรมฟังก์ชั่นหรือวิธีการแปลงการแสดง ASCII เป็นการแสดงไบนารีและกลับ แสดงA
เป็นb00
, T
เป็นb01
, G
เป็นb10
, และC
เป็นb11
(ต่อจากนี้ไป "หน่วย")
นอกจากนี้บิตสูงของแต่ละไบต์ควรมีจำนวนหน่วยในไบต์ทำให้แต่ละไบต์แทน triplet
ตัวอย่างเช่น: กลายเป็น"GATTACCA"
b11 100001 b11 010011 b10 1100xx
ใน ASCII ถึงอินพุตไบนารีช่องว่างแท็บและการขึ้นบรรทัดใหม่ควรถูกละเว้น อักขระใด ๆ ที่ไม่อยู่ในชุด[ \r\n\tATGC]
เป็นข้อผิดพลาดและอาจถูกละเว้นหรือยุติการประมวลผล
ในอินพุตแบบไบนารีถึง ASCII ไบต์ที่มีบิตสูงสองบิตb00
อาจถูกละเว้น
เอาต์พุต ASCII อาจมีช่องว่าง แต่ไม่ควรมีขนาดเกินกว่า 4 เท่าของอินพุตไบนารีบวกหนึ่งไบต์ยาวและต้องลงท้ายด้วยการขึ้นบรรทัดใหม่
เอาต์พุตไบนารีอาจมีจำนวนb00xxxxxx
"ไบต์" ควบคุมโดยพลการ แต่จะต้องไม่ยาวกว่าอินพุต ASCII
แต่ละโปรแกรมแปลงต้องรองรับอินพุตที่มีความยาวตามอำเภอใจ และควรทำการเข้ารหัสหรือถอดรหัสในเวลาเชิงเส้นโดยประมาณ
เกิดการบิด
น่าเสียดายที่นักชีวสารสนเทศศาสตร์ซึ่งคุณปฏิบัติงานนี้อยู่เขาได้กระทำผิดต่อคุณในระดับส่วนตัว แต่อาจเป็นเรื่องเล็กน้อย
บางทีเขาออกไปกับน้องสาวของคุณอีกครั้งและไม่เคยเรียกเธออีกครั้ง บางทีเขาอาจเหยียบหางสุนัขของคุณ ข้อมูลเฉพาะไม่สำคัญจริงๆ
สิ่งสำคัญคือคุณมีโอกาสคืนทุน!
รายละเอียด
การแปลงแต่ละครั้งควรมีอัตราความผิดพลาดเล็กน้อย ตามลำดับข้อผิดพลาดหนึ่งครั้งต่อหนึ่งหมื่นถึงหนึ่งล้านหน่วยที่ประมวลผล
ข้อผิดพลาดสามารถเป็นหนึ่งในสิ่งต่อไปนี้:
- ข้อผิดพลาดซ้ำซ้อน:
"GAT TAC CA"
กลายเป็น"GAT TAA CCA"
- ข้อผิดพลาดในการลบ:
"GAT TAC CA"
กลายเป็น"GAT TAC A"
- ข้อผิดพลาดในการแปล:
"GAT TAC CA"
กลายเป็น"GTA TAC CA"
- การทำสำเนา Triplet:
"GAT TAC CA"
กลายเป็น"GAT TAC TAC CA"
- เลื่อนหลุด:
"GAT TAC CA"
กลายเป็น"TAC GAT CA"
- การพลิกกลับของแฝด:
"GAT TAC CA"
กลายเป็น"GAT CAT CA"
ข้อผิดพลาดนั้นจะถูกนำเสนอในกรณีที่ไม่ควรปรากฏชัดในโค้ดทันที และไม่คำนึงถึงความยาวของอินพุต; การแปลงควรมีข้อผิดพลาดอย่างน้อยหนึ่งรายการ
ทั้งสองวิ่งกับปัจจัยที่เหมือนกันไม่ควรจำเป็นต้องผลิตออกเหมือนกัน
เคล็ดลับ
นักชีวสารสนเทศศาสตร์ที่ชั่วช้าเป็นนักเขียนโค้ดที่มีความสามารถพอสมควร และเช่นนี้โครงสร้างบางอย่างจะถูกค้นพบโดยอัตโนมัติและถูกแบนเช่น:
- เขาจะค้นพบการเรียกไปยังระบบสร้างหมายเลขสุ่มโดยอัตโนมัติเช่น rand (), random () หรืออ่านจาก / dev / urandom หรือ / dev / random (หรือสิ่งที่เทียบเท่ากับภาษา)
- เขาจะสังเกตเห็นตัวแปรฟุ่มเฟือยตัวนับหรือลูป
การให้คะแนน
ตัวเข้ารหัสและตัวถอดรหัสจะทำคะแนนแยกกัน
แต่ละไฟล์จะถูกเรียกใช้ 3 ครั้งเทียบกับชุดของไฟล์อินพุตที่สร้างแบบสุ่ม 100 ไฟล์แต่ละไฟล์มีขนาดตามลำดับ 3 ล้านหน่วย
ข้อมูลสำหรับกรณีทดสอบการเข้ารหัสจะถูกสร้างขึ้นโดยประมาณดังนี้:
for (l = 1 => bigNum)
for (t = 1 => 20)
random_pick(3,ATGC)
t == 20 ? newline : space
ข้อมูลสำหรับกรณีทดสอบถอดรหัสจะถูกสร้างขึ้นโดยประมาณดังนี้:
for (u = 1 => bigNum)
for (t = 1 => 20)
random_byte() | 0b11000000
0x00
เครื่องเข้ารหัส
- แต่ละไบต์หายไปจากความยาวขั้นต่ำที่คาดหวังในความยาวจริงจะได้คะแนน -1 คะแนนสูงสุด -1000 (ความยาวขั้นต่ำที่คาดหวังคือ
ceil(count(ATGC) / 3)
.)
ตัวถอดรหัส
- แต่ละไบต์เกินความยาวสูงสุดที่คาดหวังในความยาวจริงจะได้คะแนน -1 คะแนนสูงสุด -1000 (ความยาวสูงสุดที่คาดหวังคือ
size(input) * 4 + 1
.)
ทั้งสอง
- ข้อผิดพลาดแต่ละประเภทที่สามารถสร้างได้จะได้คะแนน 100 คะแนน รวมเป็น 600 คะแนนสำหรับแต่ละคนรวม 1200
- แต่ละกรณีทดสอบที่ตัวเข้ารหัสสร้างข้อผิดพลาดมากกว่าหรือน้อยกว่า 30% มากกว่าค่าเฉลี่ยของตัวเองจะถูกลงโทษด้วย -5 คะแนน
- แต่ละกรณีทดสอบที่ตัวเข้ารหัสสร้างข้อผิดพลาดน้อยกว่าหรือน้อยกว่า 15% น้อยกว่าค่าเฉลี่ยของตัวเองจะได้รับ 5 คะแนน
- แต่ละกรณีทดสอบที่ทั้งสามวิ่งออกมาเหมือนกันจะถูกลงโทษ -10 คะแนน
ข้อกำหนดที่ยาก
รายการจะถูกตัดสิทธิ์หาก:
- สำหรับอินพุตที่ถูกต้องใด ๆ ที่ยาวกว่าหนึ่งแฝดมันไม่สามารถสร้างข้อผิดพลาดแม้แต่ครั้งเดียว
- มันมีประสิทธิภาพที่ไม่สามารถทดสอบถุงมือได้ภายในเวลาประมาณหนึ่งชั่วโมง
- โดยเฉลี่ยจะสร้างข้อผิดพลาดมากกว่าหนึ่งข้อในทุก ๆ หมื่นหน่วย
- โดยเฉลี่ยจะสร้างข้อผิดพลาดน้อยกว่าหนึ่งข้อในทุก ๆ ล้านหน่วย
อินเตอร์เฟซ
ผู้เข้าประกวดควรยอมรับอินพุตในอินพุตมาตรฐานและเอาต์พุตไปยังเอาต์พุตมาตรฐาน
หากรายการนั้นเป็นหนึ่งโปรแกรมที่มีฟังก์ชั่นคู่; สวิตช์-e
และ-d
ควรตั้งค่าโปรแกรมสำหรับการเข้ารหัสและถอดรหัสตามลำดับ
ตัวอย่างการเรียกร้อง:
$ encoder <infile.txt >outfile.bin
$ decoder <infile.bin >outfile.txt
$ recoder -e <infile.txt >outfile.bin
ผู้ชนะ
ผู้ชนะคือรายการที่มีคะแนนสูงสุด ค่าสูงสุดทางทฤษฎีคือ 1200 สำหรับชนิดข้อผิดพลาดบวก 3000 คะแนนสำหรับความเสถียรในอัตราการสร้างข้อผิดพลาด
ในกรณีที่ไม่น่าเป็นไปได้ ผู้ชนะจะถูกกำหนดโดยการนับคะแนน
หมายเหตุเพิ่มเติม
สำหรับจุดประสงค์ในการเรียกใช้ชุดทดสอบแต่ละรายการควรมีคำแนะนำในการรันหรือการรวบรวม
รายการทั้งหมดควรจะสามารถรันได้บนเครื่อง Linux ที่ไม่มี X