ASCII 연단 구축


26

스포츠 경기에서 종종 우승자는 연단에 표시되는데, 1 위는 가장 높은 곳에, 2 위는 중간에 왼쪽, 3 위는 가장 낮고 오른쪽으로. 특별한 조정을 통해 여기에서이를 재현 할 것입니다.

연단은 다음과 같습니다.

     @---@
     | @ |
@---@| | |
| @ || | |
| | || | |@---@
| | || | || @ |

이것은이 도전의 기초를 형성 할 것입니다. 다음 단계는 연단을 사람에 맞게 너비를 넓히는 것입니다 (인쇄 가능한 ASCII 문자열). 그러나 환상적인 사진 촬영 기회이기 때문에 미적 아름다움을 보장하기 위해 각 연단의 너비는 동일해야하며 너비는 홀수 여야합니다. 또한 사람들은 연단 중앙에 서기를 원할 것이므로 현은 가능한 한 중앙에 있어야합니다. (왼쪽 또는 오른쪽으로 정렬 할 수 있으며 일관 될 필요는 없습니다.) 위의 연단은 최소 크기이며 3넓게 간주됩니다 .

예를 들어, ["Tom", "Ann", "Sue"]각각 1, 2, 3을 나타내는 입력 에서 다음 연단을 출력합니다.

      Tom
     @---@
 Ann | @ |
@---@| | |
| @ || | | Sue
| | || | |@---@
| | || | || @ |

그러나을 Anne대신 Ann하는 경우 다음 크기로 올라가서 5문자열을 최대한 중앙에 배치해야합니다. 여기에서는 "추가"문자 Anne가 가운데의 왼쪽에 오도록 정렬하고 있지만 정렬 할면을 선택할 수 있습니다.

         Tom
       @-----@
 Anne  |  @  |
@-----@|  |  |
|  @  ||  |  |  Sue
|  |  ||  |  |@-----@
|  |  ||  |  ||  @  |

더 긴 이름으로 가자. 방법에 대해 ["William", "Brad", "Eugene"]:

          William
         @-------@
  Brad   |   @   |
@-------@|   |   |
|   @   ||   |   | Eugene
|   |   ||   |   |@-------@
|   |   ||   |   ||   @   |

여기서 우리는 Brad공백이 Eugene적고 William적합 하며 잘 맞습니다.

더 긴 테스트 사례의 경우 어떻습니까 ["A", "BC", "DEFGHIJKLMNOPQRSTUVWXYZ"]?

                                     A
                         @-----------------------@
           BC            |           @           |
@-----------------------@|           |           |
|           @           ||           |           | DEFGHIJKLMNOPQRSTUVWXYZ
|           |           ||           |           |@-----------------------@
|           |           ||           |           ||           @           |

마지막으로 가능한 가장 작은 입력이 있습니다 ["A", "B", "C"].

       A
     @---@
  B  | @ |
@---@| | |
| @ || | |  C
| | || | |@---@
| | || | || @ |

  • 입력 및 출력은 편리한 방법 으로 제공 할 수 있습니다 .
  • 입력은 비어 있지 않은 것으로 보장됩니다 (즉, ""이름으로 받지 않습니다 ).
  • STDOUT에 인쇄하거나 함수 결과로 리턴 할 수 있습니다.
  • 전체 프로그램 또는 기능이 허용됩니다.
  • 문자가 적절하게 정렬되는 한 외부 공백은 허용됩니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

모든 짝수 길이 이름을 같은 방향으로 정렬해야합니까?
Sparr

1
마지막 예제 출력에서 ​​연단이 길이 1 대신 길이 3을 갖는 이유는 무엇입니까?
bruderjakob2

3
@bruderjakob 그는 처음에 "위의 연단은 최소 크기이며 3 너비로 간주됩니다"
rtpax

답변:



7

그루비 , 187 , 176 , 156 , 150 바이트

