สร้าง ASCII Podiums


26

ในการแข่งขันกีฬามักจะเกิดขึ้นที่ผู้ชนะจะได้รับการนำเสนอบนโพเดียมโดยมีผู้ชนะอันดับที่หนึ่งในอันดับที่สูงที่สุดในกลางคนที่สองที่อยู่ในระดับความสูงกลางไปทางซ้ายและคนที่สามที่อยู่ต่ำสุดและต่ำสุด ไปทางขวา. เราจะสร้างใหม่ที่นี่ด้วยการปรับแต่งพิเศษ

โพเดียมนำเสนอด้านล่าง:

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

สิ่งนี้จะเป็นพื้นฐานสำหรับความท้าทายนี้ ขั้นตอนต่อไปคือการทำให้แท่นกว้างพอที่จะใส่คน (สตริง ASCII ที่พิมพ์ได้) ที่อยู่บนพวกเขา อย่างไรก็ตามเราต้องการให้มั่นใจในความงามที่สวยงาม (เพราะนี่เป็นโอกาสในการถ่ายภาพที่ยอดเยี่ยม) ดังนั้นแต่ละแท่นจะต้องมีความกว้างเท่ากันและความกว้างจะต้องแปลก นอกจากนี้ผู้คนจะ (เห็นได้ชัด) ต้องการยืนอยู่ตรงกลางแท่นดังนั้นสตริงจะต้องอยู่กึ่งกลางที่ดีที่สุดเท่าที่จะทำได้ (คุณสามารถจัดตำแหน่งไปทางซ้ายหรือขวาและไม่จำเป็นต้องสอดคล้องกัน) podiums ด้านบนมีขนาดต่ำสุดและถือว่า3กว้าง

ตัวอย่างเช่นเนื่องจากอินพุตที่["Tom", "Ann", "Sue"]แสดงถึง first-, second- และ Third-place ตามลำดับให้เอาต์พุต podiums ต่อไปนี้:

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

อย่างไรก็ตามหากเรามีAnneแทนAnnเราจะต้องขึ้นไปที่ขนาดถัดไป5และจัดกึ่งกลางสตริงให้ดีที่สุดเท่าที่จะทำได้ ที่นี่ฉันกำลังจัดตำแหน่งดังนั้นตัวอักษร "พิเศษ" ของAnneอยู่ทางด้านซ้ายของกึ่งกลาง แต่คุณสามารถเลือกด้านที่จะจัดตำแหน่ง

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

ลองหาชื่ออีกต่อไป เกี่ยวกับ["William", "Brad", "Eugene"]:

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

ที่นี่เราจะเห็นว่าBradมีช่องว่างจำนวนมากEugeneน้อยกว่าและWilliamพอดีพอดี

สำหรับกรณีทดสอบที่ยาวขึ้นวิธีการเกี่ยวกับ["A", "BC", "DEFGHIJKLMNOPQRSTUVWXYZ"]:

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

สุดท้ายเรามีอินพุตที่เล็กที่สุดเท่าที่จะเป็นไปได้เช่น["A", "B", "C"]:

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

  • เข้าและส่งออกจะได้รับโดยวิธีการที่สะดวกใด
  • ข้อมูลเข้ามีการรับประกันว่าไม่ว่างเปล่า (เช่นคุณจะไม่ได้รับ""ชื่อ)
  • คุณสามารถพิมพ์ลงใน STDOUT หรือส่งคืนเป็นผลลัพธ์ของฟังก์ชัน
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น
  • สามารถยอมรับช่องว่างที่ไม่เกี่ยวข้องใด ๆ ได้ตราบใดที่อักขระมีการจัดเรียงอย่างเหมาะสม
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

ชื่อที่มีความยาวเท่ากันทั้งหมดจะต้องจัดตำแหน่งในทิศทางเดียวกันหรือไม่?
Sparr

1
เหตุใดโพเดียมในผลลัพธ์ตัวอย่างสุดท้ายจึงมีความยาว 3 แทนที่จะเป็นความยาว 1
bruderjakob17

3
@bruderjakob เขากล่าวว่าในตอนต้น "podiums ด้านบนมีขนาดต่ำสุดและถือว่ากว้าง 3"
rtpax

คำตอบ:



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

ลองออนไลน์!

(หมายเหตุ: ล่าม tio groovy ไม่สามารถจัดการรายการการจัดทำดัชนีโดยใช้ค่า Long แม้ว่า groovy 2.5.6 สามารถดังนั้นคำตอบ tio ใช้*.toShort()แทนการ*.toLong()เพิ่ม byte)

กำหนดการปิดfซึ่งสามารถเรียกผ่าน:

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

โดยที่fส่งคืนสตริง

คำอธิบาย:

