Code Golf:康威的人生游戏


76

挑战:编写实现John H. Conway的Game of Life细胞自动机的最短程序。[链接]

编辑:经过对竞争的一个星期,我选择了一个胜利者:pdehaan,管理由击败了Matlab解决一个字符用Perl。

对于那些还没有听说过“生命游戏”的人,您可以选择一个正方形的网格(理想情况下是无限个)。细胞可以是活的(填充的)或死亡的(空的)。通过应用以下规则,我们可以确定在下一个步骤中哪些细胞仍然存在:

  1. 任何具有少于两个活邻居的活细胞都会死亡,好像是由于人口不足造成的。
  2. 任何具有三个以上活邻居的活细胞都会死亡,就像人满为患一样。
  3. 任何有两个或三个活邻居的活细胞都可以存活到下一代。
  4. 具有正好三个活邻居的任何死细胞都将变成活细胞,就像通过繁殖一样。

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

这是运行相关文件的示例:

in.txt:

................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
..................................XX............................................
..................................X.............................................
.......................................X........................................
................................XXXXXX.X........................................
................................X...............................................
.................................XX.XX...XX.....................................
..................................X.X....X.X....................................
..................................X.X......X....................................
...................................X.......XX...................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................

重复100次:

Q:\>life in.txt 100

结果输出(out.txt)

................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
..................................XX............................................
..................................X.X...........................................
....................................X...........................................
................................XXXXX.XX........................................
................................X.....X.........................................
.................................XX.XX...XX.....................................
..................................X.X....X.X....................................
..................................X.X......X....................................
...................................X.......XX...................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................

规则:

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

获胜者将由字符数决定。

祝好运!


22
这真是太棒了!我完全相信它属于SO。几天前,我在APL中发现了一个很棒的实现:youtube.com/watch?
v=a9xAKttWgP4

可以接受的想法,但是您需要加强它。meta.stackexchange.com/questions/24242/...
ZAF

4
相对受欢迎度对于高尔夫而言是一个糟糕的指标。即使不是最短的,甚至不符合规格,perl也会获得很多投票。您应该坚持字符计数。语言更加冗长的人仍然可以互相竞争
John La Rooy

2
哦,我的天哪,吓死了。就在这一刻,我想发布完全相同的比赛。:O
文森特

2
输入文件中是否有换行符?
加布

Answers:


24

Perl中,127 129 135个字符

设法剥离了另外几个角色...

$/=pop;@b=split'',<>;map{$n=-1;@b=map{++$n;/
/?$_:($t=grep/X/,@b[map{$n+$_,$n-$_}1,80..82])==3|$t+/X/==3?X:'.'}@b}1..$/;print@b

2
非常好!您用一种通用性更好的语言击败了几种专业语言。:)
hb2pencil 2010年

4
这写到'out.txt'吗?
AShelly

2
@b=<>=~/./g保存3个以上字符
暴民

40

