折成三角形


22

给定一个长度可被4整除的字符串,请制作一个三角形,如下所示。

如果字符串是abcdefghijkl,则三角形将是:

   a
  b l
 c   k
defghij

如果字符串是iamastringwithalengthdivisiblebyfour,则三角形将是:

         i
        a r
       m   u
      a     o
     s       f
    t         y
   r           b
  i             e
 n               l
gwithalengthdivisib

如果字符串是thisrepresentationisnotatriangle,则三角形将是:

        t
       h e
      i   l
     s     g
    r       n
   e         a
  p           i
 r             r
esentationisnotat

笔记

  • 该字符串仅包含从a到的字符z
  • 只要形状未损坏,就允许使用前导/尾随空格和换行符。
  • 允许使用字符串列表作为输出。

这是。以字节为单位的最短答案将获胜。有标准漏洞

Answers:


7

木炭25 22 21字节

≔÷Lθ⁴λ↙…θλ→✂θλ±λ↖✂θ±λ

在线尝试!链接是详细版本的代码。只需将字符串切成三部分,然后按适当的方向打印即可。编辑:通过使用整数除法和切片保存3个字节。通过使用CycleChop而不是Slice字符串的头来保存另一个字节。编辑:木炭现在支持沿多边形的边缘绘制任意文本,从而将代码简化为12个字节:

GH↙→→↖⊕÷Lθ⁴θ

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



@EriktheOutgolfer这是新的Slice运算符。
尼尔

:| 糟糕,是要让PolygonHollow做到这一点的,GH↙→→↖⊕÷Lθ⁴θ下次我推送木炭时,它将起作用
仅使用ASCII的

6

05AB1E,23个字节

ćsIg4÷GćsÁćsŠN·<ú«s}».C

在线尝试!

说明

ć                        # extract head of input
 s                       # swap the remaining string to top of stack
  Ig4÷G                  # for N in [1...len(input)/4-1] do:
       ć                 # extract head
        sÁ               # swap remaining string to top of stack and rotate right
          ć              # extract head
           sŠ            # reorder stack as tail, head, remaining
             N·<ú        # prepend N-1 spaces to tail
                 «s      # concatenate with head and swap remaining string to top
                   }     # end loop
                    ».C  # join by newlines and center

6

的JavaScript(ES6),119个 117 108 105字节

s=>(l=s.length/4,S=' ',g=([c,...s],p)=>S.repeat(l)+c+(l--?p+s.pop()+`
`+g(s,p?p+S+S:S):s.join``))(s+S,'')

格式化和评论

s => (                            // given the input string s:
  l = s.length / 4,               // l = length of side edge - 1
  S = ' ',                        // S = space (defining S costs 6 bytes but saves 7)
  g = (                           // g = recursive function which takes:
       [c,                        //   - c = next character
           ...s],                 //   - s = array of remaining characters
                  p) =>           //   - p = middle padding string
    S.repeat(l) + c + (           // append left padding + left character
      l-- ?                       // if side edges are not complete:
        p + s.pop() + '\n' +      //   append middle padding + right character + Line Feed
        g(s, p ? p + S + S : S)   //   and do a recursive call with updated middle padding
      :                           // else:
        s.join``                  //   append all remaining characters and stop recursion
    )                             //   (this is the bottom edge)
  )(s + S, '')                    // initial call to g()

测试用例


4

C#,260个字节

namespace System{using static Console;class P{static void Main(){var d=ReadLine();int e=d.Length/4,x=e,y=0,g=0,i=0;Action<int,int>a=(p,q)=>{SetCursorPosition(p,q);Write(d[g++]);};for(;i<e;i++)a(x--,y++);for(i=0;i<e*2;i++)a(x++,y);for(i=0;i<e;i++)a(x--,y--);}}}

真的很想用SetCursorPosition

取消高尔夫:

namespace System {
    using static Console;

