カメヲラボ

主にプログラミングとお勉強全般について書いてます

CodeIQ過去問集12:【コードゴルフ】シンプル・ライフゲーム

本稿はCodeIQで2015年11月5日~2015年11月19日に出題された「【コードゴルフ】シンプル・ライフゲームという問題を再編集したものです。 ※出題時と記述が一部異なる場合がありますがご了承ください。

コードゴルフ】シンプル・ライフゲーム

ライフゲーム

ライフゲームでは、格子状のフィールドの各マス目(セル)に対して、「生」と「死」の2つの状態を初期値として与え、次のルールによって世代変化します。

各セルについて、

「生」の状態の場合

  • 周囲の8セルのうち、「生」の状態のセルが2つまたは3つ存在する場合は、「生」の状態を継続する

  • 周囲の8セルのうち、「生」の状態のセルが1つ以下または4つ以上の場合は、「死」の状態になる

「死」の状態の場合

  • 周囲の8セルのうち、「生」の状態のセルが丁度3つ存在する場合は、「生」の状態になる

☆端のセルの扱い

フィールドの上下左右端のセルはループします。 つまり、左端のセルの左は右端のセル、上端のセルの上は下端のセルと考えてください。 たとえば、下図の黄色い部分(一番左上のセル)の周囲8セルは、青い部分になります。

【問題】

フィールドの初期状態と世代数Nを標準入力から受け取り、初期状態からN世代後の状態を出力するコードを『できるだけ短く』書いてください。

【入力】

標準入力の1~3行目は整数値で、1行目は世代数N、2行目はフィールドの縦のサイズH、3行目はフィールドの横のサイズWです。 (N≦30, H≦40, W≦35)

4行目以降H行は、長さWの文字列です。

文字列は『』と『.』のいずれかで、『』が「生」の状態、『.』は「死」の状態を表します。

【出力】

標準出力に、初期状態からN世代後のフィールドを出力してください。

【入出力サンプル 】

Case 1: Input

3
4
5
.....
.***.
...*.
.....

Case 1: Output

..**.
.*..*
..**.
.....

Case 2: Input

5
8
7
.......
.....**
.....**
.......
..*....
..*.*..
.*.*...
...*...

Case 2: Output

.......
.....**
.....**
.......
...*...
.**....
...**..
..*....

↓からサンプルデータをダウンロードできます https://bitbucket.org/ozy4dm/codeiq/downloads/lifegame.zip

【解説】