Top >コンソール・アプリケーション集

プニグマ punigma Java

import java.io.*;

/**
* ローターの機能に対応するクラス
*/

class Roter
{
    protected int[] mWire = new int[26];    // 結線
    protected int mPosition;                // 位置

    /**
    * 結線を設定する
    *
    * @param n1 結線する端子(0~25)
    * @param n2 結線する端子(0~25)
    */

    protected void Connect(int n1, int n2)
    {
        // n1 を n2 に、n2 を n1 に結線する
        mWire[n1] = n2;
        mWire[n2] = n1;
    }

    /**
    * コンストラクタ
    */

    public Roter()
    {
        // ローターの結線を設定します
        // 0~25が、必ず1回、使用されるようにします
        Connect(16, 6);
        Connect(15, 20);
        Connect(0, 21);
        Connect(17, 22);
        Connect(7, 2);
        Connect(5, 11);
        Connect(12, 23);
        Connect(10, 1);
        Connect(8, 24);
        Connect(3, 25);
        Connect(18, 9);
        Connect(13, 4);
        Connect(14, 19);

        // ローターの初期位置を設定
        mPosition = 0;
    }

    /**
    * 現在のローターの位置を取得する
    */

    public int GetPosition()
    {
        return mPosition;
    }

    /**
    * 文字を変換する
    *
    * @param ch 変換する文字
    * @return 変換された文字
    */

    public char Encode(char ch)
    {
        int n = (ch - 'A' + mPosition) % 26;
        int encoded = 'A' + ((mWire[n] - mPosition + 26) % 26);

        mPosition++;

        return (char)encoded;
    }

    /**
    * ローターを回転する
    *
    * @param n 回転する量
    */

    public void Rotate(int n)
    {
        mPosition = (mPosition + n) % 26;
    }

}

/**
* 本体みたいなクラス
*/

public class Punigma
{
    /**
    * 画面の表示
    *
    * @param roter ローター
    * @param input 入力された文字列
    * @param encoded 変換された文字列
    */

    static void ShowPunigma(Roter roter, String input, String encoded)
    {
        String str0 = "------------------------";
        String str1 = "Q W E R T Y U I O P   |||";
        String str2 = " A S D F G H J K L    |*|";
        String str3 = "  Z X C V B N M       |||";

        str2 = str2.replace('*', (char)('A' + roter.GetPosition()));

        System.out.println(str0);
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);

        System.out.println("\n" + input + "      " + encoded);
    }

    /**
    * main
    */

    public static void main( String[] args ) throws IOException
    {
        Roter roter = new Roter();
        String input = "";
        String encoded = "";
        boolean reset = false;     // 文字列表示のリセット

        // 操作ガイドを表示
        System.out.println("1~9の数字を入力するとローターが回転します。");
        System.out.println("A~Zを入力すると右側に変換した文字を表示します。");
        System.out.println("0を入力するとプログラムを終了します。");

        BufferedReader br = new BufferedReader(
                            new InputStreamReader( System.in ) );

        while (input.length() < 30)
        {
            // 画面を表示
            ShowPunigma(roter, input, encoded);

            // 1行入力
            String line = br.readLine();

            if( line.length() == 0 )
                continue;

            // 大文字として最初の文字を取り出す
            char ch = line.toUpperCase().charAt(0);

            if ('A' <= ch && ch <= 'Z')
            {
                // アルファベットの場合
                if (reset)
                {
                    // 表示をリセット
                    input = "";
                    encoded = "";
                    reset = false;
                }

                input += ch;
                encoded += roter.Encode(ch);
            }
            else if ('1' <= ch && ch <= '9')
            {
                // 数字の場合。ローターを回す

                roter.Rotate(ch - '0');

                reset = true;
            }
            else
            {
                break;
            }
        }
    }
}
PAPER BOWL
NEZEN