制作平方字


38

挑战

您的任务是创建一个程序,该程序接受任何给定的字符串输入,并以平方格式输出输入。空字符串应返回一个空字符串。

例子

给定输入:

golf

您的程序应输出:

golf
o  l
l  o
flog

输入:

123

输出:

123
2 2
321

输入:

a

输出:

a

输入:

Hello, world!

输出(注意,和之间的空格-间隙不只是换行符):

Hello, world!
e           d
l           l
l           r
o           o
,           w

w           ,
o           o
r           l
l           l
d           e
!dlrow ,olleH

计分

这是,因此每种语言中最短的答案将获胜。


@DJMcMayhem是的,我忘了补充我的道歉。
SpookyGengar '17

2
不用担心,只需仔细检查即可。顺便说一句尼斯挑战!欢迎来到该网站:)
DJMcMayhem

@SpookyGengar您是否为一个字母输入添加一个测试用例?
musicman523

@ musicman523我还没有一个吗?第三个示例仅涉及字母“ a”。
SpookyGengar '17

1
@SpookyGengar我的坏人,我显然是瞎子的
musicman523

Answers:


17

木炭7 5字节

θ‖O↙↘

在线尝试!链接是详细版本的代码。编辑:由于@CarlosAlejo,节省了2个字节。说明:

θ       Print the input string, making the top row
 ‖O     Reflect with overlap...
   ↙    ... down and left, to create the left side
    ↘   ... down and right, to create the bottom and right sides

(指向“反射”命令的多个方向连续而不是同时运行。)


哇,耶稣,我仍然认为木炭是最酷的esolang创意。
魔术章鱼缸

1
如果只打印输入字符串并向左下方和向右反射,则可以节省两个字节θ‖B↙↘在线尝试!
查理

现在我想到了,也许我应该使用ReflectOverlap而不是ReflectButterfly避免翻转字符。:-)
查理

1
这是一种罕见的情况,其中深奥的高尔夫球答案比流行的通用语言的完整版本更容易阅读和理解。
卡雷布

在这里的答案也适用于4个字节。
奥利弗

10

MATL20 16 11字节

otYTO6Lt&(c

在线尝试在MATL!

编辑:该代码在发行版20.2.1中有效,该版本早于挑战。链接使用该版本。(在20.2.2中,代码会更短一些,但是会推迟挑战时间)。

说明

o     % Implicitly input a string. Convert chars to ASCII codes
t     % Duplicate
YT    % 2-input Toeplitz matrix
O     % Push 0
6L    % Push predefined literal [2, -1+1j]. When used as an index, this is
      % interpreted as 2:end-1 (indexing is 1-based)
t     % Duplicate
&(    % 4-input assignment indexing. This writes 0 at the square formed by
      % rows 2:end-1 and columns 2:end-1 
c     % Convert to char. Char 0 is shown as space. Implicitly display

非常令人印象深刻!:)是否可以删除每个输出底部的空白行,还是功能所需的空白行?
SpookyGengar '17

2
@SpookyGengar这是一个很常见的请求,允许一个尾随换行符。
乔纳森·艾伦

@SpookyGengar谢谢!MATL始终显示尾随换行符。正如乔纳森所说,通常是这样
路易斯·门多

1
@LuisMendo您每天都会学到一些新东西。:)感谢您提交-绝对是迄今为止最好的!
SpookyGengar '17

6

果冻 29 22  17 字节

木炭 为此分数而颤抖 ...

J⁶ẋa0,1¦"ṚṚ;$ṖŒḌY

单子链接,获取并返回字符列表;或完整程序打印结果。

在线尝试!

怎么样?

J⁶ẋa0,1¦"ṚṚ;$ṖŒḌY - Link: list of characters, w     e.g. "whole"
 ⁶                - literal space character              ' '
