方形不螺旋的弦!


12

给定一个字符串,首先将其平方如下:

首先,编写字符串。

abcde

接下来,编写向左旋转的字符串。

abcde
bcdea

继续这样做,直到您编写了len(string)行。

abcde
bcdea
cdeab
deabc
eabcd

现在,从这样的字符串中读取:

----+
+--+|
|+>||
|+-+|
+---+

这使:

abcdeabcdcbaedcbcdeabaede

打印此字符串。

测试用例

abcdef -> abcdefabcdedcbafedcbcdefabcbafedefaf
cena! -> cena!cenanec!anena!cec!a!
ppcg -> ppcgppcppgcpcgpg
abc -> abcabacbc
ab -> abab
a -> a
 -> 

如果测试用例不正确,请发表评论。

请记住,这是,所以字节数最少的代码将获胜。


2
cena!是错的。它应该与您的示例匹配,abcde因为它们都是5个字母:cena!cenanec!anena!cec!a!
Linus

@Linus谢谢,我已修复它。
奥利弗·尼

Answers:


7

JavaScript(ES7),83 80 78 77字节

s=>s.repeat(l=s.length).replace(/./g,_=>s[(c-=--i**.5-l&1||-1)%l],c=-1,i=l*l)

符合ES3的奖励计划:

for(s=prompt(r=""),c=-1,l=s.length,i=l*l;i;)r+=s[(c-=l-Math.sqrt(i--)&1||-1)%l];alert(r)

说明

这利用了以下事实:例如长度为5的字符串的输出可以表示为:

abcdeabcd cbaedcb cdeab aed e
012345678 7654321 23456 543 4

其中每个数字代表字符串的索引(从0开始),以字符串的长度为模。换句话说,如果n是字符串的长度,我们将索引增加2n-1倍,然后将其减少2(n-1)-1倍,然后将其增加2(n-2)-1倍,依此类推。可以将其简化为以下算法:

  • 启动索引-1
  • 对于[n 2 ..1]范围内的每个整数x
    • 如果floor(sqrt(x))与n具有相同的奇偶校验(偶数/奇数),则递增i
    • 否则,递减i
    • 将索引i mod n处的字符添加到输出中。

之所以可行,是因为floor(sqrt(x))2n-1次迭代之后切换奇偶校验,然后在2(n-1)-1次迭代之后切换奇偶校验。


可笑的 做得好!
市长蒙蒂

1

Pyth,15个字节