    class P {
        static void Main() {
            var d = ReadLine();
            int e = d.Length / 4, x = e, y = 0, g = 0, i = 0;
            Action<int, int> a = (p, q) => { SetCursorPosition(p, q); Write(d[g++]); };
            for (; i < e; i++)
                a(x--, y++);
            for (i = 0; i < e * 2; i++)
                a(x++, y);
            for (i = 0; i < e; i++)
                a(x--, y--);
        }
    }
}

请原谅我的无知,但是行动在您的解决方案中的目的是什么?它比void函数的字节数少吗?
困惑的

1
@confusedandamused我习惯于编写单个函数的答案,因此甚至都没有考虑正常放置函数,但是它会更短。
LiefdeWen

3

Mathematica,164个字节

(b=Length[c=Characters@#];k=Column[#,Alignment->Center]&;T=Table;k@{#&@@c,k@T[""<>{c[[i+2]],T[" ",2i+1],c[[-i-1]]},{i,0,(a=b/4)-2}],""<>T[c[[i]],{i,a+1,b/2+1+a}]})&


输入

[“长度为四分之一的iamastring”]


大家都知道[[1]]可以用代替#&@@
user202729

1
你们真是太聪明了!
J42161217


当您发现自己正在执行操作时@(...),请[...]改为执行操作。而且我还没有测试过,但是您可以通过提供Column一个名称(或者甚至Column[#,Alignment->Center]&可以避免q)来保存另一个字节,然后将所有剩余的变量放入外部的第一个参数中Column(以保存周围的括号)。
Martin Ender

3

Python 3,120字节

第一次高尔夫时,我想我不妨一路学习一些Python。

a=input()
l=len(a)//4
print(l*" "+a[0])
for i in range(1,l):print((l-i)*" "+a[i]+(2*i-1)*" "+a[4*l-i])
print(a[l:3*l+1])

在线尝试!

说明:

第一个字符将自己打印在len(a)//4空格之后,然后i从第二个字符开始打印第一个和最后一个字符,并用2*i - 1空格分隔。

最后,剩下的子字符串被打印出来。


欢迎来到PPCG!您可以从此解决方案中学习。
Leaky Nun

这里可能的高尔夫球场是声明p=print,然后简单地将其p用于所使用的三个print
FlipTack

另外,由于保证了字符串长度始终可以被四整除,因此//可以用代替(地板除法)/
FlipTack

顺便说一句,您链接到网上尝试的代码与答案中的代码不同。
FlipTack

3

GNU sed的178 158 132 + 1 = 133个字节

+1字节的-r标志。

s/(.)(.*)(.)/ \1\n\2;\3/
:
s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1  \6\n\3;\4\5/m
t
:A
s/(.*\n)( *)(.*);/ \2;\1\2\3/m
tA
s/. (.)$/\1/gm

在线尝试!

说明

以前的修订版中,尽管直觉上我确信可以避免它们,但我还是使用了大量字节来处理数学,特殊情况和清除。从那以后,我基本上做到了。

假设我们有输入abcdEFGHIJKLMnop。字母EFGHIJKLM将在三角形的底部,因此我将其大写以用作视觉辅助。

首先,我们准备输入,方法是将第一个字符放在其自己的行上(以空格开头;),然后在最后一个字符之前插入光标():

s/(.)(.*)(.)/ \1\n\2;\3/

现在我们有:

 a
bcdEFGHIJKLMno;p

现在,在循环中,我们将对最后一行做一些操作:1.复制上一行的空格,并将其插入第一个字符加两个之后;2.将最后一个字符移到空格后的右边,然后换行;3.将光标向左移动三个字符。

:
  s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1  \6\n\3;\4\5/m
  t

这是每次迭代的结果:

 a
b   p
cdEFGHIJKL;Mno

 a
b   p
c     o
dEFGHI;JKLMn

 a
b   p
c     o
d       n
EF;GHIJKLM

您可以看到金字塔开始成形。您还可以看到游标的用途:在每次迭代中,它向左移动了三个字符,当它不再向左移动三个字符时,它中断了循环,恰好是我们到达“底部”时金字塔。

现在,我们将执行类似的操作,但相反。在循环中,我们将把光标从行的开头复制到前一行的开头,再加上一个空格,然后将光标移到该行。

:A
  s/(.*\n)( *)(.*);/ \2;\1\2\3/m
  tA

这是几次迭代和最终结果:

 a
b   p
c     o
 ;d       n
EFGHIJKLM

 a
b   p
  ;c     o
 d       n
EFGHIJKLM

...

    ; a
   b   p
  c     o
 d       n
EFGHIJKLM

现在我们已经完成了,除了一些额外的字符:;第一行中有A 和额外的空格,而后三行中金字塔的“中间”有两个空格。一个简单的替代摆脱它们:

s/. (.)$/\1/gm

全部做完!

    a
   b p
  c   o
 d     n
EFGHIJKLM


2

Python 2中100个97 96字节

  • Jacoblaw保存了1个字节:整数除法是不必要的
a=input()+" "
k=j=len(a)/4
while j:print j*" "+a[0]+(2*(k-j)-1)*" "+a[-1];a=a[1:-1];j-=1
print a

在线尝试!

说明:

我在这里所做的一件聪明的事是在输入的末尾加一个空格,以便第一个字符与之配对,并且可以将其推入循环(并且由于允许尾随空格)

abcdefghijkl[space]   
To print [0] [-1]            Output=>[spaces]a[another_calculated_spaces(=0 here)][space]
Strip at both ends(a[1:-1])  
bcdefghijkl                
To print [0] [-1]            Output=>[spaces]b[another_calculated_spaces]l
Strip at both ends(a[1:-1])
and so on.

跟随的循环数与关联len(word)//4。在最后一步中,将打印剩下的整个字符串(这形成三角形的底)。空间遵循简单的模式。第一组空间继续减少1,而第二组空间继续增加2。


1
您可以通过不进行整数除法来剃除一个字节吗?因为a它将始终是4的倍数///
。-

谢谢你,我很惊讶它没有抛出任何错误,甚至对[输入,长度不能被4整除] [ tio.run/...
officialaimm

1
这是因为在Python 2中,默认情况下,除法是整数。那是在Python 3中完成的。–
CalculatorFeline

2

C 225字节

p(c){putchar(c);}S(n){while(n--)p(' ');}main(int c,char**v){int i= strlen(v[1]),n=i/4,r;char*s=v[1],*e=&s[i-1];S(n);p(*s++);p('\n');for (r=1;r<n;r++){S(n-r);p(*s++);S(2*r-1);p(*e--);p('\n');}e++;while (s!=e)p(*s++);p('\n');}

解释

p(c){putchar(c);}        // p is alias for putchar
S(n){while(n--)p(' ');}  // S prints n spaces
main(int c,char**v){
    int i= strlen(v[1]), // counter
        n=i/4,           // num rows in figure - 1
        r;               // current row 
    char*s=v[1],         // start char
        *e=&s[i-1];      // end char
    S(n);p(*s++);p('\n');// print first row
    for (r=1;r<n;r++){ 
        S(n-r);p(*s++);S(2*r-1);p(*e--);p('\n'); // print middle rows
    }
    e++;while (s!=e)p(*s++);p('\n'); // print last row
}

2

C#,172个字节

int i=0,n=s.Length;var p="";p=new string(' ',n/4)+s[i]+"\r\n";for(i=1;i<n/4;i++){p+=new string(' ',n/4-i)+s[i]+new string(' ',i*2-1)+s[n-i]+"\r\n";}p+=s.Substring(i,n/2+1);

在线尝试!


1

八度,87字节

@(s,x=(n=nnz(s))/4)[[' ';flip(diag(s(1:x))')]' [' ';diag(s(n:-1:n-x+2))];s(x+1:n-x+1)];

*在Windows机器中,以上代码产生了正确的结果,但是在tio中,我添加了一些代码来更正它。

说明:

[' ';flip(diag(s(1:x))')]'        %left side
[' ';diag(s(n:-1:n-x+2))]         %right side
s(x+1:n-x+1)                      %bottom side

在线尝试!


1

Haskell,136个字节

i#x=x<$[1..i]
f s|let h=div l 4;l=length s=unlines$[(h-i)#' '++(s!!i):(2*i-1)#' '++[(s++" ")!!(l-i)]|i<-[0..h-1]]++[drop h$take(l-h+1)s]

在线尝试!


1

PHP> = 7.1,122字节

for(;$i*2<$w=strlen($a=$argn)/2;$e=$a[-++$i])echo str_pad(str_pad($a[$i],$i*2).$e,$w+1," ",2),"
";echo substr($a,$i,$w+1);

PHP沙盒在线

PHP> = 7.1,124字节

for(;$i*2<$w=strlen($a=$argn)/2;$e=$a[-++$i],$s.=$s?"  ":" ")echo str_pad("",$w/2-$i)."$a[$i]$s$e
";echo substr($a,$i,$w+1);

PHP沙盒在线


1

AWK,129字节

{n=split($0,a,"")
printf"%"(w=n/4+1)"s\n",a[++i]
for(;++i<w;)printf"%"(w-i+1)"s%"2*i-2"s\n",a[i],a[n-i+2]
$0=substr($0,i,i+w-1)}1

在线尝试!

我应该认为这可能会打得更多,只是看不到。


1

视网膜,99字节

^(.)(?=(....)+)
$#2$*  $1¶$#2$* 
( ( *).)(.*)(.)$
$1 $4¶$2$3
+`(( +).¶ ( *).)(.*)(.)$
$1$2  $5¶$3$4

在线尝试!说明:前两个阶段生成前两行,但是此后不需要特殊框,并且可以自动生成每行以下内容:

thisrepresentationisnotatriangle

        t
       hisrepresentationisnotatriangle

        t
       h e
      isrepresentationisnotatriangl

        t
       h e
      i   l
     srepresentationisnotatriang

...

        t
       h e
      i   l
     s     g
    r       n
   e         a
  p           i
 r             r
esentationisnotat

1

Java 8,213字节

s->{int n=s.length()/4,i;String r=s(n)+s.charAt(0)+"\n";for(i=1;i<n;r+=s(n-i)+s.charAt(i)+s(i*2-1)+s.charAt(n*4-i++)+"\n");return r+s.substring(i,n*2+i+1);}String s(int n){String r="";for(;n-->0;r+=" ");return r;}

说明:

在这里尝试。

s->{                           // Method (1) with String parameter and String return-type
  int n=s.length()/4,          //  The length of the input divided by 4
      i;                       //  And an index-integer
  String r=                    //  Result-String which starts as:
           s(n)                //   Trailing spaces
           +s.charAt(0)+"\n";  //   + the first character and a new-line
  for(i=1;i<n;                 //  Loop from `1` to `n`
      r+=                      //   And append the result-String with:
         s(n-i)                //    Trailing spaces
         +s.charAt(i)          //    + the character of the left diagonal line
         +s(i*2-1)             //    + center spaces
         +s.charAt(n*4-i++)    //    + the character of the right diagonal line
         +"\n"                 //    + a new-line
  );                           //  End of loop
  return r                     //  Return the result-String
         +s.substring(i,n*2+i+1);
                               //   + the bottom part of the triangle
}                              // End of method (1)

String s(int n){               // Method (2) with integer parameter and String return-type
  String r="";                 //  Result-String
  for(;n-->0;r+=" ");          //  Append the result-String with `n` spaces
  return r;                    //  Return the result-String
}                              // End of method (2)

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.