Xây dựng bục ASCII


26

Trong các cuộc thi thể thao, điều thường xảy ra là người chiến thắng được trình bày trên bục vinh quang, với người đứng thứ nhất ở giữa cao nhất, người thứ hai ở độ cao giữa bên trái và người thứ ba ở mức thấp nhất và rẽ phải. Chúng tôi sẽ tạo lại điều đó ở đây với một số điều chỉnh đặc biệt.

Các bục được trình bày dưới đây:

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

Điều này sẽ tạo cơ sở cho thách thức này. Bước tiếp theo là làm cho bục đủ rộng để phù hợp với mọi người (chuỗi ASCII có thể in) nằm trên chúng. Tuy nhiên, chúng tôi muốn đảm bảo vẻ đẹp thẩm mỹ (vì đây là một cơ hội hình ảnh tuyệt vời), vì vậy mỗi bục cần phải có cùng chiều rộng và chiều rộng phải là số lẻ. Ngoài ra, mọi người sẽ (rõ ràng) muốn đứng ở trung tâm của bục giảng, vì vậy các chuỗi phải được tập trung tốt nhất có thể. (Bạn có thể căn chỉnh sang trái hoặc phải và không cần nhất quán.) Các bục trên là kích thước tối thiểu và được coi là 3rộng.

Ví dụ: được đưa ra đầu vào ["Tom", "Ann", "Sue"]tương ứng vị trí thứ nhất, thứ hai và thứ ba, xuất ra các bục sau:

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

Tuy nhiên, nếu chúng ta có Annethay vì Ann, chúng ta sẽ cần tăng kích thước tiếp theo 5và căn giữa các chuỗi càng tốt càng tốt. Ở đây, tôi đang căn chỉnh để chữ "phụ" Annenằm ở bên trái của trung tâm, nhưng bạn có thể chọn bên nào để căn chỉnh.

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

Hãy để một số tên dài hơn. Thế còn ["William", "Brad", "Eugene"]:

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

Ở đây chúng ta có thể thấy rằng Bradcó rất nhiều khoảng trắng, Eugeneít hơn và Williamphù hợp vừa phải.

Đối với trường hợp thử nghiệm dài hơn, làm thế nào về ["A", "BC", "DEFGHIJKLMNOPQRSTUVWXYZ"]:

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

Cuối cùng, chúng ta có đầu vào nhỏ nhất có thể, đại loại như ["A", "B", "C"]:

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

  • Đầu vào và đầu ra có thể được đưa ra bởi bất kỳ phương pháp thuận tiện .
  • Đầu vào được đảm bảo không trống (nghĩa là bạn sẽ không bao giờ nhận được ""tên).
  • Bạn có thể in nó sang STDOUT hoặc trả lại dưới dạng kết quả chức năng.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận.
  • Bất kỳ số lượng khoảng trắng ngoại lai nào cũng được chấp nhận, miễn là các ký tự xếp hàng một cách thích hợp.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Có phải tất cả các tên có độ dài chẵn phải được sắp xếp theo cùng một hướng?
Sparr

1
Tại sao các bục trong đầu ra ví dụ cuối cùng có chiều dài 3 thay vì chiều dài 1?
bruderjakob17

3
@bruderjakob, ông nói ngay từ đầu "bục trên là kích thước tối thiểu và được coi là rộng 3"
rtpax

Câu trả lời:


9

JavaScript (ES8), 196 byte

a=>`141
101
521
031
236
330
332`.replace(/./g,n=>[...`@-@   |@||||`.substr(n*3,3)].join(' -'[+!+n].repeat(m/2))||a[n-=4].padStart(m+l[n]+3>>1).padEnd(m+3),m=Math.max(2,...l=a.map(s=>s.length))&~1)

Hãy thử trực tuyến!


7

Groovy , 187 , 176 , 156 , 150 byte

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]}}

Hãy thử trực tuyến!

(lưu ý: trình thông dịch tio Groovy không thể xử lý danh sách lập chỉ mục bằng cách sử dụng các giá trị Long mặc dù có thể Groovy 2.5.6. Do đó, câu trả lời tio đang sử dụng *.toShort()thay vì *.toLong()thêm một byte)

Xác định một bao đóng fcó thể được gọi thông qua:

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

trong đó ftrả về một chuỗi.

Giải trình:

