Simulasikan Tag Siklus Bitwise

11

Tantangan

Dengan dua string dalam format I / O default apa pun, lakukan hal berikut:

CATATAN: Tantangan akan merujuk ke string pertama sebagai "data" dan yang kedua disebut sebagai "program".

  1. Ubah program menjadi string tanpa batas yang hanya merupakan program yang diulang tanpa batas (misalnya 10-> 1010101010...). Tantangan akan menyebut ini sebagai "program tak terbatas"
  2. Sementara data tidak kosong, lakukan hal berikut sambil mengulangi program tak terbatas:

    Sebuah. Jika perintah saat ini adalah "0", hapus bit paling kiri dalam data. Jika data kosong, "0" tidak melakukan apa pun.

    b. Jika perintah saat ini adalah "1", tambahkan karakter berikutnya dalam program ke data jika bit paling kiri dalam data adalah satu.

    c. Jika data tidak kosong sekarang, output data.

Uji Kasus

Data adalah sisi kiri input dan program adalah sisi kanan.

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

Catatan

  • Data dan program hanya terdiri dari 0s dan 1s
  • Untuk data / program yang tidak berhenti, program Anda tidak perlu berhenti.
  • Data dan program tidak akan kosong dalam input.
  • Anda mungkin memiliki beberapa trailing dan memimpin baris baru
  • Celah Standar dilarang
  • Anda dapat menggunakan format I / O yang nyaman

Seperti biasa dengan , kode terpendek menang !

MilkyWay90
sumber
@Sanchises Sepertinya duplikat garis batas untuk itu, tetapi Anda harus mendapatkan hasilnya pada generasi tertentu dan itu untuk sistem tag siklik.
MilkyWay90
dalam kasus uji pertama, 100menuju ke 10cmd 0, yang definisi adalah "hapus bit paling kiri dalam data." tidak akan sedikit paling kiri dari 100menjadi 1?
Jonah
@ Jonah Oh, ketinggalan itu
MilkyWay90
dalam kasus (b), jika Anda menambahkan, apakah penunjuk instruksi bergerak ke kanan satu atau dua karakter?
Sparr
@Parr Bergerak ke kanan. Lihat bagian berlabel Tantangan.
MilkyWay90

Jawaban:

4

Haskell, 77 71 62 byte

f@(d:e)#(p:q)=f:[e,f++take d q]!!p#q
_#_=[]
a!b=tail$a#cycle b

Cobalah online!

Edit: -9 bytes berkat @xnor.

nimi
sumber
1
Di baris pertama, Anda bisa melakukannya f:[e,f++take d q]!!p#q.
xnor
2

C # (Visual C # Interactive Compiler) , 82 byte

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

Cobalah online!

Perwujudan Ketidaktahuan
sumber
apa arti dari ke-48 dan ke-49, karena penasaran?
Jonah
1
@Jonah 48 adalah nilai ASCII dari 0, dan 49 adalah nilai ASCII dari1
Perwujudan Ketidaktahuan
Anda tidak harus menggunakan 0 dan 1 sebagai gantinya di sini: P
ASCII-satunya
@ ASCII-only Saya menggunakan string, bukan array.
Perwujudan Ketidaktahuan
@EmbodimentofIgnorance mengapa tidak menggunakan a Listdan Skip, atau sesuatu seperti itu
ASCII-only
1

J , 65 byte

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

Cobalah online!

Saya bisa bermain golf ini lebih jauh nanti. Perhatikan bahwa 5pada akhirnya akan menjadi tak terbatas _dalam program yang sebenarnya, tetapi saya telah meninggalkannya di sana untuk membuat menjalankan contoh-contoh yang tidak berhenti menjadi lebih mudah.

Jonah
sumber
1

Python 3 , 74 byte

def f(d,p):
 while d:c,*p=p+p[:1];d=(d[1:],d+p[:1]*d[0])[c];d and print(d)

Cobalah online!

Argumen:: ddata ,: pprogram.

Erik the Outgolfer
sumber
1

05AB1E , 24 21 byte

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

Mengambil program sebagai input pertama dan data sebagai input kedua. Input.

Cobalah online.

Penjelasan:

[             # 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)
Kevin Cruijssen
sumber
1

Ruby , 62 59 byte

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

Cobalah online!

Bagaimana

  • Dapatkan bit pertama dari kode cdan data d, panggil mereka adan b. Pasang akembali di akhir c.
  • Pasang kembali bdi awal djika a==1. Ini dapat disingkat menjadi[b]*a
  • Letakkan byte pertama cdi akhir dif a==1 and b==1. Ini dapat disingkat menjadi c[0,a*b].
  • Jika kami memiliki lebih banyak data, cetak dan ulangi.
GB
sumber
0

Jelly , 40 byte

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

Cobalah online!

Saya berasumsi bahwa mengikuti baris baru tidak masalah. Saya juga pergi dengan daftar dua daftar nol dan satu sebagai input, dan output ke stdout.

Nick Kennedy
sumber
0

Python 1 , 75 byte

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

Cobalah online!

Perwujudan Ketidaktahuan
sumber
Bagus! A niggle: untuk data '100', program '0', ini akan mencetak string kosong sekali: tetapi aturan c mengatakan "Jika data tidak kosong sekarang, hasilkan data."
Chas Brown
@ChasBrown Kesalahan ketik kecil, saya sedang menunggu klarifikasi dari OP jika mengikuti baris baru ok
Perwujudan Ketidaktahuan
@ ChasBrown OP mengatakan beberapa baris baru dibolehkan, lihat di sini
Perwujudan Ketidaktahuan
Tetapi setelah beralih ke array 1 dan 0, sekarang Anda mencetak array kosong, []bukan baris baru misalnya, data [1,0,0], program [0].
Chas Brown
1
python 1? python 2 tidak berfungsi?
ASCII
0

C ++ (gcc) , 178 byte

void a(std::string s,std::string d){while(!s.empty())for(int i=0;i<d.size();i++){if(d[i]=='0')s.erase(0,1);else if(s[0]=='1')s.push_back(d[(i+1)>=d.size()?0:i+1]);std::cout<<s;}}

Cobalah online!

peterzuger
sumber
1
163 byte
ceilingcat
0

C ++ (gcc) , 294 289 272 byte

-22 byte berkat @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);}}}

Cobalah online!

Algoritma yang cukup mudah. Menyalin data ke dalam antrian, dan berulang kali mengulangi program. Pada "0", itu menghilangkan elemen pertama dalam antrian ("bit" pertama). Pada angka 1, ia menambahkan "bit" berikutnya dari program ke data jika "bit" pertama dari data adalah 1. Kemudian ia menggulung data, mencetaknya "bit" dengan "bit", dan akhirnya mencetak ruang untuk memisahkan entri data berturut-turut.

Neil A.
sumber
@ceilingcat Penggunaan (ab) pintar c[1]! Diperbarui.
Neil A.