
import java.io.RandomAccessFile;
import java.util.Scanner;

public class Sejtautomata {

    static boolean[][] eletter,eletter_eredeti;

    public static void main(String[] args) throws Exception {
        eletter = new boolean[50][50];
        {
            RandomAccessFile raf = new RandomAccessFile("conway.txt", "r");
            int count = 0;
            for (int i = 0; i < 50; i++) {
                char[] c = raf.readLine().toCharArray();
                for (int j = 0; j < 50; j++) {
                    if (c[j] == 's') {
                        eletter[i][j] = true;
                        count++;
                    }
                }
            }
            raf.close();
            eletter_eredeti=new boolean[50][50];//az eredeti állapota, nem lesz módosítva
            for(int i=0;i<50;i++){
                System.arraycopy(eletter[i],0 , eletter_eredeti[i], 0, 50);
            }
            //input kész
            System.out.println("2. feladat:\nAz élettérben található sejtek száma " + count);
        }

        System.out.println("3. feladat:\nA vizsgált cella oszlopa:");
        Scanner sc = new Scanner(System.in);
        {
            int k = Integer.parseInt(sc.nextLine()) - 1;
            System.out.println("A vizsgált cella sora:");
            int i = Integer.parseInt(sc.nextLine()) - 1;
            System.out.println("A cellában " + (eletter[i][k] ? "van" : "nincs") + " sejt, a szomszédos cellákban a sejtek száma " + szomszed(i, k));
        }
        {
            int count = 0;//megszámolja az életben maradó sejteket
            for (int i = 0; i < 50; i++) {//lásd egylepes
                for (int j = 0; j < 50; j++) {
                    if (eletter[i][j]) {
                        int c = szomszed(i, j);
                        if (!(c < 2 || c > 3)) {//inverz
                            count++;
                        }
                    }
                }
            }
            System.out.println("5. feladat:\nAz élettérben " + count + " olyan sejt van, amely a következő időpontban is életben marad.");
        }
        System.out.println("6. feladat:\nHány lépést végezzünk el a szimulációból:");
        int n;
        {
            n = Integer.parseInt(sc.nextLine());
            for (int i = 0; i < n; i++) {
                egylepes();
            }
            System.out.println("Az élettérben " + getNew() + " sejt fog születni a következő szimulációs lépésben.");
        }
        {
            RandomAccessFile raf = new RandomAccessFile("statisztika.txt", "rw");
            raf.setLength(0);
            raf.seek(0);
            eletter=eletter_eredeti;
            for (int i = 0; i < 100; i++) {
                egylepes();
                int alive = count();
                if (alive == 0) {
                    raf.writeBytes("A szimuláció " + (i + 1 + n) + ". lépése után az élettér már nem tartalmaz sejteket." + System.lineSeparator());
                    break;
                } else {
                    raf.writeBytes(alive + " " + getDead() + " " + getNew() + System.lineSeparator());
                }
            }
            raf.close();
        }
    }

    static int getNew() {//megszámolja a létrejövő sejteket
        int count = 0;
        for (int i = 0; i < 50; i++) {//lásd egylepes
            for (int j = 0; j < 50; j++) {
                if (!eletter[i][j]) {
                    if (szomszed(i, j) == 3) {
                        count++;
                    }
                }
            }
        }
        return count;
    }

    static int getDead() {//megszámolja az elpusztuló sejteket
        int count = 0;
        for (int i = 0; i < 50; i++) {//lásd egylepes
            for (int j = 0; j < 50; j++) {
                if (eletter[i][j]) {
                    int c = szomszed(i, j);
                    if ((c < 2 || c > 3)) {
                        count++;
                    }
                }
            }
        }
        return count;
    }

    static int count() {//megszámolja az élő sejteket
        int count = 0;
        for (boolean[] b : eletter) {
            for (boolean bo : b) {
                if (bo) {
                    count++;
                }
            }
        }
        return count;
    }

    static int szomszed(int i, int k) {
        int c = 0;
        for (int y = i - 1; y <= i + 1; y++) {
            for (int x = k - 1; x <= k + 1; x++) {
                if ((!(i == y && k == x)) && x >= 0 && y >= 0 && x < 50 && y < 50) {//igaz akkor, ha nem az (i;k) sejt és létező indexe a tömbnek
                    c += eletter[y][x] ? 1 : 0;
                }
            }
        }
        return c;
    }

    static void egylepes() {
        boolean[][] ter = new boolean[50][50];//az új eletter
        for (int i = 0; i < 50; i++) {
            for (int j = 0; j < 50; j++) {
                if (eletter[i][j]) {//ha van sejt
                    int c = szomszed(i, j);
                    ter[i][j] = !(c < 2 || c > 3); //elpusztul-e
                } else {//ha nincs
                    if (szomszed(i, j) == 3) {//létrejön
                        ter[i][j] = true;
                    }
                }
            }
        }
        eletter = ter;
    }
}
