MC102 - Algoritmos e Programação de Computadores

Jogo da Vida

Nesta tarefa, exercitaremos o uso estruturas multidimencionais em Python. O tema será o autômato celular proposto por John Horton Conway em 1970, conhecido como Jogo da Vida.

O jogo, que na verdade não tem jogadores, opera sobre um tabuleiro com células vivas e células mortas. Utilizaremos um padrão ASCII-ART em que células vivas são representadas por caracteres @ e células mortas por espaços em branco. Uma moldura com caratecteres + e - será utilizada para facilitar a visualização da delimitação dos diagramas.

+-----+
|     |
|  @  |
| @ @ |
|     |
+-----+

Na definição original, o diagrama é infinito e toda célula tem 8 vizinhos como esquematizado abaixo:

 V8  V1 V2
   \ | /
V7 - @ - V3
   / | \
 V6  V5 V4 

No nosso caso, para simplificar, consideraremos que as células adjacentes à moldura estão sempre mortas. Os estados das outras células poderão ser modificadas a partir da seguintes regras:

Todas as mortes e todos os nascimentos são calculadas simultaneamente, dando origem a uma sequência de quadros.

+-----------------+ +-----------------+ +-----------------+ +-----------------+ 
|                 | |                 | |                 | |                 |
|     @     @     | |                 | |                 | |     @     @     |
|     @     @     | |    @@     @@    | |    @@@   @@@    | |     @     @     |
|     @@   @@     | |     @@   @@     | |                 | |     @@   @@     |
|                 | |  @  @ @ @ @  @  | |  @    @ @    @  | |                 |
| @@@  @@ @@  @@@ | |  @@@ @@ @@ @@@  | |  @    @ @    @  | | @@@  @@ @@  @@@ |
|   @ @ @ @ @ @   | |   @ @ @ @ @ @   | |  @    @ @    @  | |   @ @ @ @ @ @   |
|     @@   @@     | |    @@@   @@@    | |    @@@   @@@    | |     @@   @@     |
|                 | |                 | |                 | |                 |
|     @@   @@     | |    @@@   @@@    | |    @@@   @@@    | |     @@   @@     |
|   @ @ @ @ @ @   | |   @ @ @ @ @ @   | |  @    @ @    @  | |   @ @ @ @ @ @   |
| @@@  @@ @@  @@@ | |  @@@ @@ @@ @@@  | |  @    @ @    @  | | @@@  @@ @@  @@@ |
|                 | |  @  @ @ @ @  @  | |  @    @ @    @  | |                 |
|     @@   @@     | |     @@   @@     | |                 | |     @@   @@     |
|     @     @     | |    @@     @@    | |    @@@   @@@    | |     @     @     |
|     @     @     | |                 | |                 | |     @     @     |
|                 | |                 | |                 | |                 |
+-----------------+ +-----------------+ +-----------------+ +-----------------+

Entrada

As primeiras linhas da entrada conterão um diagrama inicial para o jogo da vida no formato utilizado nos exemplos anteriores. A última linha conterá o número de passos a serem processados na sequência, ou seja, o número de quadros além do quadro original que você deverá apresentar na saída.

+------+
|      |
|      |
|  @@@ |
| @@@  |
|      |
|      |
+------+
1

Saída

A saída conterá uma repetição do diagrama inicial seguida do(s) quadro(s) solicitado(s).

+------+ +------+ 
|      | |      | 
|      | |   @  | 
|  @@@ | | @  @ | 
| @@@  | | @  @ | 
|      | |  @   | 
|      | |      | 
+------+ +------+ 

Testes para o SuSy

Esta tarefa terá 10 testes abertos com padrões conhecidos do Jogo da Vida. Note que alguns padrões estabilizam, outros desaparecem, outros oscilam e outros se deslocam no diagrama. Veja, como exemplos, os testes 2, 3, 6 e 9.

arq2.in arq2.res
+-----+
|     |
|  @  |
| @ @ |
|  @  |
|     |
+-----+
2
+-----+ +-----+ +-----+
|     | |     | |     |
|  @  | |  @  | |  @  |
| @ @ | | @ @ | | @ @ |
|  @  | |  @  | |  @  |
|     | |     | |     |
+-----+ +-----+ +-----+
arq3.in arq3.res
+----+
|    |
| @  |
| @  |
|  @ |
|    |
+----+
2
+----+ +----+ +----+
|    | |    | |    |
| @  | |    | |    |
| @  | | @@ | |    |
|  @ | |    | |    |
|    | |    | |    |
+----+ +----+ +----+
arq6.in arq6.res
+-----+
|     |
|  @  |
|  @  |
|  @  |
|     |
+-----+
5
+-----+ +-----+ +-----+ +-----+ +-----+ +-----+
|     | |     | |     | |     | |     | |     |
|  @  | |     | |  @  | |     | |  @  | |     |
|  @  | | @@@ | |  @  | | @@@ | |  @  | | @@@ |
|  @  | |     | |  @  | |     | |  @  | |     |
|     | |     | |     | |     | |     | |     |
+-----+ +-----+ +-----+ +-----+ +-----+ +-----+
arq9.in arq9.res
+-------+
|       |
|  @    |
|   @   |
| @@@   |
|       |
|       |
|       |
+-------+
7
+-------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+
|       | |       | |       | |       | |       | |       | |       | |       |
|  @    | |       | |       | |       | |       | |       | |       | |       |
|   @   | | @ @   | |   @   | |  @    | |   @   | |       | |       | |       |
| @@@   | |  @@   | | @ @   | |   @@  | |    @  | |  @ @  | |    @  | |   @   |
|       | |  @    | |  @@   | |  @@   | |  @@@  | |   @@  | |  @ @  | |    @@ |
|       | |       | |       | |       | |       | |   @   | |   @@  | |   @@  |
|       | |       | |       | |       | |       | |       | |       | |       |
+-------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+

Esta tarefa inclui dois testes fechados.

Dicas de Python 3 para esta tarefa:

Orientações para submissão

Veja aqui a página de submissão da tarefa. Lembre-se que o arquivo a ser submetido deve se chamar main.py. No link Arquivos auxiliares há um arquivo arqs-09.zip que contém todos os arquivos de testes abertos e seus respectivos resultados compactados. Os arquivos executa-testes.py e executa-testes-windows.py também estão neste pacote.

Observe o limite máximo de 20 submissões

A nota final é proporcional ao número de testes que executaram corretamente. A submissão de um código que não implementa o algoritmo solicitado, mas que exibe as saídas esperadas dos testes abertos a partir da comparação de trechos da entrada será considerada fraude e acarretará a atribuição de nota zero à média final da disciplina.

O peso desta tarefa é 3.

O prazo final para submissão é 24/06/2018.