Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมถอดรหัสรหัสเพื่อปลดชนวนระเบิดใน Python


สมมติว่ามีระเบิดที่คุณจะคลี่คลาย และเวลาของคุณกำลังจะหมดลง! คุณมีโค้ดอาร์เรย์แบบวงกลมที่มีความยาว n และมีคีย์ k ตอนนี้ในการถอดรหัสรหัส คุณต้องแทนที่ทุกหมายเลข ตัวเลขทั้งหมดจะถูกแทนที่พร้อมกัน มีกฎเล็กน้อย -

  • ถ้า k> 0 ให้แทนที่ตัวเลข ith ด้วยผลรวมของตัวเลข k ถัดไป

  • ถ้า k <0 ให้แทนที่ตัวเลข ith ด้วยผลรวมของตัวเลข k ก่อนหน้า

  • ถ้า k =0 ให้แทนที่ตัวเลข ith ด้วย 0

ในที่นี้โค้ดมีลักษณะเป็นวงกลม ดังนั้นองค์ประกอบถัดไปของโค้ด[n-1]คือโค้ด[0] และองค์ประกอบก่อนหน้าของโค้ด[0]คือโค้ด[n-1] สุดท้ายเราต้องส่งคืนรหัสที่ถอดรหัสแล้ว

ดังนั้นหากอินพุตเป็นเหมือนรหัส =[8,2,3,5], k =3 ผลลัพธ์จะเป็น [10, 16, 15, 13] เพราะสำหรับแต่ละคีย์เราจะแทนที่ด้วยผลรวมสามองค์ประกอบถัดไป ดังนั้น code[0] จะเป็น 10, code[1] จะเป็น 16, code[2] จะเป็น 15 และ code[3] จะเป็น 13

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ &mius;

  • ถอดรหัส :=รายการใหม่

  • สำหรับฉันในช่วง 0 ถึงขนาดของรหัส - 1 ทำ

    • ถ้า k> 0 แล้ว

      • ผลรวม :=0

      • เจ :=i+1

      • m :=k

      • ในขณะที่ m ไม่ใช่ศูนย์ ให้ทำ

        • sum :=sum + code[j mod ความยาวของโค้ด]

        • m :=m - 1

        • เจ :=เจ + 1

      • แทรกผลรวมที่ส่วนท้ายของการถอดรหัส

    • มิฉะนั้นเมื่อ k เท่ากับ 0 แล้ว

      • ใส่ 0 ต่อท้ายถอดรหัส

    • มิฉะนั้น

      • ผลรวม :=0

      • เจ :=i-1

      • m :=k

      • ในขณะที่ m ไม่ใช่ศูนย์ ให้ทำ

        • sum :=sum + code[j mod ความยาวของโค้ด]

        • m :=m + 1

        • เจ :=เจ - 1

      • แทรกผลรวมที่ส่วนท้ายของการถอดรหัส

  • ถอดรหัสกลับ

ตัวอย่าง (Python)

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

def dissolve(code, k):decode =[] for i in range(len(code)):if k> 0:sum =0 j =i+1 m =k while(m):sum+=code [j%len(code)] m-=1 j+=1 decode.append(sum) elif k ==0:decode.append(0) else:sum =0 j =i-1 m =k while(m) :sum+=code[j%len(code)] m+=1 j-=1 decode.append(sum) return decodecode =[8,2,3,5]k =3print(แก้(รหัส, k)) 

อินพุต

[8,2,3,5], 3

ผลลัพธ์

[10, 16, 15, 13]