数学- 179 163 154 151个字符

    a = {2, 2, 2};
    s = Export["out.txt", 
       CellularAutomaton[{224, {2, {a, {2, 1, 2}, a}}, {1,1}}, 
                (ReadList[#1, Byte, RecordLists → 2>1] - 46)/ 42, #2]〚#2〛
       /. {0 → ".", 1 → "X"}, "Table"] &
添加了可读性的空间

调用

    s["c:\life.txt", 100]

动画:

替代文字

您还可以获取一段时间内的平均人口图:

替代文字

一个从维基百科生成滑翔机的好模式

a

AFAIK Mathematica使用“元胞自动机”使用规则30生成随机数


1
根据动画,似乎无法正确发展。
gnovice

62
具有内置CellularAutomaton功能似乎可以消除一些挑战。
AShelly

@gnovice是的。有一个错误... tnx!
belisarius博士10年

17
@AShelly我想代码高尔夫球挑战可以同时采取两种方式>调整
不合适的

2
@Adrian不同语言的挑战。在Mathematica中,ASCII格式令人头疼...
belisarius博士2010年

33

MATLAB 7.8.0(R2009a) - 174 171 161 150 138 131 128 124个字符

函数语法:(124个字符)

这是易于阅读的版本(添加了不必要的换行符和空格,以实现更好的格式设置):

function l(f,N),
  b=char(importdata(f))>46;
  for c=1:N,
    b=~fix(filter2(ones(3),b)-b/2-3);
  end;
  dlmwrite('out.txt',char(b*42+46),'')

这是从MATLAB Command Window运行程序的方式:

l('in.txt',100)

命令语法:(130个字符)

有关调用函数有一个命令语法评论后,我挖得更深一些,并且发现了MATLAB功能可以在事实与命令行格式调用(有一些限制)。你每天学习新的东西!

function l(f,N),
  b=char(importdata(f))>46;
  for c=1:eval(N),
    b=~fix(filter2(ones(3),b)-b/2-3);
  end;
  dlmwrite('out.txt',char(b*42+46),'')

这是从MATLAB Command Window运行程序的方式:

l in.txt 100


附加挑战:可鸣叫的GIF制造商-136个字符

我以为很有趣,我想看看是否可以将输出转储到GIF文件而不是文本文件中,同时仍将字符数保持在140以下(即“可发送”)。这是格式精美的代码:

function l(f,N),
  b=char(importdata(f))>46;
  k=ones(3);
  for c=1:N+1,
    a(:,:,:,c)=kron(b,k);
    b=~fix(filter2(k,b)-b/2-3);
  end;
  imwrite(~a,'out.gif')

尽管IMWRITE应该创建默认情况下无限循环的GIF,但我的GIF仅循环一次。也许这是较新版本的MATLAB中已修复的错误。因此,为了使动画的持续时间更长,并使演化步骤更容易看清,我将帧延迟保留为默认值(似乎为半秒)。这是使用Gosper Glider Gun模式的GIF输出:

替代文字


改进措施

  • 更新1:将矩阵b从逻辑(即“布尔”)类型更改为数字类型,以摆脱一些转换。
  • 更新2:缩短了用于加载文件的代码,并使用MAGIC函数作为技巧来创建更少字符的卷积内核。
  • 更新3:简化索引逻辑,取而代之~~b+0b/42,换成'same''s'作为参数传递给CONV2(和它令人惊讶的还是工作!)。
  • 更新4:我想我应该先在网上搜索,因为MathWorks的Loren在今年早些时候发布了有关高尔夫和生活游戏的博客。我合并了此处讨论的一些技术,这需要我变b回逻辑矩阵。
  • 更新5:一个由Aslak GRINSTED评论对上述博客文章指出两者的逻辑和执行卷积(使用功能更短的算法FILTER2),所以我“收编”(读“复制”),他的建议。;)
  • 更新6:从的初始化中删除了两个字符b,并对循环中的逻辑进行了重新处理,以节省另外1个字符。
  • 更新7:埃里克·桑普森(Eric Sampson)在一封电子邮件中指出,我可以将其替换cell2matchar,以节省4个字符。谢谢埃里克!

@AShelly:在深入研究之后,我发现可以使用命令语法来调用MATLAB函数(我以前从未想到过)。我将其他解决方案添加到我的答案中。它仅添加6个字符。
gnovice

30

红宝石1.9 - 189 178 159 155 153个字符

f,n=$*
c=IO.read f
n.to_i.times{i=0;c=c.chars.map{|v|i+=1
v<?.?v:('...X'+v)[[83,2,-79].map{|j|c[i-j,3]}.to_s.count ?X]||?.}*''}
File.new('out.txt',?w)<<c

编辑: 处理换行符少4个字符。如果允许它在活细胞到达边缘时破坏换行符,则
可以再删除7个(v<?.?v:)。


19
等到Perl家伙来...;)
MladenJablanović10年

1
@ hb2pencil,Mladen,我认为在提交至少一个perl条目之前,从未接受过任何代码高尔夫球答案:)
John La Rooy,2010年

我看到竞争在加剧,所以我会等待。谢谢!
hb2pencil 2010年

我认为您可以通过将第3行替换为减去12个字符 v<13?v:l==3||v-l==?T?X:?.}}。但是我没有安装1.9来测试它。
AShelly

我认为您不能将v(字符串)与整数进行比较。
MladenJablanović10年

20

Python-282个字符

不如让球滚动...

