1P5: กล่องซ้อน


53

งานนี้เป็นส่วนหนึ่งของครั้งแรกงวดพรีเมียร์โปรแกรมปริศนากด

คุณได้รับลำดับชั้นของรายการในรูปแบบต่อไปนี้:

2
Hat
1
Gloves

ซึ่งจะต้องใส่ในกล่องเช่น:

.------------.
| Hat        |
| .--------. |
| | Gloves | |
| '--------' |
'------------'

ในรูปแบบการป้อนข้อมูลตัวเลขเริ่มต้นกล่องที่มีรายการให้มากที่สุดเท่าที่จำนวนที่ระบุ กล่องแรกมีสองรายการอยู่ในนั้น (หมวกและกล่องที่มีถุงมือ) ส่วนที่สองมีเพียงรายการเดียวเท่านั้น - ถุงมือ

อย่างที่เห็นกล่องสามารถอยู่ในกล่องได้เช่นกัน และพวกมันจะถูกปัดเศษเสมอ ... เรียงลำดับของ (มุมแหลมเป็นอันตรายจากบาดแผลและเราไม่ต้องการมัน)

ด้านล่างนี้มีรายละเอียดที่น่ารังเกียจสำหรับผู้ที่ต้องการใช้ประโยชน์จากทุก ๆ ส่วนที่ข้อกำหนดให้ ใจคุณการไม่อ่านสเป็คนั้นเป็นข้อแก้ตัวสำหรับการส่งคำตอบที่ผิด ในตอนท้ายจะมีสคริปต์ทดสอบและกรณีทดสอบบางกรณี


สเปค

  • กล่องถูกสร้างขึ้นจากตัวละครต่อไปนี้:

    • | (U + 007C) ใช้สำหรับสร้างขอบแนวตั้ง
    • - (U + 002D) ใช้เพื่อสร้างขอบแนวนอน
    • ' (U + 0027) คือมุมล่างของวงกลม
    • . (U + 002E) คือมุมบนของวงกลม

    กล่องมีลักษณะดังนี้:

    .--.
    |  |
    '--'
    

    โปรดทราบว่าในขณะที่ Unicode นั้นมีมุมโค้งมนและอักขระวาดรูปกล่องที่เหมาะสมงานนี้เป็นแบบ ASCII เท่านั้น เท่าที่ฉันรัก Unicode ฉันรู้ว่ามีภาษาและสภาพแวดล้อมที่นั่นซึ่งไม่ค่อยประสบความสำเร็จในช่วงทศวรรษที่สองถึงทศวรรษที่ผ่านมา

  • กล่องสามารถมีลำดับของรายการที่เป็นข้อความหรือรายการอื่น ๆ แต่ละรายการในกล่องจะแสดงผลจากบนลงล่าง ลำดับ A, B, C จึงแสดงผลดังนี้:

    .---.
    | A |
    | B |
    | C |
    '---'
    

    แน่นอนนี้ใช้กับกล่องซ้อนกันเช่นกันซึ่งเป็นรายการที่เหมือนกับข้อความ ดังนั้นลำดับ A, B, Box (C, Box (D, E)), F จะแสดงผลดังนี้:

    .-----------.
    | A         |
    | B         |
    | .-------. |
    | | C     | |
    | | .---. | |
    | | | D | | |
    | | | E | | |
    | | '---' | |
    | '-------' |
    | F         |
    '-----------'
    
  • กล่องปรับขนาดให้เข้ากับเนื้อหาและกล่องที่ซ้อนกันจะขยายตามขนาดของพาเรนต์เสมอ มีช่องว่างทั้งก่อนและหลังเนื้อหาเสมอเพื่อไม่ให้ข้อความหรือกล่องซ้อนกันอยู่ใกล้กับขอบกล่องด้านนอกมากเกินไป กล่าวโดยย่อสิ่งต่อไปนี้ผิด

    .---.
    |Box|
    '---'
    

    และต่อไปนี้ถูกต้อง:

    .-----.
    | Box |
    '-----'
    

    ดูดีกว่าด้วย :-)

  • รายการข้อความ (ดูอินพุตด้านล่าง) จะต้องทำซ้ำอย่างแน่นอน

  • มีกล่องระดับบนสุดเสมอ (เปรียบเทียบ XML) อย่างไรก็ตามหนึ่งกล่องสามารถมีอีกหลายกล่อง

