Bitweises zyklisches Tag simulieren

11

Herausforderung

Gehen Sie bei zwei Zeichenfolgen in einem beliebigen Standard-E / A-Format wie folgt vor:

HINWEIS: Die Herausforderung bezieht sich auf die erste Zeichenfolge als "Daten" und die zweite als "Programm".

  1. Ändern Sie das Programm in eine unendliche Zeichenfolge, die nur das Programm ist, das unendlich wiederholt wird (z . B. 10-> 1010101010...). Die Herausforderung wird dies als "unendliches Programm" bezeichnen.
  2. Während die Daten nicht leer sind, gehen Sie wie folgt vor, während Sie das Endlosprogramm durchlaufen:

    ein. Wenn der aktuelle Befehl "0" ist, löschen Sie das Bit ganz links in den Daten. Wenn die Daten leer sind, macht "0" nichts.

    b. Wenn der aktuelle Befehl "1" ist, hängen Sie das nächste Zeichen im Programm an die Daten an, wenn das Bit ganz links in den Daten eine Eins ist.

    c. Wenn die Daten jetzt nicht leer sind, geben Sie die Daten aus.

Testfälle

Daten sind die linke Seite der Eingabe und das Programm ist die rechte Seite.

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

Anmerkungen

  • Die Daten und das Programm bestehen nur aus Nullen und Einsen
  • Für Daten / Programme, die nicht angehalten werden, muss Ihr Programm nicht angehalten werden.
  • Die Daten und das Programm sind in der Eingabe nicht leer.
  • Möglicherweise haben Sie mehrere nachfolgende und führende Zeilenumbrüche
  • Standardlücken sind verboten
  • Sie können jedes bequeme E / A-Format verwenden

Wie immer mit , kürzestem Code gewinnt !

MilkyWay90
quelle
@Sanchises Scheint ein Borderline-Duplikat zu sein, aber Sie müssen das Ergebnis bei einer bestimmten Generation erhalten, und das gilt für jedes zyklische Tag-System.
MilkyWay90
im ersten Testfall 100geht an 10auf cmd 0, deren Definition „löschen Sie das am weitesten links gelegene Bit in den Daten.“ wäre nicht das Bit ganz links 100sein 1?
Jonah
@ Jonah Oh, habe das verpasst
MilkyWay90
bewegt sich der Befehlszeiger in Fall (b) beim Anhängen um ein oder zwei Zeichen nach rechts?
Sparr
@Sparr Es bewegt sich nach rechts. Siehe den Abschnitt mit der Bezeichnung Herausforderung.
MilkyWay90

Antworten:

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

Probieren Sie es online aus!

Bearbeiten: -9 Bytes dank @xnor.

Nimi
quelle
1
In der ersten Zeile können Sie tun f:[e,f++take d q]!!p#q.
xnor
2

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

Probieren Sie es online aus!

Verkörperung der Unwissenheit
quelle
Welche Bedeutung haben die 48 und 49 aus Neugier?
Jonah
1
@ Jonah 48 ist der ASCII-Wert von 0und 49 ist der ASCII-Wert von1
Verkörperung der Unwissenheit
sollten Sie hier nicht stattdessen 0 und 1 verwenden: P
Nur ASCII
@ Nur ASCII Ich verwende einen String, kein Array.
Verkörperung der Unwissenheit
@EmbodimentofIgnorance warum nicht ein Listund Skipoder so etwas verwenden
ASCII-nur
1

J , 65 Bytes

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

Probieren Sie es online aus!

Ich kann das später weiter Golf spielen. Beachten Sie, dass 5am Ende _im eigentlichen Programm unendlich wäre , aber ich habe es dort belassen, um das Ausführen der Beispiele ohne Unterbrechung zu vereinfachen.

Jona
quelle
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)

Probieren Sie es online aus!

Argumente :: dDaten , p: Programm.

Erik der Outgolfer
quelle
1

05AB1E , 24 21 Bytes

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

Nimmt das Programm als erste Eingabe und Daten als zweite Eingabe.

Probieren Sie es online aus.

Erläuterung:

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

Probieren Sie es online aus!

Wie

  • Holen Sie sich das erste Bit aus Code cund Daten d, rufen Sie sie auf aund b. aAm Ende von zurücksetzen c.
  • Setzen Sie bam Anfang von dif zurück a==1. Dies kann auf verkürzt werden[b]*a
  • Setzen Sie das erste Byte cam Ende von dif a==1 and b==1. Dies kann auf verkürzt werden c[0,a*b].
  • Wenn wir mehr Daten haben, drucken und wiederholen.
GB
quelle
0

Gelee , 40 Bytes

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

Probieren Sie es online aus!

Ich habe angenommen, dass nachfolgende Zeilenumbrüche in Ordnung sind. Ich habe auch eine Liste mit zwei Listen mit Nullen und Einsen als Eingabe und Ausgabe an stdout erstellt.

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

Probieren Sie es online aus!

Verkörperung der Unwissenheit
quelle
Nett! Ein Problem: Für Daten '100', Programm '0', wird die leere Zeichenfolge einmal gedruckt. In Regel c heißt es jedoch: "Wenn die Daten jetzt nicht leer sind , geben Sie die Daten aus."
Chas Brown
@ChasBrown Kleiner Tippfehler, ich warte auf die Klärung durch das OP, ob nachfolgende Zeilenumbrüche in Ordnung sind
Verkörperung der Ignoranz
@ChasBrown Das OP sagt, dass mehrere nachfolgende Zeilenumbrüche erlaubt sind, siehe hier
Verkörperung der Ignoranz
Nachdem Sie jedoch zu Arrays mit []Einsen und Nullen gewechselt haben, drucken Sie jetzt ein leeres Array anstelle einer neuen Zeile in z. B. Daten [1,0,0], Programm [0].
Chas Brown
1
Python 1? Python 2 funktioniert nicht?
Nur 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;}}

Probieren Sie es online aus!

Peterzuger
quelle
1
163 Bytes
Ceilingcat
0

C ++ (gcc) , 294 289 272 Bytes

-22 Bytes dank @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);}}}

Probieren Sie es online aus!

Ziemlich einfacher Algorithmus. Kopiert die Daten in eine Warteschlange und durchläuft das Programm wiederholt. Bei einer "0" wird das erste Element in der Warteschlange entfernt (das erste "Bit"). Bei einer 1 fügt es das nächste "Bit" des Programms zu den Daten hinzu, wenn das erste "Bit" der Daten 1 ist. Dann durchläuft es die Daten, druckt sie "Bit" für "Bit" und druckt schließlich a Platz zum Trennen aufeinanderfolgender Dateneingaben.

Neil A.
quelle
@ceilingcat Clever (ab) Verwendung von c[1]! Aktualisiert.
Neil A.