Sunday, 14 December 2014

[Programming] phê ROT13

Lâu rồi cảm giác phê ấy mới trở lại ~^.^~
Giống như mỗi lần vắt óc giải một bài ProjectEuler và bấm vào nút check kết quả thấy nó màu xanh :3

Hôm nay là ROT13, thật ra nó chẳng có gì phức tạp cả, nhưng sau khi implement được ROT13 sử dụng một ngôn ngữ mới thì lại phải phê.

Tại sao lại là ROT13 - 13 - 13 - 13 ?
ROT13 ("rotate by 13 places") là một phương pháp "mã hoá" đơn giản bằng việc thay thế 1 chữ cái bằng chữ cách nó 13 chữ cái trong bảng chữ cái tiếng Anh. Lý do có số 13 (mà không phải 14 hay 15 cho trăng tròn) bởi bảng chữ cái tiếng Anh gồm 26 chữ, và nhờ vậy mà để giải mã các ký tự đã bị đảo đi, người ta chỉ cần dịch nó đi tiếp 13 chữ là thu được kết quả ban đầu. Tưởng tượng bảng chữ cái là một vòng tròn như sau: ... a b c ... x y z a b c ...

Hoặc tưởng tượng khác đi một chút, hãy chia bảng chữ cái làm đôi và xếp cạnh nhau, ta có:
a  b  c  d  e  f  g  h  i  j  k  l  m
n  o  p  q  r  s  t  u  v  w  x  y  z
ROT13 chỉ việc thay một chữ cái bằng chữ tương ứng ở nửa bên kia (a - n, b - o, ... ).

Tất nhiên nếu thích, bạn có thể phát minh ra vài cái ROT với một số khác, kiểu ROT6, ROT9, ROT906 đều được cả, chỉ là nó không thể dùng 1 phương pháp duy nhất mà lại vừa "mã hoá" lại vừa "giải mã" được mà thôi. ROT5 và ROT47 là hai phương pháp cũng phổ biến sau ROT13.


Khi viết trên máy tính, vấn đề phức tạp hơn một chút vì bảng mã ASCII là bảng mã 256 ký tự và nó không phải là "vòng tròn". Nhưng chỉ cần giải quyết cộng trừ một chút thì sẽ ra ngay, rất thích hợp làm bài tập về nhà cho các sinh viên năm nhất năm hai ngành lập trình.

Một vài điều thú vị về ROT13:
- Người dùng terminal có thể dùng lệnh sau để thực hiện ROT13:
$ echo "The Quick Brown Fox Jumps Over The Lazy Dog" | tr 'A-Za-z' 'N-ZA-Mn-za-m'
Gur Dhvpx Oebja Sbk Whzcf Bire Gur Ynml Qbt
$ echo "The Quick Brown Fox Jumps Over The Lazy Dog" | tr 'A-Za-z' 'N-ZA-Mn-za-m' | tr 'A-Za-z' 'N-ZA-Mn-za-m'
The Quick Brown Fox Jumps Over The Lazy Dog
- Người dùng vim có thể gõ g? để ROT13 nội dung từ đang chọn (ví dụ để ROT13 một dòng, bấm V (shift +v) , bấm g?.

Khi test với dòng chữ "nananana", ban biên tập đã rất bất ngờ khi nhận được kết quả sau khi "ROT13" là: "anananan". Điều này thật là kỳ diệu và chúng tôi cảm ơn ca sỹ Bảo Thy đã bí mật đưa những thứ này vào ca khúc "Công chúa bong bóng" :x :x :x.

PS: code python để sinh ra hai nửa bảng chữ cái:
In [9]: import string
In [15]: '  '.join(string.lowercase[13:])
Out[15]: 'n  o  p  q  r  s  t  u  v  w  x  y  z'

In [16]: '  '.join(string.lowercase[:13])
Out[16]: 'a  b  c  d  e  f  g  h  i  j  k  l  m'
Python function để trả về giá trị số thứ tự (ordinal) của một ký tự - ord:
In [30]: ord('m')
Out[30]: 109
Python built-in function trả về giá trị string của một số (trong khoảng 0-255) - chr:
In [34]: chr(65)
Out[34]: 'A'
Hoặc unichr để trả về string của một thứ tự trong bảng mã unicode:
In [41]: unichr(123)
Out[41]: u'{'
Hết.
hvn@familug.org