import sys
_,I,N=sys.argv;R=range(3e3);B=open(I).read();B=set(k for k in R if'A'<B[k])
for k in R*int(N):
 if k<1:b,B=B,set()
 c=sum(len(set((k+o,k-o))&b)for o in(1,80,81,82))
 if(c==3)+(c==2)*(k in b):B.add(k)
open('out.txt','w').write(''.join('.X\n'[(k in B)-(k%81<1)]for k in R))

6
看到python被这种方法
弄糊涂

1
搞不清楚?我以为那很干净?;)
凯尔·罗森多

1
但是2.7(和3.x)接受大括号以进行集合理解,因此set(...)可以替换为{...},而替换为则range(3e3)可以range(3000)使净字符改善2个字符。
唐·奥多内尔

20

Python 2.x-210/234个字符

好的,包含210个字符的代码有点作弊。

#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')

您可能将无法复制并粘贴此代码并使它正常工作。它应该是Latin-1(ISO-8859-1),但我认为在此过程中某处它被转换为Windows-1252。此外,您的浏览器可能会吞下某些非ASCII字符。

因此,如果它不起作用,则可以使用普通的旧7位字符生成文件:

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源代码上使用zip压缩。真正的秘诀是,我在结果字符串中使用了非ASCII字符。它仍然是有效的代码,非常麻烦。

我认为非压缩版本的重量为234个字符,仍然值得尊重。

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))

抱歉,水平滚动条是必需的,但是上面的所有换行都是必需的,我将它们视为一个字符。

我不会尝试阅读高尔夫代码。随机选择变量名以实现最佳压缩。是的,我很认真。格式更好并带有注释的版本如下:

# 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括号格式,但是我试图弄清楚每个括号即将关闭的地方。


1
+1做得好,unicode是代码高尔夫球在SO上的公平竞赛-根本不是“作弊”
John La Rooy

open(f).readlines()应该放在list(open(f))。在EOF处,用EOL压缩后的等效字符和缩略的6个字符,缩短了3个字节,奇怪的是,压缩了4个字符,使EOL缩短了206个字符(压缩了EOL)和228个字符(最小化了没有EOL)。
克里斯·摩根

14

的Haskell - 284 272 232个字符

import System
main=do f:n:_<-getArgs;s<-readFile f;writeFile"out.txt"$t s$read n
p '\n'_='\n'
p 'X'2='X'
p _ 3='X'
p _ _='.'
t r 0=r
t r n=t[p(r!!m)$sum[1|d<-1:[80..82],s<-[1,-1],-m<=d*s,m+d*s<3240,'X'==r!!(m+d*s)]|m<-[0..3239]]$n-1

10

F#,496

我可以减少很多,但是我喜欢它,因为它仍然在球场上并且很可读。

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

根据要求,这是我的下一个选项:

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数组/字符串数组而不是1D数组,这让我感到迷losing,但现在不想做这种转换了。请注意,我如何优雅地读取文件3200次以初始化数组:)


请减少很多,我很好奇!
兰代

10

Ruby 1.8: 178 175个字符

f,n=$*;b=IO.read f
n.to_i.times{s=b.dup
s.size.times{|i|t=([82,1,-80].map{|o|b[i-o,3]||''}*'').count 'X'
s[i]=t==3||b[i]-t==?T??X:?.if s[i]>13};b=s}
File.new('out.txt','w')<<b

换行符很重要(尽管可以使用分号替换所有换行符。)

编辑:修复了换行符问题,并修剪了3个字符。


输出文件中的行似乎没有分开。
MladenJablanović10年

它们不是-但它们在我的80字符控制台中完美显示。
AShelly

您需要换行;很抱歉没有明确指出。
hb2pencil 2010年

10

Java,441 ... 346


  • 更新1删除了内部如果和更多的丑陋
  • 更新2修复了一个错误并获得了一个角色
  • Update 3使用更多的内存和数组,而忽略了一些边界问题。大概可以保存几个字符。
  • 更新4保存了一些字符。感谢BalusC。
  • Update 5进行了一些细微的更改,使其降至400以下,使其变得更加丑陋。
  • 更新6现在,事情是如此的硬编码,也可以一口气以确切的数量读取。再加上一些节省。
  • Update 7将写入内容链接到文件以保存字符。再加上一些奇数位。

只是在玩BalusC的解决方案。名声有限意味着我无法添加任何评论。

