ずいほう坂ダッシュで、一番が下がってビリが上がるやり方について。
果たしてこれで本当に全体で遅い人が前に速い人が後ろに移動しているのかどうか。
単純にモデル化してシミュレーションするプログラムを組んでみた。
public class Zuiho {
static Group[] zuiho;
public static void main(String[] args) {
init();
for(int i = 0; i < 5; i++)
System.out.println(zuiho[i]);
System.out.println();
for(int t = 0; t < 100; t++) {
for(int i = 0; i < 5; i++)
zuiho[i].run();
for(int i = 0; i < 4; i++)
zuiho[i].swap(zuiho[i + 1]);
System.out.println(t + 1);
for(int i = 0; i < 5; i++)
System.out.println(zuiho[i]);
System.out.println();
}
}
static void init() {
zuiho = new Group[5];
zuiho[0] = new Group(15.0f, 14.0f, 13.0f, "A", "B", "C");
zuiho[1] = new Group(12.0f, 11.0f, 10.0f, "D", "E", "F");
zuiho[2] = new Group(9.0f, 8.0f, 7.0f, "G", "H", "I");
zuiho[3] = new Group(6.0f, 5.0f, 4.0f, "J", "K", "L");
zuiho[4] = new Group(3.0f, 2.0f, 1.0f, "M", "N", "O");
}
}
class Runner {
float speed;
String name;
Runner(float speed, String name) {
this.speed = speed;
this.name = name;
}
boolean fast_than(Runner r) {
return r.speed > this.speed ? false : true;
}
public String toString() {
return name;
}
}
class Group {
Runner r[];
Group(float s0, float s1, float s2, String n0, String n1, String n2) {
r = new Runner[3];
r[0] = new Runner(s0, n0);
r[1] = new Runner(s1, n1);
r[2] = new Runner(s2, n2);
}
void swap(int a, int b) {
Runner tmp = r[a];
r[a] = r[b];
r[b] = tmp;
}
void run() {
for(int i = 0; i < 2; i++) {
if(r[1].fast_than(r[0]))
swap(0, 1);
if(r[2].fast_than(r[1]))
swap(1, 2);
}
}
void swap(Group back) {
Runner tmp = r[0];
r[0] = back.r[2];
back.r[2] = tmp;
}
public String toString() {
return r[0] + " " + r[1] + " " + r[2];
}
}
上のプログラムのとおりに実行した結果↓
A~Oの15人がいて、速さは常にA>B>C>…>N>Oとする。
速い人が前にいる状態を初期状態として、走るごとの状態遷移は以下のとおり。
10回目まで。
A B C
D E F
G H I
J K L
M N O
1
F B C
I E A
L H D
O K G
M N J
2
I C F
L E B
O H A
N K D
J M G
3
L F I
O E C
N H B
M K A
G J D
4
O I L
N E F
M H C
J K B
D G A
5
N L O
M F I
K H E
G J C
A D B
6
M N O
K I L
J H F
D G E
A B C
7
L N O
J K M
G H I
C E F
A B D
8
M N O
I K L
F H J
D E G
A B C
9
L N O
J K M
G H I
C E F
A B D
10
M N O
I K L
F H J
D E G
A B C
あんまり面白い結果じゃなかった。
だいたい6回以内でほぼ最終状態に遷移するらしい。
それ以降はとなりの組と行ったり来たりするだけ。
これぐらいならプログラム走らせるまでもなく紙とペンで追いかけられるだろうと、あとで気づいた。