ওয়্যারওয়ার্ল্ড সেলুলার অটোমেটনের অনুকরণ করুন


24

ওয়্যারওয়ার্ল্ড একটি সেলুলার অটোমেটন যা তারের মধ্য দিয়ে প্রবাহিত ইলেকট্রনের অনুরূপ ডিজাইন করা হয়েছিল। এর সহজ যান্ত্রিকগুলি ডিজিটাল সার্কিটগুলি নির্মাণের অনুমতি দেয়। এমনকি এটি একটি সম্পূর্ণ কম্পিউটার নির্মাণের অনুমতি দিয়েছে ।

আপনার লক্ষ্যটি আপনার পছন্দের ভাষায় সংক্ষিপ্ততম ওয়্যারওয়ার্ল্ড বাস্তবায়ন তৈরি করা।

গ্রিডের প্রতিটি ঘরে চারটির মধ্যে একটিতে রাষ্ট্র রয়েছে। চারটি রাজ্য হ'ল "ফাঁকা," "তামা," "ইলেক্ট্রন মাথা," বা "ইলেক্ট্রন লেজ।"

  • একটি ফাঁকা ঘর সর্বদা একটি ফাঁকা ঘর থাকবে
  • একটি বৈদ্যুতিন মাথা সর্বদা একটি বৈদ্যুতিন লেজ হয়ে যাবে
  • একটি বৈদ্যুতিন লেজ সর্বদা তামা হয়ে যাবে
  • একটি তামার সেল ইলেক্ট্রন প্রধান হয়ে উঠবে যদি এর আটটি প্রতিবেশীর মধ্যে এক বা দু'জন ইলেক্ট্রন প্রধান হয়, অন্যথায় এটি তামা থাকবে

এই প্রতিযোগিতার শর্টেস্ট গেম অফ লাইফ প্রতিযোগিতার মতো একই স্টাইল থাকবে তবে কয়েকটি পরিবর্তন হবে।

  • গ্রিডটি কমপক্ষে 40 বাই 40 কোষের হতে হবে
  • গ্রিডের প্রান্তগুলি অবশ্যই চারপাশে মোড়ানো উচিত নয় (টরাস নয়)। মাঠের বাইরের কোষগুলিকে নিয়মিত "ফাঁকা" হিসাবে গণ্য করুন।
  • ব্যবহারকারীদের নিজস্ব শুরুর কনফিগারেশনটি প্রবেশ করা অবশ্যই সম্ভব হবে।
  • ফাঁকা পর্দার দিকে তাকানো মজাদার নয়। প্রোগ্রামটি চলার সাথে সাথে অবশ্যই অনুকরণটি প্রদর্শন করতে হবে।

এটি কোড গল্ফ, সবচেয়ে কম বাইট জেতা।

উত্তর:


6

এপিএল, ডায়ালগ (১৩১)

{h t c←1↓⍵∘=¨F←' htc'⋄⎕SM∘←1 1,⍨⊂N←F[1+⊃+/H h(t∨c≠H←c∧S↑1 1↓1 2∊⍨⊃+/+/K∘.⊖(K←2-⍳3)∘.⌽⊂¯1⌽¯1⊖h↑⍨2+S←25 79)ר⍳3]⋄∇N⊣⎕DL÷4}↑{79↑⍞}¨⍳25

আউটপুট ⎕SMউইন্ডোতে প্রদর্শিত হয় । সিমুলেশন অবিরাম চলে। গ্রিডটি 79x25 কারণ এটি ⎕SMউইন্ডোর ডিফল্ট আকার । বৈদ্যুতিন মাথাটি হয় h, লেজ হয় t, তামা হয় c। প্রোগ্রামটি 25 লাইন হিসাবে কীবোর্ড থেকে প্রারম্ভিক কনফিগারেশনটি পড়ে।

