Zbuduj podium ASCII

26

Podczas zawodów sportowych często zdarza się, że zwycięzcy są prezentowani na podium, z osobą zajmującą pierwsze miejsce na najwyższym środku, drugą osobę na średnim wzroście po lewej stronie, a trzecią osobę na najniższym i w prawo. Tutaj odtworzymy to za pomocą specjalnych poprawek.

Podium są przedstawione poniżej:

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

Będzie to stanowić podstawę tego wyzwania. Następnym krokiem jest, aby podium były wystarczająco szerokie, aby pasowały do ​​ludzi (drukowane ciągi ASCII), które są na nich. Chcemy jednak zapewnić estetyczne piękno (ponieważ jest to fantastyczna okazja do zrobienia zdjęcia), dlatego każde podium musi mieć tę samą szerokość, a szerokość musi być nieparzysta. Dodatkowo ludzie (oczywiście) będą chcieli stać na środku podium, więc struny muszą być wyśrodkowane tak dobrze, jak to możliwe. (Można wyrównać do lewej lub prawej strony i nie musi być spójna.) Powyższe podium mają minimalny rozmiar i są uważane za3 szerokie.

Na przykład, biorąc pod uwagę dane wejściowe ["Tom", "Ann", "Sue"]reprezentujące odpowiednio pierwsze, drugie i trzecie miejsce, wypisz następujące podium:

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

Jeśli jednak Annezamiast tego Annbędziemy musieli przejść do następnego rozmiaru 5i wyśrodkować łańcuchy najlepiej jak to możliwe. Tutaj wyrównuję, więc „dodatkowa” litera Anneznajduje się po lewej stronie środka, ale możesz wybrać, do której strony chcesz wyrównać.

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

Poszukajmy dłuższych nazw. Co powiesz na ["William", "Brad", "Eugene"]:

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

Tutaj widzimy, że Bradma dużo białych znaków, Eugenemniej, i Williampasuje dokładnie.

W przypadku dłuższego przypadku testowego, co powiesz na ["A", "BC", "DEFGHIJKLMNOPQRSTUVWXYZ"]:

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

Wreszcie mamy najmniejszy możliwy wkład, taki jak ["A", "B", "C"]:

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

  • Dane wejściowe i wyjściowe można podać dowolną dogodną metodą .
  • Dane wejściowe są gwarantowane jako niepuste (tzn. Nigdy nie otrzymasz ""nazwy).
  • Możesz wydrukować go do STDOUT lub zwrócić jako wynik funkcji.
  • Dopuszczalny jest pełny program lub funkcja.
  • Dopuszczalna jest dowolna ilość obcych białych znaków, o ile znaki są odpowiednio ustawione w jednej linii.
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
AdmBorkBork
źródło
Czy wszystkie nazwy o równej długości muszą być wyrównane w tym samym kierunku?
Sparr
1
Dlaczego podium w ostatnim przykładzie wyjściowym ma długość 3 zamiast długości 1?
bruderjakob17
3
@bruderjakob na początku stwierdza: „podium powyżej jest minimalnym rozmiarem i uważa się je za 3 szerokie”
rtpax

Odpowiedzi:

9

JavaScript (ES8), 196 bajtów

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)

Wypróbuj online!

Arnauld
źródło
7

Groovy , 187 , 176 , 156 , 150 bajtów

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

Wypróbuj online!

(uwaga: interpreter tio groovy nie był w stanie obsłużyć indeksowania list przy użyciu wartości Long, mimo że groovy 2.5.6 potrafi. Zatem odpowiedź tio *.toShort()zamiast tego *.toLong()dodaje bajt)

Definiuje zamknięcie, fktóre można wywołać za pomocą:

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

gdzie fzwraca ciąg.

Wyjaśnienie:

Przestrzegamy kodu, mamy:

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-> - zdefiniować zamknięcie f za pomocą jednego parametru n
  • m=n*.size().max()|1 - znajdź maksymalną nazwę len, binarną lub nieparzystą liczbę
  • h=' '*(m/2) - h będzie zawierać przestrzenie podłogowe (m / 2), wykorzystane później
  • a=...- tworzy listę kodowania z elementami:
    • indeksy 0,1,2 - nazwy, wyśrodkowane do maksymalnej długości
    • indeks 3 - m + 2 spacje
    • indeks 4 - @---@wzór wyściełany do len
    • indeks 5 - | @ | wzór wyściełany do len
    • indeks 6 - | | |wzór wyściełany do len
    • indeks 7 - nowa linia
  • '307...'*.toLong().sum{a[it]}- użyj wskaźników na liście kodowania, aby zbudować wynik. .sumwykorzystuje fakt, że ciąg + ciąg w groovy jest poprawny.
  • zwróć uwagę, że do wywołania wyrażenie '3073...'*.toLong()używa *.operatora rozkładaniatoLong() każdego znaku, zwracając listę liczb.
  • zauważ w odpowiedzi zmienną awstawiono, usunięto linie zerowe itp.
Matias Bjarland
źródło
6

Płótno , 45 bajtów

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

Wypróbuj tutaj!

Wyjaśnienie:

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

Nadużycia „i nie muszą być konsekwentne”, co czyni go dość niezrozumiałym.

dzaima
źródło
Umm ... masz szansę na wyjaśnienie?
Matias Bjarland,
1
@MatiasBjarland, chociaż jest to głównie manipulacja stosami, a reszty ledwo rozumiem, tam.
dzaima
4

Python 2 , 197 190 bajtów

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

Wypróbuj online!

-6 bajtów, dzięki Andrew Dunai

TFeld
źródło
Możesz zapisać 6 bajtów, zastępując wiersz 5 x,y,p='@| 'i używając pzamiast' '
Andrew Dunai
1
@andrewdunai dzięki :)
TFeld
4

Python 2 , 157 bajtów

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

Wypróbuj online!

Lynn
źródło
3

Węgiel drzewny , 63 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

≔÷⌈EθLι²η

Oblicz liczbę miejsc w każdej połowie podium.

F³«

Pętla nad każdym miejscem. Należy pamiętać, że dane wejściowe powinny być w kolejności 2, 1, 3.

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

Ustaw na początku linii, która będzie zawierać tekst.

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

Wydrukuj tekst z wystarczającą ilością lewej dopełnienia, aby go wyśrodkować.

≔⁻⁷ⅉι

Uzyskaj wysokość podium.

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

Narysuj podium.

Alternatywne podejście, również 63 bajty:

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

≔÷⌈EθLι²η

Oblicz liczbę miejsc w każdej połowie podium.

F³«

Pętla nad każdym miejscem. Należy pamiętać, że dane wejściowe powinny być w kolejności 2, 1, 3.

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

Ustaw na początku linii, która będzie zawierać tekst.

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

Wydrukuj tekst z wystarczającą ilością lewej dopełnienia, aby go wyśrodkować.

⪫@-@×-η⟧

Wyjmij także szczyt podium, wstawiając -s między znakami łańcucha, @-@aby osiągnąć odpowiednią szerokość.

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

Wydrukuj pozostałą część podium, odpowiednio rozmieszczając |litery s, z wyjątkiem tego, że środkowy znak znajduje się @w pierwszym rzędzie.

Neil
źródło
3

R 308 302 299

-6 bajtów dzięki @JAD
-3 bajtów dzięki @Guiseppe, teraz mam mniej niż 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='')}

Prawdopodobnie istnieje lepszy sposób na utworzenie układu; Powinienem spróbować, jakie opcje mam dla ramek danych.

Wypróbuj online

CT Hall
źródło
304 bajty
JAD
2
czapki z głów dla ciebie za wykonanie zmiennego ascii-artowego wyzwania w R ... nigdy nie jest zabawne. Możesz zapisać 3 bajty za pomocą i=max(1,nchar(a)%/%2). Generowanie matrixi używanie writemoże być krótsze (a nie a data.frame). Sugeruję użycie opcji formatz j="c"do automatycznego uzasadniania rzeczy, i strrepjest to również pomocne w tym przypadku. Może wypróbuj pokój na czacie golfR, aby odrzucić pomysły?
Giuseppe
Tak, nie zdawałem sobie sprawy, jak trudno będzie w to wejść. Nauczyłem się trochę, głównie powinienem lepiej nauczyć się języka Python lub zacząć uczyć się Perla :). Zapomniałem o strrep; Będę musiał to sprawdzić.
CT Hall
2

Czysty , 209 bajtów

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

Wypróbuj online!

Obrzydliwe
źródło
2

Python 2 , 188 bajtów

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

Wypróbuj online!

-5 dzięki TFeld .

Erik the Outgolfer
źródło
2

