একটি অদ্ভুত অটোম্যাটন প্রয়োগ করুন


11

আমি সেলুলার অটোমেটনের সাথে চারপাশে খেলছিলাম এবং আমি একটি আকর্ষণীয় আচরণ পেয়েছিলাম। এখানে কিভাবে এটা কাজ করে:

এটা একটা বাইনারি স্ট্রিং সার্চ বাঁ দিক থেকে ডানদিকে, যদি encounters একটি 1দ্বারা অনুসরণ 2অন্যান্য মান এটি একটি সংযোজন হবে 0ফলাফল এবং পড়া চালিয়ে যান। যদি এটির মুখোমুখি হয় 0(বা 3 টিরও কম মান বাকি রয়েছে) তবে এটি বর্তমান মান এবং একটি সংযোজন করবে 1এবং পড়া চালিয়ে যাবে। স্ট্রিংয়ের শেষে এটি ফলাফলটিতে একটি একক সংযোজন করবে 1

এখানে একটি প্রজন্মের একটি কাজের উদাহরণ's

01011111
^

আমরা প্রথমে একটি মুখোমুখি 0হই যাতে আমরা 01আমাদের ফলাফলের সাথে সংযোজন করি

01011111
 ^
01

এখন আমরা একটি মুখোমুখি হয়েছি 1তাই আমরা একটি শূন্য সংযোজন করি এবং পরবর্তী দুটি মান ছেড়ে চলে যাই

01011111
    ^
010

আমরা অন্যটির মুখোমুখি 1হই তাই আমরাও তাই করি

01011111
       ^
0100

আমাদের এখন আর একটি 1তবে লাফ দেওয়ার মতো পর্যাপ্ত জায়গা নেই তাই আমরা বর্তমান কক্ষটি সংযুক্ত করি এবং একটি 1(এই ক্ষেত্রে 11)

01011111
        ^
010011

আমরা শেষে রয়েছি তাই আমরা একটি একক সংযোজন করি 1এবং এই প্রজন্মকে সমাপ্ত করব

01011111
        ^
0100111

কার্য

যে কোনও যুক্তিসঙ্গত বিন্যাসে ইনপুট দেওয়া আপনার অবশ্যই একটি ফাংশন বা প্রোগ্রাম তৈরি করতে হবে যা অটোমেটনের একটি প্রজন্মকে গণনা করে।

এটি একটি প্রশ্ন তাই উত্তরগুলি বাইটে স্কোর করা হবে, কম বাইট আরও ভাল।

নমুনা বাস্তবায়ন

এখানে হাস্কেলের একটি নমুনা বাস্তবায়ন (একটি ফাংশন সংজ্ঞায়িত করে dতবে প্রোগ্রামটি অনির্দিষ্টকালের জন্য একটি পুনরাবৃত্তি মুদ্রণ করে):

d('1':_:_:x) = "0" ++ d x
d(a:x) = a:'1':d x
d x = "1"
r x = x:map d(r x)

এটি অনলাইন চেষ্টা করুন!


আপনার প্রশ্নে আপনি বলেছেন যে আমাদের কাছে এখন আরও 1 টি আছে তবে লাফ দেওয়ার পর্যাপ্ত জায়গা নেই তাই আমরা বর্তমান ঘরটি এবং একটি 1 বা 11 সংযোজন করি । এটি 1 বা 11?
কেয়ার্ড কোইনরিঙ্গিংহিং

2
সুতরাং আমাদের যদি 10এটি একটি মুদ্রণ করা উচিত 11011? আমি মনে করি আরও কয়েকটি পরীক্ষার কেস সহায়ক হবে
nmjcman101

2
@ ওয়েট উইজার্ড আমি বিধিগুলির একটি পরিষ্কার ব্যাখ্যা, সম্ভবত একটি টেবিলের প্রশংসা করব
আলেকজান্ডার - মনিকা

2
আমি বিশ্বাস করি না এটি আসলে একটি সেলুলার অটোমেটন, তবে এটি একটি সংজ্ঞা দিয়ে আমাকে আলোকিত করতে নির্দ্বিধায় মনে হয়।
২৮

2
@ ফেয়ারসাম আসলে এটি কোষের সংখ্যা সংরক্ষণ করে না। এটি একটি সসীম-রাষ্ট্রীয় ট্রান্সডুসার
janrjan জোহানসেন

উত্তর:


5

ভি , 26 22 21 বাইট

রেজিক্সগুলি মিশ্রিত করে 4 বাইটের জন্য @ কুইজক্যাককে ধন্যবাদ! এবং @ janrjanJohansen কিছু বেটে কিছু রেগেক্স সংমিশ্রণের জন্য

Ó1../3
Ó./&1
Ó31/0
A1

এটি অনলাইন চেষ্টা করুন!

একাধিকবার বিকল্প ব্যবহার করে এবং শেষে 1 যুক্ত করে। খুব অভিনব কিছু না। আমার কাছে এমন সংস্করণ রয়েছে যা পছন্দসই প্রভাব পেতে রিম্যাপ করে 1এবং 0সন্নিবেশ মোডে রাখে তবে এটি বেশ খানিকটা দীর্ঘ।

(একাধিক প্রতিস্থাপন সংস্করণ: এটি অনলাইনে চেষ্টা করুন! )


দ্বিতীয় এবং তৃতীয় রেজেক্সগুলি Ó1ü0/&1( üহল \|)
ইউজার 41805

