Gra w życie: k pokoleń

Zadanie 13 z 14 · rozdział 13Trudność: 2 z 3macierzesymulacjasąsiedzi

Treść zadania

Gra w życie Conwaya to plansza komórek, z których każda jest żywa (#) albo martwa (.). Sąsiadami komórki jest 8 komórek stykających się z nią bokiem lub rogiem. W każdym kroku (pokoleniu) wszystkie komórki zmieniają się jednocześnie według reguł:

  • żywa komórka z 2 lub 3 żywymi sąsiadami przeżywa, w przeciwnym razie umiera,
  • martwa komórka z dokładnie 3 żywymi sąsiadami ożywa, w przeciwnym razie pozostaje martwa.

Komórki poza planszą są zawsze martwe. Wczytaj planszę i liczbę k, a następnie wypisz stan planszy po k krokach.

Dane wejściowe

  • 1. linia: n m k — liczba wierszy, liczba kolumn i liczba kroków
  • następnie n linii po m znaków . lub #

Dane wyjściowe

n linii po m znaków . lub # — plansza po k krokach (bez spacji między znakami).

Ograniczenia

  • 1 ≤ n, m ≤ 20
  • 0 ≤ k ≤ 10

Uwagi

  • W każdym kroku buduj nową macierz i wypełniaj ją na podstawie starej. Jeśli zmieniasz komórki w miejscu, kolejne komórki policzą sąsiadów z już zmienionej planszy i wynik będzie błędny.
  • Przy liczeniu sąsiadów sprawdzaj, czy indeksy mieszczą się w planszy (pamiętaj, że w Pythonie indeks -1 oznacza ostatni element, a nie „poza planszą”).
  • Dla k = 0 wypisz planszę bez zmian.

Przykład

Wejście
5 5 1
.....
..#..
..#..
..#..
.....
Wyjście
.....
.....
.###.
.....
.....

Środkowa komórka ma 2 żywych sąsiadów, więc przeżywa; skrajne komórki pionowej kreski mają po 1 sąsiedzie i umierają, a komórki obok środka mają po 3 żywych sąsiadów i ożywają.

Zasady obowiązujące w rozdziale 13

Zadania w tym rozdziale ćwiczą pracę z listami dwuwymiarowymi (macierzami): tworzenie, wczytywanie, przechodzenie po wierszach i kolumnach oraz przekształcanie.
Każde zadanie (oraz każdy podpunkt) jest osobnym, niezależnym programem: czyta standardowe wejście (stdin) i wypisuje wynik na standardowe wyjście (stdout).

Konwencje wspólne:

  • Dane wczytuj dokładnie w kolejności podanej w sekcji Wejście.
  • Wiersz macierzy na wejściu to jedna linia z liczbami oddzielonymi spacjami — wczytaj całą linię i rozbij ją po spacjach (input().split()).
  • W wyjściu macierzy: każdy wiersz w osobnej linii, elementy oddzielone pojedynczą spacją.
  • Program nie wypisuje komunikatów typu „Podaj liczbę:”.

Zadanie pochodzi z otwartego zbioru Nauka-Programowania (z rozwiązaniami wzorcowymi). Zgłoś błąd w treści lub testach.

Python uruchomi się w przeglądarce przy pierwszym teście.

Kod zapisuje się automatycznie w tej przeglądarce. Tab wstawia wcięcie; aby opuścić edytor klawiaturą, naciśnij Esc, a potem Tab.

Testy

Program dostaje „Wejście” przez input() i musi wypisać „Oczekiwane wyjście”. Liczby porównywane są z tolerancją 0,01, a tekst podany w input("…") nie jest sprawdzany.

Test 1

Nie uruchomiono
Wejście
4 4 3
....
.##.
.##.
....
Oczekiwane wyjście
....
.##.
.##.
....

Test 2

Nie uruchomiono
Wejście
5 5 2
.....
..#..
..#..
..#..
.....
Oczekiwane wyjście
.....
..#..
..#..
..#..
.....

Test 3

Nie uruchomiono
Wejście
3 3 1
...
.#.
...
Oczekiwane wyjście
...
...
...

Test 4

Nie uruchomiono
Wejście
3 4 0
#..#
.##.
#..#
Oczekiwane wyjście
#..#
.##.
#..#

Test 5

Nie uruchomiono
Wejście
6 6 4
......
.#....
..#...
###...
......
......
Oczekiwane wyjście
......
......
..#...
...#..
.###..
......

Test 6

Nie uruchomiono
Wejście
1 1 1
#
Oczekiwane wyjście
.

Test 7

Nie uruchomiono
Wejście
3 3 1
##.
#..
...
Oczekiwane wyjście
##.
##.
...

Test 8

Nie uruchomiono
Wejście
5 6 3
#..#.#
.##..#
#...#.
..##..
#.#..#
Oczekiwane wyjście
......
....##
....##
....##
......
Uruchom z własnymi danymi