ব্যাখ্যা:

  • ↑{79↑⍞}¨⍳25: 79x25 গ্রিড পড়ুন
  • h t c←1↓⍵∘=¨F←' htc': তিনটি ম্যাট্রিক, একটি মাথা দিয়ে, একটিতে লেজ এবং একটি তামা সহ get স্ট্রিং এফ সেট করুন ' htc'

  • ⎕SM∘←1 1,⍨⊂N←F[1+⊃+/... ר⍳3]: "..." অংশটি দৈর্ঘ্যের তিনটি ভেক্টর, যেখানে উপাদানগুলি ম্যাট্রিক হয় যা যথাক্রমে নতুন মাথা, লেজ এবং তামা দেখায়। মাথাগুলি 1 দ্বারা, লেজগুলি 2 দ্বারা এবং তামাটি 3 দ্বারা গুণিত হয়, তারপরে আমরা এই ম্যাট্রিকগুলি একসাথে যোগ করি এবং একটি যুক্ত করি, যা সূচকে একটি ম্যাট্রিক্স দেয় FNইনপুট হিসাবে একই ফর্ম্যাটে নতুন রাজ্যে পরিণত হয় এবং এটি ⎕SMউপরের-বাম কোণ থেকে শুরু করে পর্দায় প্রদর্শিত হয় ।

  • ¯1⌽¯1⊖h↑⍨2+S←25 79: hদুটি সারি এবং কলাম দ্বারা এটি বাড়িয়ে দিয়ে ফাঁকাগুলির একটি সীমানা যুক্ত করুন , তারপরে এটিকে একটি ডান এবং নীচে ঘোরান।

  • ⊃+/+/K∘.⊖(K←2-⍳3)∘.⌽⊂: ম্যাট্রিক্সকে আটটি দিকের দিকে ঘোরান এবং তারপরে ফলাফলের ম্যাট্রিকগুলি একসাথে যোগ করুন, প্রতি পজিশনের শীর্ষস্থানীয় প্রতিবেশীদের পরিমাণ দিন।

  • 1 2∊⍨: 1 বা 2 প্রতিবেশী শুধুমাত্র সেই অবস্থানগুলিতে সেট করুন।

  • S↑1 1↓: আমরা আগে যোগ করা সীমানা সরান।

  • H←c∧: নতুন মাথা হ'ল সেই সমস্ত তামার কোষ যাঁদের 1 বা 2 মাথা প্রতিবেশী রয়েছে।

  • t∨c≠H: নতুন তামার কোষগুলি সমস্ত পুরানো লেজ এবং সমস্ত পুরানো তামার কোষ যা মাথা হয়ে উঠেনি।

  • H h(... ): নতুন মাথাগুলি Hউপরে গণনা করা হয়, নতুন লেজগুলি পুরানো মাথা এবং নতুন তামার কোষ উপরের হিসাবে গণনা করা হয়।

  • ∇N⊣⎕DL÷4: এক সেকেন্ডের 1/4 র্থ অপেক্ষা করুন, তারপরে আবার ফাংশনটি চালান N


আমার মনে হয় এটিতে 40 বাই 40 গ্রিড থাকতে পারলে ভাল হত।
mbomb007

6

ALPACA, ৮২ টি চর

ALPACA বিশেষত সেলুলার অটোমেটনের জন্য ডিজাইন করা একটি ভাষা।

o কিছুই নয়; সি কন্ডাক্টর; ই ইলেক্ট্রন; t হ'ল ইলেক্ট্রন লেজ।

state o " ";
state c "c" to e when 1 e or 2 e;
state e "e" to t;
state t "t" to c.

এই ভাষা কখন প্রকাশ করা হয়েছিল? ভাষার জন্য কোনও লিঙ্ক আছে?
অপ্টিমাইজার

@ অপ্টিমাইজার আপনি এখানে যান! আমি ভাষা করিনি।
ড্যানTheম্যান

4
কুল। সঠিক চ্যালেঞ্জের জন্য সঠিক ভাষা ..
অপ্টিমাইজার

4

গল্ফস্ক্রিপ্ট ( 125 120 105 100 চর)