รหัสที่ทำให้ไม่งงงวยเรามี:

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-> - กำหนดการปิด f ด้วยหนึ่งในพารามิเตอร์ n
  • m=n*.size().max()|1 - ค้นหาชื่อสูงสุด len, เลขฐานสองหรือเป็นเลขคี่
  • h=' '*(m/2) - h จะมีช่องว่างของพื้น (m / 2) ที่ใช้ในภายหลัง
  • a=...- สร้างรายการเข้ารหัสด้วยองค์ประกอบ:
    • ดัชนี 0,1,2 - ชื่อซึ่งอยู่กึ่งกลางไปที่ max len
    • ดัชนี 3 - m + 2 ช่องว่าง
    • ดัชนี 4 - @---@รูปแบบ, เบาะเพื่อ len
    • ดัชนี 5 - | @ |รูปแบบ, เบาะเพื่อ len
    • ดัชนี 6 - | | |รูปแบบ, เบาะเพื่อ len
    • ดัชนี 7 - ขึ้นบรรทัดใหม่
  • '307...'*.toLong().sum{a[it]}- ใช้ข้อบ่งชี้ในรายการการเข้ารหัสเพื่อสร้างผลลัพธ์ .sumใช้ข้อเท็จจริงว่า string + string ใน groovy นั้นถูกต้อง
  • โปรดทราบว่านิพจน์'3073...'*.toLong()ใช้ตัว*.ดำเนินการสเปรดเพื่อโทรหาtoLong()อักขระแต่ละตัวโดยส่งคืนรายการตัวเลข
  • สังเกตในคำตอบที่ตัวแปรaถูก inline, nelines ลบออก ฯลฯ

6

Canvas ขนาด 45 ไบต์

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

ลองที่นี่!

คำอธิบาย:

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

การละเมิด "และไม่จำเป็นต้องสอดคล้อง" ทำให้ไม่สามารถเข้าใจได้


อืมมมม ... โอกาสของคำอธิบายไหม?
Matias Bjarland

1
@ MatiasBjarland แม้ว่ามันจะเป็นสแต็คส่วนใหญ่และที่เหลือฉันแทบจะไม่เข้าใจมี
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

ลองออนไลน์!

-6 ไบต์ขอบคุณ Andrew Dunai


คุณสามารถบันทึก 6 ไบต์โดยแทนที่บรรทัด 5 เป็นx,y,p='@| 'และใช้pแทน' '
Andrew Dunai

1
@andrewdunai ขอบคุณ :)
TFeld


3

ถ่าน , 63 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

≔÷⌈EθLι²η

คำนวณจำนวนช่องว่างในแต่ละครึ่งของแท่น

F³«

วนรอบแต่ละสถานที่ โปรดทราบว่าอินพุตนั้นคาดว่าจะอยู่ในลำดับที่ 2, 1, 3

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

ตำแหน่งถึงจุดเริ่มต้นของบรรทัดที่จะมีข้อความ

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

เอาท์พุทข้อความที่มีช่องว่างภายในที่เหลือเพียงพอที่จะศูนย์มัน

≔⁻⁷ⅉι

รับความสูงของแท่น

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

วาดโพเดียม

ทางเลือกวิธี 63 ไบต์เช่นกัน:

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

≔÷⌈EθLι²η

คำนวณจำนวนช่องว่างในแต่ละครึ่งของแท่น

F³«

วนรอบแต่ละสถานที่ โปรดทราบว่าอินพุตนั้นคาดว่าจะอยู่ในลำดับที่ 2, 1, 3

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

ตำแหน่งถึงจุดเริ่มต้นของบรรทัดที่จะมีข้อความ

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

เอาท์พุทข้อความที่มีช่องว่างภายในที่เหลือเพียงพอที่จะศูนย์มัน

⪫@-@×-η⟧

เอาท์พุทด้านบนของโพเดียมโดยการแทรก-s ระหว่างอักขระของสตริง@-@เพื่อให้ได้ความกว้างที่ถูกต้อง

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

พิมพ์ส่วนที่เหลือของแท่นโดยเว้นวรรค|s อย่างเหมาะสมยกเว้นว่าตัวอักษรกลางนั้น@อยู่บนแถวแรก


3

R 308 302 299

-6 ไบต์ขอบคุณ @JAD
-3 ไบต์ขอบคุณ @Guiseppe ตอนนี้ฉันอายุไม่ถึง 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='')}

อาจเป็นวิธีที่ดีกว่าในการสร้างเค้าโครง ฉันควรลองใช้ตัวเลือกอะไรบ้างสำหรับกรอบข้อมูล

ลองออนไลน์



2
สวมหมวกออกไปสำหรับการทำสิ่งท้าทายASCIIแบบผันแปรในอาร์ ... ไม่เคยสนุกที่จะทำ คุณสามารถบันทึก 3 i=max(1,nchar(a)%/%2)ไบต์โดยใช้ การสร้างmatrixและการใช้writeอาจสั้นกว่า (แทนที่จะเป็นdata.frame) ฉันขอแนะนำให้ใช้formatกับj="c"เพื่อปรับสิ่งอัตโนมัติและstrrepเป็นประโยชน์อย่างหนึ่งในกรณีนี้เช่นกัน อาจลองห้องสนทนา golfRเพื่อตีกลับความคิด
Giuseppe

