iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0

CodeWars 題目

Link

難度

5 kyu

題目

函數接受一個字串並傳回使用 Rot13 加密的字串;但如果字串中包含數字或特殊字符,則直接返回。

思路

Rot13 將英文拆分成 13 個字母為一列的組合,一列以 A 為首、一列以 N 為首,並且兩個組合倆倆相對;也就是說經過加密之後,A 應該會被替換成另一列的對應位置:N。
其他依此類推,並且區分大小寫。

利用 charCodeAt 方法驗證後,兩個組合 Unicode 編碼差異為 13。
因此針對英文字母的 Unicode,返回對應編碼的字串即可。

實作

function rot13(message) {
	return message.replace(/[A-Za-z]/g, (match) => {
		const code = match.charCodeAt(0);
		if ((code > 77 && code <= 90) || code >= 110) {
			return String.fromCharCode(code - 13);
		}
		return String.fromCharCode(code + 13);
	});
}

使用字串取代方法 replace,查找字串中的所有大小寫英文字母字元。

code 獲取該字元的 Unicode 編碼,> 77 && code <= 90 判斷是否為大寫英文字母 N 開始的字;>= 110 判斷是否為小寫英文字母 n 開始的字。

大寫字母 "A" Unicode 十進位:65。
小寫字母 "a" Unicode 十進位:97。
大寫字母 "N" Unicode 十進位:78。
小寫字母 "n" Unicode 十進位:110。

因此利用這個數值範圍,再用 fromCharCode 取得 Unicode 編碼回傳的數字即可。

心得

開始解程式之後才發現,僅僅只是一題的題目,也可以有眾多的類別。
可以考數學、考函數式程式設計、甚至可以考 IP 轉換、密碼學⋯⋯等等。

以前總是不懂為什麼很多技術文章,常常看到用說故事的方式去寫?
仔細想想,其實不是說背景故事,而是在「交代規則」才對。


上一篇
Number of trailing zeros of N!
下一篇
Primes in numbers
系列文
解三十天的 CodeWars30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言