Construir podios ASCII

26

En las competiciones deportivas, a menudo sucede que los ganadores se presentan en los podios, con la persona del primer lugar en lo más alto en el medio, la persona del segundo lugar en la altura media a la izquierda y la persona del tercer lugar en lo más bajo y a la derecha. Vamos a recrear eso aquí con algunos ajustes especiales.

Los podios se presentan a continuación:

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

Esto formará la base para este desafío. El siguiente paso es hacer que los podios sean lo suficientemente anchos para adaptarse a las personas (cadenas ASCII imprimibles) que están en ellos. Sin embargo, queremos asegurar la belleza estética (porque esta es una oportunidad fantástica para tomar fotos), por lo que cada podio debe tener el mismo ancho, y el ancho debe ser extraño. Además, las personas (obviamente) querrán pararse en el centro del podio, por lo que las cuerdas deben estar centradas lo mejor posible. (Puede alinearse tanto a la izquierda como a la derecha, y no es necesario que sea coherente). Los podios anteriores son del tamaño mínimo y se consideran3 anchos.

Por ejemplo, dada la entrada que ["Tom", "Ann", "Sue"]representa el primer, segundo y tercer lugar respectivamente, genera los siguientes podios:

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

Sin embargo, si tenemos en Annelugar de Ann, tendremos que subir al siguiente tamaño 5y centrar las cuerdas lo mejor posible. Aquí, estoy alineando para que la letra "extra" Anneesté a la izquierda del centro, pero puedes elegir a qué lado alinear.

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

Vamos por algunos nombres más largos. Que tal ["William", "Brad", "Eugene"]:

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

Aquí podemos ver que Bradtiene mucho espacio en blanco, Eugenemenos, y se Williamajusta a la perfección.

Para un caso de prueba más largo, ¿qué tal ["A", "BC", "DEFGHIJKLMNOPQRSTUVWXYZ"]:

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

Finalmente, tenemos la entrada más pequeña posible, algo como ["A", "B", "C"]:

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

  • La entrada y salida se pueden dar por cualquier método conveniente .
  • La entrada está garantizada como no vacía (es decir, nunca recibirá ""como nombre).
  • Puede imprimirlo en STDOUT o devolverlo como resultado de una función.
  • Un programa completo o una función son aceptables.
  • Cualquier cantidad de espacios en blanco extraños es aceptable, siempre y cuando los caracteres se alineen apropiadamente.
  • Las lagunas estándar están prohibidas.
  • Este es el por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).
AdmBorkBork
fuente
¿Todos los nombres de longitud par tienen que estar alineados en la misma dirección?
Sparr
1
¿Por qué los podios en el último ejemplo de salida tienen longitud 3 en lugar de longitud 1?
bruderjakob17
3
@bruderjakob dice al principio "los podios anteriores son del tamaño mínimo y se consideran 3 de ancho"
rtpax

Respuestas:

9

JavaScript (ES8), 196 bytes

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)

Pruébalo en línea!

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

Pruébalo en línea!

(nota: el tio groovy interpreter no pudo manejar las listas de indexación usando valores largos, aunque groovy 2.5.6 sí. Por lo tanto, la respuesta tio está usando en *.toShort()lugar de*.toLong() agregar un byte)

Define un cierre al fque se puede llamar mediante:

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

dónde f devuelve una cadena.

Explicación:

Desenmascarando el código, tenemos:

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-> - defina el cierre f con un en-param n
  • m=n*.size().max()|1 - encontrar el nombre máximo len, binario o número impar
  • h=' '*(m/2) - h contendrá espacios de piso (m / 2), utilizados más tarde
  • a=...- crea una lista de codificación con elementos:
    • índices 0,1,2 - nombres, centrados en max len
    • índice 3 - m + 2 espacios
    • índice 4 - @---@ patrón, acolchado para len
    • índice 5 - | @ | patrón, acolchado para len
    • índice 6 - | | |patrón, acolchado para len
    • índice 7 - nueva línea
  • '307...'*.toLong().sum{a[it]}- use indicaciones en la lista de codificación para construir el resultado. .sumusa el hecho de que string + string en groovy es válido.
  • tenga en cuenta que la expresión '3073...'*.toLong()usa el *.operador de propagación para llamar toLong()a cada carácter y devolver una lista de números.
  • tenga en cuenta en la respuesta que la variable ase ha insertado, se han eliminado las líneas de puntos, etc.
Matias Bjarland
fuente
6

Lienzo , 45 bytes.

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

Pruébalo aquí!

Explicación:

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

Abusa "y no necesita ser consistente", lo que lo hace bastante ininteligible.

dzaima
fuente
Umm ... alguna posibilidad de una explicación?
Matias Bjarland
1
@MatiasBjarland, aunque es principalmente manipulación de pila y el resto, apenas entiendo, allí.
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

Pruébalo en línea!

-6 bytes, gracias a Andrew Dunai

TFeld
fuente
Puede guardar 6 bytes reemplazando la línea 5 x,y,p='@| 'y usando en plugar de' '
Andrew Dunai
1
@andrewdunai gracias :)
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

Pruébalo en línea!

Lynn
fuente
3

Carbón , 63 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

≔÷⌈EθLι²η

Calcule el número de espacios en cada mitad de un podio.

F³«

Pase sobre cada lugar. Tenga en cuenta que se espera que la entrada esté en el orden 2, 1, 3.

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

Posición al inicio de la línea que tendrá el texto.

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

Imprima el texto con suficiente relleno izquierdo para centrarlo.

≔⁻⁷ⅉι

Obtén la altura del podio.

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

Dibuja el podio.

Enfoque alternativo, también 63 bytes:

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

≔÷⌈EθLι²η

Calcule el número de espacios en cada mitad de un podio.

F³«

Pase sobre cada lugar. Tenga en cuenta que se espera que la entrada esté en el orden 2, 1, 3.

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

Posición al inicio de la línea que tendrá el texto.

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

Imprima el texto con suficiente relleno izquierdo para centrarlo.

⪫@-@×-η⟧

También muestre la parte superior del podio insertando -s entre los caracteres de la cadena @-@para alcanzar el ancho correcto.

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

Imprima el resto del podio espaciando la |s apropiadamente, excepto que el carácter del medio está @en la primera fila.

Neil
fuente
3

R 308 302 299

-6 bytes gracias a @JAD
-3 bytes gracias a @Guiseppe, ahora tengo menos de 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='')}

Probablemente haya una mejor manera de crear el diseño; Debería probar qué opciones tengo para los marcos de datos.

Pruébalo en línea

CT Hall
fuente
304 bytes
JAD
2
Felicitaciones a ustedes por hacer un desafío ascii-arte variable en R ... nunca es divertido hacerlo. Puede guardar 3 bytes usando i=max(1,nchar(a)%/%2). Generar ay matrixusar writepuede ser más corto (en lugar de a data.frame). Sugiero usar formatcon j="c"para justificar automáticamente las cosas, y también strrepes útil en este caso. ¿Quizás probar la sala de chat golfR para intercambiar ideas?
Giuseppe
Sí, no me di cuenta de lo difícil que sería entrar en eso. Aunque aprendí un poco, sobre todo debería aprender Python mejor o comenzar a aprender Perl :). Me había olvidado strrep; Tendré que investigar eso.
CT Hall
2

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

Pruébalo en línea!

Οurous
fuente
2

Python 2 , 188 bytes

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

Pruébalo en línea!

-5 gracias a TFeld .

Erik el Outgolfer
fuente
2

PHP, 147 bytes

Golfed 93 bytes de mi idea inicial, un sencillo <?=:

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

