ZONeプログラミングコンテスト-2nd ROUND 1問目

テクノロジー

1問目はこのような問題でした。

この暗号を解けと。

puvxlhwva
fubxha
tbxvtralb
jnerjnerun
xvzvgnpuvgb
lhxban
xnaxrvjb
xvmhxhgnzr
xbabubfuvav
lnggrxvgn
fnffbxhqntn
lhxbab
fuvehfuvgbfvgr
chermragbjb
bartnvfuvgnv
ranwvqbevaxh
mbar
jb
whaovfuvgr
ubfuvvabqn
xbabartnvjb
xnanrgrxhereron
bgbanfuvxh
xbabubfuvjb
ngbavfhehgfhzbevqn
jnerjnerun
nenfbvtbgbjb
abmbznanv
znrzhxvan
urawvjb
xvgnvfuvgrveh

文字列変換の問題です。

rot13で暗号化しているというので調べてみたところ、13文字加算or減算するとものに戻るという暗号のようです。

a→n
i→v
u→h
e→r
o→b

に変換されるという例までついていますので確認してみました。

#include <stdio.h>

int main()
{
    printf("a 0x%x -> n 0x%x %d\n",'a','n','n'-'a');
    printf("i 0x%x -> v 0x%x %d\n",'i','v','v'-'i');
    printf("u 0x%x -> h 0x%x %d\n",'u','h','h'-'u');
    printf("e 0x%x -> r 0x%x %d\n",'e','r','r'-'e');
    printf("o 0x%x -> b 0x%x %d\n",'o','b','b'-'o');

    return 0;
}

実行結果は、

a 0x61 -> n 0x6e 13
i 0x69 -> v 0x76 13
u 0x75 -> h 0x68 -13
e 0x65 -> r 0x72 13
o 0x6f -> b 0x62 -13

なるほど、uとoでマイナスになっていますね。

「a」→「n」になっているので「n」はで加算か減算を変えてみればいいのかな?

文字が数字に対応していることがわかっていればわかりやすいです。

早速作ったプログラムはこんな感じに。

#include <stdio.h>

#define inc ('n'-'a')

char input[50][20]=
{
"puvxlhwva",
"fubxha",
"tbxvtralb",
"jnerjnerun",
"xvzvgnpuvgb",
"lhxban",
"xnaxrvjb",
"xvmhxhgnzr",
"xbabubfuvav",
"lnggrxvgn",
"fnffbxhqntn",
"lhxbab",
"fuvehfuvgbfvgr",
"chermragbjb",
"bartnvfuvgnv",
"ranwvqbevaxh",
"mbar",
"jb",
"whaovfuvgr",
"ubfuvvabqn",
"xbabartnvjb",
"xnanrgrxhereron",
"bgbanfuvxh",
"xbabubfuvjb",
"ngbavfhehgfhzbevqn",
"jnerjnerun",
"nenfbvtbgbjb",
"abmbznanv",
"znrzhxvan",
"urawvjb",
"xvgnvfuvgrveh",
""
};

int main()
{
    int a=0,i=0;
    char out[50]={0};
    
    while(1){
        if(input[a][0]==0){
            return 0;
        }
        for (i=0;i<50;i++){
            out[i]=0;
        }
        for(i=0;input[a][i]!=0;i++){
            if('n'> input[a][i]){
                out[i] = input[a][i] + inc;
            }else{
                out[i] = input[a][i] - inc;
            }
        }
        printf("%s\n",out);
        a++;
    }

    return 0;
}

実行結果は、

chikyujin
 shokun
 gokigenyo
 warewareha
 kimitachito
 yukona
 kankeiwo
 kizukutame
 konohoshini
 yattekita
 sassokudaga
 yukono
 shirushitosite
 purezentowo
 onegaishitai
 enajidorinku
 zone
 wo
 junbishite
 hoshiinoda
 kononegaiwo
 kanaetekurereba
 otonashiku
 konohoshiwo
 atonisurutsumorida
 warewareha
 arasoigotowo
 nozomanai
 maemukina
 henjiwo
 kitaishiteiru

さっぱり読めないのでひらがなに変換、

ちきゅじん しょくん ごきげにょ われわれは きみたちと ゆこな かんけいを きずくため このほしに やってきた さっそくだが ゆこの しるしとして ぷれぜんとを おねがいしたい えなじどりんく ぞね を じゅんびして ほしいのだ このねがいを かなえてくれれば おとなしく このほしを あとにするつもりだ われわれは あらそいごとを のぞまない まえむきな へんじを きたいしている

宇宙人さんも少し文字が抜けているので補正すると

地球人諸君、ごきげんよう。我々は、君たちと友好な関係を築くためこの星にやってきた。
早速だが、友好の印としてプレゼントをお願いしたい。エナジードリンク「ZONe」を準備して欲しいのだ。この願いを叶えてくれればおとなしくこの星を後にするつもりだ。我々は争いごとを望まない。前向きな返事を期待している。
https://mh-procon.zone-energy.jp/

コメント

タイトルとURLをコピーしました