我们从开始的地方结束了!…


29

挑战:

输入:

您有两个输入:
-仅包含可打印ASCII的字符串(不包括空格,制表符或换行符)
-可打印的ASCII字符

输出:

第一行将包含字符串输入。i该字符的每个-modulo-3首次出现都将朝东南方向移动;每出现i-modulo-3秒事件将向南移动一次;并且每i-modulo-3出现的三分之一将沿西南方向移动。您将继续操作,直到字符将再次位于其初始起始位置(这意味着如有必要,它将从一侧缠绕到另一侧),然后再次使用字符串输入将最后一行打印到完成它。(请注意,所有测试用例都将在最多length(input)行之后(包括包含尾随输入的行)结束于其初始输入。但是,如下面的第一个测试用例所示,它可能更快,长度为14,但在之后9.)

这可能都非常模糊,因此这里有一个示例:

测试用例1:

字符串输入:"This_is_a_test"
字符输入:'s'

输出:

This_is_a_test
    s s    s  
     ss   s   
      s  s    
      sss     
      sss     
      s  s    
     ss   s   
    s s    s  
This_is_a_test

这是三个颜色路径相同的测试用例s

在此处输入图片说明

第一条's'沿着绿色路线向东南方向行驶;第二条's'沿着黄线向南行驶;第三条's'沿着淡蓝色的路径向西南方向移动。(如果有第四个's',它将再次朝东南方向移动,这可以在下面的其他一些测试案例中看到。)

挑战规则:

  • 输入将仅包含可打印的ASCII(不包括空格,制表符和换行符)
  • I / O格式很灵活。可以是换行符分隔的字符串,字符矩阵等。您的呼叫。
  • 给定字符可能不存在于字符串中,在这种情况下,允许您将输入字符串输出一次或两次(即,"test", 'a'可以将其中之一作为可能的输出:"test\ntest"/ "test")。
  • 前导空格是强制性的;尾随空格是可选的。允许一个或多个前导/尾随换行符。

一般规则:

  • 这是,因此最短答案以字节为单位。
    不要让代码高尔夫球语言阻止您发布使用非代码高尔夫球语言的答案。尝试针对“任何”编程语言提出尽可能短的答案。
  • 标准规则适用于您的答案,因此允许您使用STDIN / STDOUT,具有适当参数的函数/方法和返回类型的完整程序。你的来电。
  • 默认漏洞是禁止的。
  • 如果可能,请为您的代码添加一个带有测试的链接。
  • 另外,如有必要,请添加说明。

测试案例/更多示例:

测试案例2:

字符串输入:"abcabcabcabcabc"
字符输入:'b'

输出:

abcabcabcabcabc
  b b b    b b 
   bbb      bb 
    b        b 
   bbb       bb
b b b b      b 
 b  b  b     b 
b b b   b    b
   bb    b   bb
    b     b  b 
    bb     bbb
    b b    bbb 
    b  b  b  b 
    b   bb   bb
b   b   bb   b 
abcabcabcabcabc

这是五个颜色路径相同的测试用例a

在此处输入图片说明

测试案例3:

字符串输入:"only_two_paths?"
字符输入:'o'

输出:

only_two_paths?
 o     o       
  o    o       
   o   o       
    o  o       
     o o       
      oo       
       o       
       oo      
       o o     
       o  o    
       o   o   
       o    o  
       o     o 
       o      o
only_two_paths?

这是两个颜色路径相同的测试用例o

在此处输入图片说明

测试案例4:

字符串输入:"lollollollollol"
字符输入:'l'

输出:

lollollollollol
lll   ll  ll   
 ll   ll  ll   
l ll ll ll ll  
  lll l ll l ll
  llllll  ll ll
l l  ll    ll  
 ll  lll   ll  
l l l lll ll l 
  ll  l ll l  l
l l l l llll l 
 ll  lll  lll  
l l   l    ll  
  ll lll  lllll
  l l l ll l ll
lollollollollol

这是十个颜色路径相同的测试用例l

在此处输入图片说明

测试案例5:

字符串输入:"AbCdEeDcBaAbCdEeDcBa_CCCCC"
字符输入:'C'

输出:

AbCdEeDcBaAbCdEeDcBa_CCCCC
C  C        C       C  C  
 C  C       C      C  CCC 
  C  C      C     C  C C C
C  C  C     C    C  C  C  
 C  C  C    C   C  C   C  
  C  C  C   C  C  C    C  
   C  C  C  C C  C     C  
    C  C  C CC  C      C  
     C  C  CC  C       C  
      C  C CC C        C  
       C  C CC         C  
        CC CC C        C  
        CC CC  C       C  
       C  C CC  C      C  
      C  C CC C  C     C  
     C  C   C  C  C    C  
    C  C    CC  C  C   C  
   C  C     C C  C  C  C  
  C  C      C  C  C  C C  
 C  C       C   C  C  CC  
C  C        C    C  C  C  
  C         C     C  C CCC
 C          C      C  CCCC
C           C       C  C  
 C          C        CCCCC
AbCdEeDcBaAbCdEeDcBa_CCCCC

这是具有七个颜色路径的相同测试用例C

在此处输入图片说明

测试用例6:

字符串输入:"XyX"
字符输入:'X'

输出:

XyX
 XX
  X
XyX

这是两个颜色路径相同的测试用例X

在此处输入图片说明

测试案例7:

字符串输入:"aaaa"
字符输入:'a'

输出:

aaaa
aa  
aaa 
 aaa
aaaa

这是四个颜色路径相同的测试用例a

在此处输入图片说明


因此,当字符串包含字符的3的倍数时,输出的行数可能会少于字符串的长度?
尼尔

@Neil我不确定它是否是3的倍数,还没有研究那么多。我所知道的是,至多length(input)所有内容都可以再次匹配,但是可以在第一个测试用例证明之后尽快进行。但是似乎您确实对3的倍数是正确的(尽管我不确定100%)。
凯文·克鲁伊森

@Neil任何字符连续出现仅3次的字符串都将打印3行,无论长度多长
Asone Tuhid

2条印刷线之间是否允许尾随新行?
Asone Tuhid

@AsoneTuhid对不起,但没有。我不在乎整个预期输出之前或之后的任何尾随或前导新行,但我不允许在行之间插入。斜线将不再正确以及..
凯文Cruijssen

Answers:


1

Stax,24 个字节

»v↕*δó‼Γ█|q┬YM╨|·£↕fßßZo

在线运行和调试

这是同一程序的ascii表示。

