Construisez des podiums ASCII

26

Dans les compétitions sportives, il arrive souvent que les gagnants soient présentés sur les podiums, avec la première place au plus haut au milieu, la deuxième place à la hauteur moyenne à gauche, et la troisième place au plus bas et à droite. Nous allons recréer cela ici avec quelques ajustements spéciaux.

Les podiums sont présentés ci-dessous:

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

Cela constituera la base de ce défi. L'étape suivante consiste à rendre les podiums suffisamment larges pour s'adapter aux personnes (chaînes ASCII imprimables) qui s'y trouvent. Cependant, nous voulons garantir la beauté esthétique (car c'est une fantastique opportunité de photo), donc chaque podium doit avoir la même largeur, et la largeur doit être impaire. De plus, les gens voudront (évidemment) se tenir au centre du podium, donc les cordes doivent être centrées le mieux possible. (Vous pouvez vous aligner à gauche ou à droite, et cela n'a pas besoin d'être cohérent.) Les podiums ci-dessus sont de la taille minimale et sont considérés comme 3larges.

Par exemple, étant donné l'entrée ["Tom", "Ann", "Sue"]représentant respectivement la première, la deuxième et la troisième place, sortez les podiums suivants:

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

Cependant, si nous en avons Anneau lieu de Ann, nous devrons passer à la taille suivante 5et centrer les cordes le mieux possible. Ici, je m'aligne de sorte que la lettre "supplémentaire" Annesoit à gauche du centre, mais vous pouvez choisir de quel côté vous aligner.

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

Allons-y pour des noms plus longs. Que diriez-vous ["William", "Brad", "Eugene"]:

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

Ici, nous pouvons voir qu'il y Brada beaucoup d'espace, Eugenemoins, et qu'il Williamconvient parfaitement.

Pour un scénario de test plus long, que diriez-vous ["A", "BC", "DEFGHIJKLMNOPQRSTUVWXYZ"]:

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

Enfin, nous avons la plus petite entrée possible, quelque chose comme ["A", "B", "C"]:

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

  • L'entrée et la sortie peuvent être fournies par n'importe quelle méthode pratique .
  • L'entrée est garantie non vide (c'est-à-dire que vous ne recevrez jamais ""de nom).
  • Vous pouvez l'imprimer sur STDOUT ou le renvoyer en tant que résultat de fonction.
  • Un programme complet ou une fonction sont acceptables.
  • N'importe quelle quantité d'espace blanc étranger est acceptable, tant que les caractères s'alignent correctement.
  • Les failles standard sont interdites.
  • Il s'agit de donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.
AdmBorkBork
la source
Tous les noms de longueur paire doivent-ils être alignés dans la même direction?
Sparr
1
Pourquoi les podiums du dernier exemple de sortie ont-ils une longueur 3 au lieu d'une longueur 1?
bruderjakob17
3
@bruderjakob, il déclare au début "les podiums ci-dessus sont la taille minimale et sont considérés comme 3 de large"
rtpax

Réponses:

9

JavaScript (ES8), 196 octets

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)

Essayez-le en ligne!

Arnauld
la source
7

Groovy , 187 , 176 , 156 , 150 octets

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

Essayez-le en ligne!

(Remarque: l'interpréteur groove tio ne peut pas gérer les listes d'indexation en utilisant des valeurs longues même si groovy 2.5.6 le peut. Ainsi, la réponse tio utilise *.toShort()au lieu de *.toLong()laquelle ajoute un octet)

Définit une fermeture fqui peut être appelée via:

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

frenvoie une chaîne.

Explication:

Dégageant le code, nous avons:

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-> - définir la fermeture f avec un in-param n
  • m=n*.size().max()|1 - trouver le nom max len, binaire ou un nombre impair
  • h=' '*(m/2) - h contiendra des espaces au sol (m / 2), utilisés plus tard
  • a=...- crée une liste d'encodage avec des éléments:
    • index 0,1,2 - noms, centrés sur max len
    • index 3 - m + 2 espaces
    • index 4 - @---@motif, rembourré à len
    • index 5 - | @ |motif, rembourré à len
    • index 6 - | | |motif, rembourré à len
    • index 7 - nouvelle ligne
  • '307...'*.toLong().sum{a[it]}- utilisez des indices dans la liste d'encodage pour construire le résultat. .sumutilise le fait que string + string dans groovy est valide.
  • notez que l'expression '3073...'*.toLong()utilise l' *.opérateur d'étalement pour appeler toLong()chaque caractère, renvoyant une liste de nombres.
  • noter dans la réponse que la variable aa été insérée, les lignes de repère supprimées, etc.
Matias Bjarland
la source
6

Toile , 45 octets

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

Essayez-le ici!

Explication:

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

Les abus "et cela n'a pas besoin d'être cohérent", ce qui le rend assez inintelligible.

dzaima
la source
Umm ... une chance d'explication?
Matias Bjarland
1
@MatiasBjarland bien que ce soit principalement la manipulation de pile et le reste que je comprends à peine, là-bas.
dzaima
4

Python 2 , 197 190 octets

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

Essayez-le en ligne!

-6 octets, merci à Andrew Dunai

TFeld
la source
Vous pouvez économiser 6 octets en remplaçant la ligne 5 vers x,y,p='@| 'et en utilisant pau lieu de' '
Andrew Dunai
1
@andrewdunai thanks :)
TFeld
4

Python 2 , 157 octets

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

Essayez-le en ligne!

Lynn
la source
3

Fusain , 63 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

≔÷⌈EθLι²η

Calculez le nombre d'espaces dans chaque moitié d'un podium.

F³«

Faites une boucle sur chaque endroit. Notez que l'entrée devrait être dans l'ordre 2e, 1er, 3e.

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

Position au début de la ligne qui contiendra le texte.

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

Sortez le texte avec suffisamment de remplissage gauche pour le centrer.

≔⁻⁷ⅉι

Obtenez la hauteur du podium.

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

Dessinez le podium.

Approche alternative, également 63 octets:

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

≔÷⌈EθLι²η

Calculez le nombre d'espaces dans chaque moitié d'un podium.

F³«

Faites une boucle sur chaque endroit. Notez que l'entrée devrait être dans l'ordre 2e, 1er, 3e.

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

Position au début de la ligne qui contiendra le texte.

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

Sortez le texte avec suffisamment de remplissage gauche pour le centrer.

⪫@-@×-η⟧

Sortez également le haut du podium en insérant des -s entre les caractères de la chaîne @-@pour atteindre la bonne largeur.

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

Imprimez le reste du podium en espaçant le |s de manière appropriée, sauf que le caractère du milieu est un @sur la première ligne.

Neil
la source
3

R 308 302 299

-6 octets grâce à @JAD
-3 octets grâce à @Guiseppe, maintenant j'ai moins 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='')}

Il existe probablement un meilleur moyen de créer la mise en page; Je devrais essayer quelles options j'ai pour les trames de données.

Essayez-le en ligne

CT Hall
la source
2
chapeau à toi pour avoir fait un défi ascii-art variable dans R ... jamais amusant à faire. Vous pouvez enregistrer 3 octets en utilisant i=max(1,nchar(a)%/%2). La génération d'un matrixet l'utilisation writepeuvent être plus courtes (plutôt qu'un data.frame). Je suggère d'utiliser formatavec j="c"pour justifier automatiquement les choses, et strrepest également utile dans ce cas. Peut-être essayez le salon de discussion golfR pour faire rebondir vos idées?
Giuseppe
Ouais, je ne savais pas à quel point ça allait être difficile. J'ai appris un peu, surtout je devrais mieux apprendre Python, ou commencer à apprendre Perl :). J'avais oublié strrep; Je vais devoir examiner cela.
CT Hall
2

Nettoyer , 209 octets

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

Essayez-le en ligne!

Οurous
la source
2

Python 2 , 188 octets

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

Essayez-le en ligne!

-5 grâce à TFeld .

Erik le Outgolfer
la source
2

PHP, 147 octets

joué 93 octets de mon idée initiale, un simple <?=:

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

prend les noms des arguments de ligne de commande. Courez avec -nrou essayez-le en ligne .
Nécessite PHP 7; renvoie des avertissements en PHP 7.2 (et plus tard, probablement). Voir TiO pour un correctif de +5 octets.

cartographie:

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

panne:

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
;

Le pré-incrément pour $ime sauve de toutes les astuces pour les nouvelles lignes.
L' 6espace pour peut également être vide; donc je l'ai fait.
Mais utiliser $argv[0]pour la chaîne de bordure supérieure -était le plus beau golf de tous les temps. (et économisé 9 octets!)

Titus
la source
2

Go, 436 octets

Aller est terrible pour le golf. Mais:

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

En panne:

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
la source
1

Java 8, 399 394 373 octets

Cette solution est probablement beaucoup trop longue, mais c'est une solution :)

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 octets enregistrés en itérant directement dans l'ordre (a = 1,0,2 au lieu 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;}

21 octets enregistrés grâce à @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;}