f={n->m=n*.size().max()|1;h=' '*(m/2);'30734715746756276647665'*.toLong().sum{(n*.center(m+2)+[' '*(m+2),"@${'-'*m}@","|$h@$h|","|$h|$h|",'\n'])[it]}}

온라인으로 사용해보십시오!

(참고 : tio groovy 인터프리터는 groovy 2.5.6이 가능하더라도 Long 값을 사용하여 인덱싱 목록을 처리 할 수 ​​없습니다. 따라서 tio 답변은 바이트를 추가하는 *.toShort()대신 사용 합니다 *.toLong())

다음을 f통해 호출 할 수 있는 클로저 를 정의합니다 .

println(f(['tom','ann','sue']))

여기서 f문자열을 반환합니다.

설명:

코드를 난독 화하면 다음과 같은 이점이 있습니다.

f={n->
  m=n*.size().max()|1
  h=' '*(m/2)
  a=n*.center(m+2)+[' '*(m+2),"@${'-'*m}@","|$h@$h|","|$h|$h|",'\n']
  '30734715746756276647665'*.toLong().sum{a[it]}
}
  • f={n-> -하나의 매개 변수로 클로저 f를 정의하십시오. n
  • m=n*.size().max()|1 -최대 이름 len, 이진수 또는 홀수를 찾습니다.
  • h=' '*(m/2) -h는 나중에 사용되는 바닥 (m / 2) 공간을 포함합니다.
  • a=...-요소가 포함 된 인코딩 목록을 만듭니다.
    • 인덱스 0,1,2-이름, max len을 중심으로
    • 인덱스 3-m + 2 공백
    • 색인 4- @---@패턴, len으로 채워짐
    • 색인 5- | @ | 패턴, len으로 채워짐
    • 인덱스 6- | | |len에 채워진 패턴
    • 색인 7-줄 바꿈
  • '307...'*.toLong().sum{a[it]}-인코딩 목록에 인덱스를 사용하여 결과를 빌드하십시오. .sumgroovy의 string + string이 유효하다는 사실을 사용합니다.
  • 이 표현식 '3073...'*.toLong()*.스프레드 연산자를 사용하여 toLong()각 문자 를 호출 하고 숫자 목록을 반환합니다.
  • 답에 변수 a가 인라인되어 있고, 줄이 제거되었습니다.

6

캔버스 , 45 바이트

r351⁰{|*@;∔;J└l2M2%±├ ××l⇵╷-×└+-α∔k+│∔⇵;}┐++⇵

여기 사용해보십시오!

설명:

r    Center the input, preferring left. Converts to an ASCII-art object
     which pads everything with spaces. This is the bulk of the magic.

 251⁰{ .... }            for each number in [2, 5, 1]:
      |*                 repeat "|" vertically that many times
        @;∔              prepend an "@" - a vertical bar for later
           ;             swap top 2 stack items - put the centered art on top
            J            push the 1st line of it (removing it from the art)
             └           order the stack to [remaining, "@¶|¶|..", currentLine]
              l          get the length of the current line
               2M        max of that and 2
                 2%      that % 2
                   ±├    (-that) + 2
                      ×× prepend (-max(len,2)%2) + 2 spaces
l                 get the length of the new string
 ⇵╷               ceil(len / 2) -1
   -×             repeat "-" that many times - half of the podiums top
     └            order stack to [art, currLine, "@¶|¶|..", "----"]
      +           append the dashes to the vertical bar = "@-----¶|¶|.."
       -α∔        vertically add "-" and the original vertical bar - "-¶@¶|¶|.."
          k       remove the last line of that to make up for the middles shortness
           +      and append that horizontally - half of the podium without the name
            │     palindromize the podium
             ∔    and prepend the name
              ⇵   reverse vertically so the outputs could be aligned to the bottom
               ;  and get the rest of the centered input on top
Finally, 
┐     remove the useless now-empty input
 ++   join the 3 podium parts together
   ⇵  and undo the reversing

남용은 "일관 될 필요가 없어"이해하기 어렵습니다.


음 .. 설명 할 기회가 있습니까?
Matias Bjarland

1
@MatiasBjarland 비록 스택 조작과 나머지는 간신히 이해하지만, 거기에 있습니다.
dzaima

4

파이썬 2 , 197 190 바이트

n=input()
w=max([3]+map(len,n))
w+=~w%2;W=w+2
S=('{:^%d}'%w).format
x,y,s='@| '
a,b,c=map(S,n);A,B,C=x+'-'*w+x,y+S(x)+y,y+S(y)+y
for l in-~W*s+a,s*W+A,s+b+s+B,A+C,B+C+s+c,C+C+A,C+C+B:print l

온라인으로 사용해보십시오!

Andrew Dunai 덕분에 -6 바이트


당신은에 5 호선을 대체하여 6 바이트를 저장할 수 있습니다 x,y,p='@| '및 사용 p대신에' '
앤드류 Dunai

1
@andrewdunai 감사합니다 :)
TFeld


