続・Javaでサイコロ(六面体)のアクションを考えてみる

f:id:ts0818:20190504210302j:plain

サトシ・ナカモトラテン文字表記: Satoshi Nakamoto)は、ビットコインプロトコルと、そのリファレンス実装であるビットコインコア (Bitcoin Core/Bitcoin-Qt) を作ったことで知られる人物の称する氏名。

本名であるか、そもそも個人であるかどうかを含め、正体は不明。

公式には漢字表記は存在しないが、一部において中本哲史という表記で言及されることがある

サトシ・ナカモト - Wikipedia

⇧  皆々様ご存知、 「ビットコイン」の生みの親と言われてるお方ですね。

ナカモトは日本のメディアで「謎の日本人」として紹介されることがある

しかし、ナカモトの英語が流暢であり、彼のビットコインに関する論文に日本語が使われていないため、日本人説を疑問視する見方がある

彼のビットコインに関する最初のソフトウェアは共同作業によるものと推測されており、このため、サトシ・ナカモトとは特定の個人ではなく、あるグループが共有して使っている偽名であるという主張もある

サトシ・ナカモト - Wikipedia

⇧  「あるグループが共有して使っている偽名であるという主張もある」って...

その構造って...海外ドラマ『ウォーキング・デッド』の「救世主」ってグループが使ってた「ニーガン」やん!

ciatr.jp

⇧  みんなして、ニーガン、ニーガン言ってましたけど...

はい、全然関係ない話を延々としたところで、どうもボクです。サイコロのアクションをプログラミング の第2弾ということで、レッツトライ~。

 

サイコロを振った後の結果を知りたい

まぁ、今回も、

judge.u-aizu.ac.jp

⇧  上記サイト様の問題にトライということで。

Eclipseを起動し、適当なJavaプロジェクト、クラスを作成で。

f:id:ts0818:20190504223103p:plain

ソースコードはこんな感じ。

Dice01.java

package dto;

public class Dice01 {
  private int number[];
  private int work[];

  public Dice01() {

  }

  public Dice01(String[] args) {
    number = new int[args.length];
    work = new int[args.length];
    // サイコロの初期化
    for (int i = 0; i < args.length; i++) {
      number[i] = Integer.parseInt(args[i]);
    }
  }

  public void rollDice(char action, int num) {
    for (int i = 0; i < num; i++) {
      this.work[i] = this.number[i];
    }

    switch (action) {
    case 'E':
      // West→Top, South→South, Top→East, Bottm→West, North→North, East→Bottom
      setNumber(work[3], work[1], work[0], work[5], work[4], work[2]);
      break;
    case 'N':
      // South→Top, Bottom→South, East→East, West→West, Top→Nouth, Nouth→Bottom
      setNumber(work[1], work[5], work[2], work[3], work[0], work[4]);
      break;
    case 'S':
      // North→Top, Top→South, East→East, West→West, Bottom→North, South→Bottom
      setNumber(work[4], work[0], work[2], work[3], work[5], work[1]);
      break;
    case 'W':
      // East→Top, South→South, Bottom→East, Top→West, North→North, West→Bottom
      setNumber(work[2], work[1], work[5], work[0], work[4], work[3]);
      break;
    default :
      break;
    }
  }

  public void setNumber(int n1, int n2, int n3, int n4, int n5, int n6) {
    this.number[0] = n1;
    this.number[1] = n2;
    this.number[2] = n3;
    this.number[3] = n4;
    this.number[4] = n5;
    this.number[5] = n6;
  }

  public int takeTopNumber() {
    return this.number[0];
  }
  
  public int takeSouthNumber() {
    return this.number[1];
  }
  
  public int takeEastNumber() {
    return this.number[2];
  }
}

 

package main;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import dto.Dice01;

public class TestDice02 {

  public static void main(String[] args) {
    // TODO 自動生成されたメソッド・スタブ
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    List<Integer> eastList = new ArrayList<>();
    char[] actionArr = {'N', 'E', 'S', 'W'};  // サイコロをどう振るか
    Random random = new Random();
    try {
      String[] diceNumber = br.readLine().split("\\s");
      Dice01 dice01 = new Dice01(diceNumber);
      int q = Integer.parseInt(br.readLine());
      for (int i = 0; i < q; i++) {
        String[] topAndSouth = br.readLine().split("\\s");
        while(true) {
          // 適当にサイコロを振る
          dice01.rollDice(actionArr[random.nextInt(4)], diceNumber.length);
          // 上面と、前面の数字が条件に合えば、
          if (dice01.takeTopNumber() == Integer.parseInt(topAndSouth[0])
              && dice01.takeSouthNumber() == Integer.parseInt(topAndSouth[1])) {
            // 右面の数字を格納
            eastList.add(dice01.takeEastNumber());
            break; // 処理を抜ける
          }
        }
      }
      // 結果を出力
      for (int east: eastList) {
        System.out.println(east);
      }
      
    } catch (NumberFormatException e) {
      // TODO 自動生成された catch ブロック
      e.printStackTrace();
    } catch (IOException e) {
      // TODO 自動生成された catch ブロック
      e.printStackTrace();
    }
  }
}

んで、実行。

f:id:ts0818:20190504223533p:plain

入力値は、

Input

1行目に各面の整数が、ラベルの順番に空白区切りで与えられます。
2行目に質問の数 q が与えられます。

続く q 行に質問が与えられます。各質問では上面と前面の整数が空白区切りで1行に与えられます。

サイコロ 2 | プログラミング入門 | Aizu Online Judge

ということで、 

f:id:ts0818:20190504223030p:plain

できました~。

サイコロが転がってる映像でも無いと、哀しい気持ちになりますね...

今回はこのへんで。