Код Гольф: Конвей Игра Жизни

Задача: Напишите кратчайшую программу, которая реализует клеточный автомат Джона Х. Конвей "Игра жизни". [ссылка]

РЕДАКТИРОВАТЬ:. Примерно через неделю соревнований я выбрал победителя: pdehaan, за то, что он смог победить решение Matlab одним символом с помощью perl.

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

  • Любая живая клетка с менее чем двумя живыми соседями умирает, как если бы она вызвана неполным населением.
  • Любая живая клетка с более чем тремя живыми соседями умирает, как если бы она переполнена.
  • Любая живая ячейка с двумя или тремя живыми соседями живет следующим поколением.
  • Любая мертвая ячейка с ровно тремя живыми соседями становится живой клеткой, как бы размножением.

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

Правила:

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

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

Удачи!

Ответ 1

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..$/;[email protected]

Ответ 2

Mathematica - 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]

Анимация:

alt text

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

alt text

Хороший шаблон для создания планеров из Wikipedia

aa

AFAIK Mathematica использует Cellular Automaton для генерации случайных чисел, используя Правило 30.

Ответ 3

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 могут быть вызываемые с помощью команды- (с некоторыми ограничениями). Вы узнаете что-то новое каждый день!

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


Дополнительная задача: Чистый 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. Таким образом, чтобы сделать анимацию дольше и сделать шаги эволюции проще, я оставил задержку кадра по умолчанию (что составляет около половины секунды). Здесь вывод GIF с использованием Gosper Glider Gun:

alt text


Улучшения

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

Ответ 4

Ruby 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:), если вы разрешаете им сжимать новые строки, когда живые ячейки достигают краев.

Ответ 5

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

Вероятно, вы не сможете скопировать и вставить этот код и заставить его работать. Он должен быть латинским-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 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, но я пытался прояснить, что закрывает каждый кронштейн.

Ответ 7

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

Ответ 8

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 раз для инициализации моего массива:)

Ответ 9

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

Новые строки значительны (хотя все можно заменить w/точки с запятой.)

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

Ответ 10

Java, 441... 346


  • Обновление 1 Удалено внутреннее и более уродство
  • Обновление 2 Исправлена ​​ошибка и получен символ
  • Обновление 3 Использование большого количества памяти и массивов при игнорировании некоторых проблем с границами. Вероятно, несколько символов могут быть сохранены.
  • Обновление 4 Сохранено несколько символов. Благодаря BalusC.
  • Обновление 5 Несколько незначительных изменений, чтобы идти ниже 400 и сделать это просто лишним битом.
  • Обновление 6. Теперь все так жестко запрограммировано, что можно прочитать в точной сумме за один раз. Плюс еще несколько сбережений.
  • Обновление 7. Запишите запись в файл, чтобы сохранить char. Плюс несколько нечетных бит.

Просто играйте с решением 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();
 }
}

Ответ 11

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

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

Ответ 12

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

3499538

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

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

Ответ 13

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)

Ответ 14

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

Ответ 15

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

Ответ 16

Java, 556 532 517 496 472 433 428 420 418 381 символ


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

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

  • Обновление 3: заменило if/else на ?: и объединило объявления char[] и int. Сохранено 21 символ.

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

  • Обновление 5: улучшилось по подсказкам Molehill. Основной был hardcoding длина char, чтобы я мог избавиться от 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 символ.

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


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

Ответ 17

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. Возможно, это вдохновит кого-то, у кого будет больше опыта в игре с кодом.

  • Обновлен использовать список() вместо $var = $_SERVER [ "argv" ] для обоих аргументов. Ницца Дон
  • Обновлено + = и - = это сделало меня /facepalm хе-хантом верю, что я пропустил его
  • Обновлен вывод файла для использования file_put_contents() еще один хороший улов Don
  • Обновлено удалена инициализация vars $q и $w, которые они не использовались

Ответ 18

С++ - 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';}}

Ответ 19

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.

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

Ответ 20

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}[email protected] for(1..$i);
sub N{substr$c[$R++],$K,3}open P,'>','out.txt';$,=$/;print [email protected]

Запустить с помощью:

conway.pl infile #times

Ответ 21

Другая попытка 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);
            }
        }};
    }
}

Очень похоже на версию Molehills. Я попытался использовать другой FileWriter и подсчитать соты ячеек без дополнительной переменной. К сожалению, RandomAccessFile - довольно длинное имя, и требуется, чтобы вы проходили режим доступа к файлам.

Ответ 22

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

Ответ 23

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

Ответ 24

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

***
..*
.*

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

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

ИМХО - так как я узнал, что в "Конуэй-игре жизни" трюк не писал короткий код, а код, способный быстро создавать сложные формы жизни. Используя классический рисунок выше и обернутый мир из 594 441 ячеек, лучшее, что я мог сделать, было около 1000 поколений в секунду.

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

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

И планеры

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