トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
No.18 うーさー暗号
■■■問題■■■
太郎君は暗号に興味があり、新しい暗号方式を考えていました。
そこで大昔に開発されたシーザー暗号を参考にし、
すこし変更することでもうちょっと複雑な暗号方式を作ろうと思いつきました。
シーザー暗号とは、平文(暗号化されていない文)のアルファベットを、
右にN回ずらしたもので、たとえば N=1 の場合、
'A'は'B'になり、'M'は'N'になり、'Z'は'A'になります。
そこで太郎君は、文字ごとにNの値を変更することを考え、
1文字目なら N=1、そして2文字目なら N=2、・・・のように、
「i文字目の文字をi回右にずらす」ことにしました。
(ずらした結果、文字'Z'を超える場合はシーザー暗号と同様に文字'A'へ戻ります)
そして太郎君は、この新しい暗号方式を「うーさー暗号」と名づけました。
入力に「うーさー暗号」で暗号化された文字列が与えられるので、
これを復号した文字列を出力してください。
■■■入力■■■
S
文字列Sが1行(1024文字以内)で与えられます。
文字列Sを構成する各文字はアルファベット大文字('A'-'Z')のみで、
復号後の文字列もすべてアルファベット大文字のみで構成されます。
■■■出力■■■
入力文字列を復号した文字列
最後に改行してください。
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "Input1";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("BCD");
//AAA
}
else if (InputPattern == "Input2") {
WillReturn.Add("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
//ZZZZZZZZZZZZZZZZZZZZZZZZZZ
}
else if (InputPattern == "Input3") {
WillReturn.Add(new string('Z', 104));
//YXWVUTSRQPONMLKJIHGFEDCBAZYXWVUTSRQPONMLKJIHGFEDCB
//AZYXWVUTSRQPONMLKJIHGFEDCBAZYXWVUTSRQPONMLKJIHGFED
//CBAZ
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
string S = InputList[0];
var sb = new System.Text.StringBuilder();
for (int I = 0; I <= S.Length - 1; I++) {
sb.Append(ZurashiSyori(S[I], I + 1));
}
Console.WriteLine(sb.ToString());
}
//対象文字を、指定文字分ずらす
static char ZurashiSyori(char pTarget, int pN)
{
while (27 <= pN) pN -= 26;
char wkChar = (char)(pTarget - pN);
if ('A' <= wkChar) return wkChar;
return (char)('Z' - ('A' - wkChar - 1));
}
}
解説
ナイーブに実装してます。