যে কোনও 1D সেলুলার অটোমেটন সিমুলেট করুন


14

চ্যালেঞ্জ

আপনাকে একটি সম্পূর্ণ প্রোগ্রাম লিখতে হবে যা এসটিডিআইএন থেকে সাতটি সংখ্যা নেয় এবং সেলুলার অটোমেটনের (সিএ) দ্বি মাত্রিক ইতিহাসটি এসটিডিআউট প্রিন্ট করে। এটি কোড গল্ফ।

ইনপুট বিন্যাস ইনপুটটি কমা দ্বারা আলাদা সাতটি পূর্ণসংখ্যা / স্ট্রিং হবে। প্রথম নম্বরটি হ'ল ওল্ফ্রাম কোড অনুসারে নিয়মের সংখ্যা (প্রতিটি নিয়মের মানক নাম)। দ্বিতীয়টি হল প্রাথমিক প্রারম্ভিক কনফিগারেশন। তৃতীয় এবং চতুর্থ বর্ণনা করে যে কোন প্যাটার্নটি এবং এটি কত বার প্রারম্ভিক কনফিগারেশনের বামে সংযুক্ত করা উচিত। প্যাডিং হিসাবে পঞ্চম এবং ষষ্ঠটি ডান পাশের জন্য একই কাজ করে। শেষ সংখ্যাটি সিমুলেশন চালানোর জন্য প্রজন্মের সংখ্যা।

সুতরাং, ইনপুট একটি উদাহরণ 90,11,0,4,0,4,5। এটি আপনার প্রোগ্রামকে বলতে হবে যে আপনি নিয়ম 90 চালাচ্ছেন । এটি প্রোগ্রামটিকেও বলা উচিত যে আপনি চাইছেন যে প্রাথমিক কনফিগারেশনটি দুটি প্রান্তে 4 বার সংযুক্ত 11স্ট্রিংয়ের 0সাথে থাকে, তাই আসল প্রারম্ভিক প্যাটার্নটি 0000110000। এটি আপনার প্রোগ্রামকে 5 প্রজন্ম ধরে এই সিমুলেশনটি চালনা করতে বলে।

আউটপুট আপনার প্রোগ্রামটি প্রতিটি প্রজন্মের কোষগুলির পুরো অ্যারেটি মুদ্রণ করবে (নতুন লাইনের দ্বারা পৃথক), যাতে আউটপুটটি সিএ এর স্পেস-টাইম ডায়াগ্রাম হয়। প্রতিটি প্রজন্মের জন্য, প্রতিটি কক্ষের অবস্থা ইনপুট হিসাবে সরবরাহিত নিয়ম অনুসারে তত্ক্ষণিক বাম এবং ডানদিকে তার রাজ্য এবং কোষের রাজ্য দ্বারা নির্ধারিত হয়। সিমুলেশনটি প্রান্তগুলির চারপাশে মোড়ানো উচিত। প্রথম মুদ্রিত জিনিসটি জেন ​​হিসাবে প্রাথমিক আরে হওয়া উচিত। 0।

ইনপুটটির 90,11,0,4,0,4,5ফলে নীচের আউটপুটটি যথাসম্ভব যথাযথ হওয়া উচিত।

0000110000
0001111000
0011001100
0111111110
1100000011
0110000110

লক্ষ্য করুন যে শুরু রাষ্ট্রটি পাঁচটি প্রজন্মের অন্তর্ভুক্ত নয়। এছাড়াও লক্ষ করুন যে সিমুলেশনটি প্রান্তগুলির চারপাশে মোড়ক করে।

আরও উদাহরণ

ইনপুট:

184,1100,01,2,01,1,4

আউটপুট:

0101110001
1011101000
0111010100
0110101010
0101010101

ইনপুট:

0,1011,1,0,0,1,2

আউটপুট:

10110
00000
00000

কীভাবে 1 ডি সিএ কাজ করে এবং কীভাবে তাদের নাম্বার করা হয় সে সম্পর্কে আরও তথ্য


পরীক্ষার কেস হিসাবে নিয়ম 0 অন্তর্ভুক্ত করার জন্য ভাল হয়েছে done
পিটার টেলর

