制作八角形文字


14

上周四,用户@SpookyGengar对他/她关于制作平方字的第一个挑战使我们感到高兴。如果我们将边数加倍怎么办?

挑战

以字符串形式使用您需要的任何合理格式的输入(stringchararray ...)并输出该输入的八角形表示形式(也可以使用任何合理的格式:stringstrings的列表,charmatrix ...),如以下示例所示:

Input: golf
Output:

   golf
  o    l
 l      o
f        g
l        o
o        l
g        f
 o      l
  l    o
   flog


Input: HelloWorld
Output:

         HelloWorld
        e          l
       l            r
      l              o
     o                W
    W                  o
   o                    l
  r                      l
 l                        e
d                          H
l                          e
r                          l
o                          l
W                          o
o                          W
l                          o
l                          r
e                          l
H                          d
 e                        l
  l                      r
   l                    o
    o                  W
     W                o
      o              l
       r            l
        l          e
         dlroWolleH


Input: a
Output:

a


Input: ab
Output:

 ab
b  a
a  b
 ba


Input: code golf
Output:

        code golf
       o         l
      d           o
     e             g

   g                 e
  o                   d
 l                     o
f                       c
l                       o
o                       d
g                       e

e                       g
d                       o
o                       l
c                       f
 o                     l
  d                   o
   e                 g

     g             e
      o           d
       l         o
        flog edoc

笔记

  • 输入将仅包含可打印的ASCII字符。
  • 只要保持八角形,就允许前导和/或尾随空格和换行符。
  • 这是,所以每种语言的排序程序/功能可能会赢!

5
“如果我们将边数加倍怎么办?” <-然后木炭仍然会赢得胜利
Leaky Nun

建议的测试用例:code golf
Leaky Nun

@LeakyNun被<Space>认为是可打印的?
V. Courtois

2
@ V.Courtois
破修女

@LeakyNun添加了测试用例。
查理

Answers:


10

木炭,16字节(10字节无竞争)

F⁸«✂θ⁰±¹↷¹A⮌θθ»θ

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

F⁸«                 Repeat for each side of the octagon
   ✂θ⁰±    ¹        Print the input except the last character
        ↷¹          Rotate 45° clockwise
          A⮌θθ      Reverse the input string
              »θ    Print the input again, to handle the length 1 case

备用长度1修补程序,也为16个字节: 详细版本。

PθF⁸«✂θ⁰±¹↷¹A⮌θθ

木炭的错误修正意味着以下10字节代码现在可以使用:详细版本。

F⁴«θ←↘⮌θ↖⟲

似乎应该这样做。大声笑
魔术章鱼缸

1
嗯,我不认为这code golf行得通吗?
暴民埃里克(Erik the Outgolfer)

呵呵,其实这是16个字节(替换θθθθθ»θ)。
暴民埃里克(Erik the Outgolfer)'17年

@EriktheOutgolfer糟糕,对此感到抱歉,我没想到要针对长度为1的情况测试我的修复程序……我在该问题上的测试记录不是很好吗?
尼尔

@Neil但是问题code golf呢?我认为这与木炭如何获取投入有关,不幸的是,由于无法避免,因此完全丧失了这项挑战的资格。
暴民埃里克(Erik the Outgolfer)

5

JavaScript(ES6),156个字节

f=
s=>[...Array((l=s.length-1)*3+1)].map((_,i,a)=>a.map((_,j)=>s[i+j-l?l*5-i-j?i+l*2-j?j+l*2-i?i%(l*3)?j%(l*3)?-1:j?i-l:l+l-i:i?l+l-j:j-l:j:l-i:l*3-i:i]||` `))
<input oninput=o.textContent=this.value?f(this.value).map(function(a){return(a.join``)}).join`\n`:``><pre id=o>

返回一个字符数组。


1
它似乎仅适用于长度为4的字符串
Charlie

1
@CarlosAlejo对不起,没有足够仔细地检查。方便地,修复保存的2个字节!
尼尔

哦,我的那是很多三元?:
暴民埃里克(Erik the Outgolfer)

@EriktheOutgolfer好东西,它不是python或那真的很冗长:P
Stephen

3

Mathematica,247个字节

