Simular etiqueta cíclica bit a bit

11

Desafío

Dadas dos cadenas en cualquier formato de E / S predeterminado, haga lo siguiente:

NOTA: El desafío se referirá a la primera cadena como "datos" y a la segunda como "programa".

  1. Cambie el programa a una cadena infinita que es solo el programa repetido infinitamente (por ejemplo, 10-> 1010101010...). El desafío se referirá a esto como el "programa infinito"
  2. Mientras los datos no estén vacíos, haga lo siguiente mientras recorre el programa infinito:

    a. Si el comando actual es "0", elimine el bit más a la izquierda en los datos. Si los datos están vacíos, "0" no hace nada.

    si. Si el comando actual es "1", agregue el siguiente carácter en el programa a los datos si el bit más a la izquierda en los datos es uno.

    C. Si los datos no están vacíos ahora, envíe los datos.

Casos de prueba

Los datos son el lado izquierdo de la entrada y el programa es el lado derecho.

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

Notas

  • Los datos y el programa constarán de solo 0s y 1s.
  • Para los datos / programas que no se detienen, su programa no necesita detenerse.
  • Los datos y el programa no estarán vacíos en la entrada.
  • Puede tener múltiples líneas nuevas y finales
  • Las lagunas estándar están prohibidas
  • Puede usar cualquier formato conveniente de E / S

Como siempre con , ¡el código más corto gana !

MilkyWay90
fuente
@Sanchises Parece un duplicado límite para eso, pero tienes que obtener el resultado en cierta generación y eso es para cualquier sistema de etiquetas cíclicas.
MilkyWay90
en el primer caso de prueba, 100va a 10cmd 0, cuya definición es "eliminar el bit más a la izquierda en los datos". no sería el más a la izquierda de 100ser 1?
Jonás
@ Jonás Oh, me perdí eso
MilkyWay90
en el caso (b), si agrega, ¿el puntero de instrucción se mueve uno o dos caracteres a la derecha?
Sparr
@Sparr Se mueve a la derecha. Vea la sección llamada Desafío.
MilkyWay90

Respuestas:

4

Haskell, 77 71 62 bytes

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

Pruébalo en línea!

Editar: -9 bytes gracias a @xnor.

nimi
fuente
1
En la primera línea, puedes hacerlo f:[e,f++take d q]!!p#q.
xnor
2

C # (compilador interactivo de Visual C #) , 82 bytes

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

Pruébalo en línea!

Encarnación de la ignorancia
fuente
¿Cuál es el significado de los 48 y 49, por curiosidad?
Jonás
1
@Jonah 48 es el valor ASCII de 0, y 49 es el valor ASCII de1
Encarnación de la ignorancia
No deberías usar 0 y 1 en lugar aquí: P
ASCII de sólo
@ Solo ASCII Estoy usando una cadena, no una matriz.
Encarnación de la ignorancia
@EmbodimentofIgnorance, ¿por qué no usar un Listy Skip, o algo así
Solo para ASCII el
1

J , 65 bytes

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

Pruébalo en línea!

Puedo jugar golf más adelante. Tenga 5en cuenta que al final sería infinito _en el programa real, pero lo dejé allí para facilitar la ejecución de los ejemplos que no se detienen.

Jonás
fuente
1

Python 3 , 74 bytes

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

Pruébalo en línea!

Argumentos:: ddatos p,: programa.

Erik el Outgolfer
fuente
1

05AB1E , 24 21 bytes

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

Toma el programa como primera entrada y los datos como segunda entrada.

Pruébalo en línea.

Explicación:

[             # 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
fuente
1

Ruby , 62 59 bytes

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

Pruébalo en línea!

Cómo

  • Obtenga el primer bit del código cy los datos d, llámelos ay b. Poner de anuevo al final de c.
  • Poner de nuevo bal comienzo de dif a==1. Esto se puede acortar a[b]*a
  • Pon el primer byte de cal final de dif a==1 and b==1. Esto se puede acortar a c[0,a*b].
  • Si tenemos más datos, imprime y repite.
GB
fuente
0

Jalea , 40 bytes

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

Pruébalo en línea!

Supuse que las nuevas líneas finales están bien. También he ido con una lista de dos listas de ceros y unos como entrada y salida a stdout.

Nick Kennedy
fuente
0

Python 1 , 75 bytes

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

Pruébalo en línea!

Encarnación de la ignorancia
fuente
¡Agradable! Un inconveniente: para los datos '100', programa '0', esto imprimirá la cadena vacía una vez: pero la regla c dice "Si los datos no están vacíos ahora, envíe los datos".
Chas Brown el
@ChasBrown Pequeño error tipográfico, estoy esperando una aclaración del OP si las nuevas líneas finales están bien
Encarnación de la ignorancia
@ChasBrown El OP dice que se permiten múltiples líneas nuevas, ver aquí
Encarnación de la ignorancia
Pero después de cambiar a matrices de 1 y 0, ahora está imprimiendo una matriz vacía en []lugar de una nueva línea en, por ejemplo, datos [1,0,0], programa [0].
Chas Brown el
1
pitón 1? Python 2 no funciona?
Solo ASCII
0

C ++ (gcc) , 178 bytes

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

Pruébalo en línea!

peterzuger
fuente
1
163 bytes
ceilingcat
0

C ++ (gcc) , 294 289 272 bytes

-22 bytes gracias a @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);}}}

Pruébalo en línea!

Algoritmo bastante sencillo. Copia los datos en una cola y recorre repetidamente el programa. En un "0", elimina el primer elemento de la cola (el primer "bit"). En un 1, agrega el siguiente "bit" del programa a los datos si el primer "bit" de los datos es 1. Luego recorre los datos, imprimiéndolos "bit" por "bit", y finalmente imprime un espacio para separar entradas de datos sucesivas.

Neil A.
fuente
@ceilingcat Uso inteligente (ab) de c[1]! Actualizado.
Neil A.