আমি মুগ্ধ হয়েছি যে নিয়ম 90 একটি সিয়েরপিনস্কি গসকেট। বিশেষত যেহেতু আমি অন্য কোডগল্ফ প্রকল্পের জন্য পরীক্ষার অংশ ছিলাম ।
জোফিশ

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

কেউ ইতিমধ্যে এটি করেছে: pouet.net/prod.php?which=60478
লুসার ড্রোগ

উত্তর:


5

গল্ফস্ক্রিপ্ট, 77 73 70 অক্ষর

','/)~\(~:?;~~*@@~*@+\+{1&}/]({[.,{.[3<?256+]{2base}/\~=\(+}*])n@)\+}*

@ হাওয়ার্ডকে ধন্যবাদ, যিনি কীভাবে 4 টি অক্ষর সংরক্ষণ করবেন তা নির্দেশ করেছিলেন।


আপনি একটি সুস্পষ্ট সংরক্ষণ করতে পারেন 48--> 1&এবং আমি আরও তিনটি মনে করি। আপনি )ব্লকটির আগে বাদ দিতে পারেন (কাউন্টারটি বাড়ানো হবে না) এবং তাই শেষ দুটি পপগুলি সংরক্ষণ করতে পারেন।
হাওয়ার্ড

@ হওয়ার্ড, ধন্যবাদ শেষে থাকা এই পপগুলি পূর্বের পুনরাবৃত্তিতে দরকারী ছিল তবে আপনি ঠিক বলেছেন যে এগুলি অপসারণ করা এখনই বোধগম্য।
পিটার টেলর

5

এপিএল (153 টি অক্ষর)

∇ cellularautomaton
  i               ← ⍞
  s               ← (i=',') / ⍳ ⍴i
  (b a x c)       ← {i[s[⍵]↓⍳s[⍵+1]-1]} ¨ ⍳4
  (z x x l x r n) ← ⍎i
  y               ← ⍎ ¨ ⊃ ,/ (l / ⊂a) , b , r / ⊂c
  (n+1) (⊃⍴,y) ⍴ '01'[1+⊃ ,/ y,{({(z ⊤⍨ 8/2)[8 - 2⊥¨ 3 ,/ (⊃⌽⍵),⍵,⊃⍵]}⍣⍵)y} ¨ ⍳n]
∇

এবং কম পাঠযোগ্য, সামান্য খাটো আকারে:

i←⍞⋄s←(i=',')/⍳⍴i⋄b a x c←{i[s[⍵]↓⍳s[⍵+1]-1]}¨⍳4⋄z x x l x r n←⍎i⋄y←⍎¨⊃,/(l/⊂a),b,r/⊂c⋄'01'[1+⊃,/y,{({(z⊤⍨8/2)[8-2⊥¨3,/(⊃⌽⍵),⍵,⊃⍵]}⍣⍵)y}¨⍳n]⍴⍨(1+n),⊃⍴,y

উদাহরণ:

      cellularautomaton
26,00110,01,4,10,6,7
0101010100110101010101010
1000000011100000000000001
0100000110010000000000011
0010001101101000000000110
0101011001000100000001101
0000010110101010000011000
0000100100000001000110100
0001011010000010101100010

আমি নিশ্চিত যে উন্নতির জন্য জায়গা রয়েছে (আমি এই পোস্টটি লেখার সময়ও কিছু পরিবর্তন খুঁজে পেয়েছি!) তবে এর মধ্যে কিছু মৌলিক পরিবর্তনগুলি জড়িত থাকতে পারে এবং আমি আর এপিএলে তাকাতে পারি না। এখানে ব্যবহৃত এপিএলের বৈকল্পিক হ'ল ডায়ালগ এপিএল


4

রুবি, 165 159 টি অক্ষর

a=gets.split ?,
b=a.map &:to_i
c=(x=a[2]*b[3]+a[1]+a[4]*b[5]).chars.map &:hex
(0..b[6]).map{puts c*''
c=(1..w=x.size).map{|i|b[0]>>c[i-1]*2+c[i%w]+c[i-2]*4&1}}

সম্পাদনা করুন: আমি ছোট বর্ধনের জন্য কিছু জায়গা পেয়েছি।

