ビット単位のサイクリックタグのシミュレーション


11

チャレンジ

既定のI / O形式の2つの文字列を指定して、次の操作を行います。

注:チャレンジでは、最初の文字列を「データ」、2番目の文字列を「プログラム」と呼びます。

  1. プログラムを無限の文字列に変更します。無限の文字列は、プログラムが無限に繰り返されるだけです(例10--- 1010101010...)。チャレンジではこれを「無限プログラム」と呼びます
  2. データが空ではない間、無限プログラムをループしながら次の操作を実行します。

    a。現在のコマンドが「0」の場合、データの左端のビットを削除します。データが空の場合、「0」は何もしません。

    b。現在のコマンドが「1」の場合、データの左端のビットが1であれば、プログラムの次の文字をデータに追加します。

    c。データが空でない場合、データを出力します。

テストケース

データは入力の左側であり、プログラムは右側です。

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

ノート

  • データとプログラムは0と1のみで構成されます
  • 停止しないデータ/プログラムの場合、プログラムを停止する必要はありません。
  • データとプログラムは入力では空になりません。
  • 複数の末尾および先頭の改行がある場合があります
  • 標準的な抜け穴は禁止されています
  • 任意の便利なI / O形式を使用できます

と同様に、最短のコードが勝ちます!


@Sanchisesはそれにボーダーラインが重複しているように見えますが、特定の世代で結果を取得する必要があります。これは、サイクリックタグシステムの場合です。
MilkyWay90

最初のテストケースで100は、「データの左端のビットを削除する」という定義の10cmd に進み0ます。の左端のビットでは100ない1でしょうか?
ヨナ

@Jonahああ、その逃した
MilkyWay90

(b)の場合、追加を行うと、命令ポインターは1文字または2文字右に移動しますか?
スパー

@Sparr右に移動します。チャレンジというラベルの付いたセクションを参照してください。
MilkyWay90

回答:



2

C#(Visual C#Interactive Compiler)、82バイト

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

オンラインでお試しください!


好奇心のうち、48と49の重要性は何ですか?
ヨナ

1
48 @JonahのASCII値であり0、そして49は、ASCIIの値である1
無知の実施の形態

ここでは代わりに0と1を使用しないでください:P
ASCIIのみ

@ASCIIのみ配列ではなく文字列を使用しています。
無知の

@EmbodimentofIgnoranceはなぜ使用しないListSkip、またはそのような何か
ASCIIのみの

1

J、65バイト

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

オンラインでお試しください!

私はこれを後でさらにゴルフするかもしれません。実際のプログラム5では最後が無限大_になることに注意してください。ただし、停止しない例を簡単に実行できるように、そこに残しておきます。



1

05AB1E24 21 バイト

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

プログラムを最初の入力として、データを2番目のinput.inputとして受け取ります。

オンラインでお試しください。

説明:

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

ルビー62 59バイト

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

オンラインでお試しください!

どうやって

  • コードから最初のビットを取得cし、データd、それらを呼び出すab。入れaの終わりにc
  • if bの先頭に戻します。これはda==1[b]*a
  • if cの最後にの最初のバイトを置きます。これはに短縮できます。da==1 and b==1c[0,a*b]
  • さらにデータがある場合は、印刷して繰り返します。



0

Python 1、75バイト

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

オンラインでお試しください!


いいね!ニグル:データ '100'、プログラム '0'の場合、これは空の文字列を1回印刷します。ただし、ルールcは「データがない場合、データを出力します」と言います。
チャスブラウン

@ChasBrown小さなタイプミス、末尾の改行が問題ない場合、OPからの明確化を待っています
無知の

@ChasBrown OPは、複数の末尾の改行が許可されていると言います。こちらを
無知の

しかし、1と0の配列に切り替えた後、今[]では、例えばdata [1,0,0]、programの改行の代わりに空の配列を印刷し ています[0]
チャスブラウン

1
python 1?python 2は動作しませんか?
ASCIIのみ


0

C ++(GCC) 294の 289 272バイト

@ceilingcatのおかげで-22バイト

#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);}}}

オンラインでお試しください!

かなり簡単なアルゴリズム。データをキューにコピーし、プログラムを繰り返しループします。「0」では、キューの最初の要素(最初の「ビット」)を削除します。1の場合、データの最初の「ビット」が1の場合、プログラムの次の「ビット」をデータに追加します。その後、データをループし、「ビット」ごとに印刷し、最後に連続するデータエントリを区切るスペース。


@ceilingcat Clever(ab)use of c[1]!更新しました。
ニールA.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.