ติดตั้งหุ่นยนต์แปลก ๆ


11

ฉันกำลังเล่นกับหุ่นยนต์อัตโนมัติและฉันพบสิ่งที่มีพฤติกรรมที่น่าสนใจ นี่คือวิธีการทำงาน:

มันอ่านสตริงไบนารีจากซ้ายไปขวาหากพบ1ตามด้วย2ค่าอื่น ๆ มันจะผนวก0กับผลและอ่านต่อ หากพบ0(หรือมีเหลือน้อยกว่า 3 ค่า) มันจะผนวกค่าปัจจุบันและ a 1และอ่านต่อ ในตอนท้ายของสตริงมันจะผนวกหนึ่ง1กับผลลัพธ์

นี่เป็นตัวอย่างผลงานของรุ่นหนึ่ง

01011111
^

เราพบกันครั้งแรก0ดังนั้นเราจึงต่อท้าย01ผลลัพธ์ของเรา

01011111
 ^
01

ตอนนี้เราได้พบกับ1ดังนั้นเราจึงผนวกศูนย์และข้ามค่าสองค่าถัดไป

01011111
    ^
010

เราพบกัน1ดังนั้นเราทำแบบเดียวกัน

01011111
       ^
0100

ตอนนี้เรามีพื้นที่อื่น1แต่ไม่เพียงพอที่จะข้ามดังนั้นเราจึงผนวกเซลล์ปัจจุบันและ a 1(ในกรณีนี้11)

01011111
        ^
010011

เราอยู่ท้ายแล้วเราจึงผนวกหนึ่ง1และยุติรุ่นนี้

01011111
        ^
0100111

งาน

การป้อนข้อมูลให้ในรูปแบบที่สมเหตุสมผลคุณต้องสร้างฟังก์ชั่นหรือโปรแกรมที่คำนวณหุ่นยนต์รุ่นหนึ่ง

นี่เป็นคำถามเกี่ยวกับดังนั้นคำตอบจะได้คะแนนเป็นไบต์โดยมีจำนวนไบต์น้อยกว่าดีกว่า

การใช้งานตัวอย่าง

นี่คือตัวอย่างการใช้งานใน Haskell (กำหนดฟังก์ชั่น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 หรือไม่
caird coinheringaahing

2
ดังนั้นถ้าเรามี10มันควรจะพิมพ์11011? ฉันคิดว่าอีกสองสามกรณีทดสอบจะเป็นประโยชน์
nmjcman101

2
@WeatWizard ฉันขอขอบคุณคำอธิบายที่ชัดเจนขึ้นอาจเป็นตารางของกฎ
Alexander - Reinstate Monica

2
ฉันไม่เชื่อว่านี่เป็นหุ่นยนต์เซลลูล่าร์จริง แต่รู้สึกฟรีที่จะสอนฉันด้วยคำจำกัดความที่บอกว่าเป็น
feersum

2
@feersum แน่นอนว่ามันไม่ได้รักษาจำนวนเซลล์ มันเป็นตัวแปลงสัญญาณจำกัด
Ørjan Johansen

คำตอบ:


5

V , 26 22 21 ไบต์

ขอบคุณ @CowsQuack เป็นเวลา 4 ไบต์ด้วยการรวม regexes! และ @ ØrjanJohansenสำหรับไบต์อื่นที่มีชุดค่าผสม regex

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

ลองออนไลน์!

ใช้ทดแทนหลายครั้งและผนวก 1 ท้าย ไม่มีอะไรแฟนซีเกินไป ฉันมีเวอร์ชันที่ทำการแมป1และ0อยู่ในโหมดแทรกเพื่อให้ได้เอฟเฟกต์ที่ต้องการ แต่มันค่อนข้างนานกว่านี้

(รุ่นทดแทนหลายรายการ: ลองออนไลน์! )


regexes ที่สองและสามสามารถผสานเข้ากับÓ1ü0/&1( üคือ\|)
user41805

@Cowsquack อัจฉริยะ!
nmjcman101

ก็จะยิ่งสั้นเพื่อทำตามด้วยÓ./&1 Ó31/0
Ørjan Johansen

3

JavaScript (ES6), 56 ไบต์

รับอินพุตเป็นอาร์เรย์ของอักขระ ส่งคืนสตริงหรือตัวเลข1ถ้ากำหนดอาร์เรย์ว่าง

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

การสาธิต

เวอร์ชันภาพเคลื่อนไหว

ตัวอย่างของอินพุตที่มีความเสถียร: 0101, 010011111



2

Python 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 ไบต์ขอบคุณ Rod
-6 ไบต์ขอบคุณ ovs
-1 ไบต์ขอบคุณ micsthepick


[0]if v else[x[y],1]สามารถเขียนใหม่เป็น[[x[y],1],[0]][v]แต่คุณสามารถกลับvค่าไปถึง96 ไบต์
Rod


ไม่จำเป็นต้องใช้วงเล็บในคำสั่งการพิมพ์ใน python 2 ดังนั้นคุณสามารถบันทึกหนึ่งไบต์
micsthepick

2

สวิฟท์ 3 , 147 ไบต์

-1 ต้องขอบคุณ@ Mr.Xcoder

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

Ungolfed ส่งคืนค่ามากกว่าการพิมพ์:

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 ไบต์
Mr. Xcoder

@ Mr.Xcoder ขอบคุณ! ฉันยังสามารถตรวจจับสิ่ง1ที่อยู่ในข้อมูลด้วยได้0 < elementมากกว่าelement == 0
Alexander - Reinstate Monica

1

Python 2 , 81 ไบต์

ทั้งอินพุตและเอาต์พุตเป็นรายการ (ขอบคุณ Erik the Outgolfer)

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]

Python 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

การอธิบายมันเป็นวิธีการเล่นแบบวนซ้ำแบบง่ายๆ



@EriktheOutgolfer ขอบคุณ :)
mdahmoune

โอ้และคุณสามารถทำแทน1>Z[0] 0==Z[0]
Erik the Outgolfer


0

สกาล่า , 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.