Bangun Podium ASCII

26

Dalam kompetisi olahraga, sering terjadi bahwa pemenang disajikan di podium, dengan orang yang berada di posisi pertama di tengah, orang di tempat kedua di ketinggian tengah di sebelah kiri, dan orang ketiga di tempat terendah dan ke kanan. Kita akan membuatnya kembali di sini dengan beberapa penyesuaian khusus.

Podium disajikan di bawah ini:

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

Ini akan menjadi dasar untuk tantangan ini. Langkah selanjutnya adalah membuat podium cukup lebar agar sesuai dengan orang-orang (string ASCII yang dapat dicetak) yang ada di sana. Namun, kami ingin memastikan keindahan estetika (karena ini adalah kesempatan berfoto yang fantastis), sehingga setiap podium harus memiliki lebar yang sama, dan lebarnya harus aneh. Selain itu, orang-orang akan (jelas) ingin berdiri di tengah podium, sehingga senar harus dipusatkan sebaik mungkin. (Anda dapat menyelaraskan ke kiri atau kanan, dan itu tidak perlu konsisten.) Podium di atas adalah ukuran minimum, dan dianggap 3lebar.

Misalnya, mengingat input yang ["Tom", "Ann", "Sue"]mewakili tempat pertama, kedua, dan ketiga, output podium berikut:

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

Namun, jika kita punya Annealih - alih Ann, kita harus naik ke ukuran berikutnya 5,, dan pusatkan string sebaik mungkin. Di sini, saya menyelaraskan sehingga huruf "ekstra" Anneadalah di sebelah kiri tengah, tetapi Anda dapat memilih sisi mana yang akan diluruskan.

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

Mari kita cari nama yang lebih panjang. Bagaimana dengan ["William", "Brad", "Eugene"]:

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

Di sini kita dapat melihat bahwa Bradmemiliki banyak ruang putih, Eugenekurang begitu, dan Williampas.

Untuk test case yang lebih lama, bagaimana dengan ["A", "BC", "DEFGHIJKLMNOPQRSTUVWXYZ"]:

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

Akhirnya, kami memiliki input sekecil mungkin, seperti ["A", "B", "C"]:

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

  • Input dan output dapat diberikan dengan metode apa pun yang mudah .
  • Input dijamin non-kosong (yaitu, Anda tidak akan pernah menerima ""sebagai nama).
  • Anda dapat mencetaknya ke STDOUT atau mengembalikannya sebagai hasil fungsi.
  • Program lengkap atau fungsi dapat diterima.
  • Berapapun ruang kosong ekstranus dapat diterima, asalkan karakter berbaris dengan tepat.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
AdmBorkBork
sumber
Apakah semua nama genap harus disejajarkan dengan arah yang sama?
Sparr
1
Mengapa podium pada contoh terakhir memiliki panjang 3 bukannya panjang 1?
bruderjakob17
3
@bruderjakob ia menyatakan pada awalnya "podium di atas adalah ukuran minimum dan dianggap 3 lebar"
rtpax

Jawaban:

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)

Cobalah online!

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

Cobalah online!

(catatan: tio groovy interpreter tidak dapat menangani Daftar pengindeksan menggunakan nilai Long meskipun groovy 2.5.6 bisa. Jadi, jawaban tio menggunakan *.toShort()alih-alih *.toLong()yang menambahkan byte)

Menentukan penutupan fyang dapat dipanggil melalui:

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

di mana fmengembalikan sebuah string.

Penjelasan:

Membatalkan kode, kami memiliki:

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-> - mendefinisikan penutupan f dengan satu in-param n
  • m=n*.size().max()|1 - cari nama maksimal len, biner-atau ke nomor ganjil
  • h=' '*(m/2) - h akan berisi ruang lantai (m / 2), digunakan nanti
  • a=...- membuat daftar penyandian dengan elemen:
    • indeks 0,1,2 - nama, berpusat ke maks len
    • indeks 3 - m + 2 spasi
    • indeks 4 - @---@pola, empuk ke len
    • indeks 5 - | @ |pola, empuk ke len
    • indeks 6 - | | |pola, empuk ke len
    • indeks 7 - baris baru
  • '307...'*.toLong().sum{a[it]}- Gunakan indeks ke dalam daftar penyandian untuk membangun hasilnya. .summenggunakan fakta bahwa string + string di groovy valid.
  • perhatikan bahwa ekspresi '3073...'*.toLong()menggunakan *.operator spread untuk memanggil toLong()setiap karakter, mengembalikan daftar nomor.
  • catat dalam jawaban variabel atelah di-inline, neline dihapus dll
