Javaの基本データ型の表現範囲を語呂合わせで覚える。

インパクトが必要なので、できるだけ臨場感のあるものにした。


short 16ビット -32,768~32,767

ミニなロバ (32768)

解説:shortだけにミニ。小さいロバではなく、ミニスカートのロバ。


int 32ビット -2,147,483,648~2,147,483,647

自慰しなよ 破産虫歯 (2147483648)

解説:intだけにインテリメガネ。破産で虫歯の状態なら自慰するしかない。


long 64ビット -9,223,372,036,854,775,808~9,223,372,036,854,775,807

クンニ兄さん 皆プレイザル パッコしな 名古屋オハー (9223372036854775808)

解説:longだけに絶倫。クンニ兄さんが皆プレイザルでパッコしてることは説明不要。そして明け方に名古屋へ。


以上。

16×16の座標の中に半径7.7の円を描く。

16×16の座標の中に、算術関数で半径7.7の円を描く。

実数の軌跡は整数の精度で座標に描画され、円が現れる。

import static java.lang.Math.*;

import java.util.Arrays;

class Circle {

  public static void main(String[] args) throws java.lang.Exception {

    int field[][] = new int[16][16];

    double r = 7.7;
    double a = 180;

    for (int i = 1; i <= 360; i++) {
      int x = (int) (r * cos(i * PI / a) + 8);
      int y = (int) (r * sin(i * PI / a) + 8);
      field[x][y] = 1;
    }

    for (int m = 0; m < 16; m++) {
      System.out.println(Arrays.toString(field[m]));
    }

  }

}

stdout

[0, 0, 0, 0, 2, 7, 8, 7, 8, 8, 7, 2, 0, 0, 0, 0]
[0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0]
[0, 0, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 9, 0, 0]
[0, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 0]
[2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2]
[7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7]
[8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8]
[8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7]
[7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8]
[8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8]
[7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7]
[2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2]
[0, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 0]
[0, 0, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 9, 0, 0]
[0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0]
[0, 0, 0, 0, 2, 7, 8, 8, 7, 8, 7, 2, 0, 0, 0, 0]

カード組み合わせの総当りにCollections.shuffleを使う

Javaの小さなソース。

0以外の数字がひとつずつ書かれたカードをN枚並べて数を作る。
カードは重複する。

桁数を調節するための空白カードをN-1枚混ぜてランダムに抽選してN枚並べ、作った数を記録する。
数を作るたびにカードの状態は元に戻す。これを十分な回数繰り返す。

これまでに作られた数との同じ数が作られる(衝突)ことがあるので、それが連続して起こった回数を記録する。
最初のうちは衝突は稀にしか起こらないが、やがて十分な回数に近づくと新しい数は作られにくくなるので、連続して衝突が起こるようになる。

この仕組みで設定されたカードの並びで作ることができるすべての数を探す。

以下はN=6で1が3枚、2が1枚、3が2枚の場合で、十分な衝突の連続回数を1000000回として計算。

import java.util.*;
import java.lang.*;
import java.io.*;

class Test {

  public static void main(String[] args) throws java.lang.Exception {

    HashSet<Long> fixNumbers = new HashSet<Long>();
    List<String> cards = new ArrayList<String>();

    cards.add("1");
    cards.add("1");
    cards.add("1");
    cards.add("2");
    cards.add("3");
    cards.add("3");
    cards.add("");
    cards.add("");
    cards.add("");
    cards.add("");
    cards.add("");

    String word = "";
    long number = 0;
    long collision = 0;

    while (true) {

      Collections.shuffle(cards);

      word = "";
      for (int i = 0; i < Collections.frequency(cards, "") + 1; i++) {
        word += cards.get(i);
      }

      number = Long.parseLong(word);

      if (fixNumbers.add(number) != false) {
        collision = 0;
      } else {
        collision++;
      }

      if (collision >= 1000000) {
        System.out.println(fixNumbers.size());
        break;
      }

    }

  }
}