เคยได้ยิน Caesar cipher มั้ย?
จูลิอัส ซีซาร์ใช้เทคนิคนี้ซ่อนข้อความลับจากศัตรู!
Caesar cipher เป็นเทคนิคเข้ารหัสแบบโบราณที่สุด
แนวคิดหลักคือ หมุนตัวอักษร จำนวน ตำแหน่งบนอักษรอักษร x ตัว
เช่น x = 1 'A' จะกลายเป็น 'B', 'C' กลายเป็น 'D' ตามลำดับ

แล้วเรา implement ในโค้ดยังไง?
โชคดี ไมยากอย่างที่คิด เราจะใช้ข้อเท็จจริงว่าตัวอักษรแทนได้ด้วยตัวเลข (ASCII codes) ทำให้การหมุนตัวอักษรกลายเป็นแค่บวกเลข 2 ตัว
สร้าง Caesar Cipher Converter ของคุณเอง
เริ่มต้นแปลง input string เป็น integer array:
ascii = "test".chars.map(&:ord)
แยกความหมาย:
เมธอด chars แยกสตริงเป็น array ของตัวอักษร คืนค่า enumerator จึงเรียก map ได้
map เหมาะสำหรับ transform ทุก element ของ array คืนค่า array ใหม่ที่ transform แล้ว
หมายเหตุ: syntax นี้ต้อง Ruby 1.9+ เทียบเท่ากับ:
ascii = "test".chars.map { |c| c.ord } เราเรียก ord บนทุก element เพื่อได้ค่า ASCII
ตัวอย่าง output:
[116, 101, 115, 116]
ขั้นตอนการหมุน (Rotation)
เพิ่มจำนวนการหมุนที่ต้องการ ใช้ map อีกครั้ง:
shifted = ascii.map { |c| c + 5 } => [121, 106, 120, 121] แปลงตัวเลขกลับเป็นตัวอักษร แล้ว join จะได้ encrypted string:
shifted.map { |c| c.chr }.join => "yjxy" เพื่อถอดรหัสกลับค่าเดิม ทำขั้นตอนเดียวกัน แต่ shift ซ้ายแทน
สำคัญ: ต้อง shift จำนวนตำแหน่งเท่าเดิม ไม่งั้นจะไม่ได้ข้อมูลเดิมกลับ
โค้ด完成版 และรุ่นทางเลือก
โค้ด Caesar cipher 完成版 ได้ที่นี่
ผลิต 26 รูปแบบที่เป็นไปได้สำหรับ string ใดๆ และจัดการ wrapping (ตัวอย่างในโพสต์ไม่รองรับ)
มีรุ่นทางเลือกใช้ Array#rotate ด้วย
อาจสนใจ: Ruby string formatting