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

76
挑战:编写最短的程序实现 John H. Conway 的生命游戏细胞自动机。[链接] 编辑:经过大约一周的比赛,我选择了一个获胜者:pdehaan,他成功用 Perl 击败了 Matlab 解决方案,仅用一个字符就能实现。
对于那些没有听说过生命游戏的人,你需要拿一个(理想上是无限大的)正方形格子的网格。单元可以是活着的(填充)或死亡的(空的)。我们通过应用以下规则来确定哪些单元在下一个时间步骤中是活着的:
1. 任何只有不到两个活邻居的活细胞都会死亡,就像人口不足一样。 2. 任何有超过三个活邻居的活细胞都会死亡,就像因过度拥挤而死亡一样。 3. 任何有两个或三个活邻居的活细胞将继续生存到下一代。 4. 正好有三个活邻居的死亡细胞成为活细胞,就像通过繁殖一样。
你的程序将读取一个40 x 80字符的ASCII文本文件,该文件指定为命令行参数,并读取要执行的迭代次数(N)。最后,它将输出一个名为out.txt的ASCII文件,其中包含N次迭代后系统的状态。
以下是一个使用相关文件的示例运行: 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(如果存在,则覆盖)。
  • 不需要处理棋盘的边缘(环绕、无限网格等)。
  • 编辑:您的输出文件中需要有换行符。

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

祝你好运!


22
这是一个非常棒的"代码高尔夫"!我完全相信它应该属于SO。几天前我在APL中发现了一个很棒的实现:http://www.youtube.com/watch?v=a9xAKttWgP4。 - Victor Hurdugaci
这是一个可以接受的想法,但你需要进一步完善它。http://meta.stackexchange.com/questions/24242/acceptable-level-of-code-golf-questions - zaf
4
相对流行度不是评估高尔夫比赛好坏的良好指标。即使perl代码不是最短的,甚至不符合规范,它也经常获得很多投票。你应该依靠字符数进行评估。使用更冗长语言的人仍然可以在他们之间竞争。 - John La Rooy
2
输入文件中有换行符吗? - Gabe
需要在两个地方加入换行符。我之前应该澄清这一点。 - hb2pencil
显示剩余6条评论
24个回答

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

这是一个HTML文件,没有文件输入,但有一个文本区域可以完成工作!还有一些HTML和初始化变量。主要的程序只有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>

1

RUST - 469个字符 不知道我是否应该在这里发布(这篇帖子已经3年了),但无论如何,我的尝试,在rust(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);
}

0

经典模式之一

***
..*
.*

我的头像是使用我自己版本的生命游戏创建的,使用了这个图案和规则(请注意不是23/3):

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

在我看来,学习康威生命游戏的诀窍不在于编写简短的代码,而在于能够快速处理复杂的生命形式。使用上述经典模式和一个包含594,441个单元格的环绕世界,我所能做到的最好成绩大约是每秒1,000代。

另一个简单的模式

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

还有滑翔机

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

10
或许你误解了“代码高尔夫”问题的关键点。 - gnovice
这里是一些模式的收藏,以防你像我几年前那样上瘾了。 http://www.argentum.freeserve.co.uk/lex.htm - dbasnett
@gnovice - 不是,但这是一个我非常喜欢的话题。元胞自动机可能是一个有趣的最短代码问题,但它本身也是一个有趣的话题。我现在退出。 - dbasnett
1
如果您精通于这里未列出的编程语言,我鼓励您提交一个代码高尔夫挑战 -- 即使它在长度方面稍微落后于其他挑战,我们也会非常欣赏。 :) - hb2pencil
仅自动机代码就有近2000行。绘图/编辑(图形化)/模式文件处理可能还有2000行。所以我想我会超过我的回合标准 ;) - dbasnett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接