อินพุต

  • อินพุตได้รับจากอินพุตมาตรฐาน สำหรับการทดสอบที่เปลี่ยนเส้นทางได้ง่ายขึ้นจากไฟล์

  • อินพุตจะได้รับ Line-wise โดยแต่ละบรรทัดจะแทนรายการข้อความที่จะใส่ในกล่องปัจจุบันหรือเปิดกล่องใหม่

  • ทุกบรรทัดถูกยกเลิกโดยตัวแบ่งบรรทัด

  • รายการข้อความมีการทำเครื่องหมายโดยบรรทัดที่ไม่มีตัวเลข (ดูด้านล่าง) ข้อความใช้อักขระตัวอักษรช่องว่างและเครื่องหมายวรรคตอน ( .,-'"?!()) ข้อความจะไม่เริ่มต้นหรือลงท้ายด้วยเว้นวรรคและจะมีอักขระอย่างน้อยหนึ่งตัวเสมอ

  • กล่องเริ่มต้นด้วยบรรทัดเดียวที่มีตัวเลขอยู่ในนั้น จำนวนที่บอกขนาดของกล่องคือจำนวนรายการต่อไปนี้ที่ใส่ลงไป:

    2
    A
    B
    

    ให้กล่องที่มีรายการข้อความสองรายการ:

    .---.
    | A |
    | B |
    '---'
    

    กล่องจะมีอย่างน้อยหนึ่งรายการ

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

  • กล่องเป็นเพียงรายการเดียวเสมอไม่ว่าจะมีกี่รายการก็ตาม เช่น

    3
    A
    4
    a
    b
    c
    d
    B
    

    จะให้กล่องที่มีสามรายการที่สองเป็นอีกกล่องที่มีสี่รายการ

    การทำรังไม่ส่งผลกระทบต่อความจริงที่ว่ากล่องเป็นเพียงรายการเดียว

ขีด จำกัด

  • ระดับการทำรังสูงสุดคือห้า นั่นคือมีมากที่สุดห้ากล่องในแต่ละอื่น ๆ ซึ่งรวมถึงส่วนนอกสุด

  • มีมากถึงสิบรายการต่อกล่อง

  • รายการข้อความมีความยาวสูงสุด100อักขระ

เอาท์พุต

  • เอาท์พุทเป็นกล่องแสดงผลรวมถึงรายการที่มีและซ้อนอยู่ทั้งหมดตามกฎที่ระบุไว้ข้างต้น
  • ควรให้เอาต์พุตกับเอาต์พุตมาตรฐานและจะต้องตรงกันทั้งหมด ไม่อนุญาตให้นำช่องว่างนำหน้าหรือต่อท้าย
  • แต่ละบรรทัดต้องถูกยกเลิกด้วยการขึ้นบรรทัดใหม่รวมถึงบรรทัดสุดท้าย

สภาพการชนะ

  • รหัสที่สั้นที่สุดชนะ (เช่นได้รับคำตอบที่ยอมรับ)

ตัวอย่างอินพุต 1

3
This is some text!
Oh, more text?
Just text for now, as this is a trivial example.

ตัวอย่างผลลัพธ์ 1

.--------------------------------------------------.
| This is some text!                               |
| Oh, more text?                                   |
| Just text for now, as this is a trivial example. |
'--------------------------------------------------'

ตัวอย่างอินพุต 2

4
Extreme
nesting
3
of
boxes
4
might
lead
to
2
interesting
1
visuals.
Indeed!

ตัวอย่างผลลัพธ์ 2

.--------------------------.
| Extreme                  |
| nesting                  |
| .----------------------. |
| | of                   | |
| | boxes                | |
| | .------------------. | |
| | | might            | | |
| | | lead             | | |
| | | to               | | |
| | | .--------------. | | |
| | | | interesting  | | | |
| | | | .----------. | | | |
| | | | | visuals. | | | | |
| | | | '----------' | | | |
| | | '--------------' | | |
| | '------------------' | |
| '----------------------' |
| Indeed!                  |
'--------------------------'

ตัวอย่างอินพุต 3

1
1
1
1
1
Extreme nesting Part Two

ตัวอย่างผลลัพธ์ 3

.------------------------------------------.
| .--------------------------------------. |
| | .----------------------------------. | |
| | | .------------------------------. | | |
| | | | .--------------------------. | | | |
| | | | | Extreme nesting Part Two | | | | |
| | | | '--------------------------' | | | |
| | | '------------------------------' | | |
| | '----------------------------------' | |
| '--------------------------------------' |
'------------------------------------------'

ตัวอย่างอินพุต 4

3
Foo
2
Bar
Baz
2
Gak
1
Another foo?

ตัวอย่างผลลัพธ์ 4

.----------------------.
| Foo                  |
| .------------------. |
| | Bar              | |
| | Baz              | |
| '------------------' |
| .------------------. |
| | Gak              | |
| | .--------------. | |
| | | Another foo? | | |
| | '--------------' | |
| '------------------' |
'----------------------'

สคริปต์ทดสอบ

เนื่องจากการรับรายละเอียดที่ถูกต้องอาจเป็นเรื่องยากในบางครั้งที่เรา ( Venteroและฉัน) ได้เตรียมสคริปต์ทดสอบคุณสามารถเรียกใช้โซลูชันของคุณด้วยเพื่อตรวจสอบว่าถูกต้องหรือไม่ มันมีอยู่เป็นทั้งPowerShell สคริปต์และสคริปต์ทุบตี การขอร้องคือ: <test-script> <program invocation>.

UPDATE: สคริปต์ทดสอบได้รับการอัปเดตแล้ว มีหลายกรณีทดสอบที่ไม่เป็นไปตามขีด จำกัด ที่ฉันกำหนดไว้ สคริปต์ทดสอบ PowerShell ไม่ได้ใช้การเปรียบเทียบแบบตัวพิมพ์เล็ก - ใหญ่สำหรับการตรวจสอบผลลัพธ์ ฉันหวังว่าทุกอย่างเรียบร้อยดี จำนวนกรณีทดสอบลดลงเหลือ 156 แม้ว่ากรณีสุดท้ายจะค่อนข้างใหญ่ ...

UPDATE 2: ฉันฉันอัปโหลดกำเนิดทดสอบกรณี เขียนใน C #โดยกำหนดเป้าหมายเป็นรันไทม์. NET 2 มันวิ่งบนโมโน มันอาจช่วยให้ผู้คนทดสอบการใช้งานของพวกเขา เป็นกรณีที่เลวร้ายที่สุดที่ชัดเจนได้รับข้อ จำกัด ในงานที่คุณสามารถลอง:

nb.exe 1 10 10 5 100 100 | my invocation

ซึ่งจะสร้างเฉพาะกล่องจนถึงระดับสุดในและใช้ทั้งจำนวนสูงสุดของรายการต่อกล่องและความยาวสูงสุดของรายการข้อความ ฉันไม่ได้รวมกรณีทดสอบนี้ไว้ในสคริปต์ทดสอบเนื่องจากมีขนาดค่อนข้างใหญ่และมีขนาดใหญ่กว่า

อัปเดต3: ฉันอัปเดตสคริปต์ทดสอบ PowerShell ซึ่งมีแนวโน้มที่จะเกิดข้อผิดพลาดขึ้นอยู่กับว่าจุดสิ้นสุดของบรรทัดอยู่ในสคริปต์และบรรทัดใดที่ลงท้ายด้วยโซลูชันที่พิมพ์ ตอนนี้มันควรจะเป็นทั้งผู้ไม่เชื่อเรื่องพระเจ้า ขออภัยในความสับสนอีกครั้ง


คุณบอกว่าช่องควรปรับขนาดให้เข้ากับเนื้อหา แต่ในตัวอย่างสุดท้ายกล่องด้านในแรกปรับขนาดให้เป็นกล่องด้านนอก ดังนั้นกล่องที่ซ้อนกันจะมีขนาดอย่างไร
Juan

@ Juan: ขอบคุณสำหรับการจับที่ น่าแปลกที่สลิปอย่างที่เกิดขึ้น แก้ไข :-)
Joey

1
@ Joey An oldy แต่เป็นสิ่งที่ดี หวังว่ามันจะเป็นแรงบันดาลใจให้ผู้ใช้รายใหม่ ๆ ของเราเขียนคำถามที่ดีและตรงประเด็น :-)
Gareth

@ กาเร็ ธ ฉันควรพยายามหาเวลาที่จะเขียนสิ่งเหล่านั้นให้มากขึ้นอีกครั้ง แต่คำถามที่ระบุไว้อย่างดีกรณีทดสอบการใช้งานอ้างอิงและสิ่งต่าง ๆ (สิ่งที่ฉันพิจารณาว่าจำเป็นสำหรับการแข่งขัน แต่มุมมองนั้นไม่ได้ถูกแบ่งปันโดยหลายคน)) ต้องใช้เวลา มันง่ายขึ้นมากเมื่ออยู่ในมหาวิทยาลัย: D
Joey