class M{public static void main(String[]a)throws Exception{int t=3240,j=t,i=new Integer(a[1])*t+t;char[]b=new char[i+t],p={1,80,81,82};for(new java.io.FileReader(a[0]).read(b,t,t);j<i;){char c=b[j],l=0;for(int n:p)l+=b[j+n]/88+b[j-n]/88;b[j+++t]=c>10?(l==3|l+c==90?88:'.'):c;}new java.io.FileWriter("out.txt").append(new String(b,j,t)).close();}}

更具可读性的版本:

class M{
 public static void main(String[]a)throws Exception{
  int t=3240,j=t,i=new Integer(a[1])*t+t;
  char[]b=new char[i+t],p={1,80,81,82};
  for(new java.io.FileReader(a[0]).read(b,t,t);j<i;){
    char c=b[j],l=0;
    for(int n:p)l+=b[j+n]/88+b[j-n]/88;
    b[j+++t]=c>10?(l==3|l+c==90?88:'.'):c;
  }
  new java.io.FileWriter("out.txt").append(new String(b,j,t)).close();
 }
}

用字符串代替char []会更昂贵,但这在代码高尔夫中确实没有关系!不错的一个:)
BalusC,2010年

请注意,文件/字符的总长度不是2754个字符。
BalusC,2010年

@BallusC谢谢,我设法只复制了34行,而不是全部40行!
Molehill

这确实是一个真正的记忆猪!顺便说一句,--i可以进去,new char[i--*t]b[l++]+=(char)j可以只是b[l++]=(char)j。这样可以节省另外3个字符。
BalusC 2010年

顺便说一句:为什么删除了&n+j<s?当输入文件的长度为3240个字符时,这将导致AIOBE。更多优化:看一下我如何将文件读入char[],您的文件可以替换为 while(l<t)b[l++]=(char)r.read();,节省4个字符。
BalusC

9

斯卡拉- 467 364 339个字符

object G{def main(a:Array[String]){val l=io.Source.fromFile(new java.io.File(a(0)))getLines("\n")map(_.toSeq)toSeq
val f=new java.io.FileWriter("out.txt")
f.write((1 to a(1).toInt).foldLeft(l){(t,_)=>(for(y<-0 to 39)yield(for(x<-0 to 79)yield{if(x%79==0|y%39==0)'.'else{val m=t(y-1)
val p=t(y+1);val s=Seq(m(x-1),m(x),m(x+1),t(y)(x-1),t(y)(x+1),p(x-1),p(x),p(x+1)).count('X'==_)
if(s==3|(s==2&t(y)(x)=='X'))'X'else'.'}})toSeq)toSeq}map(_.mkString)mkString("\n"))
f.close}}

我认为还有很多改进的余地...

[编辑]是的,它是:

object G{def main(a:Array[String]){var l=io.Source.fromFile(new java.io.File(a(0))).mkString
val f=new java.io.FileWriter("out.txt")
var i=a(1).toInt
while(i>0){l=l.zipWithIndex.map{case(c,n)=>if(c=='\n')'\n'else{val s=Seq(-83,-82,-81,-1,1,81,82,83).map(_+n).filter(k=>k>=0&k<l.size).count(l(_)=='X')
if(s==3|(s==2&c=='X'))'X'else'.'}}.mkString
i-=1}
f.write(l)
f.close}}

[编辑]而且我觉得还有更多需要挤出的...

object G{def main(a:Array[String]){val f=new java.io.FileWriter("out.txt")
f.write(((1 to a(1).toInt):\(io.Source.fromFile(new java.io.File(a(0))).mkString)){(_,m)=>m.zipWithIndex.map{case(c,n)=>
val s=Seq(-83,-82,-81,-1,1,81,82,83)count(k=>k+n>=0&k+n<m.size&&m(k+n)=='X')
if(c=='\n')c else if(s==3|s==2&c=='X')'X'else'.'}.mkString})
f.close}}

2
您让我阅读了Scala Wikipedia文章。多么美丽的语言!:)
文森特

2
是的。它改变了我的生活。
兰代

7

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

3499538

