ASCII Podyumları Yap


26

Spor müsabakalarında genelde kazananlara podyumlarda, ilk sırada birinci, ortada ikinci, ortada ikinci, solda ve üçüncü sırada en düşük üçüncü sırada yer alır. sağa. Bunu burada bazı özel tweakslerle yeniden yaratacağız.

Podyumlar aşağıda sunulmuştur:

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

Bu, bu zorluğun temelini oluşturacaktır. Bir sonraki adım, podyumları üzerlerindeki insanlara (yazdırılabilir ASCII dizeleri) uyacak kadar geniş hale getirmektir. Bununla birlikte, estetik güzelliği sağlamak istiyoruz (çünkü bu harika bir fotoğraf fırsatıdır), bu nedenle her podyumun aynı genişlikte olması ve genişliğin tuhaf olması gerekir. Ek olarak, insanlar (açıkçası) podyumun ortasında durmak isteyeceklerdir, bu nedenle iplerin mümkün olduğunca en iyi şekilde ortalanması gerekir. (Sola veya sağa hizalayabilirsiniz ve tutarlı olması gerekmez.) Yukarıdaki podyum minimum boyuttadır ve 3geniş kabul edilir .

Örneğin, ["Tom", "Ann", "Sue"]sırasıyla birinci, ikinci ve üçüncü sırayı temsil eden girdi verildiğinde , aşağıdaki podyumları verin:

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

Ancak, Annebunun yerine varsa bir Annsonraki boyuta çıkmamız 5ve dizeleri mümkün olduğunca en iyi şekilde ortalamamız gerekir. Burada, "fazla" harfi Annemerkezin solunda olacak şekilde hizalanıyorum, ancak hangi tarafa hizalanacağını seçebilirsiniz.

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

Biraz daha uzun isimler için gidelim. Peki ya ["William", "Brad", "Eugene"]:

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

Burada bunun Bradçok fazla boşluk bıraktığını görüyoruz, çok Eugeneaz ve Williamtam olarak uyuyor.

Daha uzun bir test durumu için nasıl ["A", "BC", "DEFGHIJKLMNOPQRSTUVWXYZ"]:

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

Son olarak, mümkün olan en küçük girdiye sahibiz ["A", "B", "C"]:

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

  • Giriş ve çıkış herhangi bir uygun yöntemle verilebilir .
  • Girişin boş olmadığı garantilidir (yani, ""bir isim olarak asla alamayacaksınız ).
  • STDOUT'a yazdırabilir veya işlev sonucu olarak geri döndürebilirsiniz.
  • Tam bir program veya bir işlev kabul edilebilir.
  • Karakterler uygun şekilde hizalandığı sürece herhangi bir miktarda boş boşluk kabul edilebilir.
  • Standart boşluklar yasaktır.
  • Bu olduğundan, tüm normal golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Tüm çift uzunluk adlarının aynı yönde hizalanması gerekiyor mu?
Sparr

1
Neden son örnek çıktındaki podyumda uzunluk 1 yerine uzunluk 3 var?
bruderjakob17

3
@ bruderjakob başında “podyumların minimum büyüklükte olduğunu ve 3 genişlikte kabul
edildiğini

Yanıtlar:


9

JavaScript (ES8), 196 bayt

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)

Çevrimiçi deneyin!


7

Groovy , 187 , 176 , 156 , 150 bayt

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

Çevrimiçi deneyin!

(not: lu harika tercüman olsa harika 2.5.6 kutu Uzun değerlerini kullanarak Listelerini indeksleme başa çıkamayan Böylece lu cevap kullanıyor. *.toShort()yerine *.toLong()bir bayt hangi ekler)

Şununla fçağrılabilecek bir kapanmayı tanımlar :

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

nerede fbir dize döndürür.

Açıklama:

Kodu kaldırmadan, biz var:

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-> - Bir param in ile bir f kapatılması tanımlayın n
  • m=n*.size().max()|1 - İkili ya da tek sayı olan en fazla len adını bulun
  • h=' '*(m/2) - h daha sonra kullanılan kat (m / 2) boşluklarını içerecektir
  • a=...- elemanları içeren bir kodlama listesi oluşturur:
    • 0,1,2 dizinler - en fazla len merkezlenmiş adlar
    • dizin 3 - m + 2 boşluk
    • dizin 4 - @---@desen, len için yastıklı
    • dizin 5 - | @ |desen, len için yastıklı
    • dizin 6 - | | |desen, len için yastıklı
    • dizin 7 - newline
  • '307...'*.toLong().sum{a[it]}- sonucu oluşturmak için kodlama listesine işaretler kullanın. .sumgroovy'deki string + string'in geçerli olduğu gerçeğini kullanır.
  • ifadenin , sayı listesini döndürerek her karakteri çağırmak '3073...'*.toLong()için *.spread operatörünü kullandığını unutmayın toLong().
  • cevabında, değişkenin işaretlendiğine a, nelinlerin kaldırıldığına vs. dikkat edin .

6

Tuval , 45 bayt

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

Burada dene!

Açıklama:

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

Suiistimaller "ve tutarlı olması gerekmez", onu anlaşılmaz kılıyor.


Um ... bir açıklama şansın var mı?
Matias Bjarland

1
@MatiasBjarland çoğunlukla yığın manipülasyonu ve gerçekte anlayamadığım kadarıyla orada.
dzaima

4

Python 2 , 197 190 bayt

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

Çevrimiçi deneyin!

-6 bayt, Andrew Dunai sayesinde


Satır 5 yerine x,y,p='@| 've pyerine' '
Andrew Dunai

1
@andrewdunai teşekkürler :)
TFeld

4

Python 2 , 157 bayt

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

Çevrimiçi deneyin!


3

Kömür , 63 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

≔÷⌈EθLι²η

Bir podyumun her yarısındaki boşluk sayısını hesaplayın.

F³«

Her yerin üzerinde döngü. Girişin 2., 1., 3. sırada olması bekleniyor.

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

Metni içeren satırın başına yerleştirin.

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

Metni, ortalamak için yeterince sol doldurma ile çıkartın.

≔⁻⁷ⅉι

Podyumun yüksekliğini al.

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

Podyumu çiz.

Alternatif yaklaşım, ayrıca 63 bayt:

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

≔÷⌈EθLι²η

Bir podyumun her yarısındaki boşluk sayısını hesaplayın.

F³«

Her yerin üzerinde döngü. Girişin 2., 1., 3. sırada olması bekleniyor.

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

Metni içeren satırın başına yerleştirin.

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

Metni, ortalamak için yeterince sol doldurma ile çıkartın.

⪫@-@×-η⟧

Ayrıca doğru genişliğe ulaşmak için -dizgenin karakterleri arasına s yerleştirerek podyumun tepesini çıkar @-@.

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

|Orta karakterin @ilk sırada bir olması dışında , podyumun kalanını uygun şekilde aralıklarla yazdırın .


3

R 308 302 299

@JAD
-3 bayt sayesinde -6 bayt @Guiseppe sayesinde, şimdi 300 yaşın altındayım

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

Düzeni oluşturmanın daha iyi bir yolu olabilir; Veri çerçeveleri için hangi seçeneklere sahip olduğumu denemeliyim.

Çevrimiçi deneyin



2
R'de değişken bir sanat eseri mücadelesi yaptığınız için sizi hayal kırıklığına uğratmayın . Kullanarak 3 bayt kaydedebilirsiniz i=max(1,nchar(a)%/%2). A üretmek matrixve kullanmak writedaha kısa olabilir (a yerine data.frame). Bir şeyleri otomatik olarak yaslamak için formatile kullanmanızı öneririm j="c"ve strrepbu durumda da yararlı bir şey . Belki fikirlerini zıplatmak için golfR sohbet odasını dene ?
Giuseppe

Evet, bunun ne kadar zor olacağını bilmiyordum. Biraz tho öğrendim, çoğunlukla Python'u daha iyi öğrenmeliyim ya da Perl :) öğrenmeye başladım. Ben unutmuşum strrep; Buna bakmak zorundayım.
CT Hall