Comme l'a suggéré @KevinCruijssen, on pourrait également utiliser à la varplace de StringJava 10+ et enregistrer quelques octets supplémentaires. Je ne le fais pas pour la simple raison que je n'ai pas encore Java 10: D aussi, des lambdas pourraient être utilisés. Mais cela ne réduirait la quantité d'octets que si nous omettions de l'affecter à une Function<String[],String>variable.

Sous forme développée:

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

L'entrée doit être donnée sous la Stringforme d'un tableau de longueur 3. Un exemple ressemble à ceci:

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

Sortie:

          Anthony          
         @-------@         
 Bertram |   @   |         
@-------@|   |   |         
|   @   ||   |   | Carlos  
|   |   ||   |   |@-------@
|   |   ||   |   ||   @   |
bruderjakob17
la source
1
Bonne réponse et bienvenue chez PPCG! +1 de moi! Voici quelques éléments de base pour jouer au golf pour en faire 342 octets : Java 8+ lambda au lieu de la méthode régulière; Java 10+ varau lieu de String; rempli le tableau de longueurs avec une boucle pour chaque; changé if(m%2==0)m++;if(m==3)m=5;pour m+=m%2<1?m==2?3:1:0le même effet; changé tout %nr==0en %nr<1; changé le %(m-1)en %~-m; mettez tout à l'intérieur de la boucle elle-même afin que les supports {}puissent être retirés.
Kevin Cruijssen
Si vous ne l'avez pas encore vu, Astuces pour jouer au golf en Java et Astuces pour jouer au golf dans <toutes les langues> peuvent être intéressantes à lire. Profitez de votre séjour!
Kevin Cruijssen
@KevinCruijssen bien, merci beaucoup! Je mettrai à jour le message!
bruderjakob17
Suggérer m-l[a]>>1au lieu de (m-l[a])/2et i<k+2?" ":j%~-m<1?"|":j==m/2?i==k+2?"@":"|"au lieu dei>=k+2?j%~-m<1?"|":j==m/2?i==k+2?"@":"|":" "
plafondcat
1

C (GCC) 302 293 292 289 287 octets

-6 octets grâce au plafond

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

Exécutez-le ici

Non golfé et expliqué (techniquement, vous ne pouvez pas avoir de commentaires après les barres obliques inverses dans les macros, donc cela ne fonctionnera pas)

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

Voici le code d'appel

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

et sortie

         Tom         
       @-----@       
  Anne |  @  |       
@-----@|  |  |       
|  @  ||  |  |  Sue  
|  |  ||  |  |@-----@
|  |  ||  |  ||  @  |
rtpax
la source
Suggérer à la for(;i--;memset(D+1,45,w))w=w<(L[i]=strlen(N[i]))?L[i]|1:w;place defor(;i--;)w=w<(L[i]=strlen(N[i]))?L[i]|1:w;memset(D+1,45,w);
plafondcat
1

PowerShell pour Windows, 231 223 octets

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

Essayez-le en ligne!

L'entrée est un tableau @('second','first','third'). Version déroulée:

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
la source