Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 SQL Server 2005 Forums
 Transact-SQL (2005)
 Conway's game of life

Author  Topic 

Transact Charlie
Master Smack Fu Yak Hacker

3451 Posts

Posted - 2009-06-01 : 11:59:28
It's been a slow afternoon so :

DECLARE @iterations INT SET @iterations = 100
DECLARE @rows INT SET @rows = 1

SET NOCOUNT ON

IF OBJECT_ID('tempdb..#field1') IS NOT NULL DROP TABLE #field1
IF OBJECT_ID('tempdb..#field2') IS NOT NULL DROP TABLE #field2

CREATE TABLE #field1 (
[x] INT
, [y] INT
)

CREATE TABLE #field2 (
[x] INT
, [y] INT
)

INSERT #field1 (
[x]
, [y]
)
SELECT 0, 0
UNION SELECT 1, 0
UNION SELECT 2, 0
UNION SELECT 2, 1
UNION SELECT 1, 2



WHILE @iterations > 0 BEGIN

PRINT 'Iteration : ' + CAST(@iterations AS VARCHAR(50))
INSERT INTO #field2 (
[x]
, [y]
)
SELECT
[x]
, [y]
FROM
(
SELECT
spawns.[x]
, spawns.[y]
, COUNT(*) AS [neighbours]
, MAX(CASE WHEN f.[x] IS NULL THEN 1 ELSE 0 END) AS [new]
FROM
(
SELECT [x] + 1 AS [x], [y] AS [y] FROM #field1
UNION ALL SELECT [x] - 1 AS [x], [y] AS [y] FROM #field1
UNION ALL SELECT [x] AS [x], [y] + 1 AS [y] FROM #field1
UNION ALL SELECT [x] AS [x], [y] - 1 AS [y] FROM #field1
UNION ALL SELECT [x] + 1 AS [x], [y] + 1 AS [y] FROM #field1
UNION ALL SELECT [x] + 1 AS [x], [y] - 1 AS [y] FROM #field1
UNION ALL SELECT [x] - 1 AS [x], [y] + 1 AS [y] FROM #field1
UNION ALL SELECT [x] - 1 AS [x], [y] - 1 AS [y] FROM #field1
)
spawns
LEFT JOIN #field1 f ON
f.[x] = spawns.[x]
AND f.[y] = spawns.[y]
GROUP BY
spawns.[x]
, spawns.[y]
)
field
WHERE
(field.[neighbours] = 3 AND [new] = 1)
OR (field.[neighbours] BETWEEN 2 AND 3 AND [new] = 0)

SET @rows = @@ROWCOUNT

IF @rows = 0 BREAK

TRUNCATE TABLE #field1
IF @iterations = 0 BEGIN
INSERT #field1 SELECT * FROM #field2
BREAK
END

SET @iterations = @iterations - 1

PRINT 'Iteration : ' + CAST(@iterations AS VARCHAR(50))
INSERT INTO #field1 (
[x]
, [y]
)
SELECT
[x]
, [y]
FROM
(
SELECT
spawns.[x]
, spawns.[y]
, COUNT(*) AS [neighbours]
, MAX(CASE WHEN f.[x] IS NULL THEN 1 ELSE 0 END) AS [new]
FROM
(
SELECT [x] + 1 AS [x], [y] AS [y] FROM #field2
UNION ALL SELECT [x] - 1 AS [x], [y] AS [y] FROM #field2
UNION ALL SELECT [x] AS [x], [y] + 1 AS [y] FROM #field2
UNION ALL SELECT [x] AS [x], [y] - 1 AS [y] FROM #field2
UNION ALL SELECT [x] + 1 AS [x], [y] + 1 AS [y] FROM #field2
UNION ALL SELECT [x] + 1 AS [x], [y] - 1 AS [y] FROM #field2
UNION ALL SELECT [x] - 1 AS [x], [y] + 1 AS [y] FROM #field2
UNION ALL SELECT [x] - 1 AS [x], [y] - 1 AS [y] FROM #field2
)
spawns
LEFT JOIN #field2 f ON
f.[x] = spawns.[x]
AND f.[y] = spawns.[y]
GROUP BY
spawns.[x]
, spawns.[y]
)
field
WHERE
(field.[neighbours] = 3 AND [new] = 1)
OR (field.[neighbours] BETWEEN 2 AND 3 AND [new] = 0)

SET @rows = @@ROWCOUNT

IF @rows = 0 BREAK

TRUNCATE TABLE #field2
SET @iterations = @iterations - 1

END

SELECT * FROM #field1





Charlie
===============================================================
Msg 3903, Level 16, State 1, Line 1736
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION

SwePeso
Patron Saint of Lost Yaks

30421 Posts

Posted - 2009-06-26 : 06:29:54
Excellent!
x	y
25 -25
26 -25
27 -25
27 -24
26 -23



E 12°55'05.63"
N 56°04'39.26"
Go to Top of Page

Transact Charlie
Master Smack Fu Yak Hacker

3451 Posts

Posted - 2009-06-26 : 07:25:20
Indeed. Glider fantastic.

Of course it's very, very slow.....

"Cool but useless" probably describes this quite nicely.


Charlie
===============================================================
Msg 3903, Level 16, State 1, Line 1736
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION
Go to Top of Page
   

- Advertisement -