Код гольф: игра жизни Конвея

Задача: напишите самую короткую программу, которая реализует John H. Conway's игры клеточный автомат. [ссылке]

EDIT: примерно через неделю соревнований я выбрал победителя:pdehaan, для управления бить решение Matlab по один символ с perl.

для тех, кто не слышал об игре жизни, вы берете сетку (идеально бесконечную) квадрата ячейки. Клетки могут быть живыми (заполненными) или мертвыми (пустыми). Мы определяем, какие клетки живы на следующем этапе времени, применяя следующие правила:

  1. любая живая клетка с менее чем двумя жить соседям умирает, как будто вызваны под-населения.
  2. любая живая клетка с более чем тремя жить соседям умирает, как бы переполненности.
  3. любая живая клетка с двумя или тремя соседями выживает в следующем поколении.
  4. любая мертвая клетка с ровно три живых соседей становится живой клетки, как бы воспроизводства.

ваша программа будет читать в текстовом файле ASCII 40x80 символов, указанном в качестве аргумента командной строки, а также количество итераций (N) для выполнения. Наконец, он будет выводиться в файл ASCII.txt состояние системы после 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...................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................

Правила:

  • вы должны использовать файл ввода/вывода для чтения/записи файлов.
  • вам нужно принять входной файл и количество итераций в качестве аргументов
  • вам нужно сгенерировать.тхт (перезаписать, если он существует) в указанном формате
  • вы не потребность общаться с краями доски (укручения, бесконечные сетки .и т. д.)
  • EDIT: вы do нужно, чтобы строки в выходной файл.

победитель будет определяться количеством символов.

удачи!

24 ответов


perl, 127 129 135 chars

удалось снять еще пару символов...

$/=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

Mathematica -179 163 154 151 chars

Добавлены пробелы для удобства чтения

Invoke with

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

анимация:

alt text

вы также можете получить график генеральной совокупности с течением времени:

alt text

хороший шаблон для создания планеров из Википедия

aa

насколько я знаю Mathematica использует клеточный автомат для генерации случайных чисел используя Правила 30.


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 Окно:

l('in.txt',100)

синтаксис команды: (130 символов)

после комментария о вызове функций с синтаксисом команды я копнул немного глубже и узнал, что функции MATLAB can на самом деле вызывается в формате командной строки (С некоторыми ограничениями). Каждый день узнаешь что-то новое!

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 Окно:

l in.txt 100


дополнительная задача: Tweetable GIF maker-136 символов

я подумал, что для удовольствия я посмотрю, могу ли я сбросить вывод в GIF-файл вместо текстового файла, сохраняя при этом количество символов ниже 140 (т. е. "tweetable"). Вот красиво отформатированный код:

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. Таким образом, чтобы анимация длилась дольше и сделать шаги эволюции легче увидеть, я оставил задержку кадров по умолчанию (которая, кажется, составляет около половины секунды). Вот выход GIF с помощью Госпер Планерная Пушка шаблон:

alt text


улучшение

  • обновление 1: изменена матрица b из логического (т. е. "boolean") введите числовой, чтобы избавиться от нескольких преобразований.
  • обновление 2: сократил код для загрузки файла и использовал функцию магия как трюк для создания ядра свертки в меньшем количестве символов.
  • обновление 3: упрощена логика индексирования, заменена ~~b+0 С b/42 и заменить 'same' С 's' в качестве аргумента CONV2 (и это удивительно до сих пор сработало!).
  • обновление 4: думаю, я должен был сначала поискать в интернете, так как Лорен из MathWorks блог о гольфе и игре в жизнь в начале этого года. Я включил некоторые из методов, обсуждавшихся там, которые требовали от меня изменения b назад к логической матрице.
  • обновление 5: A комментарий от Аслака Гринстеда на вышеуказанном блоге предлагает еще более короткий алгоритм как для логики, так и для выполнения свертки (с использованием функции FILTER2), поэтому я " включил "(читай" скопировал") его предложения. ;)
  • обновление 6: обрезаны два символа из инициализации b и переработал логику в цикле, чтобы сохранить 1 дополнительный символ.
  • обновление 7: Эрик Сэмпсон указал в электронном письме, что я могу заменить cell2mat С char, сохранение 4 символов. Спасибо, Эрик!

Руби 1.9 - 189 178 159 155 153 chars

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

Edit: Обрабатывает новые строки с 4 символами меньше.
Можно удалить еще 7 (v<?.?v:) Если вы позволите ему блокировать новые строки, когда живые ячейки достигнут краев.


Python-282 chars

мог бы также получить мяч прокатки...

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

Python 2.х - 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')

