76

課題:ジョン H. コンウェイのライフ ゲームセル オートマトンを実装する最短のプログラムを作成します。【リンク

編集:約 1 週間の競争の後、私は勝利者を選択しました: pdehaanは、perl で Matlab ソリューションを1文字打ち負かすことに成功しました。

Game of Life について聞いたことがない人のために説明すると、正方形のセルのグリッド (理想的には無限) を使用します。セルは、生きている (満たされている) か、死んでいる (空) 場合があります。次のルールを適用して、次のステップでどの細胞が生きているかを判断します。

  1. 生きている隣人が 2 つ未満の生きているセルは、人口不足が原因であるかのように死にます。
  2. 生きている隣人が 3 つ以上いる生きているセルは、過密状態のように死にます。
  3. 2 つまたは 3 つの生きた隣人を持つ生きたセルは、次の世代に生き続けます。
  4. ちょうど 3 つの生きている隣接セルを持つ死んだセルは、再生によって生きているセルになります。

プログラムは、コマンドライン引数として指定された 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 を生成する必要があります (存在する場合は上書きします)。
  • ボードの端を処理する必要はありませ(ラップアラウンド、無限グリッドなど)。
  • 編集:出力ファイルに改行が必要です

勝者は文字数によって決定されます。

幸運を!

4

24 に答える 24

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 コマンド ウィンドウからプログラムを実行する方法は次のとおりです。

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 文字

文字数を 140 未満 (つまり「ツイート可能」) に保ちながら、出力をテキスト ファイルではなく GIF ファイルにダンプできるかどうか試してみようと思いました。きれいにフォーマットされたコードは次のとおりです。

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 は 1 回しかループしません。おそらく、これは新しいバージョンの MATLAB で修正されたバグです。そこで、アニメーションを長持ちさせ、進化のステップを見やすくするために、フレーム遅延をデフォルト値 (約 0.5 秒のようです) のままにしました。Gosper Glider Gunパターンを使用した GIF 出力は次のとおりです。

代替テキスト


改良点

  • 更新 1:マトリックスbを論理 (つまり「ブール」) 型から数値型に変更して、いくつかの変換を取り除きました。
  • 更新 2:ファイルをロードするためのコードを短縮し、関数MAGICをトリックとして使用して、より少ない文字数で畳み込みカーネルを作成しました。
  • 更新 3:インデックス作成ロジックを簡素化~~b+0し、 に置き換え、CONV2の引数として にb/42置き換えました(驚くべきことに、それでも機能しました!)。'same''s'
  • 更新 4: The MathWorks のLorenが今年初めにゴルフとライフ ゲームについてブログを書いたので、最初にオンラインで検索する必要があったと思います。そこで説明したテクニックのいくつかを取り入れたのでb、論理マトリックスに戻す必要がありました。
  • 更新 5:上記のブログ投稿に対するAslak Grinstedのコメントは、ロジックと畳み込みの実行 (関数FILTER2を使用) の両方に対してさらに短いアルゴリズムを提案しているため、彼の提案を「組み込み」(「コピー」と読みます)。;)
  • 更新 6:の初期化から 2 文字を削除bし、ループ内のロジックを作り直して 1 文字追加しました。
  • 更新 7: Eric Sampson が電子メールで指摘してくれたので、4 文字節約できcell2matますchar。ありがとうエリック!
于 2010-08-18T17:37:34.463 に答える
30

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:

于 2010-08-17T14:03:03.510 に答える
24

パール、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
于 2010-08-21T22:22:58.393 に答える
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))

横スクロールで申し訳ありませんが、上記の改行はすべて必須で、それぞれ 1 文字として数えています。

ゴルフされたコードを読もうとはしません。最適な圧縮を実現するために、変数名はランダムに選択されます。はい、私は本気です。より適切にフォーマットされ、コメントされたバージョンは次のとおりです。

# 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 っぽいブラケットの書式設定で申し訳ありませんが、各ブラケットが何を閉じているのかを明確にしようとしていました。

于 2010-08-19T13:48:58.443 に答える
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))
于 2010-08-17T10:07:26.377 に答える
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
于 2010-08-19T09:36:18.027 に答える
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% の減少です。1D配列ではなく2D配列/文字列の配列を使用することで負けていると感じずにはいられませんが、今はその変換を行う気がしません。配列を初期化するためにファイルを3200回エレガントに読み取る方法に注意してください:)

于 2010-08-17T15:58:43.667 に答える
10

