Simuler une balise cyclique au niveau du bit


11

Défi

Étant donné deux chaînes dans n'importe quel format d'E / S par défaut, procédez comme suit:

REMARQUE: le défi fera référence à la première chaîne en tant que "données" et la seconde en tant que "programme".

  1. Changez le programme en une chaîne infinie qui est juste le programme répété à l'infini (par exemple 10-> 1010101010...). Le défi appellera cela le "programme infini"
  2. Pendant que les données ne sont pas vides, procédez comme suit lors de la boucle sur le programme infini:

    une. Si la commande actuelle est "0", supprimez le bit le plus à gauche dans les données. Si les données sont vides, "0" ne fait rien.

    b. Si la commande en cours est "1", ajoutez le caractère suivant du programme aux données si le bit le plus à gauche des données est un.

    c. Si les données ne sont pas vides maintenant, sortez les données.

Cas de test

Les données sont le côté gauche de l'entrée et le programme est le côté droit.

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

Remarques

  • Les données et le programme ne comprendront que 0 et 1
  • Pour les données / programmes qui ne s'arrêtent pas, votre programme n'a pas besoin de s'arrêter.
  • Les données et le programme ne seront pas vides dans l'entrée.
  • Vous pouvez avoir plusieurs nouvelles lignes de fin et de début
  • Les échappatoires standard sont interdites
  • Vous pouvez utiliser n'importe quel format d'E / S pratique

Comme toujours avec le , le code le plus court gagne !


@Sanchises Semble comme un doublon limite à cela, mais vous devez obtenir le résultat à une certaine génération et c'est pour tout système de balises cycliques.
MilkyWay90

dans le premier cas de test, 100passe à 10cmd 0, dont la définition est «supprimer le bit le plus à gauche des données». ne serait pas le plus à gauche peu 100être 1?
Jonah

@Jonah Oh, ça a manqué
MilkyWay90

dans le cas (b), si vous faites l'ajout, le pointeur d'instruction se déplace-t-il vers la droite d'un ou deux caractères?
Sparr

@Sparr Il se déplace à droite. Voir la section intitulée Défi.
MilkyWay90

Réponses:


4

Haskell, 77 71 62 octets

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

Essayez-le en ligne!

Edit: -9 octets grâce à @xnor.


1
Dans la première ligne, vous pouvez le faire f:[e,f++take d q]!!p#q.
xnor

2

C # (Visual C # Interactive Compiler) , 82 octets

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

Essayez-le en ligne!


quelle est la signification des 48 et 49, par curiosité?
Jonah

1
@Jonah 48 est la valeur ASCII de 0, et 49 est la valeur ASCII de1
Embodiment of Ignorance

ne devriez-vous pas utiliser à la place 0 et 1 ici: P
ASCII uniquement le

@ ASCII uniquement J'utilise une chaîne, pas un tableau.
Incarnation de l'ignorance

@EmbodimentofIgnorance pourquoi ne pas utiliser un Listet Skip, ou quelque chose comme ça
ASCII uniquement

1

J , 65 octets

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

Essayez-le en ligne!

Je pourrai jouer au golf plus tard. Notez que 5la fin serait l'infini _dans le programme réel, mais je l'ai laissé là pour faciliter l'exécution des exemples sans interruption.



1

05AB1E , 24 21 octets

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

Prend le programme comme première entrée et les données comme deuxième entrée.

Essayez-le en ligne.

Explication:

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

Rubis , 62 59 octets

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

Essayez-le en ligne!

Comment

  • Obtenez le premier bit du code cet des données d, appelez-les aet b. Remise aà la fin de c.
  • Remise bau début de dif a==1. Cela peut être raccourci[b]*a
  • Mettez le premier octet de cà la fin de dif a==1 and b==1. Cela peut être raccourci c[0,a*b].
  • Si nous avons plus de données, imprimez et répétez.


0

Gelée , 40 octets

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

Essayez-le en ligne!

J'ai supposé que les nouvelles lignes de fin étaient correctes. Je suis également allé avec une liste de deux listes de zéros et de uns en entrée et en sortie sur stdout.


0

Python 1 , 75 octets

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

Essayez-le en ligne!


Agréable! Un petit problème: pour les données '100', programmez '0', cela imprimera la chaîne vide une fois: mais la règle c dit "Si les données ne sont pas vides maintenant, sortez les données."
Chas Brown

@ChasBrown Petite faute de frappe, j'attends des éclaircissements de la part de l'OP si les nouvelles lignes sont correctes
Embodiment of Ignorance

@ChasBrown L'OP dit que plusieurs nouvelles lignes de fin sont autorisées, voir ici
Embodiment of Ignorance

Mais après avoir basculé sur des tableaux de 1 et de 0, vous imprimez maintenant un tableau vide []au lieu d'une nouvelle ligne sur, par exemple, les données [1,0,0], le programme [0].
Chas Brown

1
python 1? python 2 ne fonctionne pas?
ASCII uniquement


0

C ++ (gcc) , 294 289 272 octets

-22 octets grâce à @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);}}}

Essayez-le en ligne!

Algorithme assez simple. Copie les données dans une file d'attente et boucle à plusieurs reprises dans le programme. Sur un "0", il supprime le premier élément de la file d'attente (le premier "bit"). Sur un 1, il ajoute le "bit" suivant du programme aux données si le premier "bit" des données est 1. Puis il parcourt les données, les imprimant "bit" par "bit", et finalement imprime un espace pour séparer les entrées de données successives.


@ceilingcat Clever (ab) utilisation de c[1]! Actualisé.
Neil A.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.