Вы наверное не сможете скопировать и вставить этот код и заставить его работать. Предполагается, что это латинский-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. Все, что я сделал здесь, - это сжатие zip исходного кода Python. Настоящий обман заключается в том, что я использую символы, отличные от 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, но я пытался дать понять, что каждая скобка закрывается.


Хаскел - 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

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, но не чувствую, что делаю это преобразование сейчас. Обратите внимание, как я элегантно читаю файл 3200 время инициализации моего массива:)


Руби 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

новые строки значительны (хотя все они могут быть заменены точками с запятой.)

Edit: Исправлена проблема с новой строкой и обрезаны 3 символа.


Java,441... 346


  • обновление 1 удалены внутренние если и больше уродства
  • обновление 2 Исправлена ошибка и получил характер
  • обновление 3 используя много больше памяти и массивов, игнорируя некоторые проблемы с границами. Возможно, удастся спасти несколько символов.
  • обновление 4 сохранил несколько символов. Благодаря BalusC.
  • обновление 5 несколько незначительных изменений, чтобы пойти ниже 400 и сделать его так, что еще немного уродливее.
  • обновление 6 теперь все так жестко закодировано, можно также прочитать точное количество за один раз. Плюс еще несколько сбережений.
  • обновление 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();
 }
}

Скала - 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}}

Я думаю, что есть много комнаты для улучшения...

[Edit] Да, это:

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

[Edit] и у меня такое чувство, что есть еще больше, чтобы выжать...

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

следующее решение использует мой собственный специфичный для домена язык программирования, который я назвал NULL:

3499538

Если вам интересно, как это работает: мой язык состоит только из одного состояния на программу. Оператор представляет идентификатор потока StackOverflow, принадлежащий потоку гольфа кода. Мой компилятор компилирует это в программу, которая ищет лучшее решение javascript (с SO API), загружает его и запускает в веб-браузере.

среда выполнения может быть лучше для новых потоков (может потребоваться некоторое время для появления первого ответа Javascript), но с другой стороны, это требует очень мало навыков кодирования.


Javascript / Node.js-233 236 символы

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)

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

свинка: 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

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


  • обновление 1: заменить 1-й StringBuffer by Appendable и 2 по char[]. Спасено 24 символов.

  • обновление 2: нашел более короткий способ чтения файла в char[]. Спас 15 пеструшки.

  • обновление 3: заменил один if/else by ?: и слили char[] и int декларации. Спасен 21 символов.

  • обновление 4: заменить (int)f.length() и c.length by s. Спасено 24 символов.

  • обновление 5: сделаны улучшения в соответствии с намеками кротовой норы. Майор один жестко кодировал длину символа, чтобы я мог избавиться от File. Спас 39 пеструшки.

  • обновление 6: незначительный рефакторинг. Спасены 6 символов.

  • обновление 7: заменить Integer#valueOf() by new Integer() и refactored для петли. Спас 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();
 }
}

закрытие после написания absoletely является обязательным, в противном случае файл остается пустым. В противном случае это спасло бы еще 21 символ.

далее я мог бы также сохранить еще один символ, когда я использую 46 вместо '.', но и javac и Eclipse рывков с ошибкой компиляции возможная потеря точности. Странный материал.


Примечание: это ожидает входной файл с \n newlines, не \r\n как Windows по умолчанию использует!


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"] для обоих args. хороший Дон
  • Обновлено += и - = этот сделал меня / facepalm хех не могу поверить, что я пропустил его
  • Обновлено вывод файла для использования file_put_contents ()еще один хороший улов от Дона
  • Обновлено удалена инициализация vars $q и $w они не использовались

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.

Это мой первый гольф-кода, интересные....


c++ -492 454 386


мой первый код golf;)

#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';}}

Perl-214 chars

что, еще нет записей perl?

$i=pop;@c=<>;@c=map{$r=$_;$u='';for(0..79)
{$K=$_-1;$R=$r-1;$u.=((&N.(&N^"\W").&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 #times

еще одна попытка Java, 361 chars

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. Я попытался использовать другую файловую машинку и подсчитать соседей ячейки без дополнительной переменной. К сожалению, RandomAccessFile - довольно длинное имя, и требуется, чтобы вы передали режим доступа к файлу.


ржавчина - 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);
}

ét voilà вы можете использовать этот html-файл. нет ввода файла, но textarea, который выполняет эту работу! существует также некоторый html и инициация и 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>

один из классических шаблонов

***
..*
.*

мой аватар был создан с использованием моей версии игры жизни, используя этот шаблон и правило(обратите внимание, что это не 23/3):

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

еще один простой шаблон

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

планеры

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