首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码高尔夫:康威的生命游戏

代码高尔夫:康威的生命游戏
EN

Stack Overflow用户
提问于 2010-08-17 05:22:28
回答 10查看 19.3K关注 0票数 76

的挑战:编写了实现JohnH.Conway生命游戏元胞自动机的最短程序。[链接]

编辑:经过大约一个星期的竞争后,我选择了一个胜利者:pdehaan,用perl以一个字符击败了解决方案。

对于那些没有听说过“生命游戏”的人来说,你需要一个方形细胞的网格(理想的无限)。细胞可以是活的(充满的)或者是死的(空的)。我们通过应用以下规则来确定哪些细胞在下一阶段是活的:

  1. 任何活的细胞,如果少于两个活的邻居,就会死亡,就好像是由人口不足引起的。
  2. 任何有三个以上活邻居的活牢房都会死,好像是过度拥挤所致。
  3. 任何有两三个活邻居的活细胞都会活到下一代。
  4. 任何有三个活邻居的死细胞都会变成活细胞,就像通过繁殖一样。

您的程序将读取作为命令行参数指定的40x80字符的ASCII文本文件,以及要执行的迭代次数(N)。最后,经过N次迭代,它将输出到ASCII文件out.txt系统的状态。

下面是一个使用相关文件运行的示例:

in.txt:

代码语言:javascript
复制
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
..................................XX............................................
..................................X.............................................
.......................................X........................................
................................XXXXXX.X........................................
................................X...............................................
.................................XX.XX...XX.....................................
..................................X.X....X.X....................................
..................................X.X......X....................................
...................................X.......XX...................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................

迭代100次:

代码语言:javascript
复制
Q:\>life in.txt 100

结式输出(out.txt)

代码语言:javascript
复制
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
..................................XX............................................
..................................X.X...........................................
....................................X...........................................
................................XXXXX.XX........................................
................................X.....X.........................................
.................................XX.XX...XX.....................................
..................................X.X....X.X....................................
..................................X.X......X....................................
...................................X.......XX...................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................

The Rules:

  • 您需要使用文件I/O来读取/写入文件。
  • 您需要接受一个输入文件和作为参数的迭代次数。
  • 您需要以指定的格式生成out.txt (如果存在覆盖)。
  • 您不需要处理板的边缘(环绕,无限网格.etc)
  • 编辑:您的do需要在输出文件中有换行符。

胜利者将由字符计数决定。

祝好运!

EN

回答 10

Stack Overflow用户

发布于 2010-08-19 13:48:58

Python2.x-210/234个字符

好吧,210个字符的密码有点作弊。

代码语言:javascript
复制
#coding:l1
exec'xÚ=ŽA\nÂ@E÷sŠº1­ƒÆscS‰ØL™Æª··­âî¿GÈÿÜ´1iÖ½;Sçu.~H®J×Þ-‰­Ñ%ª.wê,šÖ§J®d꘲>cÉZË¢V䀻Eîa¿,vKAËÀå̃<»Gce‚ÿ‡ábUt¹)G%£êŠ…óbÒüíÚ¯GÔ/n×Xši&ć:})äðtÏÄJÎòDˆÐÿG¶'.decode('zip')

您可能无法复制和粘贴这些代码并使其工作。它应该是拉丁文1 (ISO-8859-1),但我认为它在前进的过程中被曲解到了Windows1252中。此外,您的浏览器可能吞下一些非ASCII字符。

因此,如果它不能工作,您可以从普通的7位字符生成文件:

代码语言:javascript
复制
s = """
23 63 6F 64 69 6E 67 3A 6C 31 0A 65 78 65 63 27 78 DA 3D 8E 41 5C 6E C2
40 0C 45 F7 73 8A BA 31 13 AD 83 15 11 11 C6 73 08 63 17 05 53 89 D8 4C
99 C6 AA B7 B7 AD E2 EE BF 47 C8 FF DC B4 31 69 D6 BD 3B 53 E7 75 2E 7E
48 AE 4A D7 DE 90 8F 2D 89 AD D1 25 AA 2E 77 16 EA 2C 9A D6 A7 4A AE 64
EA 98 B2 3E 63 C9 5A CB A2 56 10 0F E4 03 80 BB 45 16 0B EE 04 61 BF 2C
76 0B 4B 41 CB C0 E5 CC 83 03 3C 1E BB 47 63 65 82 FF 87 E1 62 55 1C 74
B9 29 47 25 A3 EA 03 0F 8A 07 85 F3 62 D2 FC ED DA AF 11 47 D4 2F 6E D7
58 9A 69 26 C4 87 3A 7D 29 E4 F0 04 74 CF C4 4A 16 CE F2 1B 44 88 1F D0
FF 47 B6 27 2E 64 65 63 6F 64 65 28 27 7A 69 70 27 29
"""

with open('life.py', 'wb') as f:
    f.write(''.join(chr(int(i, 16)) for i in s.split()))

其结果是一个有效的210字符Python源文件。我在这里所做的就是对原始Python源代码进行压缩压缩。真正的欺骗是我在结果字符串中使用非ASCII字符。它仍然是有效的代码,只是很麻烦。

