จำลองแท็กวงจร Bitwise


11

ท้าทาย

กำหนดสองสตริงในรูปแบบ I / O เริ่มต้นให้ทำดังต่อไปนี้:

หมายเหตุ: ความท้าทายจะอ้างถึงสตริงแรกว่า "ข้อมูล" และที่สองเรียกว่า "โปรแกรม"

  1. เปลี่ยนโปรแกรมเป็นสตริงที่ไม่มีที่สิ้นสุดซึ่งเป็นเพียงโปรแกรมที่ทำซ้ำไม่สิ้นสุด (เช่น10-> 1010101010...) ความท้าทายจะอ้างถึงสิ่งนี้ว่า "โปรแกรมที่ไม่มีที่สิ้นสุด"
  2. ในขณะที่ข้อมูลไม่ว่างให้ทำดังต่อไปนี้ในขณะที่วนซ้ำโปรแกรมที่ไม่มีที่สิ้นสุด:

    หากคำสั่งปัจจุบันคือ "0" ให้ลบบิตซ้ายสุดในข้อมูล หากข้อมูลว่างเปล่า "0" จะไม่ทำอะไรเลย

    ข หากคำสั่งปัจจุบันคือ "1" ให้ผนวกอักขระตัวถัดไปในโปรแกรมเข้ากับข้อมูลหากบิตซ้ายสุดในข้อมูลเป็นหนึ่ง

    ค. ถ้าข้อมูลไม่ว่างตอนนี้ให้เอาท์พุทข้อมูล

กรณีทดสอบ

Data เป็นด้านซ้ายของอินพุตและโปรแกรมเป็นด้านขวา

100, 0 --> 00, 0
1111, 1 --> 11111, 111111, 1111111, ...
10, 011 --> 0, 0, 0
1110, 011 --> 110, 1101, 11010, 1010...

หมายเหตุ

  • ข้อมูลและโปรแกรมจะประกอบด้วย 0 และ 1 เท่านั้น
  • สำหรับข้อมูล / โปรแกรมที่ไม่หยุดทำงานโปรแกรมของคุณไม่จำเป็นต้องหยุดทำงาน
  • ข้อมูลและโปรแกรมจะไม่ว่างเปล่าในอินพุต
  • คุณอาจมีหลายบรรทัดและขึ้นบรรทัดใหม่
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • คุณสามารถใช้รูปแบบ I / O ที่สะดวกใด ๆ

เช่นเดียวกับ , ที่สั้นที่สุดชนะรหัส !


@Sanchises ดูเหมือนว่าเส้นขอบจะซ้ำกับสิ่งนั้น แต่คุณจะต้องได้รับผลลัพธ์ในบางรุ่นและสำหรับระบบแท็กแบบวงกลม
MilkyWay90

ในกรณีทดสอบครั้งแรก100ไป10ที่ cmd 0ซึ่งคำจำกัดความคือ "ลบบิตซ้ายสุดในข้อมูล" จะไม่บิตซ้ายสุดของ100เป็น1?
โยนาห์

@Jonah โอ้พลาดนั่น
MilkyWay90

ในกรณี (b) หากคุณต่อท้ายตัวชี้คำแนะนำจะเลื่อนไปทางขวาหนึ่งหรือสองตัวอักษร?
Sparr

@ Sparr มันเลื่อนไปทางขวาหนึ่งอัน ดูหัวข้อท้าทาย
MilkyWay90

คำตอบ:



2

C # (Visual C # Interactive Compiler) , 82 ไบต์

m=>n=>{for(int i=0;m!="";Print(m=n[i++]<49?m.Substring(1):m[0]>48?m+n[i]:m))n+=n;}

ลองออนไลน์!


นัยสำคัญของ 48 และ 49 จากความอยากรู้คืออะไร?
Jonah

1
@Jonah 48 เป็นค่า ASCII ของ0และ 49 เป็นค่า ASCII ของ1
ศูนย์รวมของความไม่รู้

คุณไม่ควรใช้ 0 และ 1 แทนที่นี่: P
เท่านั้น

@ ASCII เท่านั้นฉันใช้สตริงไม่ใช่อาร์เรย์
ศูนย์รวมแห่งความไม่รู้

@EmbodimentofIgnorance ทำไมไม่ใช้ a ListและSkipหรืออะไรแบบนั้น
ASCII-only

1

J , 65 ไบต์

