ราวกับว่าความท้าทายนี้อาจเป็นPythonesqueอีกต่อไปในจิตวิญญาณอีกต่อไป ... ไม่จำเป็นต้องมีความรู้มาก่อนเกี่ยวกับโซ่มาร์คอฟหรือเทคนิคการเข้ารหัส
คุณเป็นสายลับที่ต้องการได้รับข้อมูลสำคัญจากบริการรักษาความปลอดภัยของอังกฤษ M1S ตัวแทนของ M1s ตระหนักดีว่าสัญญาณ Wi-Fi ของพวกเขาสามารถดัก, Android / iOS ช่องโหว่ความปลอดภัยของพวกเขาใช้ประโยชน์อื่น ๆ ดังนั้นทั้งหมดของพวกเขาใช้ Nokia 3310 ของข้อมูลข้อความส่งที่ถูกพิมพ์โดยใช้T9 อัตโนมัติเสร็จ
ก่อนหน้านี้คุณเคยแฮ็กโทรศัพท์ที่จะส่งไปยังสำนักข่าวกรองและได้ติดตั้งคีย์ล็อกเกอร์ภายใต้คีย์บอร์ดพลาสติกอันทรงเกียรติดังนั้นตอนนี้คุณจะได้รับหมายเลขที่ตรงกับตัวอักษรที่พิมพ์ดังนั้น " นกอินทรีจึงออกจากรังเพื่อเตือนตัวแทน "
84303245304270533808430637802537808430243687
แต่เดี๋ยวก่อน! ลำดับ T9 บางอย่างไม่ชัดเจน (“ 6263” อาจเป็น“ ชื่อ”,“ แผงคอ” หรือ“ โอโบ”; ยิ่งคลุมเครือยิ่งสงสัยมากขึ้น!) คุณจะทำอย่างไร คุณรู้ว่าการสอบเข้าครั้งแรกที่ใช้คือการสรุปผลงานชิ้นเอกของ Marcel Proust“ Remembrance of Things Past” ในเวลา 15 วินาทีดังนั้นคุณต้องการเลือกคำที่มาถัดจากคำก่อนหน้านี้ตามการกระจายความถี่ใน Chef-d ' œuvre of Proust!
คุณสามารถถอดรหัสรหัสและรับข้อความเดิมได้หรือไม่?
หลักการของ T9
กลไกการทำให้สมบูรณ์อัตโนมัติของ T9 สามารถอธิบายได้ดังต่อไปนี้ มันแมปตัวอักษรกับตัวเลขตามที่แสดงในภาพด้านบน
abc -> 2
def -> 3
ghi -> 4
jkl -> 5
mno -> 6
pqrs -> 7
tuv -> 8
wxyz -> 9
<space> -> 0
<other> -> <is deleted>
ตัวถอดรหัส T9 ได้รับลำดับของตัวเลขและพยายามเดาคำที่สามารถพิมพ์ด้วยปุ่มกดเหล่านั้น มันอาจใช้ตารางความถี่มาตรฐาน แต่เรากำลังก้าวไปอีกขั้นหนึ่งแล้วทำนายคำถัดไปโดยใช้ลูกโซ่มาร์คอฟ!
ตัวอย่างการเรียนรู้
คลังข้อมูลนี้เป็นเวอร์ชั่นที่s/-/ /g
โดดเด่นอย่างมากของ "ความทรงจำของสิ่งที่ผ่านมา" ของ Proust ( s/['’]s //g
และs/[^a-zA-Z ]//g
- ทำให้เกิดความสับสนในการครอบครอง's
!) เผยแพร่ครั้งแรกบนเว็บไซต์ของมหาวิทยาลัยแอดิเลด (เนื้อหาของงานนี้อยู่ในโดเมนสาธารณะในออสเตรเลีย)
ข้อความทั้งหมดจะต้องวิเคราะห์เป็นหนึ่งสตริงเป็นประโยคยาวหนึ่งคำเป็นเวกเตอร์ที่มีความยาวหนึ่งคำ (แล้วแต่ว่าภาษาใดจะสะดวกกว่าสำหรับคุณ) การแยกบรรทัดย่อยและแยกเป็นคำที่เว้นวรรคแยกออกเป็นคำที่ช่องว่าง(ฉันไม่ได้ให้ไฟล์ย่อหน้าเดียวเพราะอาจถูกขมวดคิ้วโดยเครื่องมือ github)
ฉันจะอ่านข้อความทั้งหมดเป็นหนึ่งสาย / ประโยคได้อย่างไร ตัวอย่างในR :
p_raw <- read.table("proust.txt", sep="\t") # Because there are no tabs
p_vec <- as.character(p_raw$V1) # Conversion to character vector
p_str <- paste(p_vec, collapse=" ") # One long string with spaces
p_spl <- strsplit(p_str, split=" ")[[1]] # Vector of 1360883 words
proust <- p_spl[p_spl!=""] # Remove empty entries — 1360797
งาน
กำหนดลำดับตัวเลขเป็นตัวเลขให้ส่งคืนสตริงข้อความที่เป็นไปได้ที่สามารถพิมพ์ได้โดยใช้ปุ่ม T9 ที่สอดคล้องกันโดยใช้โซ่ความน่าจะเป็นเพื่อคาดการณ์คำถัดไปXตามข้อความการฝึกอบรมนี้ที่ถือว่าเป็นประโยคยาวหนึ่งประโยค
ถ้าXเป็นคำ T9 แรกของข้อความและมีการเดาหลายคำให้เลือกหนึ่งคำโดยสุ่มหรือเลือกเพียงคำเดียวที่เป็นไปได้
สำหรับ T9 คำต่อมาทั้งหมดX (i)นำหน้าด้วยคำที่ถอดรหัสแล้วw (i-1) :
- หาก T9-word Xสามารถแปลงเป็นคำปกติxในวิธีที่ไม่ซ้ำกันให้ทำ
- ถ้ามีตัวเลือกหลายแปลงสามารถใช้ได้สำหรับXพูดx1, x2, ...มองขึ้นคำเดาก่อนW
- หากwไม่เคยตามมาด้วยสิ่งใดที่จับคู่กับXในงานดั้งเดิมของ Proust ให้เลือกx1, x2, ...ที่เป็นไปได้แบบสุ่ม
- ถ้ากว้าง xเสมอสอดคล้องกับW x1ในต้นฉบับและไม่มีพร้อมกันXi ‘s ที่สามารถแมปลงในXเลือกx1
- ถ้ากว้าง xสามารถแปลงW x1 , W x 2 ... ที่สามารถพบได้ในคลังแล้วนับเป็นไปได้ทั้งหมดXi ‘s ติดตามว่าWและแผนที่เพื่อXในคลังและรับXiกับความน่าจะเป็นจิน / (x1 + x2 + ... )
ตัวอย่าง 2a หากข้อความอยู่76630489
ที่489
ใดguy
หรือivy
(เกิดขึ้นในคลังอย่างน้อยหนึ่งครั้ง) 7663
สามารถถอดรหัสเป็นsome
(คำแรกที่เป็นไปได้มาก) หากsome
ไม่เคยตามมาด้วยสิ่งใดก็ตามที่แมปไป489
ในคลังข้อมูลให้เลือกguy
หรือivy
สุ่มด้วยความน่าจะเป็น 0.5
ตัวอย่าง 2b หากข้อความ766302277437
ที่2277437
อาจเป็นbarrier
หรือcarrier
, สามารถถอดรหัสเป็น7663
some
หาก Proust ใช้เสมอsome carrier
และไม่เคยแล้วเลือกsome barrier
some carrier
ตัวอย่าง 2c 536307663
สมมติว่าคุณต้องการที่จะถอดรหัสลำดับ เป็นที่คาดการณ์ว่าเป็น5363
อาจจะมีของเหล่านี้: , และ คุณนับจำนวนคำที่ตามมาในคลังตัวอย่าง สมมติว่าคุณได้รับสิ่งนี้ (เพื่ออธิบาย):lend
7663
pond
roof
some
lend
T9 Word following lend Occurrences
7663 some 7
7663 pond 2
7663 roof 1
ดังนั้นหาก7663
จะนำหน้าด้วยlend
มี7/(7+2+1)=70%
ความน่าจะเป็นที่7663
หมายถึงsome
20% pond
และ roof
10% อัลกอริทึมของคุณควรผลิตlend some
ใน 70% รายและlend pond
20% ราย
คุณอาจสันนิษฐานได้อย่างปลอดภัยว่าตัวแทนใช้ตัวอักษร az และช่องว่างเท่านั้น (ไม่มีเครื่องหมายวรรคตอนไม่มีการครอบครอง's
และไม่มีตัวเลข)
คุณอาจคิดว่าตัวแทนของ M1S ไม่เคยใช้คำใด ๆ ที่อยู่นอกขอบเขตของ "ความทรงจำในอดีต" (ซึ่งเป็นคำศัพท์ที่น่าสนใจจำนวน 29,237 คำ!)
Fuctionality T9 ได้ถูกนำมาใช้ในการท้าทายนี้ดังนั้นคุณอาจจะดูมัน
หากคุณต้องการความช่วยเหลือใด ๆ โซ่น่าจะได้รับการฝึกให้เชื่องเฉิดฉายในนี้ , ที่และต่อไปนี้ความท้าทาย แต่คุณไม่จำเป็นต้องรู้หลักการของเครือข่ายดังกล่าว: ทุกอย่างมีการระบุไว้ในงาน
กรณีทดสอบ
--Inputs--
20784250276960369
20784250276960369
84303245304270533808430637802537808430243687
94280343084306289072908608430262780482737
94280343084306289072908608430262780482737
--Possible outputs--
c quick brown fox
a stick crown fox
the eagle gas left the nest blest vie agents
what did the navy pay to the coast guards
what did the navy raz un the coast guards
กฎ:
- ช่องโหว่มาตรฐานใช้
- คุณไม่ทราบข้อความต้นฉบับทั้งหมดที่คุณได้รับคือลำดับของตัวเลขและไฟล์proust.txtที่คุณต้องโหลดในหน่วยความจำ / พื้นที่ทำงาน / อะไรก็ตาม ไม่จำเป็นต้องมีสิ่งใดในตัวเอง สมมติว่า
proust.txt
สามารถเข้าถึงได้เสมอ - อัลกอริทึมของคุณจะต้องสามารถสร้างเอาต์พุตที่แตกต่างกันด้วยความน่าจะเป็นที่เกี่ยวข้องหากมีตัวเลือกการถอดรหัสมากกว่าหนึ่งตัวเลือกนั้นน่าจะเป็นไปตามคลังข้อมูล (ดูตัวอย่าง 2c)
คุณต้องระวังให้มากที่สุดดังนั้นรหัสที่สั้นที่สุดจะเป็นผู้ชนะ!
ป.ล.ประโยชน์ที่ชัดเจนของอัลกอริธึมความน่าจะเป็นนี้คือความเป็นไปได้ที่คุณจะได้รับสตริงต้นฉบับจริงสำหรับสตริงถอดรหัสที่ไม่ชัดเจนซึ่งมีแนวโน้มที่จะเป็นหนึ่ง - เพียงแค่รอ ...