非压缩版本有234个字符,我认为这仍然是值得尊敬的。

代码语言:javascript
复制
import sys
f,f,n=sys.argv
e=open(f).readlines()
p=range
for v in p(int(n)):e=[''.join('.X'[8+16*(e[t][i]!='.')>>sum(n!='.'for v in e[t-1:t+2]for n in v[i-1:i+2])&1]for i in p(80))for t in p(40)]
open('out.txt','w').write('\n'.join(e))

对于水平滚动很抱歉,但是上面所有的换行符都是必需的,我已经把它们计算为每个字符。

我不会试着读金币密码的。随机选择变量名以实现最佳压缩。是的,我是认真的。更好的格式和注释版本如下:

代码语言:javascript
复制
# get command-line arguments: infile and count
import sys
ignored, infile, count = sys.argv

# read the input into a list (each input line is a string in the list)
data = open(infile).readlines()

# loop the number of times requested on the command line
for loop in range(int(count)):
    # this monstrosity applies the rules for each iteration, replacing
    # the cell data with the next generation
    data = [''.join(

                # choose the next generation's cell from '.' for
                # dead, or 'X' for alive
                '.X'[

                    # here, we build a simple bitmask that implements
                    # the generational rules.  A bit from this integer
                    # will be chosen by the count of live cells in
                    # the 3x3 grid surrounding the current cell.
                    #
                    # if the current cell is dead, this bitmask will
                    # be 8 (0b0000001000).  Since only bit 3 is set,
                    # the next-generation cell will only be alive if
                    # there are exactly 3 living neighbors in this
                    # generation.
                    #
                    # if the current cell is alive, the bitmask will
                    # be 24 (8 + 16, 0b0000011000).  Since both bits
                    # 3 and 4 are set, this cell will survive if there
                    # are either 3 or 4 living cells in its neighborhood,
                    # including itself
                    8 + 16 * (data[y][x] != '.')

                    # shift the relevant bit into position
                    >>

                    # by the count of living cells in the 3x3 grid
                    sum(character != '.' # booleans will convert to 0 or 1
                        for row in data[y - 1 : y + 2]
                        for character in row[x - 1 : x + 2]
                    )

                    # select the relevant bit
                    & 1
                ]

               # for each column and row
                for x in range(80)
            )
            for y in range(40)
    ]

# write the results out
open('out.txt','w').write('\n'.join(data))

抱歉,Pythonistas,对于C-ish括号格式,但是我试图说明每个括号关闭的是什么。

票数 20
EN

Stack Overflow用户

发布于 2010-08-17 15:58:43

F#,496

我可以减少很多,但我喜欢这个,因为它仍然在大致上和相当可读的。

代码语言:javascript
复制
open System.IO
let mutable a:_[,]=null
let N y x=
 [-1,-1;-1,0;-1,1;0,-1;0,1;1,-1;1,0;1,1]
 |>Seq.sumBy(fun(i,j)->try if a.[y+i,x+j]='X' then 1 else 0 with _->0)
[<EntryPoint>]
let M(r)=
 let b=File.ReadAllLines(r.[0])
 a<-Array2D.init 40 80(fun y x->b.[y].[x])
 for i=1 to int r.[1] do 
  a<-Array2D.init 40 80(fun y x->
   match N y x with|3->'X'|2 when a.[y,x]='X'->'X'|_->'.')
 File.WriteAllLines("out.txt",Array.init 40(fun y->
  System.String(Array.init 80(fun x->a.[y,x]))))
 0

编辑

428

根据请求,下面是我的下一次尝试:

代码语言:javascript
复制
open System
let mutable a,k=null,Array2D.init 40 80
[<EntryPoint>]
let M r=
 a<-k(fun y x->IO.File.ReadAllLines(r.[0]).[y].[x])
 for i=1 to int r.[1] do a<-k(fun y x->match Seq.sumBy(fun(i,j)->try if a.[y+i,x+j]='X'then 1 else 0 with _->0)[-1,-1;-1,0;-1,1;0,-1;0,1;1,-1;1,0;1,1]with|3->'X'|2 when a.[y,x]='X'->'X'|_->'.')
 IO.File.WriteAllLines("out.txt",Array.init 40(fun y->String(Array.init 80(fun x->a.[y,x]))))
 0

这是一个14%的削减与一些基本的高尔夫。我不禁觉得用2D数组/字符串数组(而不是一维数组)输掉了,但现在不想做这种转换。注意如何优雅地读取文件3200次来初始化我的数组:)

票数 10
EN

Stack Overflow用户

发布于 2010-08-19 13:28:04

以下解决方案使用我自己定制的特定于域的编程语言,我称之为NULL:

代码语言:javascript
复制
3499538

如果您想知道这是如何工作的:我的语言只包含每个程序的一个状态。该语句表示属于代码高尔夫球线程的StackOverflow线程ID。我的编译器将其编译成一个程序,寻找最佳的javascript解决方案(使用SO ),下载它并在web浏览器中运行它。

对于新线程来说,运行时可能更好(出现第一个经过修改的Javascript答案可能需要一些时间),但从好的方面来说,它只需要很少的编码技巧。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3499538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档