3

, 63 바이트

≔÷⌈EθLι²ηF³«J×ι⁺³⊗η⊗﹪⁻¹ι³⟦◧§θι⁺⊕η⊘⊕L§θι⟧≔⁻⁷ⅉιP↓ι@ηP↓ιP↓@@¹ηP↓ι@

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

≔÷⌈EθLι²η

연단의 각 반에있는 공간의 수를 계산하십시오.

F³«

각 장소를 반복하십시오. 입력은 2, 1, 3의 순서로되어 있어야합니다.

J×ι⁺³⊗η⊗﹪⁻¹ι³

텍스트가있는 줄의 시작 위치입니다.

⟦◧§θι⁺⊕η⊘⊕L§θι⟧

텍스트를 가운데에 맞추기에 충분한 왼쪽 패딩으로 텍스트를 출력하십시오.

≔⁻⁷ⅉι

연단의 높이를 가져옵니다.

P↓ι@ηP↓ιP↓@@¹ηP↓ι@

연단을 그립니다.

대체 접근 방식, 또한 63 바이트 :

≔÷⌈EθLι²ηF³«J×ι⁺³⊗η⊗﹪⁻¹ι³⟦◧§θι⁺⊕η⊘⊕L§θι⪫@-@×-η⟧E⁻⁷ⅉ⪫⪫||§|@¬κ× η

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

≔÷⌈EθLι²η

연단의 각 반에있는 공간의 수를 계산하십시오.

F³«

각 장소를 반복하십시오. 입력은 2, 1, 3의 순서로되어 있어야합니다.

J×ι⁺³⊗η⊗﹪⁻¹ι³

텍스트가있는 줄의 시작 위치입니다.

⟦◧§θι⁺⊕η⊘⊕L§θι

텍스트를 가운데에 맞추기에 충분한 왼쪽 패딩으로 텍스트를 출력하십시오.

⪫@-@×-η⟧

또한 -문자열의 문자 사이 에 s 를 삽입 @-@하여 올바른 폭에 도달하여 연단의 상단을 출력하십시오 .

E⁻⁷ⅉ⪫⪫||§|@¬κ× η

|중간 문자가 @첫 번째 행에 있다는 점을 제외하고 s를 적절하게 간격을두고 나머지 연단을 인쇄하십시오 .


3

R 308 302 299

@JAD 덕분에 -6 바이트 @Guiseppe 덕분에
-3 바이트, 지금은 300 세 미만입니다

function(a){i=max(1,nchar(a)%/%2)
e=2*i+1
`~`=rep
g=' '
s=g~e+2
b='@'
p='|'
t=c(b,'-'~e,b)
x=c(p,g~i,b,g~i,p)
h=sub(b,p,x)
a=lapply(a,function(q){r=nchar(q);l=(e-r)/2+1;if(r%%2<1)c(g~l,q,g~l+1)else c(g~l,q,g~l)})
cat(s,a[[1]],s,s,t,s,a[[2]],x,s,t,h,s,x,h,a[[3]],h,h,t,h,h,x,fill=length(t)*3,sep='')}