คำตอบ:


2

GolfScript 125 ตัวอักษร

n/):B;[(~{[B"."+"""-"]B"| "+:B;@@{(.10,`-{[B\" "]\}{~A}if}*B[2>:B"'"+"""-"]\}:A~;].{~;1$++,}%$-1=:§;{~§3$.+3$+,-*+1$-1%++}%n*

โดยใช้วิธีการที่คล้ายกันเป็นวิธีการแก้ปัญหาของคี


26

Python, 204 ตัวอักษร

def P(n):x=raw_input();return eval('[(n+".","","-")]'+'+P(n+"| ")'*int(x))+[(n+"'",'','-')]if'0'<x<':'else[(n,x,' ')]
r=P('')
for q,t,f in r:print q+t+f*(max(len(2*x+y)for x,y,a in r)-len(2*q+t))+q[::-1]

Pส่งคืนรายการ triples ซึ่งแต่ละรายการเป็นส่วนนำหน้าของบรรทัด / คำต่อท้าย หลังจากคำนวณอเนกประสงค์ทั้งหมดแล้วพวกเขาจะถูกพิมพ์โดยใช้จำนวนอักขระเติมที่เหมาะสมเพื่อให้ทุกบรรทัดมีความยาวเท่ากัน

เวอร์ชันที่ไม่ถูกปรับแต่ง:

def get_lines(prefix):
  line=raw_input()
  result=[]
  if line.isdigit():
    result.append((prefix+'.', '', '-'))
    for i in xrange(int(line)):
      result += get_lines(prefix + '| ')
    result.append((prefix+"'", '', '-'))
  else:
    result.append((prefix, line, ' '))
  return result
lines=get_lines('')
width=max(2*len(prefix)+len(text) for prefix,text,fill in lines)
for prefix,text,fill in lines:
  print prefix+text+fill*(width-2*len(prefix)-len(text))+prefix[::-1]

โอ้โหนั่นเร็วมาก และความคิดที่น่าสนใจด้วยPนั่นเอง
Joey

ว้าวแน่นอน นี่เป็นเรื่องที่น่าสนใจคุณสามารถโพสต์เวอร์ชั่นที่ไม่ดี ฉันต้องการที่จะเข้าใจว่าบิต eval ทำงานอย่างไร Heh, โซลูชันงูใหญ่ของฉัน ungolfed คือ 1,500+ ตัวอักษร :( แม้ว่าฉันจะใช้วิธีที่แตกต่างกัน (และไม่มีประสิทธิภาพ) ที่แตกต่างกันโดยสิ้นเชิง
Casey

@Casey: eval เป็นเพียงช็อตเล่นกอล์ฟสำหรับวงมันไม่ใช่พื้นฐาน ฉันจะโพสต์เวอร์ชันที่ไม่ได้อัปโหลดในไม่กี่วินาที ...
Keith Randall

13

Ruby 1.9, 174 ตัวอักษร

r=->l{$*<<(l*2+i=gets.chop).size;/\d/?eval('[l+?.,p=?-,p,'+'*r["| "+l],'*i.to_i+"l+?',p,p]"):[l,i,?\s]}
r[""].each_slice(3){|a,b,c|puts a+b+c*($*.max-(a*2+b).size)+a.reverse}

ค่อนข้างคล้ายกับวิธีการแก้ปัญหาของคี


6

APL (78)

{∧/⎕D∊⍨I←⍞:{∆,('-'⍪⍵⍪'-'),∆←'.|'''/⍨1(⊃⍴⍵)1}⍕⍪/{⍵↑[2]⍨⌈/⊃∘⌽∘⍴¨∆}¨∆←∇¨⍳⍎I⋄⍉⍪I}⍬

5
นี่ฉันไม่ได้อะไรเลย
Nowayz

ฉันไม่สามารถเรียกใช้ tio.run เพื่อทดสอบวิธีแก้ปัญหาได้ มิฉะนั้นฉันจะเปลี่ยนคำตอบที่ยอมรับเช่นกัน
Joey

5

Python - 355 314 259 ตัวอักษร

w=0
def p(n,l):
 global w;f=[(l-1,0)]
 for k in' '*n:
  i=raw_input()
  try:f+=p(int(i),l+1)
  except:f+=[(l,i)];w=max(w,4*l+len(i))
 return f+[(l-1,1)]
for l,s in p(input(),1):p=w-4*l-2;print'| '*l+(".'"[s]+'-'*p+".'"[s]if s<2 else s+' '*(p+2-len(s)))+' |'*l

เกือบลด 100 ตัวอักษรเป็นงานที่ดี
Casey

5

ทับทิม 1.9, 229 228 226 223 222

g=->n{(1..n).map{g[Integer l=gets.chop]rescue l}}
w=->b{b.bytesize rescue b.map{|e|w[e]}.max+4}
p=->b,c{r=c-2
[?.+?-*r+?.,*b.map{|i|p[i,c-4]}.flatten.map{|k|"| #{k} |"},?'+?-*r+?']rescue[b.ljust(c)]}
puts p[b=g[1][0],w[b]]

5

C, 390 366 363 ตัวอักษร

#define F(n)for(int i=n;i--;)
#define H(n,s,a...)F(n)printf(s);printf(a);
#define I(s)H(v,"| ",s)H(l-2,"-",s)J
#define J H(v," |","\n")
S[1<<17][26],N[1<<17],P,a;E(p){int l=strlen(gets(S[p]));if(sscanf(S[p],"%d",N+p))F(N[p])l<(a=E(++P))?l=a:l;return l+4;}R(p,v,l){if(N[p]){I(".")F(N[p])R(++P,v+1,l-4);I("'")}else{H(v,"| ","%-*s",l,S[p])J}}main(){R(P=0,0,E(0)-4);}

รวบรวมกับ gcc -std=gnu99 -w file.c

ไม่ได้ใกล้เคียงกับรุ่นของ Keith แต่เดี๋ยวก่อนมันดี ol


ผ่านการทดสอบเพียง 159 จาก 160 ครั้งที่นี่
Joey

อุ๊ยตาย ฉันคิดว่าตอนนี้มันก็โอเค ฉันลืมจัดสรรพื้นที่สำหรับ \ 0 ในกรณีที่รุนแรง
esneider

ดูเหมือนว่าจะยังคงเหมือนเดิมการทดสอบ # 142 ล้มเหลว โดยวิธีการที่กรณีที่เกิดขึ้นจริงไม่ได้แม้กระทั่งในขณะที่มันมี 10 อินพุต MiB และเอาท์พุท 78 MiB ฉันไม่ต้องการให้สคริปต์ทดสอบมีขนาดใหญ่ ;-)
Joey

แปลกฉันได้รับ160/160 passed(ผมหมายถึงสตริงของ 100 ตัวอักษรซึ่งไม่อยู่ล่ะค่ะ)
esneider

หืมแปลก FreeBSD 8.2-RELEASE #5: Sun Feb 27 10:40:25 CET 2011ด้วยgcc version 4.2.1 20070719 [FreeBSD]บน x64 ที่นี่ ฉันจะใช้คำของคุณสำหรับ 160 แล้ว :-) และควรมีกรณีทดสอบที่มี 100 ตัวอักษรจริง ๆ (ทดสอบ 143–147)
Joey

4

หลามทำงานได้ดีมาก, 460 ตัวอักษร

r=range
s=lambda x:isinstance(x,str)
w=lambda x:reduce(max,[len(i)if s(i)else w(i)+4 for i in x])
z=lambda b,x:''.join(b for i in r(x))
def g(n=1):
 t=[]
 for i in r(n):
  x=raw_input('')
  try:t+=[g(int(x))]
  except:t+=[x]
 return t
o=list.append
def y(c,m):
 f='| ';h=' |';e=z('-',m+2);a='.'+e+'.';b="'"+e+"'";t=[a]
 for i in c:
  if s(i):o(t,f+i+z(' ',m-len(i))+h)
  else:[o(t,f+j+h)for j in y(i,m-4)]
 return t+[b]
x=g()[0];m=w(x);print '\n'.join(y(x,m))

หืมนี่ดูเหมือนจะไม่ได้ผลสำหรับฉัน|ตัวละครไม่ได้เว้นระยะอย่างถูกต้อง มันคล้ายกับโซลูชันงูหลามของฉันมาก
Casey

2
อันที่จริงไม่ได้ผ่านกรณีทดสอบใด ๆ eordano: เรารวมเอาไว้เพื่อที่จะไม่มีใครส่งคำตอบที่ผิดธรรมดาอีกต่อไป
Joey

1
ฉันเดาว่าฉันวางรหัสรุ่นเก่า ควรทำงานตอนนี้ ขออภัยที่ไม่เป็นมืออาชีพ
eordano

ใช้งานได้สำหรับฉัน! วิธีแก้ปัญหาที่ดีฉันชอบวิธีการทำงาน
Casey

แน่นอนใช้งานได้ในขณะนี้
Joey

4

Haskell, 297 ตัวอักษร

f§(a,b)=(f a,b)
h c=(c,'-',c)
b l=h".":map(\(p,f,q)->("| "++p,f,q++" |"))l++[h"'"]
y[]s z=([(s,' ',"")],z)
y[(n,_)]_ z=b§foldr(\_(l,w)->(l++)§x w)([],z)[1..n]
x(a:z)=y(reads a)a z
m(p,_,q)=length$p++q
n®a@(p,c,q)=p++replicate(n-m a)c++q++"\n"
o(l,_)=l>>=(maximum(map m l)®)
main=interact$o.x.lines

ในขณะที่ golf'd วิธีการที่ค่อนข้างตรงไปข้างหน้า ข้อ จำกัด เท่านั้นคือหน่วยความจำที่มีอยู่


4

C # - 1005 859 852 782 ตัวอักษร

using c=System.Console;using System.Linq;class N{static void Main(){new N();}N(){var i=R();c.WriteLine(i.O(0,i.G().W));}I R(){var s=c.ReadLine();int l=0,i=0;if(int.TryParse(s,out l)){var b=new I(l);for(;i<l;){b.m[i++]=R();}return b;}else{return new I(0,s);}}class P{public int W;public int H;}class I{public I[]m;bool z;string t;public I(int l,string r=""){z=l!=0;m=new I[l];t=r;}public P G(){var s=new P();if(z){var d=m.Select(i=>i.G());s.W=d.Max(y=>y.W)+4;s.H=d.Sum(y=>y.H)+2;}else{s.W=t.Length;s.H=1;}return s;}public string O(int l,int w){if(z){string s=A(l,"."+"-".PadRight(w-2,'-')+"."),e=s.Replace(".","'");foreach(var i in m){s+="\n"+i.O(l+1,w-4);}s+="\n"+e;return s;}else{return A(l,t.PadRight(w));}}}static string A(int l,string o){while(l-->0){o= "| "+o+" |";}return o;}}

ฉันต้องดูอีกครั้งในขณะที่ฉันแน่ใจว่ามันจะดีขึ้น แต่นี่เป็นครั้งแรกของฉันไปที่สามผ่านมัน

Ungolf'd:

using c=System.Console;
using System.Linq;

class NestedBoxes
{
    static void Main()
    {
        new NestedBoxes();
    }
    NestedBoxes()
    {
        var item = ReadItem();
        c.WriteLine(item.Print(0, item.GetSize().Width));
    }
    Item ReadItem()
    {
        var line = c.ReadLine();
        int count = 0, i = 0;
        if (int.TryParse(line, out count))
        {
            var box = new Item(count);
            for (; i < count;)
            {
                box.items[i++] = ReadItem();
            }
            return box;
        }
        else
        {

            return new Item(0,line);
        }
    }
    class Size
    {
        public int Width;
        public int Height;
    }
    class Item
    {
        public Item[] items;
        bool isBox;
        string text;
        public Item(int size,string word="")
        {
            isBox = size != 0; items = new Item[size]; text = word;
        }
        public Size GetSize()
        {
            var s = new Size();
            if (isBox)
            {
                var sizes = items.Select(i => i.GetSize());
                s.Width = sizes.Max(y => y.Width) + 4; s.Height = sizes.Sum(y => y.Height) + 2;
            }
            else
            {
                s.Width = text.Length;
                s.Height = 1;
            }
            return s;
        }
        public string Print(int level, int width)
        {
            if (isBox)
            {
                string output = AddLevels(level, "." + "-".PadRight(width - 2, '-') + "."),
                        bottomLine = output.Replace(".", "'");
                foreach (var item in items)
                {
                    output += "\n" + item.Print(level + 1, width - 4);
                }
                output += "\n" + bottomLine;
                return output;
            } else {return AddLevels(level, text.PadRight(width)); }
        }
    }
    static string AddLevels(int level, string output)
    {
        while(level-->0)
        {
            output = "| " + output + " |";
        }
        return output;
    }
}

@ โจอี้ใช่ฉันต้องผ่านมันอีกครั้ง จำเป็นต้องเล่นกับตรรกะเพื่อลองและตัดมันด้วย
Rebecca Chernoff

ฉันไม่คุ้นเคยกับ C แต่ใน JS คุณสามารถรวมงบ var var a = 1, b = 2, c = 3;หลายหนึ่งเช่นนี้ คุณไม่สามารถทำสิ่งเดียวกันใน C หรือไม่?
nyuszika7h

2
@ Nyuszika7H นี่คือ C # ไม่ใช่ C. คุณไม่สามารถรวมvarคำแถลงโดยนัยเช่นนั้นได้ string b="",e=""คุณสามารถรวมถ้าพวกเขามีประเภทอย่างชัดเจนเช่นโจอี้กล่าวถึงการใช้
Rebecca Chernoff

@RebeccaChernoff: ฉันทำงานกับคนอื่นตอบ 689 ตอนนี้
Nick Larsen

@NickLarsen ดี - แต่ฉันไม่ได้มอง ถาม: ฉันยังต้องการเวลาผ่านไป นี่เป็นครั้งแรกของฉันไปที่ตรรกะฉันแน่ใจว่ามีสถานที่ที่ฉันสามารถฉลาดเกี่ยวกับตรรกะเพียงแค่ต้องใช้เวลาเพื่อให้ความสนใจ
Rebecca Chernoff

4

PHP, 403 388 306 ตัวอักษร

<?b((int)fgets(STDIN),'');foreach($t as $r)echo$r[0].str_pad($r[2],$w-2*strlen($r[0]),$r[1]).strrev($r[0])."\n";function b($c,$p){global$t,$w;$t[]=array($p.".","-");while($c--){if(($d=trim(fgets(STDIN)))>0)b($d,"| ".$p);else$t[]=array("| ".$p," ",$d);$w=max($w,strlen($d.$p.$p)+4);}$t[]=array($p."'","-");}

Ungolfed:

box((int)fgets(STDIN), '');

foreach($table as $row) {
    $prefix = $row[0];
    $pad = $row[1];
    $data = $row[2];
    echo $prefix . str_pad($data, ($width - 2*strlen($prefix)), $pad) . strrev($prefix)."\n";
}

function box($count,$prefix) {
    global $table, $width;
    $table[] = array($prefix.".","-");
    while($count--) {
        if(($data = trim(fgets(STDIN))) > 0) {
            box($data, "| ".$prefix);
        } else {
            $table[] = array("| ".$prefix, " ", $data);
        }
        $width = max($width,strlen($data.$prefix.$prefix)+4);
    }
    $table[] = array($prefix."'","-");
}
?>

ฉันยืมแนวคิดคำนำหน้าจาก Keith (เป็นสิ่งที่ได้รับอนุญาตหรือไม่) ไม่อย่างนั้นมันก็ค่อนข้างจะเหมือนเดิม ยังไม่สามารถต่ำกว่า 300 ได้ติดอยู่กับสิ่งนี้ ต่อมา


2
รหัสเป็นสาธารณะที่นี่ในทุกกรณีดังนั้นจึงอนุญาตให้มีการยืมความคิด ฉันคิดว่านี่เป็นสิ่งที่ทำให้ไซต์นี้แตกต่างจากเว็บไซต์อื่นที่คล้ายคลึงกัน ในฐานะที่เป็น gnibbler หนึ่งตั้งข้อสังเกตเราแข่งขันและทำงานร่วมกันในเวลาเดียวกัน
Joey

3

PHP, 806 769 721 653 619 ตัวอักษร

<?php function A($a,$b,$c,&$d){for($e=$b;$e>0;$e--){$f=fgets($a);if(false===$f){return;}$g=intval($f);if(0<$g){$h[]=A($a,$g,$c+1,$d);}else{$f=trim($f);$h[]=$f;$j=strlen($f)+4*$c;if($d<$j){$d=$j;}}}return $h;}$d=0;$h=A(STDIN,intval(fgets(STDIN)),1,&$d);function B($k,$c,$d){$f=str_pad('',$d-4*$c-2,'-',2);return C($k.$f.$k,$c,$d);}function C($f,$c,$d){$f=str_pad($f,$d-4*$c,' ');$f=str_pad($f,$d-2*$c,'| ',0);$f=str_pad($f,$d,' |');return $f;}function D($l,$c,$d){if(!is_array($l)){echo C($l,$c,$d)."\n";return;}echo B('.',$c,$d)."\n";foreach($l as $m){echo D($m,$c+1,$d);}echo B('\'',$c,$d)."\n";}D($h,0,$d);exit(0);?>

เวอร์ชันที่ไม่ถูกปรับแต่ง:

<?php
function read_itemgroup($handle, $item_count, $depth, &$width) {

    //$items = array();

    for($i = $item_count; $i > 0; $i--) {
        $line = fgets( $handle );
        if(false === $line) {
            return;
        }

        $line_int = intval($line);
        if(0 < $line_int) {
            // nested group
            $items[] = read_itemgroup($handle, $line_int, $depth + 1, $width);
        }
        else {
            // standalone item
            $line = trim($line);
            $items[] = $line;

            // determine width of item at current depth
            $width_at_depth = strlen($line) + 4 * $depth;
            if($width < $width_at_depth) {
                $width = $width_at_depth;
            }
        }
    }

    return $items;
}
$width = 0;
$items = read_itemgroup(STDIN, intval(fgets( STDIN )), 1, &$width);

//var_dump($items, $width);

function render_line($corner, $depth, $width) {
    $line = str_pad('', $width - 4 * $depth - 2, '-', 2); // 2 = STR_PAD_BOTH
    return render_item($corner . $line . $corner, $depth, $width);
}

function render_item($line, $depth, $width) {
    $line = str_pad($line, $width - 4 * $depth, ' ');
    $line = str_pad($line, $width - 2 * $depth, '| ', 0); // 0 = STR_PAD_LEFT
    $line = str_pad($line, $width, ' |');
    return $line;
}

function render($item, $depth, $width) {
    if(!is_array($item)) {
        echo render_item($item, $depth, $width) . "\n";
        return;
    }
    echo render_line('.', $depth, $width) . "\n";
    foreach($item as $nested_item) {
        echo render($nested_item, $depth + 1, $width);
    }
    echo render_line('\'', $depth, $width) . "\n";
}

render($items, 0, $width);

exit(0);
?>

ทำไมคุณใช้ชื่อฟังก์ชั่นสองตัวอักษรแทนชื่อตัวอักษรหนึ่งตัว?
Lowjacker

@ Lowkacler: จับดีนั่นเป็นสิ่งหนึ่งที่ฉันยังต้องเพิ่มประสิทธิภาพ ฉันไม่มี minifier อยู่ในมือดังนั้นฉันจึงทำมันเอง ฉันยังมีแนวคิดหลายประการเกี่ยวกับสิ่งที่ต้องปรับปรุง (การเข้ารหัสไม่ใช่การลดขนาด) ดังนั้นฉันจะโพสต์เวอร์ชันที่แก้ไขในภายหลัง
MicE

1
ก่อนอื่นสิ่งนี้หายไป<?ในช่วงเริ่มต้นที่จะทำงาน เห็นได้ชัดว่าคุณใช้ความยาวสูงสุดของรายการข้อความทั้งหมดในกรณีทดสอบเป็นความกว้างสำหรับกล่องด้านในสุด รหัสนี้ส่งผ่าน 118 กรณีทดสอบ (ทดสอบบน Linux และ FreeBSD) ฉันไม่รู้ว่าคุณทำอะไรกับสคริปต์ PowerShell ที่จะไม่ทำงานแม้ว่า :-( ขอร้องให้powershell -noprofile -file test.ps1 php boxes.phpทำงานได้ตามจริง แต่ฉันไม่มี PHP บนเครื่อง Windows ของฉันเพื่อทดสอบ
Joey

ทดสอบสิ่งนี้บนกล่องของฉันโดยใช้สคริปต์ทุบตีล่าสุดได้ 118/156 ฉันใส่ผลลัพธ์ลงในส่วนสำคัญ
Juan

1
ดีที่ได้ยิน :). นั่นคือสิ่งที่ฉันได้รับจากการเขียนสคริปต์ทดสอบที่มีจุดประสงค์เพื่อการแสดงผลบรรทัดเดียว ;-)
Joey

3

Java - 681 668 ตัวอักษร

import java.util.*;public class b{static int m,h,i;public static void main(String[]a)throws Throwable{for(Object o:z("")){a=(String[])o;String s=a[0]+a[1];i=a[0].length();for(h=0;h<m-i*2-a[1].length();h++){s+=a[2];}for(h=i;h>0;h--){s+=a[0].charAt(h-1);}System.out.println(s);}}static List z(String p)throws Throwable{String b="",d="";List l=new ArrayList();while((i=System.in.read())>-1){if(10==i){if(d!=""){String[]v={p+".",b,"-"},t={p+"'",b,"-"};l.add(v);for(int u=0;u<Integer.parseInt(d);u++){l.addAll(z(p+"| "));}l.add(t);}else{h=b.length()+p.length()*2;if(m<h)m=h;String[]v={p,b," "};l.add(v);}break;}else if(i>47&&i<58){d+=(char)i;}else {b+=(char)i;}}return l;}}

เป็นหลักเช่นเดียวกับรหัส ธ ธ ธ ธ ของ Keith Randall

เวอร์ชันที่ไม่ถูกปรับแต่ง:

import java.util.*;

public class b {
    static int m, h, i;

    public static void main(String[] a) throws Throwable {
        for (Object o : z("")) {
            a = (String[]) o;
            String s = a[0] + a[1];
            i = a[0].length();
            for (h = 0; h < m - i * 2 - a[1].length(); h++) {
                s += a[2];
            }
            for (h = i; h > 0; h--) {
                s += a[0].charAt(h - 1);
            }
            System.out.println(s);
        }
    }

    static List z(String p) throws Throwable {
        String b = "", d = "";
        List l = new ArrayList();
        while ((i = System.in.read()) > -1) {
            if (10 == i) {
                if (d != "") {
                    String[] v = { p + ".", b, "-" }, t = { p + "'", b, "-" };
                    l.add(v);
                    for (int u = 0; u < Integer.parseInt(d); u++) {
                        l.addAll(z(p + "| "));
                    }
                    l.add(t);
                } else {
                    h = b.length() + p.length() * 2;
                    if (m < h)
                        m = h;
                    String[] v = { p, b, " " };
                    l.add(v);
                }
                break;
            } else if (i > 47 && i < 58) {
                d += (char) i;
            } else {
                b += (char) i;
            }
        }
        return l;
    }
}

throwsฉันคิดว่าคุณสามารถกำจัดของหนึ่งในพื้นที่แต่ละครั้งที่มีการ
Joey

ใช่! กำจัดอีกสองสามตัวอักษร (สามารถสันนิษฐานได้ว่าแต่ละบรรทัดจะสิ้นสุดลงด้วยการขึ้นบรรทัดใหม่ถ่านซ้ำซ้อนbreak;)
เกร็ก Schueler

อาจcharเปรียบเทียบกลเม็ดเด็ดพรายโดยการดูรหัส ascii อีกต่อไป ... แต่ฉันต้องไปเตรียมพร้อมสำหรับวันหยุด
Greg Schueler

3

Perl - 200 199 ตัวอักษร

อัลกอริทึมแบบเดียวกับ Python ของ Keith Randall (การออกแบบที่ดี Keith) แต่มีขนาดเล็กกว่าเล็กน้อยใน Perl นี้

sub P{$_=<>;chop;$m>($l=length"$_@_@_")or$m=$l;/^\d/?(["@_.","","-"],(map{P("| @_")}1..$_),["@_'","","-"]):["@_",$_," "]}map{($q,$t,$f)=@$_;print"$q$t",($f x($m-length"$q$t$q")).reverse($q),"\n"}(P);

1
$_@_@_ดูเหมือนว่ามีคนไล่สัญญาณดอลลาร์
ajax333221

3

F # - 341 ตัวอักษร

let rec f(x,y)=[
 let l=stdin.ReadLine()
 let q,d=Core.int.TryParse l
 if q then
  yield x+".","",'-',"."+y
  for i=1 to d do yield!f(x+"| ",y+" |")
  yield x+"'","",'-',"'"+y
 else yield x,l,' ',y]
let l=f("","")
for w,x,y,z in l do printfn"%s"(w+x.PadRight(List.max(l|>List.map(fun(w,x,y,z)->2*w.Length+x.Length))-2*w.Length,y)+z)

วิธีแก้ปัญหาของ Keith รุ่น F # รายการจะไม่เปลี่ยนรูปไปโดยปริยายดังนั้นรุ่นนี้ stuffs ฟังก์ชัน recursive ทั้งหมดลงในรายการกลับรายการจากการที่รายการดังกล่าวถูกสกัดโดยใช้ห่วงและfor..do yield!ฉันไม่สามารถหาวิธีที่จะย้อนกลับคำนำหน้าอย่างรัดกุมดังนั้นฉันเพิ่งแนบคำต่อท้ายกับอเนกประสงค์

FYI วิธี TryParse (bool,int)ส่งกลับสองครั้ง


2

Clojure - 480 ตัวอักษร

(use '[clojure.contrib.string :only (repeat)])(let [r ((fn p[%](repeatedly % #(let [x (read-line)](try(doall(p(Integer/parseInt x)))(catch Exception e x))))) 1)]((fn z[m,n,o] (let[b #( let[p(dec o)](println(str(repeat p "| ")%(repeat(- m(* 4 p)2)"-")%(repeat p " |"))))](b \.)(doseq[i n](if(seq? i)(z m i(inc o))(println(str(repeat o "| ")i(repeat(- m(count i)(* o 4))" ")(repeat o " |")))))(b \')))((fn w[x](reduce max(map(fn[%](if(seq? %)(+ (w %)4)(count %)))x)))r)(first r) 1))

นี่เป็นโปรแกรม Clojure แรกของฉันรวมถึงความพยายามครั้งแรกของ Clojure ในสนามกอล์ฟดังนั้นไม่จำเป็นต้องพูดเลยว่าสิ่งนี้ไม่ควรถูกนำมาใช้ในฐานะตัวแทนของโซลูชั่น Clojure โดยทั่วไป ฉันแน่ใจว่ามันจะถูกทำให้สั้นลงอย่างมีนัยสำคัญโดยเฉพาะอย่างยิ่งหากวิธีการแยกวิเคราะห์ของKeith Randallและการสร้างกล่องในเวลาเดียวกันนั้นถูกนำไปใช้


ผู้ชายครึ่งหนึ่งของแหล่งนี้จะต้องเป็นช่องว่าง และ mandatorily ดังนั้น :-) ที่น่าสนใจ แต่และฉันสงสัยว่าจะมีคนเห็นตัวแปรเสียงกระเพื่อมชนะการเล่นกอล์ฟรหัส ;-)
Joey

ฉันแน่ใจว่าเป็นไปได้ ... แม้ว่าอย่างที่ฉันพูดฉันอาจจะไม่ใช่คนที่จะทำ
Casey

2

C # - 472 470 426 422 398 ตัวอักษร

using System.Linq;using y=System.Console;class W{static void Main(){var c=new int[5];var s=new string[0].ToList();int n=0,i;var l="";do{try{c[n]=int.Parse(l=y.ReadLine());l=".{1}.";n++;i=1;}catch{l+="{0}";i=0;}G:while(i++<n)l="| "+l+" |";s.Add(l);if(n>0&&--c[n-1]<0){n--;l="'{1}'";i=0;goto G;}}while(n>0);s.ForEach(z=>y.WriteLine(z,l="".PadLeft(s.Max(v=>v.Length)-z.Length),l.Replace(' ','-')));}}

ดี A goto! โดยวิธีการที่คุณสามารถละเว้นวงเล็บรอบข้อโต้แย้งแลมบ์ดาzและvนำลงนี้ 421
โจอี้

2

Scala - 475 ตัวอักษร

object N2 extends App{type S=String;def b(x:List[S],t:Int,s:S,e:S):List[S]={var l=x;o=o:+(s+".-±-."+e+"-");for(i<-1 to t)if(l.head.matches("\\d+"))l=b(l.tail,l.head.toInt,s+"| ",e+" |")else{o=o:+(s+"| "+l.head+"±"+e+" | ");l=l.drop(1)};o=o:+(s+"'-±-'"+e+"-");return l};var o:List[S]=List();val l=io.Source.stdin.getLines.toList;b(l.tail,l.head.toInt,"","");(o map(x=>x.replaceAll("±",x.last.toString*((o sortBy((_:S).length)).last.length-x.length)).dropRight(1)))map println}

1

C # 1198 1156 1142 689 671 634 ตัวอักษร

using z=System.Console;using System.Collections.Generic;using System.Linq;
class T{bool U;List<T> a=new List<T>();string m;IEnumerable<string>R(int s){if(U){yield return ".".PadRight(s-1,'-')+".";foreach(var e in a.SelectMany(b=>b.R(s-4)))yield return ("| "+e).PadRight(s-e.Length)+" |";yield return "'".PadRight(s-1,'-')+"'";}else yield return m;}int L(){return U?a.Max(x=>x.L())+4:m.Length;}
static void Main(){var p=O(int.Parse(z.ReadLine()));z.WriteLine(string.Join("\r\n",p.R(p.L())));}
static T O(int n){var k=new T(){U=true};while(n-->0){var l=z.ReadLine();int c;k.a.Add(int.TryParse(l,out c)?O(c):new T{m=l});}return k;}}

1
เวอร์ชั่น Ungolfed ขึ้นอยู่กับ github - github.com/paulduran/CodeGolf
Fatal

เข้าร่วมกับ\nดูเหมือนจะเพียงพอในท้ายที่สุด
Joey

การกำจัดอินเทอร์เฟซทำให้เป็นอิสระของตัวละครมากมายส่วนที่เหลือเป็นกอล์ฟมาตรฐาน มีอีกมากมายที่สามารถทำได้ที่นี่ฉันคาดหวังว่าสิ่งนี้จะได้ต่ำกว่า 600
Nick Larsen

นิคทำงานได้ดี ฉันสงสัยว่าอินเทอร์เฟซนั้นค่อนข้างเกินความจริง ธงง่าย ๆ จะพอเพียงในสถานการณ์นี้ตามที่คุณได้แสดงให้เห็น
ร้ายแรง

0

Pip , 89 ไบต์ (ไม่ใช่การแข่งขัน)

(ภาษาใหม่กว่าความท้าทายนอกจากนี้ฉันไม่สามารถก้าวข้าม APL ได้เลย)

รหัสคือ 87 ไบต์, +2 สำหรับ-rnธง

(z:{I+YPOi{Y{Vz}M,ym:MX#*Y$ALyY'|.s._.sX++m-#_.'|MyY".."J'-X++mALyAL"''"J'-Xm}yALl}i:g)

ลองออนไลน์!

ฟังก์ชั่นzประมวลผลรายการแรกของรายการอินพุต ( gคัดลอกไปยังตัวแปรส่วนกลางiเพื่อใช้ภายในการเรียกใช้ฟังก์ชัน) หากนี่คือตัวเลขnมันจะเรียกตัวเองซ้ำว่าnครั้งคั่นรายการผลลัพธ์ของบรรทัดไปยังสี่เหลี่ยมผืนผ้าเต็มล้อมแต่ละบรรทัดใน"| " " |"และเพิ่ม.---.และ'---'บรรทัดก่อนที่จะส่งคืนรายการใหม่ ถ้ามันเป็นสตริงมันก็จะแปลงเป็นรายการเดียวและส่งคืน ผลลัพธ์สุดท้ายถูกพิมพ์บรรทัดใหม่ที่คั่นด้วย ( -nแฟล็ก) รายละเอียดเพิ่มเติมตามคำขอ


ฉันมักจะไม่มีปัญหากับภาษาที่ใหม่กว่าความท้าทายโดยเฉพาะอย่างยิ่งเมื่อพิจารณาว่าปัญหานั้นไม่สำคัญว่าภาษาที่สร้างขึ้นใหม่จะมีการดำเนินการเฉพาะสำหรับการแก้ปัญหา :-)
Joey

สิ่งนี้ล้มเหลวในตัวอย่างที่สี่
Joey

0

Java (1369 ตัวอักษรรวมถึง EOLs)

ไม่สามารถออกได้โดยไม่ใช้ Java Java ควรจะละเอียดมากขึ้นว่า slicks ของ Python และ Ruby ดังนั้นฉันจึงไปหาทางออกที่สวยงามและซ้ำซาก

แนวคิดคือแผนผัง (กราฟ) ของวัตถุ (สตริงและกล่อง) ที่มีอีกรายการหนึ่งเริ่มต้นจากกล่อง "หัว" ในขณะที่คุณแยกวิเคราะห์ไฟล์อินพุตคุณเพิ่มสตริงและกล่องลงในกล่อง "ปัจจุบัน" และในขณะที่คุณเพิ่มความยาวสูงสุดของคอนเทนเนอร์จะถูกปรับ เมื่อคอนเทนเนอร์ถึงจำนวนไอเท็มที่กำหนดไว้ล่วงหน้าซึ่งสามารถย้อนรอยคุณไปยังคอนเทนเนอร์ก่อนหน้าได้ ในตอนท้ายของไฟล์อินพุตคุณมีคอนเทนเนอร์ "head" ที่มีการคำนวณ "maxLength" อยู่แล้วดังนั้นคุณจึงเรียกใช้เมธอด print ()

import java.io.*;import java.util.*;
public class N{private static String rPad(String s,int l){return s+str(l-s.length(),' ');}
private static String str(int l, char c){StringBuffer sb=new StringBuffer();while(l-->0){sb.append(c);}return sb.toString();}
private static class Box {Box prnt=null;String txt=null;int items;List<Box> c=new ArrayList<Box>();int maxLength=0;
public Box(Box p,int n){prnt=p;items=n;if(p!=null){p.c.add(this);}}
public Box(Box p,String s){prnt=p;txt=s;if(p!=null){p.c.add(this);p.notify(s.length());}}
public void print(String prefix,int l,String suffix){if (txt == null){System.out.println(prefix+"."+str(l-2,'-')+"."+suffix);for(Box b:c){b.print(prefix+"| ",l-4," |"+suffix);}System.out.println(prefix+"'"+str(l-2,'-')+"'"+suffix);}else{System.out.println(prefix+rPad(txt,l)+suffix);}}
protected void notify(int l){if (l+4>this.maxLength){this.maxLength=l + 4;if (this.prnt != null){this.prnt.notify(this.maxLength);}}}}
public static void main(String[] args)throws IOException{Box head=null;Box b=null;BufferedReader in=new BufferedReader(new InputStreamReader(System.in));String s;while ((s=in.readLine()) != null){try{int n=Integer.parseInt(s);b=new Box(b, n);}catch (NumberFormatException nfe){b=new Box(b, s);}if(head == null)head=b;while ((b != null) && (b.items == b.c.size())){b=b.prnt;}}head.print("",head.maxLength,"");}}

เป็นวิธีแก้ปัญหาที่สนุกสนานในการเขียน ฉันชอบคำถามมาก ดังที่ฉันได้กล่าวไว้ก่อนหน้านี้ฉันไปเพื่อความสง่างามของการแก้ปัญหาไม่ใช่วิธีการที่เรียบง่ายเศร้า Java ไม่ได้พิมพ์ Python "-" * 4 เพื่อผลิต "----" :-)

นี่คือรุ่นที่ไม่ได้แต่งแต้ม:

import java.io.*;
import java.util.*;

public class NestedBoxes
{

    private static String rPad ( String s, int l )
    {
        return s + str(l - s.length(), ' ');
    }

    private static String str ( int l, char c )
    {
        StringBuffer sb = new StringBuffer();
        while (l-- > 0)
        {
            sb.append(c);
        }
        return sb.toString();
    }

    private static class Box
    {

        Box parent = null;
        String text = null;
        int items;
        List<Box> contents = new ArrayList<Box>();

        int maxLength = 0;

        public Box ( Box p, int n )
        {
            parent = p;
            items = n;
            if (p != null)
            {
                p.contents.add(this);
            }
        }

        public Box ( Box p, String s )
        {
            parent = p;
            text = s;
            if (p != null)
            {
                p.contents.add(this);
                p.notify(s.length());
            }
        }

        public void print ( String prefix, int l, String suffix )
        {
            if (text == null)
            {
                System.out.println(prefix + "." + str(l - 2, '-') + "." + suffix);
                for (Box b : contents)
                {
                    b.print(prefix + "| ", l - 4, " |" + suffix);
                }
                System.out.println(prefix + "'" + str(l - 2, '-') + "'" + suffix);
            }
            else
            {
                System.out.println(prefix + rPad(text, l) + suffix);
            }
        }

        protected void notify ( int l )
        {
            if (l + 4 > this.maxLength)
            {
                this.maxLength = l + 4;
                if (this.parent != null)
                {
                    this.parent.notify(this.maxLength);
                }
            }
        }
    }

    public static void main ( String[] args ) throws IOException
    {
        Box head = null;
        Box b = null;
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String s;
        while ((s = in.readLine()) != null)
        {
            try
            {
                int n = Integer.parseInt(s);
                b = new Box(b, n);
            }
            catch (NumberFormatException nfe)
            {
                b = new Box(b, s);
            }

            if (head == null)
            {
                head = b;
            }

            while ((b != null) && (b.items == b.contents.size()))
            {
                b = b.parent;
            }
        }
        head.print("", head.maxLength, "");
    }
}

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