Problem Q: 合い言葉

あなたは,とあるマフィアを捜査している捜査官である.長年の追跡の結果,あなたはとうとうマフィアのアジトの場所をつきとめ,マフィアの連中を一網打尽にする絶好の機会を得た.この機会を逃すわけにはいかない.

アジトに進入するには,見張りの人間に対して合い言葉を言う必要がある.幸いにして,あなたは合い言葉に関する情報を既に手に入れていた: 見張りが言ってくる言葉をそのまま逆さにして答えればよいのだ.

あなたは万が一にも失敗できない.このミッションを確実に成功させるために,あなたは合い言葉を瞬時に言えるように合い言葉を生成するプログラムを準備することにした.

Input

入力は複数のデータセットからなる.入力の先頭にデータセット数を表す数 N のみを含む行が与えられ,以降の N 行にそれぞれのデータセットが与えられる.

それぞれのデータセットは1行の文字列からなっており,これはマフィアの見張りが言ってくる言葉を表している.見張りが言ってくる言葉は ASCII の表示可能な文字(アルファベット・数字・記号)のみからなっており,スペースやタブなどの空白文字や制御文字は含まれない.与えられる文字列は空でなく,またその長さは50文字を越えない.

Output

それぞれのデータセットに対して,見張りの言ってくる言葉に対応する合い言葉を1行で出力せよ.アルファベットの大文字と小文字は区別することに注意せよ.

Sample Input

3
Welcome
01234567890123456789012345678901234567890123456789
--%-***!

Output for Sample Input

emocleW
98765432109876543210987654321098765432109876543210
!***-%--

解答例

以下に C, C++, Java によるこの問題の解答例を示す.

C

#include <stdio.h>
#include <string.h>

int main(void)
{
    int cases, len, i, j;
    char buf[51];

    scanf("%d", &cases);
    for (i = 0; i < cases; ++i) {
        scanf("%s", buf);
        len = strlen(buf);
        for (j = len - 1; j >= 0; --j) putchar(buf[j]);
        puts("");
    }
    return 0;
}

C++

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    int cases;
    cin >> cases;
    for (int i = 0; i < cases; ++i) {
        string msg;
        cin >> msg;
        reverse(msg.begin(), msg.end());
        cout << msg << '\n';
    }
    return 0;
}

Java

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int cases = sc.nextInt();
        for (int i = 0; i < cases; ++i) {
            String msg = sc.next();
            StringBuffer buf = new StringBuffer(msg);
            buf.reverse();
            System.out.println(buf);
        }
    }
}

東京大学プログラミングコンテスト 2008
Problemsetter: Yuta Kitamura