Erstellen Sie ASCII-Podien


26

Bei sportlichen Wettbewerben werden die Sieger häufig auf dem Podium präsentiert, wobei die Person mit dem ersten Platz auf dem höchsten Platz in der Mitte, die Person mit dem zweiten Platz auf der mittleren Höhe links und die Person mit dem dritten Platz auf dem niedrigsten und dem höchsten Platz steht auf der rechten Seite. Wir werden das hier mit einigen speziellen Verbesserungen nachbilden.

Die Podien sind unten dargestellt:

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

Dies wird die Grundlage für diese Herausforderung bilden. Der nächste Schritt besteht darin, die Podien so breit zu machen, dass sie zu den darauf befindlichen Personen passen (druckbare ASCII-Zeichenfolgen). Wir möchten jedoch eine ästhetische Schönheit sicherstellen (da dies eine fantastische Fotomöglichkeit ist), daher muss jedes Podium dieselbe Breite haben und die Breite muss ungerade sein. Zusätzlich wollen die Leute (offensichtlich) in der Mitte des Podiums stehen, daher müssen die Saiten so gut wie möglich zentriert sein. (Sie können entweder nach links oder nach rechts ausrichten, und es muss nicht konsistent sein.) Die oben genannten Podien sind die Mindestgröße und gelten als 3breit.

Wenn beispielsweise die Eingabe ["Tom", "Ann", "Sue"]den ersten, zweiten bzw. dritten Platz darstellt, werden die folgenden Podien ausgegeben:

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

Wenn dies jedoch der AnneFall ist Ann, müssen wir zur nächsten Größe aufsteigen 5und die Zeichenfolgen so gut wie möglich zentrieren. Hier werde ich so ausrichten, dass der "zusätzliche" Buchstabe von Annelinks von der Mitte ist, aber Sie können wählen, auf welche Seite ausgerichtet werden soll.

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

Lassen Sie uns für einige längere Namen gehen. Wie wäre es mit ["William", "Brad", "Eugene"]:

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

Hier sehen wir, dass Brades viel Leerzeichen Eugenegibt und Williamgenau richtig passt.

Für einen längeren Testfall, wie wäre es mit ["A", "BC", "DEFGHIJKLMNOPQRSTUVWXYZ"]:

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

Schließlich haben wir den kleinstmöglichen Input, so etwas wie ["A", "B", "C"]:

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

  • Die Ein- und Ausgabe kann auf jede bequeme Weise erfolgen .
  • Die Eingabe ist garantiert nicht leer (dh Sie erhalten niemals ""einen Namen).
  • Sie können es an STDOUT drucken oder als Funktionsergebnis zurückgeben.
  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig.
  • Beliebige Leerzeichen sind zulässig, sofern die Zeichen richtig ausgerichtet sind.
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.

Müssen alle geraden Namen in die gleiche Richtung ausgerichtet werden?
Sparr

1
Warum haben die Podien in der Ausgabe des letzten Beispiels die Länge 3 anstelle der Länge 1?
bruderjakob17

3
@bruderjakob er sagt zu Beginn "die Podien oben sind die Mindestgröße und gelten als 3 breit"
RTPax

Antworten:


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)

Probieren Sie es online!


7

Groovy , 187 , 176 , 156 , 150 Bytes

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

Probieren Sie es online!

(Hinweis: Der tio groovy-Interpreter konnte keine Indizierungslisten mit Long-Werten verarbeiten, obwohl Groovy 2.5.6 dies kann. Daher wird die tio-Antwort *.toShort()anstelle von verwendet*.toLong() ein Byte.)

Definiert einen Abschluss, fder aufgerufen werden kann über:

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

woher f eine Zeichenfolge zurückgegeben.

Erläuterung:

Den Code nicht verschleiern, wir haben:

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-> - Abschluss f mit einem In-Parameter definieren n
  • m=n*.size().max()|1 - finde max name len, binär oder ungerade nummer
  • h=' '*(m/2) - h enthält Bodenflächen (m / 2), die später verwendet werden
  • a=...- Erstellt eine Kodierungsliste mit Elementen:
    • Indexe 0,1,2 - Namen, zentriert bis max
    • Index 3 - m + 2 Felder
    • Index 4 - @---@ muster, gepolstert nach len
    • Index 5 - | @ | muster, gepolstert nach len
    • index 6 - | | |muster, gepolstert nach len
    • index 7 - newline
  • '307...'*.toLong().sum{a[it]}- Verwenden Sie Hinweise in der Codierungsliste, um das Ergebnis zu erstellen. .sumverwendet die Tatsache, dass String + String in Groovy gültig ist.
  • Beachten Sie, dass der Ausdruck '3073...'*.toLong()den *.Spread-Operator zum Aufrufen verwendettoLong() jedes Zeichen und eine Liste von Zahlen zurückzugeben.
  • Beachten Sie in der Antwort, dass die Variable aeingebettet, die Zeilen entfernt usw. wurde.

6

Canvas , 45 Bytes

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

Probieren Sie es hier aus!

Erläuterung:

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

Missbrauch "und es muss nicht konsequent sein", was es ziemlich unverständlich macht.


Ähm ... irgendeine Chance auf eine Erklärung?
Matias Bjarland

1
@MatiasBjarland obwohl es meistens Stapelmanipulation ist und der Rest, den ich kaum verstehe, dort.
Dzaima

4

Python 2 , 197 190 Bytes

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

Probieren Sie es online!

-6 Bytes dank Andrew Dunai


Sie können 6 Bytes einsparen, indem Sie Zeile 5 ersetzen x,y,p='@| 'und panstelle von' '
Andrew Dunai

1
@andrewdunai danke :)
TFeld

4

Python 2 , 157 Bytes

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

Probieren Sie es online!


3

Kohle , 63 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

≔÷⌈EθLι²η

Berechnen Sie die Anzahl der Felder in jeder Hälfte eines Podiums.

F³«

Schleife über jeden Ort. Beachten Sie, dass die Eingabe in der Reihenfolge 2., 1., 3. erwartet wird.

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

Positionieren Sie an den Anfang der Zeile, die den Text enthalten soll.

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

Geben Sie den Text mit genügend Abstand aus, um ihn zu zentrieren.

≔⁻⁷ⅉι

Holen Sie sich die Höhe des Podiums.

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

Ziehe das Podium.

Alternativer Ansatz, auch 63 Bytes:

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

≔÷⌈EθLι²η

Berechnen Sie die Anzahl der Felder in jeder Hälfte eines Podiums.

F³«

Schleife über jeden Ort. Beachten Sie, dass die Eingabe in der Reihenfolge 2., 1., 3. erwartet wird.

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

Positionieren Sie an den Anfang der Zeile, die den Text enthalten soll.

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

Geben Sie den Text mit genügend Abstand aus, um ihn zu zentrieren.

⪫@-@×-η⟧

Geben Sie auch die Spitze des Podiums aus, indem Sie -s zwischen die Zeichen der Zeichenfolge einfügen @-@, um die richtige Breite zu erreichen.

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

Drucken Sie den Rest des Podiums aus, indem Sie den |entsprechenden Abstand zwischen den Buchstaben "s" festlegen, mit der Ausnahme, dass sich das mittlere Zeichen "a" @in der ersten Zeile befindet.


3

R 308 302 299

-6 Bytes dank @JAD
-3 Bytes dank @Guiseppe, jetzt bin ich unter 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='')}

Es gibt wahrscheinlich eine bessere Möglichkeit, das Layout zu erstellen. Ich sollte versuchen, welche Optionen ich für Datenrahmen habe.

Probieren Sie es online aus



2
Ich wünsche Ihnen viel Spaß beim Durchführen einer variablen ASCII-Kunst- Herausforderung in R ... Niemals Spaß zu machen. Sie können mit 3 Bytes sparen i=max(1,nchar(a)%/%2). Das Generieren matrixund Verwenden von writekann kürzer sein (als a data.frame). Ich empfehle die Verwendung von formatmit j="c", um Dinge automatisch zu rechtfertigen, und dies strrepist auch in diesem Fall hilfreich. Vielleicht versuchen Sie es im golfR Chatroom , um Ideen zu sammeln ?
Giuseppe