(T=Table;k=Length[s=Characters@#];If[k==1,#,Column[Flatten@{#,T[""<>{s[[i]],T["  ",k/2-2+i],s[[-i]]},{i,2,k}],T[""<>{s[[-i]],T["  ",k+k/2-2],s[[i]]},{i,2,k}],T[""<>{s[[i]],T["  ",3k/2-1-i],s[[-i]]},{i,2,k-1}],StringReverse@#},Alignment->Center]])&

您不需要,Alignment并且可以通过使用delayset(:=)来减少s[[i]]and 的重复来节省字节s[[-i]],您可以将这些想法减少到224个字节:(T = Table; q:= s [[i]]; r: = s [[-i]]; k =长度[s =字符@#];如果[k == 1,#,Column [Flatten @ {#,T [“” <> {q,T [“”, k / 2-2 + i],r},{i,2,k}],T [“” <> {r,T [“”,k + k / 2-2],q},{i, 2,k}],T [“” <> {q,T [“”,3k / 2-1-i],r},{i,2,k-1}],StringReverse @#},居中] ])&另外,我有一个替代解决方案,在本文发表时,它只有145个字节。
Mark S.


2

Japt84 79字节

-5个字节,感谢@ETHproductions。


Ål
VoA{A?(UÅw +Uê)£Y¥V*2+AªY¥V-A?X:SÃ:Vç +U+Vç
Wf cU¬£V?(V*3 ç hUg~Y)+X:XÃcWz2

领先的换行符是程序的一部分。将字符串作为输入并返回字符串数组。

在线尝试!带有-R用于将结果数组与换行符连接的标志。

这不是我最引以为豪的工作,但至少是从约100个字节开始。我的想法是创建顶部和中间部分,然后附加顶部,旋转180°。


真好 我没有看到很多的改进向右走,但你可以改变Ul É,以UÅl和开关V和W保存2多个字节:codepen.io/justinm53/full/...
ETHproductions

此外,AnV ?-> V-A?Uq £->U¬£
ETHproductions'Jul

@ETHproductions太好了,谢谢!不敢相信我忘了¬
贾斯汀·马里纳

1

Python 2中220个 213字节

  • 出乎意料的长于我的想象。
a=input()
l=len(a)
r=range(l)
print'\n'.join(p.center(l*3-2)for p in[a]+(l>1)*([a[i]+(2*i-2+l)*' '+a[~i]for i in r[1:-1]]+[a[~i]+(l*3-4)*' '+a[i]for i in r]+[a[i]+(3*l-2*i-4)*' '+a[~i]for i in r[1:-1]]+[a[::-1]]))

在线尝试!


1

PHP 7.1,230个156 155字节

for($x=$e=strlen($s=$argn)-1;$n<9;$r[$y][$x+=$n+1&3?$n&4?-1:1:0]=$s[$i],$i+=($n+=!$i||$i==$e)&1?:-1)$r[$y+=$n-1&3?$n<6?:-1:0]=$r[$y]?:"";echo join("
",$r);

与管道一起运行-nR在线尝试

分解

for($x=$e=strlen($s=$argn)-1;   # import to $s, set $e to length-1, init $x
    $n<9;                       # loop through 8 repetitions of string
    $r[$y][
        $x+=$n+1&3?$n&4?-1:1:0      # 3. increment/decrement $x depending on $n
    ]=$s[$i],                       # 4. copy character to current position
    $i+=(
        $n+=!$i||$i==$e             # 5. if first or last character of string, increment $n
    )&1?:-1                         # 6. if odd repetition next, else previous character
)
    $r[
        $y+=$n-1&3?$n<6?:-1:0       # 1. increment/decrement $y depending on $n
    ]=$r[$y]?:"";                   # 2. if empty, init row to string
echo join("\n",$r);             # output

1

数学,168个 166 147 127字节

(n=Length@#;b=Array[" "&,3{n,n}-2];Do[l={{1,n+k-1},{k,n-k+1}};l=Join[l,Cross/@l];b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,n}];b)&

这将获取一个单字符字符串的列表,并输出一个单字符字符串的矩阵。

我通过利用对称性使用保存的18个字节-lCross/@l其中需要类似的横产物每两个单个2D矢量采取的{x,y}{-y,x}。基本上,两个初始方向是东(上边缘)和西南(右上边缘)。然后,我们添加它们的逆时针旋转90度,其中Cross:左边缘为北,左边缘为东南。然后,我们使用-l翻转翻转我们覆盖的四个添加其他四个部分。

您可以使用以下命令在沙盒上对其进行测试:

(n=Length@#;b=Array[" "&,3{n,n}-2];Do[l={{1,n+k-1},{k,n-k+1}};l=Join[l,Cross/@l];b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,n}];b)&[{"H","e","l","l","o"," ","G","o","l","f"}]//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.