模拟按位循环标记


11

挑战

给定两个默认I / O格式的字符串,请执行以下操作:

注意:质询将第一个字符串称为“数据”,第二个字符串称为“程序”。

  1. 将程序更改为无限字符串,该字符串就是程序无限重复(例如10-> 1010101010...)。挑战将其称为“无限程序”
  2. 当数据为非空时,请在无限程序上循环执行以下操作:

    一种。如果当前命令为“ 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看起来像是在复制边界线,但是您必须在某一代获得结果,并且该结果适用于任何循环标签系统。
MilkyWay19年

在第一个测试用例中,100转到10cmd 0,其定义是“删除数据中最左边的位”。是不是最左边的1001
乔纳

@Jonah Oh,错过了
MilkyWay90

在情况(b)中,如果执行追加操作,指令指针会向右移动一两个字符吗?
Sparr

@Sparr它向右移动。请参阅“挑战”部分。
MilkyWay19年

Answers:


4

Haskell,77 71 62字节

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

在线尝试!

编辑:-9个字节,感谢@xnor。


1
在第一行中,您可以执行f:[e,f++take d q]!!p#q
xnor19年

2

C#(Visual C#交互式编译器),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
@Jonah 48是的ASCII值0,而49是的ASCII值1
Ignorance

您不应该在这里使用0和1:P
ASCII码,仅ASCII,

仅限@ASCII,我使用的是字符串,而不是数组。
无知的体现,

@EmbodimentofIgnorance为什么不使用Listand Skip和类似的东西
纯ASCII,

1

J,65个字节

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

在线尝试!

我可能以后再打高尔夫球。请注意5,最后_在实际程序中将是无穷大,但我将其保留在那里,以使运行非停止示例更加容易。



1

05AB1E24 21 字节

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

将程序作为第一输入,将数据作为第二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 的第一个字节放在if c的末尾。可以缩短为da==1 and b==1c[0,a*b]
  • 如果我们有更多数据,请打印并重复。


0

果冻,40个字节

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

在线尝试!

我认为尾随换行符是可以的。我还输入了两个零和一的列表作为输入,并输出到stdout。


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',它将打印一次空字符串:但是规则c表示“如果数据现在不为空,则输出数据”。
Chas Brown

@ChasBrown小错字,如果尾随的换行符还可以,我正在等待OP的澄清
Ignorance的体现,

@ChasBrown OP表示允许多条尾随换行符,请参见此处
无知的体现

但是在切换到1和0的数组之后,现在您要[]在例如data [1,0,0],program 上打印一个空数组 而不是换行符[0]
Chas Brown

1
python 1?python 2不起作用?


0

C ++(GCC) 294个 289 272字节

-22个字节,感谢@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);}}}

在线尝试!

相当简单的算法。将数据复制到队列中,并反复遍历程序。在“ 0”上,它将删除队列中的第一个元素(第一个“位”)。在1上,如果数据的第一个“位”为1,则它将程序的下一个“位”添加到数据中。然后循环遍历数据,按“位”逐个打印,最后打印一个分隔连续数据条目的空间。


@ceilingcat聪明(ab)使用c[1]!更新。
尼尔·A,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.