迷宫


22

阿斯图里亚斯国王筒仓的墓地里刻有一个字样:SILO PRINCEPS FECIT国王筒仓为此)。

SILO PRINCEPS费用

第一个字母位于中间,从那里沿任何非对角线方向向外辐射阅读。最后的字母位于所有四个角。在这个挑战中,您将概括化制作它们的过程。

输入项

字符串(或等效字符串)和整数。您可以对输入做出以下假设:

  • 该字符串的长度将为奇数。
  • 整数将是小于字符串长度两倍的1到1之间的奇数。

输出量

字符串的字面迷宫,使用整数作为高度宽度(有关高度示例,请参见模型)。输出应为每个字母,不带空格,默认情况下,系统/语言均使用换行符。

测试用例

请注意,输入1或(长度* 2-1)将导致水平或垂直回文。

 Input: FOO, 3    Input: BAR, 1    Input: BAR, 3    Input: BAR, 5

Output: OOO      Output: RABAR    Output: RAR       Output: R
        OFO                               ABA               A
        OOO                               RAR               B
                                                            A
                                                            R

 Input: ABCDE, 5   Input: ABCDE, 3   Input: *<>v^, 5

Output: EDCDE     Output: EDCBCDE           ^v>v^
        DCBCD             DCBABCD           v><>v
        CBABC             EDCBCDE           ><*<>
        DCBCD                               v><>v
        EDCDE                               ^v>v^

计分

这是因此最短答案以字节为单位。 禁止出现标准漏洞



输入中可以包含空格吗?如果是这样,应该如何处理?
Nitrodon

1
我们可以将输入作为字符列表吗?
罗宾·赖德

1
@Charlie显然您已经错过了我所有的Perl6答案:-)我也希望得到您的答案,因为它的灵感来自西班牙的第五任国王(嗯,是Asturies,但是Asturies yeEspaña,y tolodemástierra conquistao哈哈)
user0721090601

1
我们可以用宽度而不是高度吗?
attinat

Answers:


6

J,27个字节

([{~]+/&(|@i:)#@[-1+])-:@<:

在线尝试!

一个例子将阐明高级方法。

考虑 'ABCDE' f 3

我们注意到,我们寻求的只是1 0 1and 的“交叉加法”表3 2 1 0 1 2 3,看起来像这样:

4 3 2 1 2 3 4
3 2 1 0 1 2 3
4 3 2 1 2 3 4

然后,我们从原始字符串中提取这些索引:[{~

其余所有代码只是无聊的算术,并且使用i:来构造参数1 0 13 2 1 0 1 2 3


6

果冻,12字节

Uṡṛ‘HɗŒBŒḄZY

在线尝试!

一个以字符串为左,高度为右自变量的二元链接。返回带有换行符的字符串。如果可以接受输出的字符串列表,我可以删除最后一个Y保存的字节。有趣的是,当我在TIO上观看时,原始的“ SILO PRINCEPS FECIT”在我看来就像3D钻石的ASCII艺术。

说明

U            | Reverse input
 ṡ   ɗ       | All overlapping substrings of the length given by:
  ṛ          | - The right argument
   ‘         | - Incremented by 1
    H        | - Halved
      ŒB     | Concatenate to the reverse, keeping a single copy of the last character (so creating a palindrome)
        ŒḄ   | Do the same, but this time using the lists of characters generated by the last atom
          Z  | Transpose
           Y | Join with newlines

2
我单击了try只是为了查看,是的,确实,它可以进行3D。很奇怪但是很酷。
user0721090601

6

R93 91 87字节

-2个字节,感谢Giuseppe。通过输入宽度而不是高度来输入-4字节,这是OP所允许的。

function(s,W,w=W%/%2,h=length(s)-w-1)write(s[1+outer(abs(-w:w),abs(-h:h),`+`)],1,W,,"")

在线尝试!

将输入作为字符向量。关键部分是s[1+outer(abs(-w:w),abs(-h:h),'+')]

wh(2w+1)×(2h+1)

(i,j)1+|ih|+|jw|abs(-w:w)abs(-h:h)abs(-h:h)[h,h1,h2,,2,1,0,1,2,,h1,h]outer(abs(-2:2), abs(-1:1), '+')

32123
21012
32123

(然后,我们需要添加1,因为R是1索引的。)中间的0是输入的第一个字母应放在的位置。

其余正在格式化。


5

木炭25 19字节

E⊘⊕η✂θι⁺ι⁻Lθ⊘⊖η‖O←↑

在线尝试!链接是详细版本的代码。说明:

E⊘⊕η✂θι⁺ι⁻Lθ⊘⊖η

画出四分之一的题词。

‖O←↑

反映以完成题词。


1
令人印象深刻!我是该网站的新手,如果有几个愚蠢的问题,我谨此致歉。1.绝对是19个字符,但是它们也是19个字节吗?2.该文本采用哪种编码将占用19个字节?
damix911

是的,以UTF-8编码,将需要19个字符,但实际上为51个字节。对于UTF-16,这仍然需要39个字节进行编码。
ruohola

1
@ damix911木炭有自己的编码,可以在其Wiki上找到。我认为代码页外的字符花费3个字节。去混响器尝试计算正确的长度,但不会打扰到实际编码,这很烦人。
尼尔

1
@Neil Okey,似乎合法!
ruohola

3

Japt -R19 16字节

z
ò@VÔtXUaVÊ)êÃê

试试吧

z\nò@VÔtXUaVÊ)êÃê     :Implicit input of integer U & string V
z                     :Floor divide U by 2
 \n                   :Reassign result to U
   ò                  :Range [0,U]
    @                 :Map each X
     VÔ               :  Reverse V
       tX             :  Substring from index X to index ...
         Ua           :    Absolute difference between U and ...
           VÊ         :    Length of V
             )        :  End substring
              ê       :  Palindromise
               Ã      :End map
                ê     :Palindromise
                      :Implicit output, joined by newlines


2

Japt -R,10字节

Ôã°Vz)mê ê