레이아웃을 만드는 더 좋은 방법이있을 것입니다. 데이터 프레임에 어떤 옵션이 있습니까?

온라인으로 사용해보십시오



2
R에서 가변 아스키 아트 챌린지를 하기 위해 당신에게 모자를 썼다 . 을 사용하여 3 바이트를 저장할 수 있습니다 i=max(1,nchar(a)%/%2). 생성 matrix및 사용 write이 짧을 수 있습니다 (data.frame ) . formatwith j="c"를 사용 하여 자동 정렬하는 것이 strrep좋습니다.이 경우에도 도움이됩니다. 아마도 golfR 대화방 에서 아이디어를 되 찾으려고 노력 할까요?
주세페

그래, 나는 그것이 얼마나 어려울 지 몰랐다. 나는 조금 tho를 배웠다. 주로 나는 파이썬을 더 잘 배우거나 Perl을 배우기 시작해야한다 :). 나는 잊었다 strrep; 나는 그것을 조사해야 할 것이다.
CT 홀

2

클린 , 209 바이트

import StdEnv,Data.List
k=[' @|||||']
$l#m=max(maxList(map length l))3/2*2+1
=flatlines(transpose[(spaces(n*2)++g)%(0,6)\\n<-[1,0,2],g<-[k:[[c,'-':tl if(i==m/2)k['  '..]]\\c<-cjustify m(l!!n)&i<-[0..]]]++[k]])

온라인으로 사용해보십시오!



2

PHP, 147 바이트

내 초기 아이디어에서 93 바이트를 골라 냈습니다 <?=.

for(;~$v=_616606256046543440445[++$i];)echo$b="@   || "[$v],str_pad(($v&4?"|@":$argv)[$v&3],max(array_map(strlen,$argv))," -"[!$v],2),$b,"
"[$i%3];

명령 행 인수에서 이름을 가져옵니다. 온라인으로 실행 -nr하거나 사용해보십시오 .
PHP 7이 필요합니다. PHP 7.2 및 이후 버전에서 경고를 생성합니다. +5 바이트 수정은 TiO를 참조하십시오.

매핑 :

0:@---@     = top border
1,2,3       = $argv with spaces
4: "| | |"  = default
5: "| @ |"  = below top
6: "     "  = empty

고장:

for(;~$v=_616606256046543440445[++$i];)echo # loop through map:
    $b="@   || "[$v],                       # print left border
    str_pad(                                # print padded string:
        ($v&4?"|@":$argv)[$v&3],                # string to be padded
        max(array_map(strlen,$argv)),           # pad length = max argument length
        " -"[!$v],                              # pad with: dashes if top border, spaces else
        2                                       # option: center text (pad on both sides)
    ),
    $b,                                     # print right border
    "\n"[$i%3]                              # add linebreak every three items
;

사전 증분 $i은 줄 바꿈에 대한 모든 트릭에서 나를 구해줍니다.
공백은 6비어있을 수도 있습니다. 그래서 나는 그것을했다.
그러나 $argv[0]상단 테두리 줄 -을 사용하는 것이 가장 좋은 골프였습니다. (그리고 9 바이트 절약!)


2

436 바이트

골프는 끔찍하다. 그러나:

package main;import ("fmt";"os");func main(){;z:=os.Args;f:=3;for i:=1;i<4;i++{;if len(z[i])>f{;f=len(z[i]);};};f+=1-f%2;p:=(f-1)/2+1;b:="@";for j:=0;j<f;j++{;b+="-";};b+="@";x:=fmt.Sprintf("|%*v%*v",p,"@",p,"|");y:=fmt.Sprintf("|%*v%[1]*v",p,"|");fmt.Printf("%*v%*v\n%*v%v\n%*v%*v\n%v%v\n%v%v%*v\n%v%v%v\n%v%v%v",f+2,"",p+1+len(z[1])/2,z[1],f+2,"",b,p+1+len(z[2])/2,z[2],2*f+3-p-len(z[2])/2,x,b,y,x,y,p+1+len(z[3])/2,z[3],y,y,b,y,y,x)}