Không làm phiền mã, chúng tôi có:

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-> - xác định đóng f với một in-param n
  • m=n*.size().max()|1 - tìm tên tối đa len, số nhị phân hoặc số lẻ
  • h=' '*(m/2) - h sẽ chứa khoảng trắng (m / 2), được sử dụng sau
  • a=...- tạo danh sách mã hóa với các phần tử:
    • chỉ mục 0,1,2 - tên, tập trung vào tối đa len
    • chỉ số 3 - m + 2 dấu cách
    • chỉ số 4 - @---@mẫu, đệm để len
    • chỉ số 5 - | @ |mẫu, đệm để len
    • chỉ số 6 - | | |mẫu, đệm để len
    • chỉ số 7 - dòng mới
  • '307...'*.toLong().sum{a[it]}- sử dụng các chỉ dẫn vào danh sách mã hóa để xây dựng kết quả. .sumsử dụng thực tế là chuỗi + chuỗi trong Groovy là hợp lệ.
  • lưu ý rằng biểu thức '3073...'*.toLong()sử dụng *.toán tử trải để gọi toLong()trên mỗi ký tự, trả về một danh sách các số.
  • lưu ý trong câu trả lời biến ađã được nội tuyến, loại bỏ nelines, v.v.

6

Canvas , 45 byte

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

Hãy thử nó ở đây!

Giải trình:

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

Lạm dụng "và nó không cần phải nhất quán", làm cho nó khá khó hiểu.


Umm ... bất kỳ cơ hội của một lời giải thích?
Matias Bjarland

1
@MatiasBjarland mặc dù chủ yếu là thao tác ngăn xếp và phần còn lại tôi hầu như không hiểu, ở đó.
dzaima

4

Python 2 , 197 190 byte

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

Hãy thử trực tuyến!

-6 byte, nhờ Andrew Dunai


Bạn có thể lưu 6 byte bằng cách thay thế dòng 5 thành x,y,p='@| 'và sử dụng pthay vì' '
Andrew Dunai

1
@andrewdunai cảm ơn :)
TFeld


3

Than , 63 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

≔÷⌈EθLι²η

Tính số lượng khoảng trống trong mỗi nửa của bục.

F³«

Vòng qua từng nơi. Lưu ý rằng đầu vào dự kiến ​​sẽ theo thứ tự 2, 1, 3.

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

Vị trí bắt đầu của dòng sẽ có văn bản.

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

Xuất văn bản với đủ phần đệm bên trái để căn giữa nó.

≔⁻⁷ⅉι

Lấy chiều cao của bục giảng.

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

Vẽ bục giảng.

Cách tiếp cận khác, cũng là 63 byte:

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

≔÷⌈EθLι²η

Tính số lượng khoảng trống trong mỗi nửa của bục.

F³«

Vòng qua từng nơi. Lưu ý rằng đầu vào dự kiến ​​sẽ theo thứ tự 2, 1, 3.

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

Vị trí bắt đầu của dòng sẽ có văn bản.

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

Xuất văn bản với đủ phần đệm bên trái để căn giữa nó.

⪫@-@×-η⟧

Cũng xuất ra đỉnh của bục bằng cách chèn -s giữa các ký tự của chuỗi @-@để đạt được chiều rộng chính xác.

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

In phần còn lại của bục bằng cách đặt |s một cách thích hợp, ngoại trừ ký tự ở giữa là một @hàng đầu tiên.


3

R 308 302 299

-6 byte nhờ @JAD
-3 byte nhờ @Guiseppe, hiện tôi dưới 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='')}

Có lẽ có một cách tốt hơn để tạo bố cục; Tôi nên thử những tùy chọn tôi có cho khung dữ liệu.

Dùng thử trực tuyến



2
ngả mũ vì bạn đã thực hiện một thử thách nghệ thuật ascii khác nhau trong R ... không bao giờ thú vị để làm. Bạn có thể lưu 3 byte bằng cách sử dụng i=max(1,nchar(a)%/%2). Tạo a matrixvà sử dụng writecó thể ngắn hơn (chứ không phải a data.frame). Tôi đề nghị sử dụng formatvới j="c"để tự động biện minh cho mọi thứ và strrepcũng là một điều hữu ích trong trường hợp này. Có thể thử phòng chat golfR để nảy ý tưởng?
Giuseppe

Vâng, tôi đã không nhận ra nó sẽ khó khăn như thế nào. Tôi đã học được một chút tho, chủ yếu là tôi nên học Python tốt hơn hoặc bắt đầu học Perl :). Tôi đã quên mất strrep; Tôi sẽ phải xem xét điều đó.
Hội trường CT