Ja, ich wusste nicht, wie schwer es werden würde. Ich habe ein bisschen gelernt, meistens sollte ich Python besser lernen oder anfangen Perl zu lernen :). Ich hatte es vergessen strrep. Ich muss das untersuchen.
CT Hall

2

Sauber , 209 Bytes

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

Probieren Sie es online!



2

PHP, 147 Bytes

93 Bytes von meiner ursprünglichen Idee entfernt <?=:

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

Nimmt Namen von Kommandozeilenargumenten. Laufen Sie mit -nroder versuchen Sie es online .
Benötigt PHP 7; liefert Warnungen in PHP 7.2 (und vermutlich später). Im TiO finden Sie eine +5-Byte-Korrektur.

Kartierung:

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

Nervenzusammenbruch:

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
;

Das Pre-Increment für $ierspart mir Tricks für die Newlines.
Das Leerzeichen für 6kann auch leer sein. also habe ich das gemacht.
Aber $argv[0]für die Top Border Saite zu verwenden -war das schönste Golf, das es je gab. (und 9 Bytes gespart!)


2

Los, 436 Bytes

Go ist fürchterlich zum Golfen. Aber:

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

Heruntergebrochen:

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 Bytes

Diese Lösung ist wahrscheinlich viel zu lang, aber es ist eine Lösung :)

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 Bytes durch direkte Iteration in der angegebenen Reihenfolge gespeichert (a = 1,0,2 anstelle von 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;}

21 Bytes gespart dank @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;}

Wie @KevinCruijssen vorschlug, könnte man auch varanstelle von verwendenString Java 10+ auch etwas mehr Bytes einsparen. Ich mache das nicht aus dem einfachen Grund, weil ich Java 10 noch nicht besitze: D Außerdem könnten Lambdas verwendet werden. Dies würde jedoch nur die Anzahl der Bytes verringern, wenn wir die Zuweisung zu einer Function<String[],String>Variablen weglassen würden .

In erweiterter Form:

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

Die Eingabe muss als String-array der Länge 3 angegeben werden. Ein Beispiel sieht folgendermaßen aus:

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

Ausgabe:

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

1
Schöne Antwort und willkommen bei PPCG! +1 von mir! Hier einige grundlegende Dinge zum Golfspielen, um daraus 342 Bytes zu machen : Java 8+ Lambda statt regulärer Methode; Java 10+ varstatt String; füllte das Längenfeld mit einer for-each-Schleife; geändert if(m%2==0)m++;if(m==3)m=5;zu m+=m%2<1?m==2?3:1:0für den gleichen Effekt; alles geändert %nr==0zu %nr<1; änderte das %(m-1)zu %~-m; Legen Sie alles in die Schlaufe selbst, damit die Klammern {}entfernt werden können.
Kevin Cruijssen

Wenn Sie es noch nicht gesehen haben, können sowohl Tipps zum Golfen in Java als auch Tipps zum Golfen in <allen Sprachen> interessant sein. Genieße deinen Aufenthalt!
Kevin Cruijssen

@ KevinCruijssen in Ordnung, vielen Dank! Ich werde den Beitrag aktualisieren!
Bruderjakob17

Schlagen m-l[a]>>1statt (m-l[a])/2und i<k+2?" ":j%~-m<1?"|":j==m/2?i==k+2?"@":"|"statti>=k+2?j%~-m<1?"|":j==m/2?i==k+2?"@":"|":" "
Ceilingcat

1

C (GCC) 302 293 292 289 287 Bytes

-6 byte dank 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)}}

Führen Sie es hier aus

Ungolfed und Explained (technisch gesehen kann man nach Backslashes in Makros keine Kommentare haben, so dass dies nicht funktioniert)

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

Hier ist die Vorwahl

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

und Ausgabe

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

Schlagen Sie for(;i--;memset(D+1,45,w))w=w<(L[i]=strlen(N[i]))?L[i]|1:w;stattdessen vorfor(;i--;)w=w<(L[i]=strlen(N[i]))?L[i]|1:w;memset(D+1,45,w);
ceilingcat

1

PowerShell für 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"})}

Probieren Sie es online!

Eingabe ist Array @('second','first','third'). Abgerollte Version:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.