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 !


@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.


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!


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.



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)

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.


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.


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!


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) , 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.


@ceilingcat Uso inteligente (ab) de c[1]! Atualizada.
Neil A.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.