Matias Bjarland
sumber
6

Kanvas , 45 byte

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

Coba di sini!

Penjelasan:

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

Pelanggaran "dan itu tidak perlu konsisten", membuatnya cukup tidak dapat dipahami.

dzaima
sumber
Umm ... ada kemungkinan penjelasan?
Matias Bjarland
1
@MatiasBjarland meskipun sebagian besar manipulasi tumpukan dan sisanya saya hampir tidak mengerti, di sana.
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

Cobalah online!

-6 byte, terima kasih kepada Andrew Dunai

TFeld
sumber
Anda dapat menyimpan 6 byte dengan mengganti baris 5 ke x,y,p='@| 'dan menggunakan pbukannya' '
Andrew Dunai
1
@andrewdunai terima kasih :)
TFeld
4

Python 2 , 157 byte

a=input()
i=7
while i:print''.join(([a[k/2]]+list('-@||||    '))[7-i-k].center(max(map(len,a))|1,'- '[i+k!=6]).join('@ |'[cmp(i+k,6)]*2)for k in(2,0,4));i-=1

Cobalah online!

Lynn
sumber
3

Arang , 63 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

≔÷⌈EθLι²η

Hitung jumlah ruang di setiap setengah podium.

F³«

Lingkari setiap tempat. Perhatikan bahwa input diharapkan berada pada urutan ke-2, ke-1, ke-3.

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

Posisikan ke awal baris yang akan memiliki teks.

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

Keluarkan teks dengan bantalan kiri yang cukup untuk menempatkannya di tengah.

≔⁻⁷ⅉι

Dapatkan ketinggian podium.

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

Gambar podium.

Pendekatan alternatif, juga 63 byte:

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

≔÷⌈EθLι²η

Hitung jumlah ruang di setiap setengah podium.

F³«

Lingkari setiap tempat. Perhatikan bahwa input diharapkan berada pada urutan ke-2, ke-1, ke-3.

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

Posisikan ke awal baris yang akan memiliki teks.

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

Keluarkan teks dengan bantalan kiri yang cukup untuk menempatkannya di tengah.

⪫@-@×-η⟧

Keluarkan juga bagian atas podium dengan memasukkan -s di antara karakter string @-@untuk mencapai lebar yang benar.

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

Cetak sisa podium dengan |menempatkan huruf s dengan tepat, kecuali karakter tengahnya adalah @pada baris pertama.

Neil
sumber
3

R 308 302 299

-6 byte terima kasih kepada @JAD
-3 byte terima kasih kepada @Guiseppe, sekarang aku di bawah 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='')}

Mungkin ada cara yang lebih baik untuk membuat tata letak; Saya harus mencoba opsi apa yang saya miliki untuk frame data.

Cobalah online

CT Hall
sumber
304 bytes
JAD
2
hats off kepada Anda untuk melakukan variabel ascii-art tantangan dalam R ... tidak pernah menyenangkan untuk dilakukan. Anda dapat menyimpan 3 byte dengan menggunakan i=max(1,nchar(a)%/%2). Membuat matrixdan menggunakan writemungkin lebih pendek (daripada a data.frame). Saya sarankan menggunakan formatdengan j="c"untuk membenarkan hal-hal, dan strrepsangat membantu dalam hal ini. Mungkin mencoba chatroom golfR untuk memunculkan ide?
Giuseppe
Ya, saya tidak menyadari betapa sulitnya melakukannya. Saya belajar sedikit, sebagian besar saya harus belajar Python lebih baik, atau mulai belajar Perl :). Saya sudah lupa tentang strrep; Saya harus melihat itu.
CT Hall
2

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

Cobalah online!

Suram
sumber
2

Python 2 , 188 byte

a,b,c=l=input()
s=max(map(len,l))/2or 1
A='@'+'--'*s+'-@'
D=(' '*s).join
C=D('|@|')
D=D('|||')
d=str.center
S=s*2+3
for l in' '*S+d(a,S),' '*S+A,d(b,S)+C,A+D,C+D+d(c,S),D+D+A,D+D+C:print l

Cobalah online!

Terima kasih kepada TFeld .