উদাহরণ রান:

> 30,1,0,20,0,20,20
00000000000000000000100000000000000000000
00000000000000000001110000000000000000000
00000000000000000011001000000000000000000
00000000000000000110111100000000000000000
00000000000000001100100010000000000000000
00000000000000011011110111000000000000000
00000000000000110010000100100000000000000
00000000000001101111001111110000000000000
00000000000011001000111000001000000000000
00000000000110111101100100011100000000000
00000000001100100001011110110010000000000
00000000011011110011010000101111000000000
00000000110010001110011001101000100000000
00000001101111011001110111001101110000000
00000011001000010111000100111001001000000
00000110111100110100101111100111111100000
00001100100011100111101000011100000010000
00011011110110011100001100110010000111000
00110010000101110010011011101111001100100
01101111001101001111110010001000111011110
11001000111001111000001111011101100010001

3

সি, 303 305 301 294 292

305 সম্পাদনা: উফ! ভুলে গেছি যে calloc()দুটি আর্গ গ্রহণ করে। এটি বড় ইনপুটটিতে ফুঁকছে।

301 সম্পাদনা: আহা এইচএ! calloc()অনুরোধ করা মেমরির ব্লক আকার বাড়িয়ে আরও 2 টি বাইট সংরক্ষণ করতে আমার বু-বু ব্যবহার করুন।

294 সম্পাদনা: ভেঙে 300! এর মধ্যে strcat()একটি মুছে ফেলা হয়েছে এবং কয়েকটি লুপ টুইট করেছে। সর্বাধিক মামাটি ব্যবহার করতে পেলাম, যা ব্যবহার হিসাবে বলা মজাদার।

292 সম্পাদনা করুন: +2মেমরি বরাদ্দকরণের প্রয়োজন হয়নি ।

আমি লুজার ড্রোগের উত্তরটি বেস ধারণা হিসাবে ব্যবহার করেছি , তবে মোড়ক অ্যালগরিদম এবং সেইসাথে প্রচুর টুইট এবং ফ্যাক্টরিং পরিবর্তন করেছি।

r,A,C,n,j;main(){char*s,*p,*t,a[9],b[9],c[9];scanf("%d,%[01],%[01],%d,%[01],%d,%d",&r,b,a,&A,c,&C,&n);for(s=calloc(A+++C,9);A--;)strcat(s,A?a:b);for(;C--;)strcat(s,c);p=strdup(s);for(C=strlen(s);A++<n;puts(s),t=p,p=s,s=t)for(j=C;j--;)p[j]=(1<<(s[j?j-1:C-1]*4+s[j]*2+s[(j+1)%C])-336)&r?49:48;}

r,A,C,n,j;
main(){
    char*s,*p,*t,a[9],b[9],c[9];
    scanf("%d,%[01],%[01],%d,%[01],%d,%d",&r,b,a,&A,c,&C,&n);
    for(s=calloc(A+++C,9);A--;)
        strcat(s,A?a:b);
    for(;C--;)
        strcat(s,c);
    p=strdup(s);
    for(C=strlen(s);A++<n;puts(s),t=p,p=s,s=t)
        for(j=C;j--;)
            p[j]=(1<<(s[j?j-1:C-1]*4+s[j]*2+s[(j+1)%C])-336)&r?49:48;
}

screenshot1

screenshot2


1
আপনি এটি শুরু করতে ভুলে গেছেন C,A,! :)
লুসার droog

ভারী স্মৃতির জন্য, কী brk()? তাহলে p=s+C+1;কোথাও
লুসার droog

1
ব্যবহারের জন্য আবার +1 +++!
লুসার droog

হা হা! সমস্ত পরিবর্তন করুন %[01]থেকে %s! -9 (... বহু বছর পরে)
লুসার ড্রোগ

1
@ লেজারড্রোগ এটি কাজ করে না কারণ% s লোভী এবং কমা ও অন্যান্য সংখ্যাও খায়।
জোফিশ

2

সি (487 484 418 স্পেস সরিয়ে দিয়ে)

* জোফিশের সাহায্যে 66 টি নামিয়ে দেওয়া হয়েছে *