PHP, 147 bajtów

oderwałem 93 bajty od mojego początkowego pomysłu, wprost <?=:

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

pobiera nazwy z argumentów wiersza poleceń. Uruchom -nrlub wypróbuj online .
Wymaga PHP 7; wyświetla ostrzeżenia w PHP 7.2 (i prawdopodobnie później). Zobacz TiO dla poprawki +5 bajtów.

mapowanie:

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

awaria:

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
;

Wstępny przyrost dla $iratuje mnie przed wszelkimi sztuczkami dla nowych linii.
Puste dla 6może również być puste; więc to zrobiłem.
Ale użycie $argv[0]górnego łańcucha granicznego -było najprzyjemniejszym golfem w historii. (i zapisano 9 bajtów!)

Tytus
źródło
2

Idź, 436 bajtów

Go jest okropny dla golfa. Ale:

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

Zepsuty:

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
źródło
1

Java 8, 399 394 373 bajtów

To rozwiązanie jest prawdopodobnie zbyt długie, ale jest rozwiązaniem :)

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

Zapisano 5 bajtów, bezpośrednio iterując w kolejności (a = 1,0,2 zamiast 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;}

Zapisano 21 bajtów dzięki @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;}

Jak sugerował @KevinCruijssen, można także użyć varzamiast Stringw Javie 10+ i zapisać dodatkowe bajty. Nie robię tego z tego prostego powodu, że nie mam jeszcze Java 10: D można również użyć lambd. Ale zmniejszyłoby to tylko liczbę bajtów, gdybyśmy pominęli przypisywanie jej do Function<String[],String>zmiennej.

W rozszerzonej formie:

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

Dane wejściowe należy podać jako- Stringmacierz długości 3. Przykład wygląda następująco:

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

Wydajność:

          Anthony          
         @-------@         
 Bertram |   @   |         
@-------@|   |   |         
|   @   ||   |   | Carlos  
|   |   ||   |   |@-------@
|   |   ||   |   ||   @   |
bruderjakob17
źródło
1
Ładna odpowiedź i witamy w PPCG! +1 ode mnie! Oto kilka podstawowych rzeczy do gry w golfa, aby uzyskać 342 bajty : Java 8+ lambda zamiast zwykłej metody; Java 10+ varzamiast String; wypełnił tablicę długości pętlą dla każdego; zmieniono if(m%2==0)m++;if(m==3)m=5;na m+=m%2<1?m==2?3:1:0dla tego samego efektu; zmienił wszystko %nr==0na %nr<1; zmienił %(m-1)się %~-m; włóż wszystko do samej pętli, aby nawiasy {}mogły zostać usunięte.
Kevin Cruijssen
Jeśli jeszcze tego nie widziałeś, porady dotyczące gry w golfa w Javie i Wskazówki dotyczące gry w golfa w <wszystkich językach> mogą być interesujące. Miłego pobytu!
Kevin Cruijssen
@KevinCruijssen w porządku, dziękuję bardzo! Zaktualizuję posta!
bruderjakob17
Zaproponuj m-l[a]>>1zamiast (m-l[a])/2i i<k+2?" ":j%~-m<1?"|":j==m/2?i==k+2?"@":"|"zamiasti>=k+2?j%~-m<1?"|":j==m/2?i==k+2?"@":"|":" "
ceilingcat
1

C (GCC) 302 293 292 289 287 bajtów

-6 bajtów dzięki pułapce cat

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

Uruchom tutaj

Niegolfowane i wyjaśnione (technicznie nie możesz mieć komentarzy po ukośnikach w makrach, więc to nie będzie działać)

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

Oto kod wywołujący

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

i wyjście

         Tom         
       @-----@       
  Anne |  @  |       
@-----@|  |  |       
|  @  ||  |  |  Sue  
|  |  ||  |  |@-----@
|  |  ||  |  ||  @  |
rtpax
źródło
Sugeruj for(;i--;memset(D+1,45,w))w=w<(L[i]=strlen(N[i]))?L[i]|1:w;zamiastfor(;i--;)w=w<(L[i]=strlen(N[i]))?L[i]|1:w;memset(D+1,45,w);
ceilingcat
1

PowerShell dla Windows, 231 223 bajtów

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

Wypróbuj online!

Dane wejściowe to tablica @('second','first','third'). Wersja rozwinięta:

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
źródło