n%{.,,{1${.0=,:w[1,*]\+2*>3<}:^~`{zip^''+.4=5%'`X '@{+}*(7&1>'iX'>+=}+w,%}%"\033[H\033[J"@n*+puts 6.?.?}do

নোট করুন যে আমি \033প্রত্যেকে একটি করে চরিত্র হিসাবে গণনা করছি , কারণ এগুলিকে আক্ষরিক ESCচরিত্র দ্বারা প্রতিস্থাপন করা যেতে পারে । এটি এএনএসআই নিয়ন্ত্রণ কোডগুলি ব্যবহার করে, তাই সুসংগত টিটিটির উপর নির্ভর করে। এছাড়াও নোট করুন যে ফ্রেমগুলি ইনপুট গ্রিড দিয়ে প্রিন্ট করা হয়।

অঙ্কের গ্রিড উত্পন্ন করার সাথে কিছু ওভারল্যাপ রয়েছে , যা মুর পাড়াটিও ব্যবহার করে।

এনকোডিং: ফাঁকা স্থান => ; বৈদ্যুতিন মাথা => i; বৈদ্যুতিন লেজ => `; তামা => X

পুনরাবৃত্তির মধ্যে বিরতি হল 46656 46656 গণনা করার জন্য প্রয়োজনীয় সময় । 6.?.?অন্য অভিব্যক্তিতে পরিবর্তন আপনাকে গতি নিয়ন্ত্রণ করতে দেয়; একই অক্ষর গণনার জন্য পরবর্তী ধীরতম্যটি 7.?.?, যা অনেক ধীর হয় (আউটপুটটি 22 গুণ হিসাবে বড় এবং এটি কোনও রৈখিক জটিলতার গণনা নয়)।

একটি পরীক্ষার ক্ষেত্রে, আমি ব্যবহার করে আসছি

`iXXXXXXXXX
X   X      
   XXX     
X   X      
i`XX XXXXXX

রোসেটা কোড ওয়্যারওয়ার্ল্ড চ্যালেঞ্জ থেকে।


3

পাইথন 371 341 অক্ষর

হ্যাঁ, এটি এত ছোট নয়, তবে এটির একটি ইন্টারেক্টিভ গুই রয়েছে!

import matplotlib.pylab as l,scipy.ndimage as i
r=round
w=l.zeros((40,40),int)-1
p=l.matshow(w,vmax=2)
c=p.figure.canvas
def h(e):
 try:w[r(e.ydata),r(e.xdata)]=[0,2,-1][e.button-1]
 except:x=i.convolve(w==2,l.ones((3,3)),int,'constant');w[:]=w/2+((w==0)&(x>0)&(x<3))*2
 p.set_data(w);c.draw()
c.mpl_connect('button_press_event',h)
l.show()

নির্দেশাবলী:

তারে রাখতে বাম মাউস বোতামটি ক্লিক করুন Click

সাফ করতে ডান মাউস বোতামের সাথে ক্লিক করুন

ইলেক্ট্রন মাথার জন্য মাঝারি মাউস বোতামটি ক্লিক করুন

অটোমেটনে পদক্ষেপ নিতে অক্ষের বাইরে ক্লিক করুন


(x>0)&(x<3)-> (0<x<3)। :)
beary605

3

পাইথন ( 243 214)

ব্যবহারযোগ্যতা এবং অক্ষরগুলির মধ্যে ক্রস করার চেষ্টা করেছিল। গ্রিড 40x40। স্ট্যান্ডিনে ইনপুট দেওয়া হয়। একটি ইলেক্ট্রন হেড হয় h, বৈদ্যুতিন লেজ হয় t, তামা হয় c, অন্য কিছু খালি।

import os
f=raw_input()
while 1:f=''.join('h'if(i=='c')&(0<sum(1 for i in[-1,1,-39,-40,-41,39,40,41]if f[e+i:e+i+1]=='h')<3)else't'if i=='h'else'c'if i=='t'else f[e]for e,i in enumerate(f));os.system('cls');print f

ওয়েল লুপ (লাইন 3) সঙ্কুচিত (কোডে রাখলে কাজ করবে না):

while 1:
 for e,i in enumerate(f):
  if(i=='c')&(0<sum(1 for i in[-1,1,-39,-40,-41,39,40,41]if f[e+i:e+i+1]=='h')<3):f[e]='h'
  elif i=='h':f[e]='t'
  elif i=='t':f[e]='c'
  else:f[e]=f[e]  #redundant, but Python needs this to run
 os.system('cls') #cls is shorter than clear, so I used that
 print f

আমার মনে হয় আপনি লাইন 5-7 একটি একক অভিব্যক্তি সঙ্গে প্রতিস্থাপন করতে পারেন: g[e]='h'if(t=='c')&...else't'if i=='h'else'c'if i=='t'else i। এটি ঠিক যেমনটি ঠিক তেমন কাজ করে কিনা তা নিশ্চিত নয় তবে সেই লাইনের সাথে কিছু কাজ করা উচিত
স্ট্রাইগয়েডস

2

সি, 355 347 300 294 অক্ষর

সম্পাদনা: উপলব্ধি আমার দরকার নেই feof()

সম্পাদনা করুন: 47 টি অক্ষর সংরক্ষিত! ঘুম সরানো হয়েছে, প্রায় সমস্ত ধনুর্বন্ধনী থেকে মুক্তি পেয়েছে, প্রচুর ক্রিয়াকলাপ একত্রিত করেছে।

সম্পাদনা: আজকের শেষটি, যেহেতু আমি 300 টি চর ছিটিয়েছি। এতে পরিবর্তিত printfহয়েছে puts, প্রথম তুলনার সাথে একটি সুন্দর সামান্য অপ্টিমাইজেশন পেয়েছে।

সি এই ধরণের সমস্যার জন্য নিজেকে ভাল ধার দেয় না, তবে ওহে, এটি গল্ফ করা মজাদার। এটি একটি দুর্দান্ত বর্বর বাস্তবায়ন, তবে আমি এটি দেখতে কতটা দূরে যেতে পারি তা দেখতে চেয়েছিলাম।

ইনপুট নামের একটি পাঠ্য ফাইল i। এটিতে *তামা সহ, +ইলেক্ট্রন মাথার -জন্য, বৈদ্যুতিন লেজের জন্য, খালি কোষগুলির জন্য স্পেস সহ প্রারম্ভিক রাষ্ট্রের প্রতিনিধিত্ব রয়েছে । আমি পরীক্ষার জন্য উইকি পৃষ্ঠা থেকে এক্সওআর গেটটি ব্যবহার করছি।

   ****-+**
  +        ******
   -*******      *
                ****
                *  *****
                ****
   ********      *
  +        ******
   -****+-*

char*p,t[42][42],s[42][42];
main(i,r,c,n,j)
{
  for(p=fopen("i","r");fgets(s[i++]+1,40,p););

  for(;;getch(),memcpy(s,t,1764))
    for(j=1;j<41;puts(s[j++]+1))
      for(i=1;i<41;)
      {
        p=t[j]+i;
        r=s[j][i++];
        *p=r==43?45:r;
        if(r==45)
          *p=42;
        if(r==42)
          for(r=-1,n=0;r<2;++r,*p=n&&n<3?43:42)
            for(c=-2;c<1;)
              n+=s[j+r][i+c++]==43;
      }
}

গেল cond?43:42লেখা যেতে 42+(cond)? এবং আমি নিশ্চিত তা না হলে r=s[j][i++];*p=r==43?45:r;if(r==45)*p=42;হ্রাস করা r=s[j][i++];*p=r==43?45:r==45?42:r;যেতে পারেr=s[j][i++]-43;*p=!r?45:r==2?42:r;
পিটার টেলর

1

পাইথন, 234 218 অক্ষর

import time
I=input
C=I()
H=I()
T=I()
R=range(40)
while 1:
 for y in R:print''.join(' CHT'[(C+H+2*T).count(x+y*1j)]for x in R)
 H,T=[c for c in C if 0<sum(1 for h in H if abs(c-h)<2)<3and c not in H+T],H;time.sleep(.1)

আপনি তামার কোষের স্থানাঙ্কগুলির প্রতিনিধিত্বকারী জটিল সংখ্যার তিনটি তালিকা হিসাবে বোর্ডকে ইনপুট করেন (যার মধ্যে অবশ্যই মাথা এবং লেজের তালিকা অন্তর্ভুক্ত থাকতে হবে), মাথা এবং লেজগুলি থাকে। এখানে একটি উদাহরণ:

[3+2j+x for x in range(8)] + [3+4j+x for x in range(8)] + [11+3j+x for x in range(6)] + [2+3j]
[3+2j]
[2+3j]

মনে রাখবেন যে আমরা evalইনপুট, যাতে আপনি জটিল সংখ্যার তালিকার জন্য নির্বিচারে জটিল এক্সপ্রেশন ব্যবহার করতে পারেন।


1

কিউবাসিক, 309 বাইট

সতর্কতা: গল্ফযুক্ত সংস্করণটি ব্যবহারকারী-বান্ধব নয়: এর একটি অদ্ভুত ইনপুট পদ্ধতি রয়েছে, অসীম লুপ হিসাবে চালায় এবং এর কোনও বিলম্ব হয় না (এইভাবে কিছু সিস্টেমে খুব দ্রুত চলে)। আপনার কিউবাসিক পরিবেশে কোনও প্রোগ্রামটি কীভাবে শেষ করতে হয় তা যদি আপনি জানেন তবেই এটি চালান। অব্যক্ত সংস্করণটি সুপারিশ করা হয়েছে (নীচে দেখুন)।

INPUT w,h
SCREEN 9
FOR y=1TO h
FOR x=1TO w
PSET(x,y),VAL(INPUT$(1))
NEXT
NEXT
DO
FOR y=1TO h
FOR x=1TO w
SCREEN,,0
c=POINT(x,y)
d=c
IF c=7THEN d=1
IF c=1THEN d=6
IF c=6THEN
n=0
FOR v=y-1TO y+1
FOR u=x-1TO x+1
n=n-(POINT(u,v)=7)
NEXT
NEXT
d=7+(n=0OR n>2)
END IF
SCREEN,,1,0
PSET(x,y),d
NEXT
NEXT
PCOPY 1,0
LOOP

চালানোর জন্য, প্রম্পট আপনার কনফিগারেশন এর প্রস্থ ইনপুট এ উল্লেখ wএবং উচ্চতা h1 তারপরে w*hকক্ষের জন্য একক-অঙ্কের কোডগুলি টাইপ করুন (বাম থেকে ডানদিকে সরানো হচ্ছে, তারপরে উপরে থেকে নীচে), সহ

  • 0 = খালি
  • 6 = তারে
  • 7 = সিগন্যাল মাথা
  • 1 সিগন্যাল লেজ

একবার আপনি সমস্ত কক্ষে প্রবেশ করে নিলে সিমুলেশনটি শুরু হবে (এবং আপনি প্রোগ্রামটিকে হত্যা না করা অবধি চিরকাল অবিরত)।

Ungolfed

আরও ব্যবহারকারী-বান্ধব সংস্করণ। বিন্যাসটি সংশোধন করতে DATA, শেষে বিবৃতিগুলি সংশোধন করুন ।

কোডটি POINTফাংশনটির সুবিধা গ্রহণ করে যা স্ক্রিন থেকে একটি পিক্সেলের রঙের মান পড়ে। এর অর্থ আমাদের কোষগুলিকে আলাদাভাবে অ্যারে হিসাবে সংরক্ষণ করতে হবে না। সমস্ত ঘর এক সাথে আপডেট হয় তা নিশ্চিত করার জন্য, আমরা দ্বিতীয় "পৃষ্ঠায়" আপডেটগুলি সম্পাদন করি। আমরা SCREENবিবৃতিটির একটি সংস্করণ ব্যবহার করে সক্রিয় পৃষ্ঠা টগল করতে পারি , এবং বিবৃতিটি ব্যবহার করে একটি পৃষ্ঠার বিষয়বস্তু অন্যটিতে অনুলিপি করতে পারি PCOPY

SCREEN 9

EMPTY = 0 ' Black
HEAD = 7  ' Light gray
TAIL = 1  ' Blue
WIRE = 6  ' Brown/orange

' First two data values are the width and height
READ w, h
' The rest are the initial configuration, row by row
' Read them and plot the appropriately colored pixels
FOR y = 1 TO h
  FOR x = 1 TO w
    READ state$
    IF state$ = "" THEN value = EMPTY
    IF state$ = "H" THEN value = HEAD
    IF state$ = "T" THEN value = TAIL
    IF state$ = "W" THEN value = WIRE
    PSET (x, y), value
  NEXT x
NEXT y

' Loop the simulation until user presses a key
DO UNTIL INKEY$ <> ""
  ' Store current time for delay purposes
  t# = TIMER

  FOR y = 1 TO h
    FOR x = 1 TO w
      ' Active page = display page = 0
      SCREEN , , 0
      ' Get the color value of the pixel at x,y
      oldVal = POINT(x, y)
      IF oldVal = EMPTY THEN
        newVal = EMPTY
      ELSEIF oldVal = HEAD THEN
        newVal = TAIL
      ELSEIF oldVal = TAIL THEN
        newVal = WIRE
      ELSEIF oldVal = WIRE THEN
        neighbors = 0
        FOR ny = y - 1 TO y + 1
          FOR nx = x - 1 TO x + 1
            IF POINT(nx, ny) = HEAD THEN neighbors = neighbors + 1
          NEXT nx
        NEXT ny
        IF neighbors = 1 OR neighbors = 2 THEN
          newVal = HEAD
        ELSE
          newVal = WIRE
        END IF
      END IF
      ' Active page = 1, display page = 0
      SCREEN , , 1, 0
      ' Plot the new value on page 1
      PSET (x, y), newVal
    NEXT x
  NEXT y

  ' Copy page 1 to page 0
  PCOPY 1, 0

  ' Delay
  WHILE TIMER >= t# AND t# + 0.2 > TIMER
  WEND
LOOP

DATA 8,5
DATA T,H,W,W,W,W,W,W
DATA W, , , ,W, , , 
DATA  , , ,W,W,W, , 
DATA W, , , ,W, , , 
DATA H,T,W,W, ,W,W,W

1 প্রস্থ এবং উচ্চতার জন্য সর্বোচ্চ মানগুলি কোন স্ক্রিন মোড ব্যবহৃত হয় তার উপর নির্ভর করে। ইন SCREEN 9, প্রস্থটি 638 এবং উচ্চতা 348 পর্যন্ত হতে পারে SCREEN 7a একটি ছোট উইন্ডো দেয়)।

উদাহরণ রান

স্ক্রিন মোড 7 সহ আর্কাইভ.আর.জে অবরুদ্ধ সংস্করণ :

কিউব্যাসিকে ওয়্যারওয়ার্ল্ড

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.