세분화 :

package main
import (
  "fmt"
  "os"
)
func main() {
  z:=os.Args
  f:=3
  for i:=1;i<4;i++{
    if len(z[i])>f{
      f=len(z[i])
    }
  }
  f+=1-f%2
  p:=(f-1)/2+1
  b:="@"
  for j:=0;j<f;j++{
    b+="-"
  }
  b+="@"
  x:=fmt.Sprintf("|%*v%*v",p,"@",p,"|")
  y:=fmt.Sprintf("|%*v%[1]*v",p,"|")

  fmt.Printf("%*v%*v\n%*v%v\n%*v%*v\n%v%v\n%v%v%*v\n%v%v%v\n%v%v%v",
  f+2,"",p+1+len(z[1])/2,z[1],
  f+2,"",b,
  p+1+len(z[2])/2,z[2],2*f+3-p-len(z[2])/2,x,
  b,y,
  x,y,p+1+len(z[3])/2,z[3],
  y,y,b,y,y,x)
}

1

Java 8, 399 394 373 바이트

이 솔루션은 아마도 너무 길지만 솔루션입니다 :)

static String r(String[]p){String s="";int l[]=new int[]{p[0].length(),p[1].length(),p[2].length()},m=Math.max(l[0],Math.max(l[1],l[2]))+2,i,q,j,a,k,t;if(m%2==0)m++;if(m==3)m=5;for(i=0;i<7;i++){for(q=0;q<3;q++)for(j=0;j<m;j++){a=(2*q+1)%3;k=2*a;t=(m-l[a])/2;s+=i==k?j>=t&j<t+l[a]?p[a].charAt(j-t):" ":i==k+1?j%(m-1)==0?"@":"-":i>=k+2?j%(m-1)==0?"|":j==m/2?i==k+2?"@":"|":" ":" ";}s+="\n";}return s;}

순서대로 직접 반복하여 5 바이트를 절약했습니다 (q = 0,1,2 대신 a = 1,0,2; a = f (q))

static String r(String[]p){String s="";int l[]=new int[]{p[0].length(),p[1].length(),p[2].length()},m=Math.max(l[0],Math.max(l[1],l[2]))+2,i,j,a,k,t;if(m%2==0)m++;if(m==3)m=5;for(i=0;i<7;i++){for(a=1;a<4;a=a==1?0:a+2)for(j=0;j<m;j++){k=2*a;t=(m-l[a])/2;s+=i==k?j>=t&j<t+l[a]?p[a].charAt(j-t):" ":i==k+1?j%(m-1)==0?"@":"-":i>=k+2?j%(m-1)==0?"|":j==m/2?i==k+2?"@":"|":" ":" ";}s+="\n";}return s;}

@KevinCruijssen 덕분에 21 바이트를 절약했습니다 :

static String r(String[]p){String s="";int l[]=new int[3],m=0,i,j,a,k,t;for(String x:p)l[m++]=x.length();m=Math.max(l[0],Math.max(l[1],l[2]))+2;m+=m%2<1?1:m==3?2:0;for(i=0;i<7;i++,s+="\n")for(a=1;a<4;a=a==1?0:a+2)for(j=0,k=2*a,t=(m-l[a])/2;j<m;j++)s+=i==k?j>=t&j<t+l[a]?p[a].charAt(j-t):" ":i==k+1?j%~-m<1?"@":"-":i>=k+2?j%~-m<1?"|":j==m/2?i==k+2?"@":"|":" ":" ";return s;}

@KevinCruijssen이 제안했듯이 사용할 수도 있습니다. varString Java 10 이상에서 대신 수 있으며 여분의 바이트를 절약 할 수 있습니다. Java 10이 아직없는 간단한 이유 때문에이 작업을 수행하지 않습니다 .D도 람다를 사용할 수 있습니다. 그러나 이것은 우리가 그것을 할당하지 않으면 바이트의 양을 줄입니다.Function<String[],String> 변수에 입니다.