J                 - range(length(w))                     [1,2,3,4,5]
  ẋ               - repeat                               [" ","  ","   ","    ","     "]
         Ṛ        - reverse w                            "elohw"
        "         - zip with:
       ¦          -   sparse application of:
   a              -     and (vectorises)
    0,1           -     to indexes: [0,1] (last and 1st) ["e","ll","o o","h  h","w   w"]
            $     - last two links as a monad:
          Ṛ       -   reverse                            ["w   w","h  h","o o","ll","e"]
           ;      -   concatenate                        ["w   w","h  h","o o","ll","e","e","ll","o o","h  h","w   w"]
             Ṗ    - pop (remove last entry)              ["w   w","h  h","o o","ll","e","e","ll","o o","h  h"]
              ŒḌ  - reconstruct matrix from diagonals    ["whole","h   l","o   o","l   h","elohw"]
                Y - join with newlines                   "whole\nh   l\no   o\nl   h\nelohw"
                  - if running as a full program implicit print

很酷!到目前为止,这是最短的解决方案,但不适用于单字符输入和由数字组成的字符串,即“ 123”。
SpookyGengar '17

嗯,我将不得不处理单个字符的边缘情况,是的。它确实适用于数字字符的字符串,程序输入实际上应该用引号引起来,例如'Hello',“ Spooky's” "123"等(使用Python解释输入)。
乔纳森·艾伦,

@SpookyGengar-修复了1个字符的情况。
乔纳森·艾伦

长度减少得不错!
路易斯·门多

2
您对木炭说的没错。
尼尔

3

C,109位元组

i,j;f(char*s){for(i=j=printf("%s\n",s)-2;1[++s];)printf("%c%*c\n",*s,i,s[j-=2]);for(;*s*~i--;)putchar(*s--);}

在线尝试!

值得注意的技巧:

  • 与其浪费字节strlen,不如简单地获取字符串的长度,同时打印第一行:

    i=j=printf("%s\n",s)-2

    之所以有效,是因为printf返回了写入的字节数。

  • 对于中间的行,我们需要遍历字符串,但要排除第一个和最后一个字符。这是通过以下条件实现的

    1[++s]

    (比短(++s)[1]),它会由于++处于条件中而跳过第一个字符,并在当前字符之后的字符停止时'\0'(而不是 '\0')停止播放,从而跳过最后一个字符。

  • 在第一个循环的主体中

    printf("%c%*c\n",*s,i,s[j-=2])

    我们打印当前的字符,然后“镜像”相应的字符(跟踪用j,这并进入底片,从而在奇数情况的索引的与一个负号的字符串)填充到长度为i用空格(其中i是方便strlen(s) - 1)。

  • 最后一行的反转打印非常简单;唯一的窍门是*s*~i--,这是获得i+2循环体迭代的最短方法(不依赖i;所有i用于计数)。时髦的*s*部分可以确保如果*sis为'\0',则循环不会运行,这是在length-1输入上发生的。



3

Haskell84 78字节

f s@(_:x)|_:y<-r x=s:[a:(y>>" ")++[b]|(a,b)<-zip x y]++[r s];f s=[s]
r=reverse

在线尝试! 用法:f "test"。返回行列表。

编辑: -6字节,感谢黛安娜!


1
您可以通过使用模式保护器作为保护器并定义的同义词来节省一些字节reverser=reverse;f s@(_:x)|_:y<-r x=s:[a:(y>>" ")++[b]|(a,b)<-zip x y]++[r s];f s=[s]是78个字节。
dianne



2

05AB1E17 16 15 19字节

ÂDÂø¦¨Dgú€Ás)˜»Igi¨

在线尝试!

说明

例子 input = golf

ÂDÂ                  # bifurcate, duplicate, bifurcate
                     # STACK: 'golf', 'flog', 'flog', 'golf'
   ø                 # zip the top 2 items
                     # STACK: 'golf', 'flog', ['fg', 'lo', 'ol', 'gf']
    ¦¨               # remove the first and last element
                     # STACK: 'golf', 'flog', ['lo', 'ol']
      Dg             # get the length of the list
                     # STACK: 'golf', 'flog', ['lo', 'ol'], 2
        ú            # prepend that many spaces to each element
                     # STACK: 'golf', 'flog', ['  lo', '  ol']
         €Á          # rotate each right
                     # STACK: 'golf', 'flog', ['o  l', 'l  o']
           s         # swap the top 2 items
                     # STACK: 'golf', ['o  l', 'l  o'], 'flog'
            )˜       # wrap in a flattened list
                     # STACK: ['golf', 'o  l', 'l  o', 'flog']
              »      # join on newline
               Igi¨  # if input is length 1, remove last char

