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

วิธีการเขียน Caesar Cipher Encoder ของคุณเอง

คุณเคยได้ยินเกี่ยวกับ รหัสซีซาร์ . หรือไม่ ?

Julius Caesar ใช้เทคนิคนี้เพื่อปกปิดข้อความลับจากศัตรูของเขา!

รหัสซีซาร์เป็นหนึ่งในเทคนิคการเข้ารหัสดั้งเดิมที่สุด

แนวคิดหลักที่อยู่เบื้องหลังระบบนี้คือ หมุนตัวอักษร ตำแหน่งตัวอักษร x จำนวน .

ตัวอย่างเช่น ด้วย x = 1 , 'A' กลายเป็น 'B', 'C' กลายเป็น 'D' เป็นต้น

วิธีการเขียน Caesar Cipher Encoder ของคุณเอง

เราจะนำสิ่งนี้ไปใช้ในโค้ดได้อย่างไร

ดีใจที่คุณถาม ปรากฎว่ามันไม่ยากอย่างที่คิด เราจะใช้ประโยชน์จากข้อเท็จจริงที่ว่าตัวอักษรสามารถแสดงด้วยตัวเลขได้ (รหัส ASCII) ซึ่งจะทำให้การหมุนเวียนตัวอักษรเป็นเรื่องของการบวกตัวเลขสองตัวเข้าด้วยกัน

สร้างเครื่องแปลงรหัสซีซาร์ของคุณเอง

เราจะเริ่มต้นด้วยการแปลงสตริงอินพุตเป็นอาร์เรย์จำนวนเต็ม:

ascii = "test".chars.map(&:ord)

มาทำลายสิ่งนี้กันเถอะ :

อักขระ วิธีแบ่งสตริงออกเป็นอาร์เรย์ของอักขระและส่งคืนตัวแจงนับ เป็นผลให้เราสามารถเรียกแผนที่ บนอาร์เรย์

เมธอดแผนที่มีประโยชน์มากเมื่อเราต้องการแปลงองค์ประกอบทั้งหมดของอาร์เรย์ด้วยวิธีใดวิธีหนึ่ง ค่าส่งคืนของ map เป็นอาร์เรย์อื่นที่มีองค์ประกอบที่แปลงแล้ว

หมายเหตุ:ไวยากรณ์นี้ต้องใช้ Ruby 1.9+ และเทียบเท่ากับ:

ascii = "test".chars.map { |c| c.ord }

เนื่องจากเราต้องการเปลี่ยนตัวอักษรทุกตัวให้เป็นค่า ASCII ที่สอดคล้องกัน เราจึงเรียก ord เมธอดในทุกองค์ประกอบของอาร์เรย์

ในตัวอย่างของเรา ผลลัพธ์จะเป็นดังนี้:

[116, 101, 115, 116]

เวลาในการหมุน

เยี่ยมมาก!

ขั้นตอนต่อไปคือการเพิ่มจำนวนการหมุนที่เราต้องการ เราทำได้โดยใช้ แผนที่  อีกครั้ง:

shifted = ascii.map { |c| c + 5 }
=> [121, 106, 120, 121]

ตอนนี้เราสามารถเปลี่ยนตัวเลขกลับเป็นตัวอักษร แล้วรวมเข้าด้วยกันซึ่งจะทำให้สตริงที่เข้ารหัสแก่เรา:

shifted.map { |c| c.chr }.join
=> "yjxy"

ในการดึงสตริงเดิมของเรา ทั้งหมดที่เราต้องทำคือใช้ขั้นตอนเดิมอีกครั้ง แต่คราวนี้เลื่อนไปทางซ้าย

สิ่งสำคัญคือต้องเปลี่ยนตามจำนวนตำแหน่งที่เราใช้เดิม มิฉะนั้น เราจะไม่กู้คืนข้อมูลเดิมของเรา

โค้ดสุดท้ายและเวอร์ชันทางเลือก

คุณสามารถหารหัสซีซาร์ที่เสร็จแล้วได้ที่นี่

มันสร้างการวนซ้ำที่เป็นไปได้ทั้งหมด 26 ครั้งสำหรับสตริงที่กำหนดและยังจัดการการตัดคำด้วย (ตัวอย่างในโพสต์ไม่ทำ)

นอกจากนี้ยังมีเวอร์ชันอื่นที่ใช้ Array#rotate

คุณอาจชอบ:
การจัดรูปแบบสตริงทับทิม