পুনঃটুইট
nmjcman101

এটি এমনকি এরকম খাটো এর Ó./&1দ্বারা অনুসরণ Ó31/0
janর্জন জোহানসেন

3

জাভাস্ক্রিপ্ট (ES6), 56 বাইট

অক্ষরের অ্যারে হিসাবে ইনপুট নেয়। একটি স্ট্রিং, বা 1একটি খালি অ্যারে দেওয়া হলে নম্বর প্রদান করে।

f=([v,...a])=>v?(+v&&a[1]?a.splice(0,2)&&'0':v+1)+f(a):1

ডেমো

অ্যানিমেটেড সংস্করণ

স্থিতিশীল ইনপুটগুলির উদাহরণ: 0101, 010011111



2

পাইথন 2 , 89 বাইট

x=input()
y=0
k=[]
while x[y:]:v=1-x[y]*(y<len(x)-2);k+=[x[y]]*v+[v];y+=3-2*v
print k+[1]

এটি অনলাইন চেষ্টা করুন!

-4 বাইট রড
-6 বাইট ধন্যবাদ Ovs
-1 বাইট ধন্যবাদ micsthepick ধন্যবাদ


[0]if v else[x[y],1]হিসাবে আবারও লেখা যেতে পারে [[x[y],1],[0]][v], তবে আপনি 96 টি বাইটেv পৌঁছানোর মানটি উল্টাতে পারেন
রড


পাইথন 2 এ মুদ্রণ বিবরণের জন্য প্যারেন্টিহেসের প্রয়োজন নেই, তাই আপনি একটি বাইট সংরক্ষণ করতে পারেন
micsthepick

2

সুইফট 3 , 147 বাইট

@ মিঃ এক্সএক্সকোডারকে -1 ধন্যবাদ

func g(i:[Int]){var r=[Int]();var s=ArraySlice(i);while let e=s.popFirst(){if 0<e&&2<s.count{r+=[0];s=s.dropFirst(2)}else{r+=[e,1]}};print(r+[1])}

অসমাপ্ত, মুদ্রণের চেয়ে মান ফিরিয়ে দিচ্ছে:

func iterate(state: [Int]) -> [Int] {
    var result = [Int]()

    var inputSlice = ArraySlice(state)

    while let element = inputSlice.popFirst() {
        if 0 < element && 2 < inputSlice.count { 
            result += [0]
            inputSlice = inputSlice.dropFirst(2)
        }
        else {
            result += [element, 1]
        }

        //debugPrint(result.map(String.init).joined(separator: ""))
    }

    return result + [1]
}

1
আপনি প্রতিস্থাপন করতে পারেন 3<=s.countসঙ্গে 2<s.countজন্য -1 বাইট
মিঃ এক্সকোডার

@ মিঃ এক্সকোডার ধন্যবাদ! আমিও সনাক্ত করে করতে 1ইনপুট মধ্যে গুলি 0 < elementবদলেelement == 0
পুনর্বহাল মনিকা - আলেকজান্ডার

1

পাইথন 2 , 81 বাইট

ইনপুট এবং আউটপুট উভয়ই তালিকাগুলি (এরিক আউটগোলফারকে ধন্যবাদ)

def f(Z):return Z and((1>Z[0]or 3>len(Z))and[Z[0],1]+f(Z[1:])or[0]+f(Z[3:]))or[1]

এটি অনলাইন চেষ্টা করুন!

কিছু কারন

[0,1,0,1,1,1,1,1] --> [0,1,0,0,1,1,1]
[0] ----------------> [0,1,1]
[1] ----------------> [1,1,1]
[] -----------------> [1]
[0,1] --------------> [0,1,1,1,1]
[1,0] --------------> [1,1,0,1,1]

পাইথন 2 , 85 বাইট

ইনপুট এবং আউটপুট উভয়ই স্ট্রিং (প্রাথমিক সমাধান)

def f(Z):return Z and(('0'==Z[0]or 3>len(Z))and Z[0]+'1'+f(Z[1:])or'0'+f(Z[3:]))or'1'

এটি অনলাইন চেষ্টা করুন!

কিছু কারন

'01011111'--> 0100111
'0'---------> 011
'1'---------> 111
''----------> 1
'01'--------> 01111
'10'--------> 11011

ব্যাখ্যা এটি সহজভাবে একটি পুনরাবৃত্ত পদ্ধতির একটি গল্ফ।



@ এরিকথ আউটগল্ফারকে ধন্যবাদ :)
এমডাহুমনে

ওহ, এবং আপনি এর 1>Z[0]পরিবর্তে করতে পারেন 0==Z[0]
এরিক দ্য আউটগল্ফার


0

scala , 131 + 29 = 160 বাইট

এটি কোনও ফাংশনের অভ্যন্তরে স্ট্রিংটিকে aপ্যারামিটার হিসাবে গ্রহণ করে আউটপুটটিকে স্ট্রিং হিসাবে ফিরিয়ে দেয়।

var s=""
var k=0
for(c<-0 to a.length-1)breakable{if(k>0){k-=1
break}
if(a(c)==49&c<a.length-3){s+="0"
k+=2}else s+=a(c)+"1"}
s+"1"

আমার আছে import util.control.Breaks._ , তাই আমাকে সেই 28 বাইট প্লাস একটি ট্রেলিং লাইনফিড যুক্ত করতে হবে।

এটি অনলাইন চেষ্টা করুন!


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