采用宽度而不是高度。

试试吧

伪代码(U是字符串,V是整数):

U.Reverse().AllSubstringsOfLength(++V / 2).Map(Palindromize).Palindromize

真好!我从未想过要横向构建它。
毛茸茸的


2

Python 3,104个字节

我没打高尔夫这么长时间了...我敢肯定这可能会更短。

细节

该代码定义了一个函数,该函数接受两个参数(字符串和高度),并在标准输出上给出结果。

字符串中的索引是距​​网格中心的曼哈顿距离。对于宽度的网格w和高度h,用于在小区的距离(x, y)IS abs(x - (w - 1) / 2) + abs(v - (h - 1) / 2)

网格的宽度必须使拐角的曼哈顿距离(例如(0, 0))比字符串的长度小一。代(0, 0)入上述内容并进行简化,我们发现宽度为2 * len(s) - h

def b(s,h):
 w=2*len(s)-h
 for y in range(h):print(''.join(s[abs(x-w//2)+abs(y-h//2)]for x in range(w)))

在线尝试!



1

Pyth,19个字节

L+_btbjyyM.:Q-lQ/E2

在线尝试!

L+_btbjyyM.:Q-lQ/E2   Implicit: Q=string, E=height
L                     Define a function, y(b):
  _b                    Reverse b
 +  tb                  Append all be first element of b
                      y is now a palindromisation function
              lQ      Length of Q
             -  /E2   Subtract floored division of E by 2
          .:Q         All substrings of Q with the above length
        yM            Palindromise each substring
       y              Palindromise the set
      j               Join on newlines, implicit print



1

C#(.NET Core),146字节

s=>n=>{int w=s.Length*2-n,i=0,j;var r=new char[n,w];for(;i<n;i++)for(j=0;j<w;)r[i,j]=s[System.Math.Abs(n/2-i)+System.Math.Abs(w/2-j++)];return r;}

在线尝试!

最长的答案这么久。:-)它使用曼哈顿到广场中心的距离。但是,必须有更短的方法。


1

TCL188个 170 162字节

{{w s} {join [lmap C [lrepeat $w string] {join [$C reverse [set y [$C range $s [set x [expr abs($w/2+1-[incr i])]] end-[expr $w/2-$x]]]][$C range $y 1 end]}] \n}} bytes

在线尝试!

在TCL中,似乎有上百万种方法可以解决此问题。这不是最坏的情况。

转换为lambda至少可以节省18个字节(如果可接受行列表的返回值,则最多可以节省13个字节)

由于lmap迭代器用作额外的常量,因此节省了额外的8


1

画布,18 字节

±X↕┌L╵┌-Y{x;1y1@]┼

在这里尝试!

Canvas不会做子字符串,因此我需要将其视为艺术品,并以这种方式获得子部分。我觉得这花了我2个字节,但是,您该怎么办。

看起来这实际上不像我想的那样起作用:Canvas的palindromize函数会镜像某些字符(例如,垂直镜像的V变成^),而我不能完全禁用它…… 哦,我猜


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.