這是@AMomch的替代版本它採用了switch
少數學和ilov的rot13
消除幻數:
func rot13(unicodeScalar: UnicodeScalar) -> Character {
var result = unicodeScalar.value
switch unicodeScalar {
case "A"..."M", "a"..."m":
result += 13
case "N"..."Z", "n"..."z":
result -= 13
default:
break
}
return Character(UnicodeScalar(result))
}
func rot13(input: String) -> String {
return String(input.unicodeScalars.map(rot13))
}
print(rot13("Uryyb, jbeyq!")) // "Hello, world!"
泛化rotN
我已經讓他們採取採取rot13
功能上面,並推廣他們rotN
一組ClosedInterval<UnicodeScalar>
。這允許您以非常直接的方式實施rot13
,rot47
,rot5
以及rot13
和rot5
的組合。
func rotN(unicodeScalar: UnicodeScalar, intervals:[ClosedInterval<UnicodeScalar>]) -> Character {
var result = unicodeScalar.value
for interval in intervals {
let half = (interval.end.value - interval.start.value + 1)/2
let halfway = UnicodeScalar(interval.start.value + half)
switch unicodeScalar {
case interval.start..<halfway:
result += half
case halfway...interval.end:
result -= half
default:
break
}
}
return Character(UnicodeScalar(result))
}
func rotN(input: String, intervals:[ClosedInterval<UnicodeScalar>]) -> String {
return String(input.unicodeScalars.map {rotN($0, intervals: intervals)})
}
func rot13(input: String) -> String {
return rotN(input, intervals:["A"..."Z", "a"..."z"])
}
func rot47(input: String) -> String {
return rotN(input, intervals:["!"..."~"])
}
func rot5(input: String) -> String {
return rotN(input, intervals:["0"..."9"])
}
func rot13and5(input: String) -> String {
return rotN(input, intervals:["A"..."Z", "a"..."z", "0"..."9"])
}
print(rot13("Uryyb, jbeyq!")) // "Hello, world!"
print(rot47("%96 BF:4< [email protected]? [email protected]")) // "The quick brown fox"
print(rot5("6 + 7 = 8")) // "1 + 2 = 3"
print(rot13and5("Whyl 9, 6221")) // "July 4, 1776"
這是基於的rotN
版本在原有@AMomchilov's
rot13
:
func rotN(unicodeScalar: UnicodeScalar, intervals:[ClosedInterval<UnicodeScalar>]) -> UnicodeScalar {
var result = unicodeScalar.value
for interval in intervals {
let start = interval.start.value
let length = interval.end.value - start + 1
if interval ~= unicodeScalar {
result = (result + length/2 - start) % length + start
}
}
return UnicodeScalar(result)
}
func rotN(input: String, intervals:[ClosedInterval<UnicodeScalar>]) -> String {
return String(input.unicodeScalars.map {Character(rotN($0, intervals:intervals))})
}
爲什麼不乾脆讓按鍵陣列一個字符串數組? – user2277872
你試圖用'$ 0'來獲得'key'中的元素,這是一個'Character',而不是'Int' – Alexander
謝謝。我現在將密鑰設置爲一個字符串數組。現在有一個字符串seq問題:「extraneous argument label'seq:'in call」 – Cue