ใช่ฉันไม่ได้ตระหนักว่ามันจะยากขนาดไหน ฉันเรียนรู้เพียงเล็กน้อยส่วนใหญ่ฉันควรเรียนรู้ Python ให้ดีขึ้นหรือเริ่มเรียนรู้ Perl :) ฉันลืมไปstrrepแล้ว ฉันจะต้องดูว่า
CT Hall



2

PHP, 147 ไบต์

golfed 93 bytes จากความคิดเริ่มแรกของฉัน<?=:

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

ใช้ชื่อจากอาร์กิวเมนต์บรรทัดคำสั่ง ทำงานด้วย-nrหรือลองออนไลน์
ต้องการ PHP 7; ให้คำเตือนใน PHP 7.2 (และหลังจากนั้นอาจสันนิษฐานได้) ดู TiO สำหรับการแก้ไข +5 ไบต์

การทำแผนที่:

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

ทำให้พังถล่ม:

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
;

การเพิ่มล่วงหน้าสำหรับ$iบันทึกฉันจากกลอุบายใด ๆ สำหรับบรรทัดใหม่
ช่องว่างสำหรับ6ยังสามารถว่างได้ ดังนั้นฉันจึงทำอย่างนั้น
แต่การใช้$argv[0]เชือกเส้นขอบด้านบน-เป็นสนามกอล์ฟที่อร่อยที่สุดที่เคยมีมา (และบันทึกแล้ว 9 ไบต์!)


2

ไป 436 ไบต์

ไปเป็นสิ่งที่แย่มากสำหรับการเล่นกอล์ฟ แต่:

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

พังทลายลง:

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

วิธีนี้อาจจะยาวเกินไป แต่มันก็เป็นทางออก :)

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 ไบต์โดยวนซ้ำโดยตรงตามลำดับ (a = 1,0,2 แทน 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 ไบต์ขอบคุณ @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;}

ตามที่ @KevinCruijssen แนะนำเราสามารถใช้varแทนStringใน Java 10+ และบันทึกไบต์พิเศษบางอย่างได้ ฉันไม่ได้ทำสิ่งนี้ด้วยเหตุผลง่ายๆที่ฉันยังไม่มี Java 10: D เช่นกันสามารถใช้ lambdas ได้ แต่นี่จะลดจำนวนไบต์เท่านั้นหากเราไม่ได้กำหนดค่าให้กับFunction<String[],String>ตัวแปร

ในรูปแบบขยาย:

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

อินพุตจะต้องได้รับเป็น - Stringความยาว 3 ตัวอย่างเช่นนี้:

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

เอาท์พุท:

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

1
คำตอบที่ดีและยินดีต้อนรับสู่ PPCG! +1 จากฉัน! นี่คือบางสิ่งพื้นฐานในการเล่นกอล์ฟเพื่อให้มีขนาด 342 ไบต์ : Java 8+ แลมบ์ดาแทนที่จะใช้วิธีปกติ Java 10+ varแทนString; เติมความยาวด้วยลูปสำหรับแต่ละลูป เปลี่ยนif(m%2==0)m++;if(m==3)m=5;ไปm+=m%2<1?m==2?3:1:0สำหรับผลเดียวกัน; เปลี่ยนทั้งหมด%nr==0เป็น%nr<1; เปลี่ยน%(m-1)ไป%~-m; ใส่ทุกอย่างไว้ในลูปเพื่อให้{}สามารถลบวงเล็บได้
Kevin Cruijssen

หากคุณยังไม่เคยเห็นเคล็ดลับสำหรับการเล่นกอล์ฟใน Javaและเคล็ดลับสำหรับการเล่นกอล์ฟใน <ทุกภาษา>อาจเป็นเรื่องที่น่าสนใจสำหรับการอ่าน เพลิดเพลินไปกับการพักผ่อนของคุณ!
Kevin Cruijssen

@KevinCruijssen ไม่เป็นไรขอบคุณมาก! ฉันจะอัปเดตโพสต์!
bruderjakob17

แนะนำm-l[a]>>1แทน(m-l[a])/2และi<k+2?" ":j%~-m<1?"|":j==m/2?i==k+2?"@":"|"แทนที่i>=k+2?j%~-m<1?"|":j==m/2?i==k+2?"@":"|":" "
ceilingcat

1

C (GCC) 302 293 292 289 287 ไบต์

-6 ไบต์ขอบคุณที่แมวเพดาน

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

เรียกใช้ที่นี่

Ungolfed และอธิบาย (โดยทางเทคนิคแล้วคุณไม่สามารถมีความคิดเห็นหลังจากแบ็กสแลชในมาโครดังนั้นสิ่งนี้จะไม่ทำงาน)

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

นี่คือรหัสการโทร

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

และเอาท์พุท

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

แนะนำfor(;i--;memset(D+1,45,w))w=w<(L[i]=strlen(N[i]))?L[i]|1:w;แทนfor(;i--;)w=w<(L[i]=strlen(N[i]))?L[i]|1:w;memset(D+1,45,w);
ceilingcat

1

PowerShellสำหรับ Windows, 231 223 ไบต์

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

ลองออนไลน์!

@('second','first','third')การป้อนข้อมูลเป็นอาร์เรย์ รุ่นที่ไม่ได้ควบคุม:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.