如果您想知道它是如何工作的:每个程序中我的语言仅包含一个陈述。该语句表示属于代码高尔夫线程的StackOverflow线程ID。我的编译器将此编译为一个程序,以寻找最佳的javascript解决方案(使用SO API),然后下载并在网络浏览器中运行。

对于新线程而言,运行时可能会更好(出现第一个被认可的Javascript答案可能需要一些时间),但从好处来看,它只需要很少的编码技能。


4
@Platinum Azure:您的意思是其他人以前有这个想法?老实说,我没有在其他线程中看到它。
阿德里安·格里戈里

3
好吧,我想好主意也一样;-)。但是与上述解决方案相比,我的解决方案实际上可以解决所有的代码挑战,而上述解决方案只能打印“ Hello World”。
阿德里安·格里戈里

2
它不是图灵完整的,它不能解释抽象代码。它不一定每次都有效,因为可能永远不会有有效的(javascript)解决方案。它不应位于Code Golf上。
卡勒姆·罗杰斯

2
嘿,那只是我的翻译。Javascript解决方案是否包括了JavaScript引擎的字符数?;-)
Adrian Grigore 2010年

4
在我读完所有严肃的评论之前,我以为这是个玩笑。
kirk.burleson 2010年

5

Javascript / Node.js-233236字符

a=process.argv
f=require('fs')
m=46
t=f.readFileSync(a[2])
while(a[3]--)t=[].map.call(t,function(c,i){for(n=g=0;e=[-82,-81,-80,-1,1,80,81,82][g++];)t[i+e]>m&&n++
return c<m?c:c==m&&n==3||c>m&&n>1&&n<4?88:m})
f.writeFile('out.txt',t)

5

C-300


只是想知道我的Java解决方案可以在C中使用多少更小巧的解决方案。减少到300个,包括预处理位的换行符。释放内存给操作系统!假设操作系统也将关闭并刷新文件,则可以节省约20。

#include<stdio.h>
#include<stdlib.h>
#define A(N)j[-N]/88+j[N]/88

int main(int l,char**a){
  int t=3240,i=atoi(a[2])*t+t;
  char*b=malloc(i+t),*j;
  FILE*f;
  fread(j=b+t,1,t,fopen(a[1],"r"));
  for(;j-b-i;j++[t]=*j>10?l==3|l+*j==90?88:46:10)
      l=A(1)+A(80)+A(81)+A(82);
  fwrite(j,1,t,f=fopen("out.txt","w"));
  fclose(f);
}

5

MUMPS:314个字符

L(F,N,R=40,C=80)
    N (F,N,R,C)
    O F:"RS" U F D  C F
    .F I=1:1:R R L F J=1:1:C S G(0,I,J)=($E(L,J)="X")
    F A=0:1:N-1 F I=1:1:R F J=1:1:C D  S G(A+1,I,J)=$S(X=2:G(A,I,J),X=3:1,1:0)
    .S X=0 F i=-1:1:1 F j=-1:1:1 I i!j S X=X+$G(G(A,I+i,J+j))
    S F="OUT.TXT" O F:"WNS" U F D  C F
    .F I=1:1:R F J=1:1:C W $S(G(N,I,J):"X",1:".") W:J=C !
    Q

2
那是一种可怕的语言。字符数不错。
hb2pencil 2010年

4

Java,556 532 517 496 472 433 428 420 418 381字符


  • 更新1:替换第一StringBufferAppendable和第二char[]。保存了24个字符。

  • 更新2:找到了一种将文件读取到的更短方法char[]。保存了15个字符。

  • 更新3:替换if/else?:并合并char[]int声明。保存了21个字符。

  • 更新4:更换(int)f.length()c.length通过s。保存了24个字符。

  • 更新5:根据Molehill的提示进行了改进。主要是对字符长度进行硬编码,这样我就可以摆脱了File。保存了39个字符。

  • 更新6:次要重构。保存了6个字符。

  • 更新7:代替Integer#valueOf()通过new Integer()和重构的循环。保存了8个字符。

  • 更新8:改进的邻居计算。保存了2个字符。

  • 更新9:优化的文件读取,因为已经对文件长度进行了硬编码。保存了37个字符。


 import java.io.*;class L{public static void main(String[]a)throws Exception{int i=new Integer(a[1]),j,l,s=3240;int[]p={-82,-81,-80,-1,1,80,81,82};char[]o,c=new char[s];for(new FileReader(a[0]).read(c);i-->0;c=o)for(o=new char[j=s];j-->0;){l=0;for(int n:p)l+=n+j>-1&n+j<s?c[n+j]/88:0;o[j]=c[j]>13?l==3|l+c[j]==90?88:'.':10;}Writer w=new FileWriter("out.txt");w.write(c);w.close();}}