확장 된 형태로 :

static String r(String[]p){
    String s=""; //The string that will be returned
    int l[]=new int[3], //An array containing the lengths of our three names
            m=0, //tmp variable for filling l
            i,j,a,k,t; //some declarations to save a few bytes lateron
    for(String x:p) l[m++]=x.length();
    m=Math.max(l[0],Math.max(l[1],l[2]))+2;
    m+=m%2<1? //ensure odd length of the podests
        1
        :m==3?2:0; //ensure the length is at least 3 (in my code, m is the length of the podests + 2)
    for(i=0;i<7;i++,s+="\n") //iterate by row
        for(a=1;a<4;a=a==1?0:a+2) //iterate by place: a=1,0,2
            for(j=0,k=2*a,t=(m-l[a])/2;j<m;j++) //iterate by column
                //k is the row number from top in which the a-th name goes
                //t is the column at which the name starts
                //now, append the right char:
                s+=i==k? //write the name
                    j>=t&j<t+l[a]?
                        p[a].charAt(j-t)
                        :" "
                    :i==k+1? //write the top of the podest ("@---@")
                        j%~-m<1?
                            "@"
                            :"-"
                    :i>=k+2? //write the bottom of the podest ("|  |@  |")
                        j%~-m<1? //the left and right edge of the podest
                            "|"
                            :j==m/2? //the center of the podest
                                i==k+2? //are we at the first row of the bottom?
                                    "@" //the case where we have to write "| @ |"
                                    :"|" //the case "| | |"
                                :" "
                        :" "
                ;
    return s;
}

입력은 다음과 같이 주어져야합니다 String 길이 3의 -array . 예는 다음과 같습니다.

public static void main(String[] args){
    System.out.print(r(new String[]{"Anthony", "Bertram", "Carlos"}));
}

산출:

          Anthony          
         @-------@         
 Bertram |   @   |         
@-------@|   |   |         
|   @   ||   |   | Carlos  
|   |   ||   |   |@-------@
|   |   ||   |   ||   @   |

1
좋은 답변, PPCG에 오신 것을 환영합니다! 나에게서 +1! 여기에 342 바이트 를 만들기 위해 골프를 치는 몇 가지 기본 사항 : 일반적인 방법 대신 Java 8+ 람다; var대신 Java 10 이상 String; 길이 배열을 for-each 루프로 채웠습니다. 변경 if(m%2==0)m++;if(m==3)m=5;m+=m%2<1?m==2?3:1:0동일한 효과; 모두 %nr==0%nr<1; 변경된 %(m-1)한다 %~-m; 괄호 {}를 제거 할 수 있도록 모든 것을 루프 자체 안에 넣으십시오 .
Kevin Cruijssen

아직 보지 못했다면 Java 로 골프를 치기위한 팁<모든 언어>로 골프를 치기위한 팁을 모두 읽는 것이 흥미로울 수 있습니다. 체류를 즐길 수!
Kevin Cruijssen

@KevinCruijssen 좋아, 대단히 감사합니다! 게시물을 업데이트하겠습니다!
bruderjakob

m-l[a]>>1대신 (m-l[a])/2i<k+2?" ":j%~-m<1?"|":j==m/2?i==k+2?"@":"|"대신 제안i>=k+2?j%~-m<1?"|":j==m/2?i==k+2?"@":"|":" "
ceilingcat

1

C (GCC) 302 293 292 289 287 바이트

ceilingcat 덕분에 -6 바이트

#define P(h,n)r=w+2-L[n];i/h?printf("%*s%*s%*s",-~r/2,D,L[n],i>h?D:N[n],r/2,D):printf(~i/h?"@%s@":"|%*s%c%*s|",~i/h?D+1:w/2,D,i>h-3?64:'|',w/2,D);
f(int**N){char L[3],w=3,i=3,r,D[99]={};for(;i--;)w=w<(L[i]=strlen(N[i]))?L[i]|1:w;memset(D+1,45,w);for(i=7;i--;puts(D)){P(4,1)P(6,0)P(2,2)}}