.Wp.(H0_CZ.<LQU

一个输入a "quoted string"并打印结果的程序。

在线尝试!验证所有测试用例(针对多个输入进行修改)。

怎么运行的

.Wp.(H0_CZ.<LQU  Program. Input: Q
            L U  Map over [0, 1, 2, 3, ..., Q-1] (implicit input):
          .< Q     Q left-shifted by that many characters
                 Call this X
.W               While
   .(H0          popping the first element of X (mutates X in-place)
  p              and printing it with no trailing newline is truthy:
         Z           X = 
        C            X transposed
       _             reversed

1

Python 2.7(在CMD.EXE中),91个字节

这要求终端具有有效的backspace(\b),并且不能在repl.itideone.com上使用。以逗号结尾的打印语句用空格分隔更多输出,而不是换行符或return。退格键使我们可以覆盖分隔空间。

s=input();r=s[::-1];n=len(s)-1;i=0
while i<=n:print'\b'+s[i:]+s[:n-i]+r[i+2:]+r[:n-i],;i+=2

Python 2.7,96个字节

ideone.comrepl.it上尝试一下(感谢Oliver)。输入必须是python字符串,例如'cena!'

s=input();r=s[::-1];n=len(s)-1;i=0;S=''
while i<=n:S+=s[i:]+s[:n-i]+r[i+2:]+r[:n-i];i+=2
print S

由环路所附的四个切片(s[i:]s[:n-i]r[i+2:]r[:n-i])从螺旋的四个边缘截取。例如与01234正方形是:

01234
12340
23401
34012
40123

因此,我们采取0123401232104321。变量i是过程每个步骤中左上角值的索引。在最后的螺旋中,几个切片可能是空的。


这可能不是唯一的拯救,而是通过改变到Python 3,除暴安良的S=''print S以及S+=和包装之前的所有i+=2print()用的语句sep='',可以节省2个字节。
凯德

@Shebang我没有马上关注。随意添加python 3自己回答。
莱纳斯(Linus)

您可以更改i<=nn>i
Oliver Ni

它保存一个字节。
奥利弗·尼

@Oliver,谢谢...但是它不适用于"a string of odd length."
Linus

1

果冻11 10 字节

ẋ2µṖȮṖUµÐL

TryItOnline!所有测试

怎么样?

无气的正方形是一系列的“上边缘加右边缘”和“下边缘加左边缘”游程,每个游程都与前一个游程相反,没有第一个和最后一个字母,并且第一个是输入加上不带最后一个字母的输入(例如,输入"abcde"的输出为"abcdeabcd" + "cbaedcb" + "cdeab" + "aed" + "e")。

ẋ2µṖȮṖUµÐL - Main link: s                            e.g. abcde
ẋ2         - repeat s twice                          e.g. abcdeabcde
  µ    µ   - monadic chain separation
        ÐL - repeat until results are no longer unique:
   Ṗ       -     remove the last character                abcdeabcd / cbaedcb / cdeab / aed / e   / ""
    Ȯ      -     print z (with no linefeed) and return z
     Ṗ     -     remove the last character                abcdeabc  / cbaedc  / cdea  / ae  / ""  / ""
      U    -     reverse                                  cbaedcba  / cdeabc  / aedc  / ea  / ""  / "" <- no longer unique.

1

05AB1E,12个字节

2×[DõQ#¨D?¨R

在线尝试!

说明:

 2×[DõQ#¨D?¨R
               # Implicit input
 2×            # Repeat twice
   [           # Begin infinite loop
┏>  DõQ#       # If empty string, break
┃       ¨      # Remove last character
┃        D     # Duplicate
┃         ?    # Print with no newline and pop
┃          ¨   # Remove last character
┃           R  # Reverse
┗━━━━━━━━━━━━┛ # Implicit end infinite loop


0

C,95 94字节

i,j,k,l;f(char*s){for(k=-1,l=i=strlen(s);i--;)for(j=i*2;~j--;putchar(s[(k+=(l-i)%2*2-1)%l]));}

受到@ETHproductions答案的启发。


0

Perl,99个字节

$_=<>;
chop;
@a=split//;
print(@a[$%,(@f=1-($b=@a-$%)..$b-3),$b-1?$b-2:(),reverse@f]),$%+=2 until$%>@a

空格不是程序的一部分,而是为了提高可读性而提供的。

不是非常有效的代码。我应该能够以某种方式缩短前三行,但是我尝试做的一切都失败了。该三元运算符也需要以某种方式进行修复,但是通过这种方式,可以将我的代码缩短10个字节,因为我可以切掉很多字节。

该代码通过编译一个以偶数分隔的回文列表进行工作,该回文表示要提取的字符串的位置值。


您可以使用-F 它将替换第1行和第3行。将输入与echo -n一起删除chop。(应该可以让您大约获得81个字节)
Dada

0

事实上21 13个字节

该算法主要基于Jonathan Allan的Jelly答案。有两种方法可以将结果打印为一个字符串。这里使用的方法重复了一个中间步骤,然后将其添加到寄存器1中的运行总计(默认为空字符串);;╕在函数中,然后在最后。另一种方法是复制一个中间步骤,将那些重复的步骤留在堆栈中,并在最后将它们求和成一个字符串。;在函数中,然后在最后。

欢迎打高尔夫球。在线尝试!

2*`dX;╕dXR`Y╛

开球

         Implicit input s.
2*       Push a string that repeats s two times.
`...`Y   Call the following function until there is no change from the last call
  dX       Discard the last element. Call this new string m.
  ;╕       Duplicate m and add it to the running total in register 1.
  dXR      Discard the last element again and reverse the string.
╛        Push the unspiralled string from register 1 to the stack.
         Implicit return.

0

Python 3,59个字节

x=input()*2
while x:x=x[:-1];print(x,end='');x=x[:-1][::-1]

代表

果冻答案的直接来源; 只有一个完整的程序接受输入(而不是一个函数)。
print(x,end='')是一个打印语句,将不打印默认换行符。


-1

Python 3,93个字节

s=input();r,n,i=s[::-1],len(s)-1,0
while n-i:print(s[i:]+s[:n-i]+r[i+2:]+r[:n-i],end='');i+=2

在线尝试!


而不是print(...,end='')这样做print(end=s[i:]+s[:n-i]+r[i+2:]+r[:n-i]
FlipTack

1
无论如何,此解决方案不适用于abcde,最后缺少e
FlipTack

尝试i<=n代替n-i您的情况。
莱纳斯(Linus)2016年
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.