1个字母输入的修复非常昂贵。
我觉得现在使用其他方法可能会更好。



1

Mathematica,128个字节

(c=Column;g=Length[x=Characters@#]-1;If[g==0,#,c@{#,c@Table[""<>{x[[i]],""<>Table[" ",g-1],x[[-i]]},{i,2,g}],StringReverse@#}])&

1

C,96字节

i,l;f(char*s){for(i=l=puts(s)-2;--i;)printf("%c%*c\n",s[l-i],l,s[i]);for(;l+1;)putchar(s[l--]);}

奖励版本(122字节):

x,y,i,l;f(char*s){for(i=l=puts(s)-1;++i<l*-~l;putchar(x==l?10:x%~-l*(y%~-l)?32:s[(x*y?l+l-2-x-y:x+y)%l]))x=i%-~l,y=i/-~l;}

1

迅速3215个 199字节

let s=readLine()!,c=s.characters,r:[Character]=c.reversed(),b=c.count
print(s)
if b>1{for i in 0..<b-2{print("\(r.reversed()[i+1])\(String.init(repeating:" ",count:b-2))\(r[i+1])")};print(String(r))}

在线尝试


1

Python 3,88个字节

w=input();p=print;l=len(w)-2
[p(w[n+1]+' '*l+w[l-n])for n in range(l)]
l+1and p(w[::-1])

1
欢迎来到PPCG!
Martin Ender

也欢迎您访问该网站!我相信l+1 and可以将其重写为l+1and节省一个字节。
小麦巫师

@WheatWizard编辑-谢谢!我很惊讶这个工作...
Levi

它会起作用,除了的情况外0or,python由于0o是八进制前缀而无法解析。
小麦巫师

当我运行它,它似乎并没有打印的顶线... tio.run/##FcoxCsQgEAXQPqeYLk7EwqRL8CRiEVh3Iww/...
科蒂乔纳森萨克斯曼

1

的JavaScript(ES8),108个 112字节

let f = 

s=>(n=s.length)<2?s:(r=[...s].reverse()).slice(1,-1).reduce((a,v,i)=>a+`
`+s[i+1].padEnd(n-1)+v,s)+`
`+r.join``

o.innerHTML = f("hello folks!")
<pre id="o"></pre>

少了

s=>
   (n=s.length) < 2 ?    // record and check length
   s :                   // s has 0 or 1 char, else
   (r=[...s].reverse())  // reverse characters,
   .slice(1,-1)          // exclude 1st and last
   .reduce((a,v,i)=>     // append inner lines
      a +'\n' +s[i+1].padEnd(n-1) + v
    ,s)                  // to first line
    + '\n' +r.join("")   // append characters reversed

感谢Justin Mariner节省了大量字节,然后所有字节都累了,添加了应对挑战所需的零或单个字符检查。你明白了:-(


您可以通过第二行`+s[i+1].padEnd(s.length-1)+v,s)+`并使用来节省7个字节r.join``
贾斯汀·马里纳

感谢@JustinMariner提供有关String.prototype.padStart模板文字和标记的提示。我需
要这样做

您的间距现在太短了一个字符;您可以修复该问题,并通过(n=s.length-1)?(r=<...>+r.join``:s使用节省更多padEnd(n)。如果长度为1length-1则为0(false)。
贾斯汀·马里纳

@JustinMariner的间距是固定的,但是我一直进行长度测试-据我了解,零长度字符串和一个字符的字符串都返回自身,而无需回车或重复该字符串。
traktor53

1
padEnd是ES2017。
尼尔

1

PHP,118字节

echo $s=$argv[1];$l=strlen($r=strrev($s))-1;for($i=$l-1;$l&&$i;)echo "\n".str_pad($r[$i],$l).$s[$i].(--$i?"":"\n$r");

在线尝试!

echo $s = $argv[1];
$l = strlen($r = strrev($s)) - 1;

for ($i = $l - 1; $l && $i;)
    echo "\n" . str_pad($r[$i], $l) . $s[$i] . (--$i ? "" : "\n$r");

1

APL,58字节

{(' ',⍵)[x+(x←∘.{((c-1)=⍺⌈⍵)∨0=⍺⌊⍵}⍨r)×o⌊⌽⊖o←∘.⌈⍨r←⍳c←≢⍵]}

⎕IO←0

在线尝试!

怎么样?

c←≢⍵ -字符串的长度

r←⍳ - 范围

o←∘.⌈⍨ -外部产品最少

123
223
333

o⌊⌽⊖- minimalize与自身转过180 ö

123  ⌊  333  =  123
223  ⌊  322  =  222
333  ⌊  321  =  321

× -与

x←∘....⍨r -具有以下范围的外积

    ((c-1)=⍺⌈⍵)∨0=⍺⌊⍵ -矩阵的框架

111  ×  123  =  123
101  ×  222  =  202
111  ×  321  =  321

x+ -添加框架

111  +  123  =  234
101  +  202  =  303
111  +  321  =  432

(' ',⍵)[...] -从连接到空格的字符串中按索引获取


⍉⊖⍉⊖⌽⊖
扎卡里

@Zacharý谢谢
Uriel

0

JavaScript(ES2017),87个字节

s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i].padEnd(l)+c:z.join``:s).join`
`

ES6版本:93个字节

s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i]+' '.repeat(l-1)+c:z.join``:s).join`
`