2

Temiz , 209 bayt

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

Çevrimiçi deneyin!


2

Python 2,188 bayt

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

Çevrimiçi deneyin!

-5 TFeld sayesinde .


2

PHP, 147 bayt

ilk fikrim kapalı 93 bayt, yalındır <?=:

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

komut satırı argümanlarından isimler alır. Çevrimiçi olarak çalıştırın -nrveya deneyin .
PHP 7 gerektirir; PHP 7.2’de (ve daha sonra büyük olasılıkla) uyarı verir. +5 baytlık düzeltme için TiO'ya bakın.

haritalama:

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

Yıkmak:

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
;

Ön artış $i, beni yeni hatlar için aldatmacalardan kurtarıyor.
İçin boş 6da boş olabilir; bu yüzden yaptım.
Ancak $argv[0]üst sınır dizgisi için kullanmak -şimdiye kadarki en güzel golf oldu. (ve 9 bayt kaydedildi!)


2

Git, 436 bayt

Git golf için korkunç. Fakat:

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

Bozuldu:

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 Bayt

Bu çözüm muhtemelen çok uzun, ama bir çözüm :)

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

Doğrudan sırayla yineleyerek 5 Bayt kurtarıldı (a = q, 0,1,2; a = f (q) yerine 1,0,2)

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 sayesinde 21 bayt kaydedildi:

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'in önerdiği gibi, biri Java 10+ varyerine de kullanabilir Stringve fazladan Byte kaydedebilir. Bunu henüz Java 10 kullanmamamın basit bir nedenden dolayı yapmıyorum: D ayrıca lambdalar kullanılabilir. Ancak bu, yalnızca Function<String[],String>değişkene atamaktan vazgeçersek, bayt miktarını azaltır .

Genişletilmiş biçimde:

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

Girdi, Stringuzunluk 3 dizisi olarak verilmelidir. Bir örnek şöyle görünür:

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

Çıktı:

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

1
Güzel cevap ve PPCG'ye hoş geldiniz! Benden +1! İşte 342 bayt yapmak için golf için bazı temel şeyler : normal yöntem yerine Java 8+ lambda; Java 10+ varyerine String; uzunluk-dizisini her bir forma ile doldurdu; değiştirildi if(m%2==0)m++;if(m==3)m=5;için m+=m%2<1?m==2?3:1:0aynı etki için; hepsini %nr==0değiştirdi %nr<1; değiştirildi %(m-1)için %~-m; braketleri {}çıkartabilmek için her şeyi halkanın içine yerleştirin .
Kevin Cruijssen

Eğer henüz görmemiş varsa, Java golf için ipuçları ve içinde golf için ipuçları <tüm diller> kudreti hem okumak ilginç olabilir. Kaldınız!
Kevin Cruijssen

@KevinCruijssen iyi, çok teşekkür ederim! Gönderiyi güncelleyeceğim!
bruderjakob17

Öner m-l[a]>>1yerine (m-l[a])/2ve i<k+2?" ":j%~-m<1?"|":j==m/2?i==k+2?"@":"|"yerinei>=k+2?j%~-m<1?"|":j==m/2?i==k+2?"@":"|":" "
ceilingcat

1

C (GCC) 302 293 292 289 287 bayt

-Katıcı sayesinde 6 bayt

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

Burada çalıştır

Ungolfed ve açıkladı (teknik olarak makrolarda ters eğik çizgilerden sonra yorum alamazsınız, bu yüzden bu çalışmayacak)

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

İşte arama kodu

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

ve çıktı

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

Öner for(;i--;memset(D+1,45,w))w=w<(L[i]=strlen(N[i]))?L[i]|1:w;yerinefor(;i--;)w=w<(L[i]=strlen(N[i]))?L[i]|1:w;memset(D+1,45,w);
ceilingcat

1

PowerShell for Windows, 231 223 bayt

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

Çevrimiçi deneyin!

Giriş dizisidir @('second','first','third'). Kontrolsüz versiyon:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.