更具可读性的版本:

import java.io.*;
class L{
 public static void main(String[]a)throws Exception{
  int i=new Integer(a[1]),j,l,s=3240;
  int[]p={-82,-81,-80,-1,1,80,81,82};
  char[]o,c=new char[s];
  for(new FileReader(a[0]).read(c);i-->0;c=o)for(o=new char[j=s];j-->0;){
   l=0;for(int n:p)l+=n+j>-1&n+j<s?c[n+j]/88:0;
   o[j]=c[j]>10?l==3|l+c[j]==90?88:'.':10;
  }
  Writer w=new FileWriter("out.txt");w.write(c);w.close();
 }
}

写入后关闭是强制性的,否则文件将保留为空。否则它将节省另外21个字符。

此外,当我使用46代替时,我还可以再保存一个char '.',但是javac和Eclipse都会出现编译错误,这可能会导致精度损失。奇怪的东西。


注意:这要求输入文件带有\n换行符,而不是\r\nWindows默认使用的!


您可以只使用新的FileWriter(out.txt).write(c)说几个字符。不幸的是,您无法删除整个变量,因为write()不会返回此值。如果您找到了一个可以写的文件编写类,那么可以节省很多。另外,我喜欢您使用抛出所有东西来避免那些可怕的强制捕获。
小狗

3

PHP - 365个 328 322字符。


list(,$n,$l) = $_SERVER["argv"];
$f = file( $n );
for($j=0;$j<$l;$j++){   
    foreach($f as $k=>$v){  
        $a[$k]="";      
        for($i=0;$i < strlen( $v );$i++ ){
            $t = 0;
            for($m=-1;$m<2;$m++){
                for($h=-1;$h<2;$h++){
                    $t+=ord($f[$k + $m][$i + $h]);
                }
            }
            $t-=ord($v[$i]);          
            $a[$k] .= ( $t == 494 || ($t == 452 && ord($v[$i])==88)) ?  "X" : "." ;
        }
    }
    $f = $a;
}       
file_put_contents("out.txt", implode("\n", $a )); 

我确定可以对此进行改进,但是我很好奇PHP中的外观。也许这会激发一个具有更多代码高尔夫球经验的人。

  • 为两个参数更新了使用list()而不是$ var = $ _SERVER [“ argv”]。 好一个唐
  • 更新+ =和-=这使我/ facepalm不能相信我错过了它
  • 更新了文件输出以使用file_put_contents()Don的另一个不错的选择
  • 更新了已删除的未使用的变量$ q和$ w的初始化

list($ n,$ l)= $ _SERVER ['argv'];
唐·威尔逊

更改:$ o = fopen(“ out.txt”,“ w”); fwrite($ o,implode(“ \ n”,$ a)); fclose($ o); 收件人:file_put_contents(“ out.txt”,implode(“ \ n”,$ a));
唐·威尔逊

更改:$ t = $ t-ord($ v [$ i]); 收件人:$ t- = ord($ v [$ i]);
唐·威尔逊

更改:$ t = $ t + ord($ f [$ k + $ m] [$ i + $ h]); TO $ t + = ord($ f [$ k + $ m] [$ i + $ h]);
唐·威尔逊

2

R 340个字符

cgc<-function(i="in.txt",x=100){
    require(simecol)
    z<-file("in.txt", "rb")
    y<-matrix(data=NA,nrow=40,ncol=80)
    for(i in seq(40)){
        for(j in seq(80)){
            y[i,j]<-ifelse(readChar(z,1) == "X",1,0)
        }
        readChar(z,3)
    }
    close(z)
    init(conway) <- y
    times(conway)<-1:x
    o<-as.data.frame(out(sim(conway))[[100]])
    write.table(o, "out.txt", sep="", row.names=FALSE, col.names=FALSE)
}
cgc()