少打高尔夫球

s => (
  l = s.length-1,
  [...s].reverse().map( // scan string backwards
     (c, i, z) => 
     i != 0 // check if top row
     ? l-i != 0 // check if bottom row
       ? s[i].padEnd(l) + c // any middle row
       : z.join`` // bottom row: string reversed
     :s // top row: original string
  ).join`\n`
)

F=
s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i].padEnd(l)+c:z.join``:s).join`
`

function update() {
  O.textContent = F(I.value)
}

update()
<input id=I value='Hello, world!' oninput='update()'>
<pre id=O></pre>


padEnd是ES2017。
尼尔

@Neil谢谢,我将更改标题
edc65

您可以使用来在ES6版本上保存一个字节l+~i,这样可以避免必须减去1两次,而可以减去2次。
尼尔

@Neil应该是l-~-i
edc65

我在想s=>[...s].reverse(l=s.length).map((c,i,z)=>i?l+~i?s[i]+' '.repeat(l-2)+c:z.join``:s).join`\n` s=>[...s].reverse(l=s.length-2).map((c,i,z)=>i?i+~l?s[i]+' '.repeat(l)+c:z.join``:s).join`\n` 也可行。
尼尔

0

Java,191个字节

(s)->{PrintStream o=System.out;int l=s.lenght();o.println(s);for(int i=0;i<l;i++){o.printf("%"+"s%"+(l-1)+"s%n",s.charAt(i),s.charAt(l-1-i));for(int i=0;i<l;i++){o.print(s.charAt(l-1-i));}}};

(s)可以公正s。内有单行的循环可以删除花括号。如果可以节省任何字节,则可以返回而不是打印。您int i在两个循环中都使用了,我无法确定它们是否在不同的范围内,但值得指出。像变量一样初始化通常可以节省字节。for(int i=0;i<l;i++){o.print(s.charAt(l-1-i));}-> for(int i=0;i<l;){o.print(s.charAt(l-1-i++));}。您不需要尾随的半冒号。
TheLethalCoder

感谢您指出;)(对打高尔夫球不太熟悉)。稍后将对其进行优化!
Serverfrog

0

C#(.NET Core)179161字节