2

Sạch , 209 byte

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]])

Hãy thử trực tuyến!



2

PHP, 147 byte

đánh bại 93 byte khỏi ý tưởng ban đầu của tôi, một cách thẳng thắn <?=:

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

lấy tên từ các đối số dòng lệnh. Chạy với -nrhoặc thử trực tuyến .
Yêu cầu PHP 7; mang lại các cảnh báo trong PHP 7.2 (và sau đó, có lẽ). Xem TiO để sửa lỗi +5 byte.

ánh xạ:

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

phá vỡ:

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
;

Gia tăng trước $igiúp tôi tiết kiệm từ mọi thủ thuật cho dòng mới.
Khoảng trống cho 6cũng có thể trống; Vì vậy, tôi đã làm điều đó.
Nhưng sử dụng $argv[0]cho chuỗi biên giới hàng đầu -là golf tốt nhất từng có. (và đã lưu 9 byte!)


2

Đi, 436 byte

Đi là khủng khiếp cho golf. Nhưng:

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)}

Hỏng:

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 byte

Giải pháp này có thể là quá dài, nhưng nó là một giải pháp :)

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;}

Đã lưu 5 byte bằng cách lặp trực tiếp theo thứ tự (a = 1,0,2 thay vì q = 0,1,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;}

Đã lưu 21 Byte nhờ @KevinCruijssen:

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;}

Như @KevinCruijssen đã đề xuất, người ta cũng có thể sử dụng varthay vì Stringtrong Java 10+ và tiết kiệm thêm một số byte. Tôi không làm điều này vì lý do đơn giản là tôi chưa có Java 10: D cũng có thể sử dụng lambdas. Nhưng điều này sẽ chỉ làm giảm số lượng byte nếu chúng ta bỏ qua việc gán nó cho một Function<String[],String>biến.

Ở dạng mở rộng:

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;
}

Đầu vào phải được đưa ra dưới dạng String-array of length 3. Một ví dụ trông như thế này:

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

Đầu ra:

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

1
Câu trả lời hay, và chào mừng bạn đến với PPCG! +1 từ tôi! Dưới đây là một số điều cơ bản để chơi golf để tạo ra nó 34 byte : Java 8+ lambda thay vì phương thức thông thường; Java 10+ varthay vì String; điền vào mảng dài với một vòng lặp for-mỗi; đổi if(m%2==0)m++;if(m==3)m=5;thành m+=m%2<1?m==2?3:1:0cho cùng một hiệu ứng; thay đổi tất cả %nr==0thành %nr<1; thay đổi %(m-1)thành %~-m; đặt mọi thứ bên trong vòng lặp để các dấu ngoặc {}có thể được gỡ bỏ.
Kevin Cruijssen

Nếu bạn chưa nhìn thấy nó, Mẹo chơi golf trong JavaMẹo chơi gôn bằng <tất cả các ngôn ngữ> có thể rất thú vị để đọc qua. Tận hưởng kì nghỉ của bạn!
Kevin Cruijssen

@KevinCruijssen ổn, cảm ơn bạn rất nhiều! Tôi sẽ cập nhật bài viết!
bruderjakob17

Đề xuất m-l[a]>>1thay vì (m-l[a])/2i<k+2?" ":j%~-m<1?"|":j==m/2?i==k+2?"@":"|"thay vìi>=k+2?j%~-m<1?"|":j==m/2?i==k+2?"@":"|":" "
trần mèo

1

C (GCC) 302 293 292 289 287 byte

-6 byte nhờ trần

#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)}}

Chạy nó ở đây

Ung dung và giải thích (về mặt kỹ thuật bạn không thể có ý kiến ​​sau khi gạch chéo lại trong macro, vì vậy điều này sẽ không chạy)

#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
    }
}

Đây là mã gọi

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

và đầu ra

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

Đề xuất for(;i--;memset(D+1,45,w))w=w<(L[i]=strlen(N[i]))?L[i]|1:w;thay vìfor(;i--;)w=w<(L[i]=strlen(N[i]))?L[i]|1:w;memset(D+1,45,w);
trần

1

PowerShell cho Windows, 231 223 byte

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"})}

Hãy thử trực tuyến!

Đầu vào là mảng @('second','first','third'). Phiên bản chưa được kiểm soát:

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: | | |
    })
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.