여기에서 실행

ungolfed 및 설명 (기술적으로 매크로에서 백 슬래시 후 주석을 사용할 수 없으므로 실행되지 않습니다)

#define P(h,n)\
    r=w+2-L[n];\ //get leftover width
    i/h?\ //if i >= h
        printf("%*s%*s%*s",-~r/2,D,L[n],i>h?D:N[n],r/2,D):\//if too high print all spaces, otherwise center the name
        printf(~i/h?"@%s@":"|%*s%c%*s|",~i/h?D+1:w/2,D,i>h-3?64:'|',w/2,D);
//if (i == h - 1) print top row using D calculated if row right below top, else print '@'(64) in center, otherwise '|'
f(int**N){
    char
        L[3],//lengths of each string
        w=3,//width (init to minimum)
        i=3,//index, used in for loops
        l,//left padding
        r,//right padding
        D[99]={};//string of '-' of correct length (max 99) but first char is null for empty string
    for(;i--;)//i was set to 3 before, i will be {2,1,0}
        w=w<(L[i]=strlen(N[i]))?//set length to str len and compare to longest width so far
            L[i]|1://set it to length if longer, but make sure it is odd
            w;//do not replace
    memset(D+1,45,w); //set the first w bits of D to '-', leaves a null terminator
    for(i=7;i--;puts(D)){//i will be {6...0}
        P(4,1)//print second place, 4 high
        P(6,0)//print first place, 6 high
        P(2,2)//print thrid place, 2 high
    }
}

다음은 호출 코드입니다

int main()
{
  char* N[3] = {"Tom", "Anne", "Sue"} ;
  f(N);
}

출력

         Tom         
       @-----@       
  Anne |  @  |       
@-----@|  |  |       
|  @  ||  |  |  Sue  
|  |  ||  |  |@-----@
|  |  ||  |  ||  @  |

for(;i--;memset(D+1,45,w))w=w<(L[i]=strlen(N[i]))?L[i]|1:w;대신 제안for(;i--;)w=w<(L[i]=strlen(N[i]))?L[i]|1:w;memset(D+1,45,w);
ceilingcat

1

PowerShell Windows 용, 231 223 바이트

param($a)$w=($a|% le*|sort)[-1]
if(3-gt$w){$w=3}$w+=1-$w%2
0..6|%{$r=$_
-join($a|%{$m=' -'[5-eq($o=$r+2*(++$i%3))]
$e='     @|||||'[$o]
$x=(,''*4+$_,'','@'+,'|'*4)[$o]
"$e$($x|% *ft(($x.Length+$w)/2-.1)$m|% *ht $w $m)$e"})}

온라인으로 사용해보십시오!

입력은 array @('second','first','third')입니다. 풀린 버전 :

param($arr)
$width=($arr|% length|sort)[-1]
if(3-gt$width){$width=3}
$width+=1-$width%2

0..6|%{ $row=$_                         # 7 rows
    -join($arr|%{                       # 3 joined columns. Each column array contains 11 lines.
        $offset = $row+2*(++$i%3)       # (2,4,0) -> offset in column array #   0:
        $middle = ' -'[5-eq$offset]                                         #   1:
        $edge   = '     @|||||'[$offset]                                    #   2:
        $center = ('','','','',$_,'','@','|','|','|','|')[$offset]          #   3:
                                                                            #   4:  name
        # pad $x to a center                                                #   5: @---@
        $center = $center|% PadLeft (($center.Length+$width)/2-.1) $middle  #   6: | @ |
        $center = $center|% PadRight $width $middle                         #   7: | | |
                                                                            #   8: | | |
        # add the $edge                                                     #   9: | | |
        "$edge$center$edge"                                                 #  10: | | |
    })
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.