YxP|Ic{{i3%v-x%%mb-!Czny&PWxP

它获取所有字符的索引,然后对其进行突变,直到它们在设置上等于原始索引为止。对于每次更改,输出一个在这些索引处带有字符的字符串。

Y                               Store character in y.  Now the inputs are x and y.
 xP                             Print x.
   |Ic                          Get all indices of y in x. Make a copy.
      {                   W     Loop until cancelled.
       {        m               Map index array using block.
        i3%v-                   Subtract i%3-1 from each element. i is the loop index.
             x%%                Modulo len(x)
                 b-!            Is the mutated array set-equal to the original?
                    C           If so, cancel W loop
                     zny&P      Print a string with y at all specified indices
                           xP   Finally, print x again

8

Perl 5中-plF 101个 100 99 98 97 96字节

将其替换\0为文字0字节以得到96。请注意,“在线试用”链接具有97字节,因为似乎无法在其中输入文字0字符。

#!/usr/bin/perl -plF
say;say$$l=~y/\0/ /runtil--$l,(s:\Q${\<>}:$$l|=v0 x((++$#$l%3*$l-$l+"@-")%@F).$&;v0:oreg^$$l)eq$_

高尔夫perl荧光笔代码认为#开始发表评论。天真😈

在线尝试!

怎么运行的

$l是在第一行之后的那一行的计数器(尽管它是递减计数,所以例如在顶部字符串下方的3行中为-3)。在打印初始字符串后,它会重复执行以下操作。

在第一个字符串中搜索目标字符的出现并计算它应出现在哪个偏移量:(++$#$l%3*$l-$l+"@-")%@F这是当前位置加上行号(负)乘以-1, 0, 1(循环)。构造一个字符串,该字符串要多次\0包含目标字符,or然后放入累加器中$$l(每个累加器都是一个不同的累加器,$l原因$l是递减计数,而不是递增计数,因为$1$2等等是只读的)。$#$l每次遍历循环都类似地引用不同的数组。结果是$lth行,但带有\0空格。

第一个字符串中的目标字符被替换,\0因此您最终\0在目标字符的原始位置处使用带有“ holes”(带有)的原始字符串。如果xor使用累加器,则仅当累加器的目标字符位于原始位置时,孔才会被填充,因此结果将是原始字符串。这用于终止循环。如果循环还没有结束,请\0用空格替换打印累加器。

循环结束后,该-p选项将再次打印第一个字符串并完成程序。

目标角色以相当棘手的方式被拾取。所述${\<>}转换的线从STDIN读取,然后将其立即解除引用和在正则表达式取代的参考。该\Q前缀逃脱,在一个正则表达式(如特殊的所有字符.*)。的\E是隐含的。该o修改使得搜索部分永远不会再评价,但只是在随后的所有比赛重复(这是很好的,因为就没有什么STDIN了)。


我不认为您可以直接放置一个空字节,但可以在bash或其他方式中运行它。
FryAmTheEggman

@FryAmTheEggman谢谢,这真是道奇。但是我认为我不会打扰。人们将不得不相信我说的是如果作品他们不想尝试一下自己:-)
吨Hospel

完全公平,但我会留下评论,以便人们看到。顺便说一句,打高尔夫球不错:)
FryAmTheEggman

4

Python 2中199个 193 191字节

s,c=input()
print s;l=len(s);r=range;I=j=[i for i in r(l)if s[i]==c]
while 1:
 j=[(j[i]-i%3+1)%l for i in r(len(I))]
 if sorted(j)==I:print s;break
 print''.join((' '+c)[i in j]for i in r(l))

在线尝试!


如果循环可以通过异常退出:

Python 2,187字节

s,c=input()
print s;l=len(s);r=range;I=j=[i for i in r(l)if s[i]==c]
while 1:
 j=[(j[i]-i%3+1)%l for i in r(len(I))]
 if sorted(j)==I:print s;q
 print''.join((' '+c)[i in j]for i in r(l))

在线尝试!


  • -4个字节,感谢Jonathan Frech
  • -2字节感谢Lynn

可能的189个字节(通过异常退出循环)。
乔纳森·弗雷奇

您可以将一对paren放入(j[i]-i%3+1)%l两个字节。
林恩

2

C(gcc),261字节

i,j,l,k;g(L,t,r,c)char**L;{L[r++][c]=k;c-=t?t-1?:0:-1;l<r||g(L,t,r,c<0?l-1:c%l);}f(S,K){char*s=S,*L[i=1+(l=strlen(s))];for(k=K;i--;)for(L[i]=calloc(j=l,1);j--;)L[i][j]=32;for(puts(s);s[++i];)s[i]-k||g(L,++j%3,0,i);for(i=1;strcmp(*L,L[i]);)puts(L[i++]);puts(s);}

在线尝试!


2

JavaScript(Node.js)197194字节

s=>c=>{(C=console.log)(s);w=0;g=[];while(~(w=s.indexOf(c,w)))g.push(w++);h=(H=_=>g.map(x=>A[x]=c,A=Array(l=s.length).fill` `)&&A.join``)();while(h!=(y=H(g=g.map((x,i)=>(l-~x-i%3)%l))))C(y);C(s)}

在线尝试!

以currying语法(即)接受输入f(s)(c)

一点都不完美,但是我需要JS。功能中有很多功能。


2

Ruby189176171156150146144137字节

->s,c,r=0..k=s.size,b=[p,s]{d=0;g=s.tr c,n=' '*k;l=r=r.map{|i|l||c==s[i]?(n[z=(i+1-d%3)%k]=g[z]=c;d+=1;z):p}-b;g==s||b<<n&&redo;puts b,s}

在线尝试!


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.