-18个字节,感谢TheLethalCoder

using System.Linq;
s=>{int l=s.Length-1,i=1;var d=s.Reverse().ToArray();while(i<l)s+="\n"+s[i]+new string(' ',l-1)+d[i++];if(l>1)s+="\n"+new string(d);return s;};

在线尝试!

我不确定规则,是否需要字节计数:

using System.Linq;

有人请对此进行指正。

取消高尔夫:

s =>
{
    int l = s.Length - 1, i = 1;
    var d = s.Reverse().ToArray();
    while (i < l)
        s += "\n" + s[i] + new string(' ', l - 1) + d[i++];
    if (l > 1)
        s += "\n" + new string(d);
    return s;
};

您好,欢迎来到PPCG!您正在使用Linq,因此应在using字节数中包含。当您使用Linq ToCharArray()可以是just时ToArray(),您真的需要Reverse()吗?使用时,String您需要完全限定其使用范围或包括使用范围,但是,也可以通过对其进行更改来轻松解决string。的if可能是像三元短s+=l>1?if code:"";。您可以i++从循环中删除,然后在上发布增量d[i++]
TheLethalCoder

illike 初始化int l=s.Length-1,i=1;。我想可能就是这样!
TheLethalCoder

@TheLethalCoder谢谢!我将您的建议添加到了代码中。一些注意事项:我完全忘记了字符串实际上具有IEnumerable;字符串而不是字符串是我仍在使用的Java残差,实际上三进制的长度确实令人惊讶。在更改之后,我将for(; expr;)更改为while(expr),因为它看起来更好,并且字节数相同。再次感谢你。
GrzegorzPuławski17年

别担心!三元有时会但通常会变短,因此总是值得尝试。
TheLethalCoder

0

视网膜,106字节

..+
$&¶$&
O$^`.(?=.*$)

\G.
$&$%'¶
r`.\G
¶$%`$&
+`(.+)¶¶((.*¶)*).(.*)
¶¶$1$4$2
T`p` `(?<=.¶.).*(?=.¶.)
G`.

在线尝试!说明:

..+
$&¶$&

如果至少有两个字符,请重复输入。

O$^`.(?=.*$)

反转重复项。

\G.
$&$%'¶
r`.\G
¶$%`$&

将字符串变成三角形。顶部三角形从输入开始,每次删除第一个字符,而底部三角形从反向输入的第一个字母开始,每次添加一个字符。

+`(.+)¶¶((.*¶)*).(.*)
¶¶$1$4$2

将三角形连接在一起,重叠,以便最后一个字符形成/对角线。

T`p` `(?<=.¶.).*(?=.¶.)

如果所有字符距两端的末端至少一个字符,请将其更改为空格。

G`.

删除任何剩余的空白行。


0

Python 3,85个字节

使用第一行的输入:)

a=input()
b=len(a)
for i in range(b-2):print(a[1+i]+" "*(b-2)+a[-2-i])
print(a[::-1])

您确定这给出了正确的答案吗?
Koishore Roy

0

Lua,104个字节

print(s);for a=2,#s-1 do print(s:sub(a,a)..(" "):rep(#s-2)..s:sub(#s-a+1,#s-a+1)) end;print(s:reverse())

在线尝试!


但您只使用p过一次...
Leaky Nun

是的...要改变这一点。

0

Python 3,106个字节

功能版本...

w=input();p=print;l=len(w)-2
def f(k):p(w[k]+' '*l+w[-k-1]);l-k>0and f(k+1)
l<0 or f(1)or l<1or p(w[::-1])


0

Mathematica,138 91个字节

(b=Outer[" "&,#,#];Do[l={{1,k},{k,1}};b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,Length@#}];b)&

您可以通过在Wolfram Cloud Sandbox上粘贴以下内容,然后单击“评估单元格”或按Shift + Enter或Numpad Enter 来在线尝试它:

(b=Outer[" "&,#,#];Do[l={{1,k},{k,1}};b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,Length@#}];b)&@{"g","o","l","f","y"}//MatrixForm
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.