我觉得拥有一个可以为您完成实际自动机的增添软件包有点作弊,但是我要使用它,因为我仍然不得不绕过矩阵和东西,用'X'而不是1读入文件。

这是我的第一个“代码高尔夫”,很有趣。


2

C ++- 492 454 386


我的第一个代码高尔夫;)

#include<fstream>
#define B(i,j)(b[i][j]=='X')
int main(int i,char**v){for(int n=0;n<atoi(v[2]);++n){std::ifstream f(v[1]);v[1]="out.txt";char b[40][83];for(i=0;i<40;++i)f.getline(b[i],83);std::ofstream g("out.txt");g<<b[0]<<'\n';for(i=1;i<39;++i){g<<'.';for(int j=1;j<79;++j){int k=B(i-1,j)+B(i+1,j)+B(i,j-1)+B(i,j+1)+B(i-1,j-1)+B(i+1,j+1)+B(i+1,j-1)+B(i-1,j+1);(B(i,j)&&(k<2||k>3))?g<<'.':(!B(i,j)&&k==3)?g<<'X':g<<b[i][j];}g<<".\n";}g<<b[0]<<'\n';}}

经过某种程度的修订,用表查找和一些其他小技巧替换了一些逻辑:

#include<fstream>
#define B(x,y)(b[i+x][j+y]=='X')
int main(int i,char**v){for(int n=0;n<atoi(v[2]);++n){std::ifstream f(v[1]);*v="out.txt";char b[40][83], O[]="...X.....";for(i=0;i<40;++i)f>>b[i];std::ofstream g(*v);g<<b[0]<<'\n';for(i=1;i<39;++i){g<<'.';for(int j=1;j<79;++j){O[2]=b[i][j];g<<O[B(-1,0)+B(1,0)+B(0,-1)+B(0,1)+B(-1,-1)+B(1,1)+B(1,-1)+B(-1,1)];}g<<".\n";}g<<b[0]<<'\n';}}

1
一些提示:不需要调用main argc和argv的参数。尝试使用c和v。也尝试使用三元运算符代替if / else。很高兴看到C ++代表。:)
hb2pencil 2010年

1

Perl – 214个字符

什么,还没有perl条目?

$i=pop;@c=<>;@c=map{$r=$_;$u='';for(0..79)
{$K=$_-1;$R=$r-1;$u.=((&N.(&N^"\0\W\0").&N)=~y/X//
|(substr$c[$r],$_,1)eq'X')==3?'X':'.';}$u}keys@c for(1..$i);
sub N{substr$c[$R++],$K,3}open P,'>','out.txt';$,=$/;print P@c

运行:

conway.pl infile#次


1

另一个Java尝试,361个字符

class L{public static void main(final String[]a)throws Exception{new java.io.RandomAccessFile("out.txt","rw"){{int e=88,p[]={-1,1,-80,80,-81,81,-82,82},s=3240,l=0,i=new Byte(a[1])*s+s,c;char[]b=new char[s];for(new java.io.FileReader(a[0]).read(b);i>0;seek(l=++l%s),i--){c=b[l];for(int n:p)c+=l+n>=0&l+n<s?b[l+n]/e:0;write(c>13?(c==49|(c|1)==91?e:46):10);}}};}}

而且更具可读性

class L {
    public static void main(final String[]a) throws Exception {
        new java.io.RandomAccessFile("out.txt","rw"){{
            int e=88, p[]={-1,1,-80,80,-81,81,-82,82},s=3240,l=0,i=new Byte(a[1])*s+s,c;
            char[] b = new char[s];
            for (new java.io.FileReader(a[0]).read(b);i>0;seek(l=++l%s),i--) {
                c=b[l];
                for (int n:p)
                    c+=l+n>=0&l+n<s?b[l+n]/e:0;
                write(c>13?(c==49|(c|1)==91?e:46):10);
            }
        }};
    }
}

与Molehill的版本非常相似。我尝试使用其他FileWriter,并在没有其他变量的情况下计算单元格的邻居。不幸的是,这RandomAccessFile是一个很长的名字,要求您通过文件访问模式。


1

锈-469个字符 不知道我是否应该在这里发布此帖子(该帖子已有3年历史了),但是无论如何,我对此进行了尝试,并生锈(0.9):