C,A,r,n,j;main(){char*s,*p,*t,a[9],b[9],c[9];
    scanf("%d,%[01],%[01],%d,%[01],%d,%d",&r,b,a,&A,c,&C,&n);
    s=malloc(strlen(a)*A+strlen(b)+strlen(c)*C+3);*s=0;
    strcat(s,"0");
    for(;A--;)strcat(s,a);
    strcat(s,b);
    for(;C--;)strcat(s,c);
    strcat(s,"0");
    p=malloc((C=strlen(s)-1)+2);
    for(;n--;){
    *s=s[C-1];
    s[C]=0;
    puts(s+1);
    s[C]=s[1];
    for(j=1;s[j+1];j++)
        p[j]=(1<<(s[j-1]-48)*4+(s[j]-48)*2+s[j+1]-48)&r?49:48;
    t=p;p=s;s=t;
    }
    s[C]=0;
    puts(s+1);
}

টাইপরাইটারে মুদ্রি

জোশ @ জেড 1 ~
$! মি
সিএ তৈরি
cc ca.c -o ca
CA.c: 1: 1: সতর্কতা: ডেটা সংজ্ঞায় কোনও প্রকার বা স্টোরেজ শ্রেণি নেই
ca.c: ফাংশনে 'প্রধান':
ca.c: 2: 5: সতর্কতা: অন্তর্নির্মিত ফাংশন 'স্ক্যানফ' এর বেমানান অন্তর্নিহিত ঘোষণা
ca.c: 3: 7: সতর্কতা: অন্তর্নির্মিত ফাংশন 'malloc' এর বেমানান অন্তর্নিহিত ঘোষণা
ca.c: 3: 14: সতর্কতা: অন্তর্নির্মিত ফাংশন 'স্ট্রেলেন' এর বেমানান অন্তর্নিহিত ঘোষণা
ca.c: 4: 5: সতর্কতা: অন্তর্নির্মিত ফাংশন 'strcat' এর বেমানান অন্তর্নিহিত ঘোষণা

জোশ @ জেড 1 ~
$ প্রতিধ্বনি 90,11,0,4,0,4,5 | CA
-বাশ: সিএ: কমান্ড পাওয়া যায় নি

জোশ @ জেড 1 ~
$ প্রতিধ্বনি 90,11,0,4,0,4,5 | ./ca
0000110000
0001111000
0011001100
0111111110
1100000011
0110000110


খুশী হলাম। আপনার intভেরিয়েবলগুলি বিশ্বব্যাপী করে এবং মুছে ফেলা দিয়ে আপনি বেশ কয়েকটি বাইট শেভ করতে পারেন #include: r,A,B,C,n,i,j; main(){char *s...
জোফিশ

আপনার forলুপগুলিতে একটি গুচ্ছ সংরক্ষণ করুন :for(;A--;)strcat(s,a);
জোফিশ

এবং পুনরায় ব্যবহার করুন Aএবং Cপরে যাতে আপনাকে ডিক্লেয়ার iবা একেবারেই করতে হবে না Bp=malloc((C=strlen(s))+1); --C; strcpy(p,s); for(A=0;A<n;A++){দুঃখিত, আমি এখনই থামব :)
জোফিশ

ঠিক আছে, আমি আরও একটি মিথ্যা বলেছি। নির্মূল করে 2 byes পরিত্রাণ পেতে --C;: p=malloc((C=strlen(s)-1)+2);। আমি মনে করি গল্ফিং কোডটি প্রথমে আসার চেয়ে মজাদার!
জোফিশ

#includeযেহেতু scanfবৈকল্পিক তাই আমি মুছে ফেলার বিষয়ে নিশ্চিত ছিলাম না । তবে এটি সম্ভবত ঠিক আছে কারণ এটি কেবল একবার ডাকা হয় called ... আমার পুরানো যন্ত্রটি গতকাল মারা গিয়েছিল এবং আমি এখনও সাইগউইন ইনস্টল করছি। আমি যত তাড়াতাড়ি এটি পরীক্ষা করতে পারি আমি এই পরিবর্তনগুলি অন্তর্ভুক্ত করব। ধন্যবাদ!
লুসার droog
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.