(([:(][echo)(}.@[)`([,{.@[#1{],])@.({.@]));1|.])&>/^:(0<0#@{>)^:5

ลองออนไลน์!

ฉันอาจเล่นกอล์ฟต่อไปในภายหลัง โปรดสังเกตว่า5ในตอนท้ายจะไม่มีที่สิ้นสุด_ในโปรแกรมจริง แต่ฉันได้ทิ้งไว้ที่นั่นเพื่อให้การรันตัวอย่างที่ไม่หยุดทำงานง่ายขึ้น



1

05AB1E , 24 21 ไบต์

[¹Nèi¬i¹N>è«}ë¦}DõQ#=

ใช้โปรแกรมเป็นอินพุตแรกและข้อมูลเป็นอินพุตที่สองอินพุต

ลองออนไลน์

คำอธิบาย:

[             # Start an infinite loop:
 ¹Nè          #  Get the N'th digit of the first (program) input
              #  (NOTES: N is the index of the infinite loop;
              #          indexing in 05AB1E automatically wraps around)
    i         #  If this digit is 1:
     ¬        #   Push the head of the current data (without popping it)
              #   (will take the second (data) input implicitly if it's the first iteration)
      i     } #   If this head is 1:
       ¹N   #    Get the (N+1)'th digit of the first (program) input
           «  #    And append it to the current data
    ë }       #  Else (the digit is a 0 instead):
     ¦        #   Remove the first digit from the current data
              #   (will take the second input (data) implicitly if it's the first iteration)
 DõQ          #  If the current data is an empty string:
    #         #   Stop the infinite loop
 =            #  Print the current data with trailing newline (without popping it)

1

Ruby , 62 59 ไบต์

->c,d{p(d)while(a,*c=c;b,*d=d;c<<a;[]!=d=[b]*a+d+c[0,a*b])}

ลองออนไลน์!

อย่างไร

  • รับบิตแรกจากโค้ดcและข้อมูลการdเรียกพวกเขาและa bใส่กลับในตอนท้ายของac
  • นำกลับมาbที่จุดเริ่มต้นของถ้าd a==1สิ่งนี้สามารถย่อให้เล็กลงได้[b]*a
  • ใส่ไบต์แรกของcในตอนท้ายของถ้าd a==1 and b==1สิ่งนี้สามารถย่อให้เล็กลงc[0,a*b]ได้
  • หากเรามีข้อมูลเพิ่มเติมให้พิมพ์และทำซ้ำ


0

เยลลี่ 40 ไบต์

;€Ø2œịxØ1œị$Ʋ$Ḋ€2,1œị$?1¦ṙ€1$2¦µ⁺1ịGṄƲ¿Ḣ

ลองออนไลน์!

ฉันคิดว่าการขึ้นบรรทัดใหม่นั้นไม่เป็นไร ฉันได้ไปด้วยรายการของสองรายการศูนย์และรายการที่เป็นข้อมูลเข้าและส่งออกไปยัง stdout


0

Python 1 , 75 ไบต์

a,b=input()
while a:b=b[1:]+b[:1];a=[a[1:],a+b[:1]*a[0]][b[0]];print a or''

ลองออนไลน์!


ดี! A niggle: สำหรับ data '100', โปรแกรม '0', สิ่งนี้จะพิมพ์สตริงว่างหนึ่งครั้ง: แต่กฎ c บอกว่า "ถ้าข้อมูลไม่ว่างตอนนี้, เอาท์พุทข้อมูล"
Chas Brown

@ChasBrown พิมพ์ผิดขนาดเล็กฉันกำลังรอคำชี้แจงจาก OP หากขึ้นบรรทัดใหม่ไม่เป็นไร
ศูนย์รวมแห่งความไม่รู้

@ChasBrown The OP บอกว่าขึ้นบรรทัดใหม่หลายบรรทัดได้ที่นี่
ศูนย์รวมแห่งความไม่รู้

แต่หลังจากเปลี่ยนอาร์เรย์ 1 และ 0s ตอนนี้คุณพิมพ์อาร์เรย์ที่ว่างเปล่า []แทนการขึ้นบรรทัดใหม่บนเช่นข้อมูลโปรแกรม[1,0,0] [0]
Chas Brown

1
หลาม 1? หลาม 2 ใช้งานไม่ได้?
ASCII เท่านั้น


0

C ++ (gcc) , 294 289 272 ไบต์

-22 ไบต์ขอบคุณ @ceilingcat

#import<cstdio>
#import<queue>
void a(char*e,char*p){std::queue<char>d;for(;*e;)d.push(*e++);for(char*c=p;d.size();c=*++c?c:p){*c-49?d.pop():d.front()-48?d.push(c[1]?c[1]:*p):a("","");if(d.size()){for(int i=0;i++<d.size();d.pop())d.push(putchar(d.front()));putchar(32);}}}

ลองออนไลน์!

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


@ceilingcat Clever (ab) ใช้งานc[1]! Updated
Neil A.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.