4

文字列を受け取って文字列を返し、文字をアルファベットで 13 文字後の文字 (ROT13) に置き換える関数を作成したいと考えています。たくさんの例を見つけましたが、残念ながら、さまざまなエラーのために誰も動作させることができませんでした。たとえば、これは次のとおりです。

var key = [String:String]() // EDITED
let uppercase = Array(arrayLiteral: "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
let lowercase = Array(arrayLiteral: "abcdefghijklmnopqrstuvwxyz")
for i in 0 ..< 26 {
    key[uppercase[i]] = uppercase[(i + 13) % 26]
    key[lowercase[i]] = lowercase[(i + 13) % 26]
}

func rot13(s: String) -> String {
    return String(map(s, { key[$0] ?? $0 }))
}
4

3 に答える 3

6

実際、マッピングCharacters の最初のアプローチは良かったです。

var key = [Character: Character]()

ただし、2 つの配列は次の配列でなければなりませんCharacters

let uppercase = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters)
let lowercase = Array("abcdefghijklmnopqrstuvwxyz".characters)

(注:イニシャライザを明示的に呼び出すことは (ほとんど) ありませんxxxLiteral:。そうすると、(ほとんど) 常に実際の問題が隠されます。)

これで、辞書を埋めるコードが機能します。

for i in 0 ..< 26 {
    key[uppercase[i]] = uppercase[(i + 13) % 26]
    key[lowercase[i]] = lowercase[(i + 13) % 26]
}

文字列の変換は次のように行うことができます

//                       map
// String --> Characters ---> Characters -> String

func rot13(s: String) -> String {
    return String(s.characters.map { key[$0] ?? $0 })
}
于 2016-06-10T20:44:49.513 に答える
5

ルックアップ配列を使用しない別のアプローチを次に示します。

let input = "Hello World"

func rot13(unicodeScalar: UnicodeScalar) -> UnicodeScalar {
    var result = unicodeScalar.value

    if 65...90 ~= result { //Detect capital A ... Z
        result = (result + 13 - 65) % 26 + 65
    }
    else if 97 ... 122 ~= result { //Detect lowercase a ... z
        result = (result + 13 - 97) % 26 + 97
    }

    return UnicodeScalar(result)
}

func rot13(_ input: String) -> String {
    let resultUSs = input.unicodeScalars.map(rot13)

    var resultUSV = String.UnicodeScalarView()
    resultUSV.appendContentsOf(resultUSs) //for Swift 2.2
    //resultUSV.append(contentsOf: resultUSs) //for Swift 3.0
    return String(resultUSV)
}

let output = rot13(input)

print(output)
于 2016-06-10T21:11:03.503 に答える