/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/*
プログラミングのお題スレ Part14
//mevius.5ch.net/test/read.cgi/tech/1558168409/695
695 名前:デフォルトの名無しさん[sage] 投稿日:2019/07/03(水) 23:21:16.00 ID:S/aBv8fE
お題
直線状の(配列を使った)ライフゲームがある。ルールは、
1. 両隣が生きていれば、暑苦しいので死ぬ
2. 両隣が死んでいれば、寂しいので死ぬ
3. 両隣の内、片方だけが生きていれば、生きる
4. 両端の2つについては、隣が生きていれば生きるし、隣が死んでいれば死ぬ
5. すべてのマスの状態の変更は、同時にすること
下の初期値(1 ターン目)から初めて、状態が変わらなくなるのは、何ターン目か?
nターン目と、( n + 1 )ターン目が同じなら、nターン目を答える
ただし、漏れは検証していないので、100ターンを超えたら、終了してくださいw
* は生、. は死を表す
.*...**.*.***..
*/
class Ideone
{
public static void main
(String[] args
) {
lifegame(".*...**.*.***..", false);
lifegame(".*...**.*.***..", true);
lifegame("*...", true);
}
static void lifegame
(String data,
boolean birth
) {
System.
out.
printf("'%s' (%s)%n", data, birth
? "誕生あり" : "誕生なし"); HashMap
<String, Integer
> map
= new HashMap
<>(); for (int i = 1; i <= 100; i++)
{
System.
out.
printf("% 3d: %s%n", i, data
); if (map.containsKey(data))
{
int turn = map.get(data);
if (turn == i - 1)
{
System.
out.
printf("%dターン目に停止%n", turn
); } else
{
System.
out.
printf("%dターン目にループ突入(→%d)%n", i, turn
); }
break;
}
map.put(data, i);
data = next(data, birth);
}
}
{
int l = data.length();
char[] next = new char[l];
next[0] = (data.charAt(0) == '*' || birth) ? data.charAt(1) : '.';
next[l - 1] = (data.charAt(l - 1) == '*' || birth) ? data.charAt(l - 2) : '.';
for (int i = 1; i < l - 1; i++)
{
next[i] = (data.charAt(i) == '*' || birth)
&& (data.charAt(i - 1) + data.charAt(i + 1) == '*' + '.')
? '*'
: '.';
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKgrjg5fjg63jgrDjg6njg5/jg7PjgrDjga7jgYrpoYzjgrnjg6wgUGFydDE0IAovL21ldml1cy41Y2gubmV0L3Rlc3QvcmVhZC5jZ2kvdGVjaC8xNTU4MTY4NDA5LzY5NQoKNjk1IOWQjeWJje+8muODh+ODleOCqeODq+ODiOOBruWQjeeEoeOBl+OBleOCk1tzYWdlXSDmipXnqL/ml6XvvJoyMDE5LzA3LzAzKOawtCkgMjM6MjE6MTYuMDAgSUQ6Uy9hQnY4ZkUK44GK6aGMCuebtOe3mueKtuOBrijphY3liJfjgpLkvb/jgaPjgZ8p44Op44Kk44OV44Ky44O844Og44GM44GC44KL44CC44Or44O844Or44Gv44CBCgoxLiDkuKHpmqPjgYznlJ/jgY3jgabjgYTjgozjgbDjgIHmmpHoi6bjgZfjgYTjga7jgafmrbvjgawKMi4g5Lih6Zqj44GM5q2744KT44Gn44GE44KM44Gw44CB5a+C44GX44GE44Gu44Gn5q2744GsCjMuIOS4oemao+OBruWGheOAgeeJh+aWueOBoOOBkeOBjOeUn+OBjeOBpuOBhOOCjOOBsOOAgeeUn+OBjeOCiwoKNC4g5Lih56uv44GuMuOBpOOBq+OBpOOBhOOBpuOBr+OAgemao+OBjOeUn+OBjeOBpuOBhOOCjOOBsOeUn+OBjeOCi+OBl+OAgemao+OBjOatu+OCk+OBp+OBhOOCjOOBsOatu+OBrAo1LiDjgZnjgbnjgabjga7jg57jgrnjga7nirbmhYvjga7lpInmm7Tjga/jgIHlkIzmmYLjgavjgZnjgovjgZPjgagKCuS4i+OBruWIneacn+WApCgxIOOCv+ODvOODs+ebrinjgYvjgonliJ3jgoHjgabjgIHnirbmhYvjgYzlpInjgo/jgonjgarjgY/jgarjgovjga7jga/jgIHkvZXjgr/jg7zjg7Pnm67jgYvvvJ8KbuOCv+ODvOODs+ebruOBqOOAgSggbiArIDEgKeOCv+ODvOODs+ebruOBjOWQjOOBmOOBquOCieOAgW7jgr/jg7zjg7Pnm67jgpLnrZTjgYjjgosKCuOBn+OBoOOBl+OAgea8j+OCjOOBr+aknOiovOOBl+OBpuOBhOOBquOBhOOBruOBp+OAgTEwMOOCv+ODvOODs+OCkui2heOBiOOBn+OCieOAgee1guS6huOBl+OBpuOBj+OBoOOBleOBhHcKKiDjga/nlJ/jgIEuIOOBr+atu+OCkuihqOOBmQoKLiouLi4qKi4qLioqKi4uCiovCmNsYXNzIElkZW9uZQp7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQogICAgewogICAgICAgIGxpZmVnYW1lKCIuKi4uLioqLiouKioqLi4iLCBmYWxzZSk7CiAgICAgICAgbGlmZWdhbWUoIi4qLi4uKiouKi4qKiouLiIsIHRydWUpOwogICAgICAgIGxpZmVnYW1lKCIqLi4uIiwgdHJ1ZSk7CiAgICB9CiAgICAKICAgIHN0YXRpYyB2b2lkIGxpZmVnYW1lKFN0cmluZyBkYXRhLCBib29sZWFuIGJpcnRoKQogICAgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCInJXMnICglcyklbiIsIGRhdGEsIGJpcnRoID8gIuiqleeUn+OBguOCiiIgOiAi6KqV55Sf44Gq44GXIik7CiAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSAxMDA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIlIDNkOiAlcyVuIiwgaSwgZGF0YSk7CiAgICAgICAgICAgIGlmIChtYXAuY29udGFpbnNLZXkoZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCB0dXJuID0gbWFwLmdldChkYXRhKTsKICAgICAgICAgICAgICAgIGlmICh0dXJuID09IGkgLSAxKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIlZOOCv+ODvOODs+ebruOBq+WBnOatoiVuIiwgdHVybik7CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiJWTjgr/jg7zjg7Pnm67jgavjg6vjg7zjg5fnqoHlhaUo4oaSJWQpJW4iLCBpLCB0dXJuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBtYXAucHV0KGRhdGEsIGkpOwogICAgICAgICAgICBkYXRhID0gbmV4dChkYXRhLCBiaXJ0aCk7CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgfQogICAgCiAgICBzdGF0aWMgU3RyaW5nIG5leHQoU3RyaW5nIGRhdGEsIGJvb2xlYW4gYmlydGgpCiAgICB7CiAgICAgICAgaW50IGwgPSBkYXRhLmxlbmd0aCgpOwogICAgICAgIGNoYXJbXSBuZXh0ID0gbmV3IGNoYXJbbF07CiAgICAgICAgbmV4dFswXSA9IChkYXRhLmNoYXJBdCgwKSA9PSAnKicgfHwgYmlydGgpID8gZGF0YS5jaGFyQXQoMSkgOiAnLic7CiAgICAgICAgbmV4dFtsIC0gMV0gPSAoZGF0YS5jaGFyQXQobCAtIDEpID09ICcqJyB8fCBiaXJ0aCkgPyBkYXRhLmNoYXJBdChsIC0gMikgOiAnLic7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsIC0gMTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dFtpXSA9IChkYXRhLmNoYXJBdChpKSA9PSAnKicgfHwgYmlydGgpCiAgICAgICAgICAgICAgICAgICAgJiYgKGRhdGEuY2hhckF0KGkgLSAxKSArIGRhdGEuY2hhckF0KGkgKyAxKSA9PSAnKicgKyAnLicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcqJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnLic7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgU3RyaW5nKG5leHQpOwogICAgfQp9