ジャワ、441... 346


  • 更新 1内部の if を削除し、さらに醜い
  • Update 2バグを修正し、キャラクターを獲得しました
  • 更新 3いくつかの境界の問題を無視しながら、より多くのメモリと配列を使用します。おそらく、いくつかの文字を保存できます。
  • 更新 4いくつかの文字を保存しました。BalusCに感謝します。
  • 更新 5 400 を下回るいくつかの小さな変更を行い、さらに少し醜くします。
  • Update 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();
 }
}
于 2010-08-18T17:07:40.453 に答える
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文字をトリミングしました。

于 2010-08-18T15:02:27.790 に答える
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}}
于 2010-08-17T13:26:21.143 に答える
7

次のソリューションでは、NULL と呼んでいる独自のドメイン固有のカスタム プログラミング言語を使用します。

3499538

これがどのように機能するのか疑問に思っている場合: 私の言語は、プログラムごとに 1 つのステートメントのみで構成されています。このステートメントは、コード ゴルフ スレッドに属する StackOverflow スレッド ID を表します。私のコンパイラは、これを (SO API を使用した) 最適な JavaScript ソリューションを探すプログラムにコンパイルし、それをダウンロードして Web ブラウザで実行します。

新しいスレッドにはランタイムの方が適している可能性があります (最初に支持された Javascript の回答が表示されるまでに時間がかかる場合があります) が、コーディング スキルはほとんど必要ありません。

于 2010-08-19T13:28:04.907 に答える
5

おたふく風邪: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
于 2010-08-22T18:19:52.800 に答える
5

C - 300


私のJavaソリューションがCでどれだけ小さくて醜いのか疑問に思いました。プリプロセッサビットの改行を含めて300に減らします。OSにメモリを解放します!OSも閉じてファイルをフラッシュすると仮定すると、最大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);
}
于 2010-08-20T11:59:01.980 に答える
5

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)
于 2010-08-17T22:55:35.423 に答える
4

Java、556 532 517 496 472 433 428 420 418 381 文字


  • 更新 1StringBuffer : 1 番目を にAppendable、2 番目をに置き換えましたchar[]。24文字節約。

  • 更新 2:ファイルを に読み込むためのより短い方法が見つかりましたchar[]。15文字節約。

  • 更新 3:if/else one by?:および merged char[]andint宣言を置き換えました。21文字節約。

  • 更新 4:(int)f.length()c.lengthによって置き換えられましたs。24文字節約。

  • 更新 5: Molehill のヒントに従って改善を行いました。主要な 1 つは、char の長さをハードコーディングして、File. 39文字節約。

  • 更新 6:マイナーなリファクタリング。6文字節約。

  • 更新 7: for ループに置き換え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さらに、の代わりにを使用すると、もう 1 文字節約することもできます'.'が、javac と Eclipse の両方でコンパイル エラーの可能性がある精度が失われる可能性があります。奇妙なもの。


注:これは、Windowsがデフォルトで使用するもの\nではなく、改行を含む入力ファイルを想定しています!\r\n

于 2010-08-18T15:13:51.317 に答える
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 でどのように見えるか興味がありました。おそらくこれは、コードゴルフの経験がもう少しある人にインスピレーションを与えるでしょう.

  • 両方の引数で $var = $_SERVER["argv"] の代わりに list() を使用するように 更新されました。素敵なドン
  • += と -= を更新
  • file_put_contents() を使用するようにファイル出力を更新しました Don による別の良いキャッチ
  • vars $q と $w の初期化を削除し、それらは使用されていませんでした
于 2010-08-20T17:36:15.957 に答える
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';}}
于 2010-08-20T07:05:47.037 に答える
2

R 340 chars

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

I feel it's slightly cheating to have an add in package that does the actual automata for you, but I'm going with it cos I still had to thrash around with matricies and stuff to read in the file with 'X' instead of 1.

This is my first 'code golf', interesting....

于 2010-08-20T12:54:49.730 に答える
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 #times

于 2010-08-21T05:20:32.200 に答える
1

ほら、この 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>
于 2014-04-01T00:01:59.840 に答える
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);
}
于 2014-01-29T13:26:58.943 に答える
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はかなり長い名前であり、ファイル アクセス モードを渡す必要があります。

于 2010-08-22T17:04:30.830 に答える
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 世代/秒でした。

もう一つの簡単なパターン

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

そしてグライダー

........................*...........
......................*.*...........
............**......**............**
...........*...*....**............**
**........*.....*...**..............
**........*...*.**....*.*...........
..........*.....*.......*...........
...........*...*....................
............**......................
于 2010-08-19T23:03:11.413 に答える