toma nombres de argumentos de la línea de comandos. Ejecutar -nro probarlo en línea .
Requiere PHP 7; produce advertencias en PHP 7.2 (y más tarde, presumiblemente). Vea el TiO para una corrección de +5 bytes.

cartografía:

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

Descompostura:

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
;

El pre-incremento para $ime salva de cualquier truco para las nuevas líneas.
El espacio en blanco para 6también puede estar vacío; así que hice eso
Pero usar $argv[0]para la cadena del borde superior -fue el mejor golf de todos. (¡y guardado 9 bytes!)

Titus
fuente
2

Go, 436 bytes

Ir es terrible para el golf. Pero:

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

Desglosado:

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
fuente
1

Java 8, 399 394 373 Bytes

Esta solución es probablemente demasiado larga, pero es una solución :)

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

Se guardaron 5 bytes al iterar directamente en orden (a = 1,0,2 en lugar de 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;}

Guardado 21 Bytes gracias a @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;}

Como @KevinCruijssen sugirió, también se podría usar en varlugar de Stringen Java 10+ y guardar algunos bytes adicionales. No hago esto por la sencilla razón de que todavía no tengo Java 10: D también, se podrían usar lambdas. Pero esto solo reduciría la cantidad de bytes si dejáramos de asignarlo a una Function<String[],String>variable.

En forma expandida:

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

La entrada se debe dar como una Stringmatriz de longitud 3. Un ejemplo se ve así:

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

Salida:

          Anthony          
         @-------@         
 Bertram |   @   |         
@-------@|   |   |         
|   @   ||   |   | Carlos  
|   |   ||   |   |@-------@
|   |   ||   |   ||   @   |
bruderjakob17
fuente
1
Buena respuesta, y bienvenido a PPCG! +1 de mi parte! Aquí algunas cosas básicas para jugar golf para que sea de 342 bytes : Java 8+ lambda en lugar del método regular; Java 10+ en varlugar de String; llenó la matriz de longitud con un ciclo for-each; cambiado if(m%2==0)m++;if(m==3)m=5;a m+=m%2<1?m==2?3:1:0para el mismo efecto; cambiado todo %nr==0a %nr<1; cambiado el %(m-1)a %~-m; coloque todo dentro del bucle para que {}se puedan quitar los corchetes .
Kevin Cruijssen
Si aún no lo ha visto, los consejos para jugar golf en Java y los consejos para jugar golf en <todos los idiomas> pueden ser interesantes de leer. ¡Disfruta tu estancia!
Kevin Cruijssen
@KevinCruijssen bien, muchas gracias! ¡Actualizaré la publicación!
bruderjakob17
Sugerir en m-l[a]>>1lugar de (m-l[a])/2y en i<k+2?" ":j%~-m<1?"|":j==m/2?i==k+2?"@":"|"lugar dei>=k+2?j%~-m<1?"|":j==m/2?i==k+2?"@":"|":" "
ceilingcat
1

C (GCC) 302 293 292 289 287 bytes

-6 bytes gracias a 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)}}

Ejecútalo aquí

Desenmascarado y explicado (técnicamente no puede haber comentarios después de las barras diagonales en las macros, por lo que esto no se ejecutará)

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

Aquí está el código de llamada

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

y salida

         Tom         
       @-----@       
  Anne |  @  |       
@-----@|  |  |       
|  @  ||  |  |  Sue  
|  |  ||  |  |@-----@
|  |  ||  |  ||  @  |
rtpax
fuente
Sugerir en for(;i--;memset(D+1,45,w))w=w<(L[i]=strlen(N[i]))?L[i]|1:w;lugar defor(;i--;)w=w<(L[i]=strlen(N[i]))?L[i]|1:w;memset(D+1,45,w);
ceilingcat
1

PowerShell para Windows, 231 223 bytes

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

Pruébalo en línea!

La entrada es matriz @('second','first','third'). Versión desenrollada:

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
fuente