Simula tag ciclico bit a bit


11

Sfida

Dato due stringhe in qualsiasi formato I / O predefinito, procedere come segue:

NOTA: la sfida farà riferimento alla prima stringa come "dati" e alla seconda denominata "programma".

  1. Cambia il programma in una stringa infinita che è solo il programma ripetuto all'infinito (es. 10-> 1010101010...). La sfida si riferirà a questo come al "programma infinito"
  2. Mentre i dati non sono vuoti, esegui le seguenti operazioni mentre esegui il ciclo continuo sul programma infinito:

    un. Se il comando corrente è "0", elimina il bit più a sinistra nei dati. Se i dati sono vuoti, "0" non fa nulla.

    b. Se il comando corrente è "1", aggiungi il carattere successivo nel programma ai dati se il bit più a sinistra nei dati è uno.

    c. Se i dati non sono vuoti ora, emettere i dati.

Casi test

I dati sono il lato sinistro dell'input e il programma è il lato destro.

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

Appunti

  • I dati e il programma saranno composti solo da 0 e 1 secondo
  • Per dati / programmi che non si arrestano, non è necessario arrestare il programma.
  • I dati e il programma non saranno vuoti nell'input.
  • È possibile che siano presenti più righe finali e nuove righe principali
  • Sono vietate le scappatoie standard
  • È possibile utilizzare qualsiasi formato I / O conveniente

Come sempre con , vince il codice più corto !


@Sanchises Sembra un duplicato limite a quello, ma devi ottenere il risultato a una certa generazione e questo è per qualsiasi sistema di tag ciclico.
MilkyWay90

nel primo caso di test, 100passa a 10cmd 0, la cui definizione è "elimina il bit più a sinistra nei dati". non sarebbe l'estrema sinistra di 100essere 1?
Giona

@Jonah Oh, l'ho perso
MilkyWay90

nel caso (b), se si fa l'appendice, il puntatore dell'istruzione si sposta a destra di uno o due caratteri?
Sparr

@Sparr Si sposta a destra. Vedi la sezione chiamata Sfida.
MilkyWay90

Risposte:


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

Provalo online!

Modifica: -9 byte grazie a @xnor.


1
Nella prima riga, puoi farlo f:[e,f++take d q]!!p#q.
xnor

2

C # (compilatore interattivo Visual C #) , 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;}

Provalo online!


quali sono i significati di 48 e 49, per curiosità?
Giona

1
@Giona 48 è il valore ASCII di 0, e 49 è il valore ASCII di1
Incarnazione dell'ignoranza

non dovresti usare 0 e 1 invece qui: P
ASCII

@ Solo ASCII Sto usando una stringa, non un array.
Incarnazione dell'ignoranza l'

@EmbodimentofIgnorance perché non usare a Liste Skip, o qualcosa del genere
solo ASCII

1

J , 65 byte

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

Provalo online!

Potrei giocare a golf più avanti. Nota che 5alla fine sarebbe infinito _nel programma reale, ma l'ho lasciato lì per rendere più semplice l'esecuzione degli esempi non-stop.



1

05AB1E , 24 21 byte

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

Prende il programma come primo input e dati come secondo input.input.

Provalo online.

Spiegazione:

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

Rubino , 62 59 byte

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

Provalo online!

Come

  • Ottieni il primo bit da codice ce dati d, chiamali ae b. Rimesso aalla fine di c.
  • Rimetti ball'inizio di dif a==1. Questo può essere abbreviato in[b]*a
  • Inserire il primo byte di calla fine di dif a==1 and b==1. Questo può essere abbreviato in c[0,a*b].
  • Se disponiamo di più dati, stampa e ripeti.


0

Gelatina , 40 byte

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

Provalo online!

Ho pensato che le nuove righe finali fossero ok. Ho anche scelto un elenco di due elenchi di zero e uno come input e output su stdout.


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''

Provalo online!


Bello! Un problema: per i dati '100', programma '0', questo stamperà una volta la stringa vuota: ma la regola c dice "Se i dati non sono vuoti ora, emetti i dati".
Chas Brown,

@ChasBrown Piccolo errore di battitura, sto aspettando chiarimenti dall'OP se le nuove righe finali sono ok
Incarnazione dell'ignoranza

@ChasBrown L'OP afferma che sono consentite più linee di coda, vedi qui
Incarnazione dell'ignoranza

Ma dopo essere passati ad array di 1 e 0, ora stai stampando un array vuoto []anziché una nuova riga su, ad esempio, dati [1,0,0], programma [0].
Chas Brown,

1
python 1? python 2 non funziona?
ASCII


0

C ++ (gcc) , 294 289 272 byte

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

Provalo online!

Algoritmo abbastanza semplice. Copia i dati in una coda e scorre ripetutamente il programma. Su uno "0", rimuove il primo elemento nella coda (il primo "bit"). Su un 1, aggiunge il successivo "bit" del programma ai dati se il primo "bit" dei dati è 1. Quindi passa in rassegna i dati, stampandolo "bit" per "bit", e infine stampa un spazio per separare le successive voci di dati.


@ceilingcat Uso intelligente (ab) di c[1]! Aggiornato.
Neil A.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.