teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

サンプル追記

2018/09/02 14:12

投稿

otn
otn

スコア86349

answer CHANGED
@@ -1,2 +1,46 @@
1
1
  面を一面しか持ってないように見えますが?
2
- 今の面と、次の時点の面の、2面は最低必要ですよ。
2
+ 今の面と、次の時点の面の、2面は最低必要ですよ。
3
+ #追記
4
+ Rubyですが、書いてみました。
5
+ ```Ruby
6
+ data = <<EOF
7
+ ++++++++++
8
+ ++++++++++
9
+ +++OOOO+++
10
+ ++++++++++
11
+ ++++++++++
12
+ EOF
13
+
14
+ board = data.split(/\n/).map{|x| x.split(//)}
15
+
16
+ Y = board.size
17
+ X = board[0].size
18
+
19
+ def alive(board,y,x)
20
+ return 0 if x<0 or x>=X or y<0 or y>=Y
21
+ board[y][x] == "O" ? 1 : 0
22
+ end
23
+
24
+ def update(t0, t1)
25
+ (0...Y).each do |i|
26
+ (0...X).each do |j|
27
+ life = alive(t0,i-1,j-1)+alive(t0,i-1,j)+alive(t0,i-1,j+1)+
28
+ alive(t0,i ,j-1)+ alive(t0,i ,j+1)+
29
+ alive(t0,i+1,j-1)+alive(t0,i+1,j)+alive(t0,i+1,j+1)
30
+ t1[i][j] =
31
+ case life
32
+ when 2 then t0[i][j]
33
+ when 3 then "O"
34
+ else "+"
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ while gets == "\n"
41
+ puts board.map{|x| x.join}
42
+ next_board = Array.new(Y){Array.new(X)}
43
+ update(board, next_board)
44
+ board = next_board
45
+ end
46
+ ```