Simular tag cíclico bit a bit

11

Desafio

Dadas duas seqüências de caracteres em qualquer formato de E / S padrão, faça o seguinte:

NOTA: O desafio se referirá à primeira cadeia como "dados" e à segunda como "programa".

  1. Mude o programa para uma sequência infinita, que é apenas o programa repetido infinitamente (por exemplo 10- -> 1010101010...). O desafio se referirá a isso como o "programa infinito"
  2. Enquanto os dados não estiverem vazios, faça o seguinte enquanto faz um loop no programa infinito:

    uma. Se o comando atual for "0", exclua o bit mais à esquerda nos dados. Se os dados estiverem vazios, "0" não fará nada.

    b. Se o comando atual for "1", acrescente o próximo caractere no programa aos dados se o bit mais à esquerda nos dados for um.

    c. Se os dados não estiverem vazios agora, produza os dados.

Casos de teste

Os dados são o lado esquerdo da entrada e o programa é o lado direito.

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

Notas

  • Os dados e o programa consistirão em apenas 0s e 1s
  • Para dados / programas que não param, seu programa não precisa parar.
  • Os dados e o programa não estarão vazios na entrada.
  • Você pode ter várias linhas novas à direita e à frente
  • As brechas padrão são proibidas
  • Você pode usar qualquer formato de E / S conveniente

Como sempre com o , o código mais curto vence !

MilkyWay90
fonte
@Sanchises Parece um limite duplicado para isso, mas você precisa obter o resultado em uma certa geração e isso é para qualquer sistema de tags cíclico.
precisa
no primeiro caso de teste, 100prossegue 10no cmd 0, cuja definição é "excluir o bit mais à esquerda dos dados". o bit mais à esquerda não iria 100ser 1?
Jonah
@Jonah Oh, perdi isso
MilkyWay90
no caso (b), se você anexar, o ponteiro da instrução se move para a direita um ou dois caracteres?
Sparr
@Sparr Move-se para a direita. Veja a seção Desafio.
precisa

Respostas:

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

Experimente online!

Editar: -9 bytes graças a @xnor.

nimi
fonte
1
Na primeira linha, você pode fazer f:[e,f++take d q]!!p#q.
xnor
2

C # (compilador interativo do 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;}

Experimente online!

Modalidade de ignorância
fonte
qual é o significado dos 48 e 49, por curiosidade?
Jonah
1
@Jonah 48 é o valor ASCII 0, e 49 é o valor ASCII1
Forma de realizao de ignorância
você não deve usar 0 e 1 vez aqui: P
ASCII-only
@ Somente ASCII estou usando uma string, não uma matriz.
Modalidade de ignorância
@EmbodimentofIgnorance por que não usar um Liste Skip, ou algo parecido
ASCII-only
1

J , 65 bytes

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

Experimente online!

Eu posso jogar isso ainda mais tarde. Observe que 5no final haveria infinito _no programa real, mas eu o deixei lá para facilitar a execução de exemplos sem interrupções.

Jonah
fonte
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)

Experimente online!

Argumentos:: ddata p,: program.

Erik, o Outgolfer
fonte
1

05AB1E , 24 21 bytes

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

Leva o programa como primeira entrada e dados como segunda entrada.input.

Experimente online.

Explicação:

[             # 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
fonte
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])}

Experimente online!

Quão

  • Obtenha o primeiro bit de código ce dados d, chame-os ae b. Coloque de avolta no final de c.
  • Coloque de volta bno início de dse a==1. Isso pode ser reduzido para[b]*a
  • Coloque o primeiro byte de cno final de dif a==1 and b==1. Isso pode ser reduzido para c[0,a*b].
  • Se tivermos mais dados, imprima e repita.
GB
fonte
0

Geléia , 40 bytes

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

Experimente online!

Eu assumi que as novas linhas finais estão ok. Eu também fui com uma lista de duas listas de zeros e uns como entrada e saída para stdout.

Nick Kennedy
fonte
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''

Experimente online!

Modalidade de ignorância
fonte
Agradável! Uma niggle: para os dados '100', programa '0', isso imprimirá a sequência vazia uma vez: mas a regra c diz "Se os dados não estiverem vazios agora, produza os dados".
Chas Brown
@ChasBrown pequeno erro de digitação, eu estou esperando por esclarecimentos do OP se novas linhas de fuga são ok
Personificação da Ignorância
@ChasBrown O OP diz várias novas linhas de arrasto são permitidos, veja aqui
Personificação da ignorância
Mas depois de mudar para matrizes de 1 e 0, agora você está imprimindo uma matriz vazia em []vez de uma nova linha, por exemplo, dados [1,0,0], programa [0].
Chas Brown
1
python 1? python 2 não funciona?
somente 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;}}

Experimente online!

peterzuger
fonte
1
163 bytes
ceilingcat
0

C ++ (GCC) , 294 289 272 bytes

-22 bytes graças 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);}}}

Experimente online!

Algoritmo bastante simples. Copia os dados em uma fila e circula repetidamente pelo programa. Em um "0", ele remove o primeiro elemento da fila (o primeiro "bit"). Em um 1, ele adiciona o próximo "bit" do programa aos dados se o primeiro "bit" dos dados for 1. Em seguida, ele percorre os dados, imprimindo "bit" por "bit" e, finalmente, imprime um espaço para separar entradas de dados sucessivas.

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