use std::io::fs::File;fn main(){
let mut c=File::open(&Path::new(std::os::args()[1])).read_to_end();
for _ in range(0,from_str::<int>(std::os::args()[2]).unwrap()){
let mut b=c.clone();for y in range(0,40){for x in range(0,80){let mut s=0;
for z in range(x-1,x+2){for t in range(y-1,y+2){
if z>=0&&t>=0&&z<80&&t<40&&(x !=z||y !=t)&&c[t*81+z]==88u8{s +=1;}}}
b[y*81+x]=if s==3||(s==2&&c[y*81+x]==88u8){88u8} else {46u8};}}c = b;}
File::create(&Path::new("out.txt")).write(c);}

对于有兴趣的人,以下是进行激进打高尔夫球之前的代码:

use std::io::fs::File;
fn main() {
    let f = std::os::args()[1];
    let mut c = File::open(&Path::new(f)).read_to_end();    
    let n = from_str::<int>(std::os::args()[2]).unwrap();   
    for _ in range(0,n)
    {
        let mut new = c.clone();
        for y in range(0,40) {
            for x in range(0,80) {
                let mut sum = 0;
                for xx in range(x-1,x+2){
                    for yy in range(y-1,y+2) {
                        if xx >= 0 && yy >= 0 && xx <80 && yy <40 && (x != xx || y != yy) && c[yy*81+xx] == 88u8
                        { sum = sum + 1; }
                    }
                }
                new[y*81+x] = if sum == 3 || (sum == 2 && c[y*81+x] == 88u8) {88u8} else {46u8};                    
            }
        }
        c = new;
    }
    File::create(&Path::new("out.txt")).write(c);
}

1

étvoilà您可能要使用此html文件。没有文件输入,但是可以做一个文本区域!还有一些html和initiation和vars。主例程只有235个字符。是手工制作的JS。

<!DOCTYPE html>
<html><body><textarea id="t" style="width:600px;height:600px;font-family:Courier">
</textarea></body><script type="text/javascript">var o,c,m=new Array(3200),
k=new Array(3200),y,v,l,p;o=document.getElementById("t");for(y=0;y<3200;y++)
{m[y]=Math.random()<0.5;}setInterval(function(){p="";for(y=0;y<3200;y++){c=0;
for(v=-1;v<2;v+=2){c+=m[y-1*v]?1:0;for(l=79;l<82;l++)c+=m[y-l*v]?1:0;}
k[y]=c==3||m[y]&&c==2;}p="";for(y=0;y<3200;y++){p+=(y>0&&y%80==0)?"\n":"";
m[y]=k[y];p+=(m[y]?"O":"-");}o.innerHTML=p;},100);</script></html>

0

经典图案之一

***
..*
.*

我的头像是使用以下版本的规则和规则使用我的《生命游戏》版本创建的(请注意,它不是23/3):

#D Thanks to my daughter Natalie
#D Try at cell size of 1
#R 8/1
#P -29 -29
.*********************************************************
*.*******************************************************.*
**.*****************************************************.**
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
****************************.*.****************************
***********************************************************
****************************.*.****************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
***********************************************************
**.*****************************************************.**
*.*******************************************************.*
.*********************************************************

恕我直言-当我了解康威的《人生游戏》时,诀窍不是写短代码,而是可以迅速完成复杂生命形式的代码。使用上面的经典模式以及594,441个单元的包裹世界,我能做的最好成绩约为1000代/秒。

另一个简单的模式

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

和滑翔机

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

10
我认为您可能误解了高尔夫问题代码的要点。
gnovice 2010年

这是一组模式,以防万一您像我几年前一样迷上了argentum.freeserve.co.uk/lex.htm
dbasnett 2010年

@gnovice-不,但这是我很开心的话题。元胞自动机可能是一个有趣的最短代码问题,但它本身也是一个有趣的话题。我马上出去。
dbasnett

1
如果您有使用此处未显示的语言的经验,我建议您提交一个代码高尔夫球条目-对此表示赞赏,即使在长度方面落后于其他语言也是如此。:)
hb2pencil 2010年

仅自动机代码就差不多有2000行。绘图/编辑(以图形方式)/图案文件处理可能还要多2000个。所以我想我这回合将超过标准杆;)
dbasnett 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.