入力したテキストをRot13にエンコードする簡単な方法を探しています。単語を個々の文字と整数に分離して、それぞれを変更して結果を出力できるようになった段階で、レンガの壁にぶつかっています。以下にリストされている単純なifステートメントを使用して1文字でそれを行うことができますが、誰かが単語全体に対してそれを行う方法を手伝ってくれるなら、私は非常に感謝します。
If kInput = "a" then kOutput = "n"
ありがとう、カイ
入力したテキストをRot13にエンコードする簡単な方法を探しています。単語を個々の文字と整数に分離して、それぞれを変更して結果を出力できるようになった段階で、レンガの壁にぶつかっています。以下にリストされている単純なifステートメントを使用して1文字でそれを行うことができますが、誰かが単語全体に対してそれを行う方法を手伝ってくれるなら、私は非常に感謝します。
If kInput = "a" then kOutput = "n"
ありがとう、カイ
この方法を必要以上に難しくしているようです。単語などを区切る必要はなく、大きなIf/Elseブロックも必要ありません。
Public Function Rot13(ByVal input As String) As String
Dim result As Char() = input.ToCharArray()
For i As Integer = 0 To result.Length - 1
Dim temp As Integer = Asc(result(i))
Select Case temp
Case 65 to 77, 97 To 109 'A - M
result(i) = Chr(temp + 13)
Case 78 to 90, 110 To 122 'N - Z
result(i) = Chr(temp - 13)
End Select
Next i
Return New String(result)
End Function
これはブラウザウィンドウに直接入力されたものであり、完全にテストされていないことに注意してください。
人々はこれに良い答えを与えているように見えますが、これが私の試みです。
Dim input As String = "This is a Test!! Guvf vf n Grfg!!"
Dim result As StringBuilder = New StringBuilder()
For Each ch As Char In input
If (Not Char.IsLetter(ch)) Then
result.Append(ch)
Continue For
End If
Dim checkIndex As Integer = Asc("a") - (Char.IsUpper(ch) * -32)
Dim index As Integer = ((Asc(ch) - checkIndex) + 13) Mod 26
result.Append(Chr(index + checkIndex))
Next
Console.WriteLine(result.ToString())
編集:大文字のチェックの必要性を取り除くために改善されました。これにより、ループ内のifステートメントが1つだけの大文字と小文字および特殊文字が適切に処理されます。
エンコードするには一度呼び出すだけで、デコードするにはもう一度呼び出します。
Private Function ROT13_Encode(ByVal Input As String) As String
Dim chrs As Char() = Input.ToCharArray()
Dim ReturnString As String = ""
Dim CharInt As Integer
For Each Chr As Char In chrs
CharInt = Asc(Chr)
If CharInt >= 65 And CharInt <= 77 Then 'A-M
CharInt += 13
ElseIf CharInt >= 78 And CharInt <= 90 Then 'M-Z
CharInt -= 13
ElseIf CharInt >= 97 And CharInt <= 109 Then 'a-m
CharInt += 13
ElseIf CharInt >= 110 And CharInt <= 122 Then 'm-z
CharInt -= 13
End If
ReturnString &= ChrW(CharInt)
Next
Return ReturnString
End Function