Erik the Outgolfer
sumber
2

PHP, 147 byte

golf 93 byte dari ide awal saya, lurus ke depan <?=:

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

mengambil nama dari argumen baris perintah. Jalankan dengan-nr atau coba online .
Membutuhkan PHP 7; menghasilkan peringatan di PHP 7.2 (dan kemudian, mungkin). Lihat TiO untuk perbaikan +5 byte.

pemetaan:

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

kerusakan:

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
;

Selisih lebih awal untuk $imenyelamatkan saya dari segala trik untuk baris baru.
Kosong untuk 6juga bisa kosong; jadi saya melakukan itu.
Tetapi menggunakan $argv[0]untuk string perbatasan atas -adalah golf terbaik yang pernah ada. (dan menyimpan 9 byte!)

Titus
sumber
2

Pergi, 436 byte

Pergi sangat buruk untuk golf. Tapi:

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

Rusak:

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)
}
greyShift
sumber
1

Java 8, 399 394 373 Bytes

Solusi ini mungkin terlalu lama, tetapi ini adalah solusi :)

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

Disimpan 5 Bytes dengan langsung iterasi dalam urutan (a = 1,0,2 bukannya 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;}

Disimpan 21 Bytes berkat @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;}

Seperti yang disarankan oleh @KevinCruijssen, kita juga bisa menggunakan vardaripada Stringdi Java 10+ dan menyimpan beberapa Bytes tambahan. Saya tidak melakukan ini karena alasan sederhana bahwa saya belum memiliki Java 10: D juga, lambdas dapat digunakan. Tetapi ini hanya akan mengurangi jumlah byte jika kita tidak menetapkannya sebagai Function<String[],String>variabel.

Dalam bentuk yang diperluas:

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

Input harus diberikan sebagai String-array panjang 3. Contohnya terlihat seperti ini:

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

Keluaran:

          Anthony          
         @-------@         
 Bertram |   @   |         
@-------@|   |   |         
|   @   ||   |   | Carlos  
|   |   ||   |   |@-------@
|   |   ||   |   ||   @   |
bruderjakob17
sumber
1
Jawaban yang bagus, dan selamat datang di PPCG! +1 dari saya! Berikut beberapa hal dasar untuk membuatnya 342 byte : Java 8+ lambda, bukan metode biasa; Java 10+ varbukannya String; mengisi array-panjang dengan untuk-setiap loop; diubah if(m%2==0)m++;if(m==3)m=5;menjadi m+=m%2<1?m==2?3:1:0untuk efek yang sama; mengubah semua %nr==0menjadi %nr<1; mengubah %(m-1)ke %~-m; letakkan segala sesuatu di dalam loop itu sendiri sehingga tanda kurung {}dapat dihapus.
Kevin Cruijssen
Jika Anda belum melihatnya, Tip untuk bermain golf di Jawa dan Tips untuk bermain golf di <semua bahasa> mungkin menarik untuk dibaca. Selamat menikmati!
Kevin Cruijssen
@KevinCruijssen baik-baik saja, terima kasih banyak! Saya akan memperbarui pos!
bruderjakob17
Sarankan m-l[a]>>1bukannya (m-l[a])/2dan i<k+2?" ":j%~-m<1?"|":j==m/2?i==k+2?"@":"|"bukannyai>=k+2?j%~-m<1?"|":j==m/2?i==k+2?"@":"|":" "
ceilingcat
1

C (GCC) 302 293 292 289 287 byte

-6 byte terima kasih kepada ceilingcat

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

Jalankan di sini

Tidak digabungkan dan dijelaskan (secara teknis Anda tidak dapat memiliki komentar setelah memangkas makro, sehingga ini tidak akan berjalan)

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

Ini kode panggilannya

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

dan output

         Tom         
       @-----@       
  Anne |  @  |       
@-----@|  |  |       
|  @  ||  |  |  Sue  
|  |  ||  |  |@-----@
|  |  ||  |  ||  @  |
rtpax
sumber
Sarankan for(;i--;memset(D+1,45,w))w=w<(L[i]=strlen(N[i]))?L[i]|1:w;alih-alihfor(;i--;)w=w<(L[i]=strlen(N[i]))?L[i]|1:w;memset(D+1,45,w);
ceilingcat
1

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

Cobalah online!

Input adalah array @('second','first','third'). Versi belum dibuka:

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