Symuluj bitowy tag cykliczny

11

Wyzwanie

Biorąc pod uwagę dwa ciągi w dowolnym domyślnym formacie we / wy, wykonaj następujące czynności:

UWAGA: Wyzwanie będzie odnosić się do pierwszego ciągu jako „danych”, a drugi do „programu”.

  1. Zmień program na ciąg nieskończony, który jest po prostu programem powtarzanym w nieskończoność (np. 10-> 1010101010...). Wyzwanie będzie się nazywać tym „nieskończonym programem”
  2. Gdy dane nie są puste, wykonaj następujące czynności, zapętlając nieskończony program:

    za. Jeśli bieżącym poleceniem jest „0”, usuń lewy bit z danych. Jeśli dane są puste, „0” nic nie robi.

    b. Jeśli bieżącym poleceniem jest „1”, dołącz następny znak w programie do danych, jeśli najbardziej lewy bit w danych to jeden.

    do. Jeśli dane nie są teraz puste, wyślij dane.

Przypadki testowe

Dane są po lewej stronie wejścia, a program po prawej stronie.

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

Notatki

  • Dane i program będą się składały tylko z zer i jedynek
  • W przypadku danych / programów, które się nie zatrzymują, Twój program nie musi się zatrzymywać.
  • Dane i program nie będą puste na wejściu.
  • Możesz mieć wiele końcowych i wiodących nowych linii
  • Standardowe luki są zabronione
  • Możesz użyć dowolnego wygodnego formatu we / wy

Jak zawsze z , najkrótszych wygrywa kodu !

MilkyWay90
źródło
@ Sanchises Wydaje się, że jest to kopia graniczna, ale musisz uzyskać wynik w określonym pokoleniu i dotyczy to dowolnego systemu tagów cyklicznych.
MilkyWay90
w pierwszym przypadku testowym 100przechodzi do 10cmd 0, którego definicja to „usuń najbardziej lewy bit z danych”. nie skrajny lewy bit 100być 1?
Jonasz
@Jonah Oh, przegapiłem to
MilkyWay90
w przypadku (b), jeśli wykonasz dodatek, to czy wskaźnik instrukcji przesuwa się w prawo o jeden lub dwa znaki?
Sparr,
@Sparr Porusza się w prawo. Zobacz sekcję Wyzwanie.
MilkyWay90

Odpowiedzi:

4

Haskell, 77 71 62 bajtów

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

Wypróbuj online!

Edycja: -9 bajtów dzięki @xnor.

nimi
źródło
1
W pierwszym wierszu możesz to zrobić f:[e,f++take d q]!!p#q.
xnor
2

C # (interaktywny kompilator Visual C #) , 82 bajty

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

Wypróbuj online!

Wcielenie ignorancji
źródło
jakie znaczenie 48 i 49 mają z ciekawości?
Jonah
1
@Jonah 48 to wartość ASCII 0, a 49 to wartość ASCII1
of Ignorance
nie powinieneś tutaj używać 0 i 1: P
tylko ASCII
@ Tylko ASCII Używam ciągu, a nie tablicy.
Wcielenie nieznajomości
@EmbodimentofIgnorance dlaczego nie użyć a Listi Skip, lub czegoś takiego
tylko ASCII
1

J , 65 bajtów

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

Wypróbuj online!

Mogę zagrać w golfa później. Zauważ, że 5na końcu byłaby nieskończoność _w rzeczywistym programie, ale zostawiłem go tam, aby ułatwić uruchamianie nieprzerwanych przykładów.

Jonasz
źródło
1

Python 3 , 74 bajty

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

Wypróbuj online!

Argumenty:: ddane ,: pprogram.

Erik the Outgolfer
źródło
1

05AB1E , 24 21 bajtów

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

Pobiera program jako pierwsze wejście, a dane jako drugie wejście. Wejście.

Wypróbuj online.

Wyjaśnienie:

[             # 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
źródło
1

Rubin , 62 59 bajtów

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

Wypróbuj online!

W jaki sposób

  • Zdobądź pierwszy bit z kodu ci danych d, zadzwoń do nich ai b. Odłóż ana koniec c.
  • Odłóż bna początku dif a==1. Można to skrócić[b]*a
  • Wstaw pierwszy bajt cna końcu dif a==1 and b==1. Można to skrócić c[0,a*b].
  • Jeśli mamy więcej danych, wydrukuj i powtórz.
GB
źródło
0

Python 2 , 96 82 bajtów

def g(d,p):
 while d:
	c=p[0];p=p[1:]+[c];d=[d[1:],d+[p[0]]*d[0]][c]
	if d:yield d

Wypróbuj online!

Kradnąc trochę od odpowiedzi Emodiment of Ignorance ...

Generator, który korzysta z list 1 i 0 jako danych wejściowych / wyjściowych.

Chas Brown
źródło
0

Galaretka , 40 bajtów

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

Wypróbuj online!

Zakładam, że końcowe znaki nowej linii są w porządku. Mam również listę dwóch zer i jedynek jako danych wejściowych i wyjściowych na standardowe wyjście.

Nick Kennedy
źródło
0

Python 1 , 75 bajtów

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

Wypróbuj online!

Wcielenie ignorancji
źródło
Ładny! Niggle: w przypadku danych „100”, program „0” spowoduje to wydrukowanie pustego ciągu jeden raz: ale reguła c mówi „Jeśli dane nie są teraz puste , wyślij dane”.
Chas Brown,
@ChasBrown Mała literówka, czekam na wyjaśnienia z PO, jeśli końcowe znaki nowej linii są w porządku
Embodiment of Ignorance
@ChasBrown OP twierdzi, że dozwolone są wielokrotne końcowe znaki nowej linii, patrz tutaj
Embodiment of Ignorance
Ale po przejściu na tablice 1 i 0, teraz wypisujesz pustą tablicę []zamiast nowej linii np. Danych [1,0,0], programu [0].
Chas Brown,
1
python 1? python 2 nie działa?
Tylko ASCII
0

C ++ (gcc) , 178 bajtów

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;}}

Wypróbuj online!

peterzuger
źródło
1
163 bajty
ceilingcat
0

C ++ (gcc) , 294 289 272 bajtów

-22 bajty dzięki @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);}}}

Wypróbuj online!

Algorytm dość prosty. Kopiuje dane do kolejki i wielokrotnie zapętla się przez program. Na „0” usuwa pierwszy element w kolejce (pierwszy „bit”). Na 1 dodaje kolejny „bit” programu do danych, jeśli pierwszy „bit” danych ma wartość 1. Następnie przechodzi przez dane, drukując je „bit” po „bit”, i na koniec drukuje spacja do oddzielania kolejnych wpisów danych.

Neil A.
źródło
@ceilingcat Clever (ab) use c[1]! Zaktualizowano
Neil A.