ความสูงของกล่อง


22

ดูแผนภาพศิลปะ ascii นี้ของกล่องต่างๆ:

+--------------------------------------------------------------+
|                                                              |
|   +-------------------------------+          +-------+       |
|   |                               |          |       |       |
|   |                               |          |       |       |
|   |     +----------------+        |          |       |       |
|   |     |                |        |          +-------+       |
|   |     |                |        |                          |
|   |     |                |        |          +-------+       |
|   |     +----------------+        |          |       |       |
|   |                               |          |       |       |
|   |                               |          |       |       |
|   +-------------------------------+          +-------+       |
|                                                              |
+--------------------------------------------------------------+

แต่ละกล่องประกอบด้วยตัวไพพ์สำหรับชิ้นส่วนแนวตั้ง ( |), ขีดกลางสำหรับส่วนแนวนอน ( -), และบวกสำหรับมุม ( +)

แผนภาพยังแสดงกล่องที่อยู่ภายในกล่องอื่น ๆ เราจะเรียกจำนวนกล่องที่มีกล่องอยู่ในเลเยอร์ของกล่องนั้น นี่คือแผนภาพอีกครั้งด้วยเลเยอร์ของแต่ละกล่องหมายเหตุประกอบ:

+--------------------------------------------------------------+
|                                                              |
|   +-------------------------------+          +-------+       |
|   |                               |          |       |       |
|   |                               |          |   1   |       |
|   |     +----------------+        |          |       |       |
|   |     |                |        |    0     +-------+       |
|   |     |        2       |   1    |                          |
|   |     |                |        |          +-------+       |
|   |     +----------------+        |          |       |       |
|   |                               |          |   1   |       |
|   |                               |          |       |       |
|   +-------------------------------+          +-------+       |
|                                                              |
+--------------------------------------------------------------+

โปรแกรมของคุณจะใช้ในแผนภาพกล่องคล้ายกับที่ด้านบนเป็นอินพุต โปรแกรมของคุณควรแสดงแผนภาพกล่องด้วย:

  • กล่องที่อยู่บนชั้น 0 ควรจะเต็มไปด้วยตัวละคร#(หมายเหตุ: จะมีเพียงหนึ่งกล่องในชั้นที่ 0);
  • กล่องบนชั้น 1 ควรจะเต็มไปด้วยตัวละคร=;
  • กล่องในชั้นที่ 2 ควรเต็มไปด้วยตัวละคร-;
  • กล่องบนชั้นที่ 3 ควรจะเต็มไปด้วยตัวละคร.;
  • ไม่ควรกรอกกล่องที่เลเยอร์ 4 ขึ้นไป

นี่คือสิ่งที่เอาต์พุตของอินพุตตัวอย่างควรมีลักษณะ:

+--------------------------------------------------------------+
|##############################################################|
|###+-------------------------------+##########+-------+#######|
|###|===============================|##########|=======|#######|
|###|===============================|##########|=======|#######|
|###|=====+----------------+========|##########|=======|#######|
|###|=====|----------------|========|##########+-------+#######|
|###|=====|----------------|========|##########################|
|###|=====|----------------|========|##########+-------+#######|
|###|=====+----------------+========|##########|=======|#######|
|###|===============================|##########|=======|#######|
|###|===============================|##########|=======|#######|
|###+-------------------------------+##########+-------+#######|
|##############################################################|
+--------------------------------------------------------------+

นี่คืออินพุตและเอาต์พุตอื่นที่แสดงเลเยอร์ 3, 4 และ 5 ให้สังเกตเส้นแนวนอนที่ด้านบนซึ่งอยู่ใกล้กันมาก ในกรณีเหล่านี้มีพื้นที่ไม่เพียงพอสำหรับเติมอักขระใด ๆ

+-----------------------------------------------------------------------+
|     +--------------------------------------------------------------+  |
|     |      +-----------------------------------------------------+ |  |
|     |      |         +-----------------------------------------+ | |  |
|     |      |         |           +---------------------------+ | | |  |
|     |      |         |           |         +-------------+   | | | |  |
|     |      |         |           |         |             |   | | | |  |
|     |      |         |           |         +-------------+   | | | |  |
|     |      |         |           +---------------------------+ | | |  |
|     |      |         |                                         | | |  |
|     |      |         +-----------------------------------------+ | |  |
|     |      |                                                     | |  |
|     |      |                                                     | |  |
|     |      +-----------------------------------------------------+ |  |
|     |                                                              |  |
|     +--------------------------------------------------------------+  |
|                                                                       |
|                                                                       |
|                                                                       |
+-----------------------------------------------------------------------+

ผลลัพธ์:

+-----------------------------------------------------------------------+
|#####+--------------------------------------------------------------+##|
|#####|======+-----------------------------------------------------+=|##|
|#####|======|---------+-----------------------------------------+-|=|##|
|#####|======|---------|...........+---------------------------+.|-|=|##|
|#####|======|---------|...........|         +-------------+   |.|-|=|##|
|#####|======|---------|...........|         |             |   |.|-|=|##|
|#####|======|---------|...........|         +-------------+   |.|-|=|##|
|#####|======|---------|...........+---------------------------+.|-|=|##|
|#####|======|---------|.........................................|-|=|##|
|#####|======|---------+-----------------------------------------+-|=|##|
|#####|======|-----------------------------------------------------|=|##|
|#####|======|-----------------------------------------------------|=|##|
|#####|======+-----------------------------------------------------+=|##|
|#####|==============================================================|##|
|#####+--------------------------------------------------------------+##|
|#######################################################################|
|#######################################################################|
|#######################################################################|
+-----------------------------------------------------------------------+

ข้อมูลอื่นเวลานี้กับเส้นแนวตั้งใกล้กัน:

+-------------+
|+-----------+|
||           ||
||           ||
||           ||
|+-----------+|
+-------------+

ผลลัพธ์:

+-------------+
|+-----------+|
||===========||
||===========||
||===========||
|+-----------+|
+-------------+

หมายเหตุเพิ่มเติม

  • สามารถมีช่องว่างรอบ ๆ กล่องด้านนอกสุด
  • กล่องไม่สามารถมีความกว้างหรือความสูงภายในเป็น 0 (ดังนั้นจะต้องมีที่ว่างอยู่ภายใน)
  • กล่องที่อยู่บนชั้นเดียวกันสามารถสัมผัสกันได้

คำตอบ:


3

ทับทิม 163 164

w=l=-1
x=$<.map{|l|w=l.size;l}.join
b=[]
x.size.times{|i|c=x[i]
x[i..i+1]=='+-'&&(x[i+w]!=?|?b-=[i%w]:b<<i%w)
c>?z&&l+=b&[i%w]!=[]?1:-1
$><<(c==' '&&'#=-.'[l]||c)}

ลองออนไลน์: การทดสอบกรณี # 1 , กรณีทดสอบ # 2

โปรแกรมที่ไม่ดีนัก:

  # read all lines from STDIN
  input = $<.map{|l|l}.join
  width = input.index(?\n)+1

  box_left_margins = []
  current_layer = -1

  input.size.times{|i|
    c = input[i]

    if c == ?+ && input[i+1] == ?-
      #we're at a box's left margin
      if input[i+width] == ?|
        # we're at the box's top - mark this index as a left margin
        box_left_margins << i%width
      else
        # we're at the box's bottom - this index is no longer a left margin
        box_left_margins-=[i%width]
      end
    end

    if c == ?|
      if box_left_margins.include? (i%width)
        current_layer += 1
      else
        current_layer -= 1
      end
    end

    if c == ' '
      $><< ('#=-.'[current_layer]||' ')
    else
      $><<c
    end
  }

2

Java, 476 466 ไบต์

import java.util.*;class H{public static void main(String[]a){Scanner p=new Scanner(System.in);char[]l=p.nextLine().toCharArray(),d={'#','=','-','.'};int s=l.length,b,i;int[]m=new int[s];String o=new String(l);for(;;){o+='\n';l=p.nextLine().toCharArray();if(l[0]=='+')break;o+='|';b=0;for(i=1;i<s;++i){char c=l[i];switch(c){case' ':c=b>3?' ':d[b];break;case'+':m[i]=l[i-1]=='-'?-++m[i]:- --m[i];break;case'|':b+=m[i];}o+=c;}}o+=new String(l);System.out.println(o);}}

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

โปรแกรมอ่านบรรทัดอินพุตตามบรรทัดและดูอักขระต่อไปนี้:

  • '+' คืออย่างที่เรารู้กันว่าขอบของกล่อง หากอินพุตถ่านทางซ้ายคือ '-' มันคือจุดสิ้นสุดของกล่องมิฉะนั้นจะเป็นการเริ่มต้น อาร์เรย์มาร์กเกอร์ได้รับการอัพเดตดังนี้:
    • หากเครื่องหมายที่ดัชนีนี้คือ 0 ให้ตั้งค่าเป็น 1 (เริ่มต้น) หรือ -1 (สิ้นสุด)
    • อื่นตั้งค่าเป็น 0 (เรามาถึงด้านล่างของกล่องมันไม่สำคัญอีกต่อไป)
  • '|' เปลี่ยนความสูงของกล่องปัจจุบันโดยเครื่องหมายที่ดัชนีปัจจุบัน
  • 'ถ่านทุกตัวจะได้รับเอาต์พุตเหมือนเดิมยกเว้นช่องว่างซึ่งจะถูกแทนที่ตามความสูงของกล่องปัจจุบัน

แก้ไข: ขอบคุณ TheNumberOne สำหรับคำแนะนำ ฉันยังแทนที่ในขณะที่ (จริง) ด้วยสำหรับ (;;)


1
คุณสามารถแทนที่import java.util.Scannerด้วยimport java.util.*
TheNumberOne

2

CJam, 114 111 108 104 103 102 98 ไบต์

q"-+":R/Ws*N/z{_,{"|1"/Bs*}*}%z{_,,{_I=S&{_I>_1sf&s,\"|+"f&s,m5e<" #=2."=I\t}&}fI}%N*Ws/R*Cs"|-"er

ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

q               e# Read all input from STDIN.
"-+":R/Ws*      e# Replace each "-+" with "-1".
N/z             e# Split at linefeeds and zip. Pushes the array of columns.
{               e# For each column:
  _,            e#   Push its length.
  {             e#   Do that many times:
    "|1"/Bs*    e#   Replace each "|1" with "11".
  }*            e#
}%              e#
z               e# Transpose. Goes back to array of rows.
{               e# For each row:
  _,,           e#   Push the array of its indexes.
  {             e#   For each index I:
    _I=         e#     Get the Ith character of the row.
    S&{         e#     If it is a space:
      _I>       e#       Get the characters after the Ith.
      _1sf&s,   e#       Count how many characters are 1's.
      \"|+"f&s, e#       Count how many are |'s or +'s.
      m5e<      e#       Subtract and truncate at 5.
      " #=2."=  e#       Retrieve the corresponding character.
      I\t       e#       Replace the Ith character of the row with that one.
    }&          e#
  }fI           e#
}%              e#
N*              e# Join the rows, separating by linefeeds.
Ws/R*           e# Turn "-1"s back to "-+"s.
Cs"|-"er        e# Turn 1's and 2's into |'s and -'s.

2

JavaScript ( ES6 ) 156

เรียกใช้ส่วนย่อยใน Firefox เพื่อทดสอบ

F=b=>(
  r=b.split(/\n/),q=[n=0],
  r.map((r,i)=>(
    [...r].map((c,p)=>c=='+'?(q[p]=r[p-1]=='-'?-1:1,c):c<'!'?' #=-.'[n]||' ':((n+=q[p]|0),c)).join(''))
  ).join('\n')
)

// TEST

o=x=>O.innerHTML += x+'\n\n'


;[`+--------------------------------------------------------------+
|                                                              |
|   +-------------------------------+          +-------+       |
|   |                               |          |       |       |
|   |                               |          |       |       |
|   |     +----------------+        |          |       |       |
|   |     |                |        |          +-------+       |
|   |     |                |        |                          |
|   |     |                |        |          +-------+       |
|   |     +----------------+        |          |       |       |
|   |                               |          |       |       |
|   |                               |          |       |       |
|   +-------------------------------+          +-------+       |
|                                                              |
+--------------------------------------------------------------+`
,`+-----------------------------------------------------------------------+
|     +--------------------------------------------------------------+  |
|     |      +-----------------------------------------------------+ |  |
|     |      |         +-----------------------------------------+ | |  |
|     |      |         |           +---------------------------+ | | |  |
|     |      |         |           |         +-------------+   | | | |  |
|     |      |         |           |         |             |   | | | |  |
|     |      |         |           |         +-------------+   | | | |  |
|     |      |         |           +---------------------------+ | | |  |
|     |      |         |                                         | | |  |
|     |      |         +-----------------------------------------+ | |  |
|     |      |                                                     | |  |
|     |      |                                                     | |  |
|     |      +-----------------------------------------------------+ |  |
|     |                                                              |  |
|     +--------------------------------------------------------------+  |
|                                                                       |
|                                                                       |
|                                                                       |
+-----------------------------------------------------------------------+`
,`+-------------+
|+-----------+|
||           ||
||           ||
||           ||
|+-----------+|
+-------------+`  
].forEach(t=>o(t+'\n'+F(t)+'\n'))
pre { font-size:10px;}
<pre id=O></pre>


1

CJam, 76 74 ไบต์

q:Q"-+":R/Ws*{_"| "#"]_QN#~%'|m0='+=2*(U+:U+~; \"#=-.\"+U5e<= "S/=~}%Ws/R*

ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

q:Q        e# Read all input from STDIN and save it in the variable Q.
"-+":R/Ws* e# Replace each "-+" with "-1".
           e# This allows us to easily keep track of right corners.
{          e# For each charcter in the modified input:
  _"| "#   e#   Push its index in the string (0 for '|', 1 for ' ', -1 otherwise).

  "]_QN#~%'|m0='+=2*(U+:U+~; \"#=-.\"+U5e<= "S/

           e#   Split the pushed string at spaces, which results in three chunks:

           e#     ]        Turn the entire stack into a string.
           e#     _QN#     Compute the first index of a linefeed (row length).
           e#     ~%       Retrieve every previous character in the current column,
           e#              starting with the last.
           e#     '|m0=    Get the first character that is not a vertical bar.
           e#     '+=2*(   Push 1 if it's a plus sign and -1 otherwise.
           e#     U+:U     Add to U (initially 0) to keep track of the layer.
           e#     +~;      Add U to the string (casts to Array), dump and discard U.

           e#     "#=-."+  Concatenate this string with the space on the stack.
           e#     U5e<     Truncate U at 5.
           e#     =        Retrieve the corresponding character to replace the space.

           e#     (empty)

  =~       e#   Select and execute the proper chunk.
}%         e#
Ws/R*      e# Replace each "-1" with "-+".

1

APL (Dyalog Unicode) , 50 ไบต์SBCS

s[⊃¨0~¨⍨a5|5⌊+⍀+\(⊢ׯ1*+⍀++\)5=a←⎕⍳⍨s' #=-.+|']

ลองออนไลน์!

s←' #=-.+|' กำหนดสตริงให้กับตัวแปร s

อินพุตที่ประเมินนั้นต้องเป็นเมทริกซ์อักขระ

⎕⍳⍨sแทนที่ทุกองค์ประกอบของด้วยดัชนีในs

a← มอบหมายให้ a

5=ส่งคืนเมทริกบูลีนที่ซึ่ง+-es อยู่a( s[5]คือ'+')

(⊢ׯ1*+⍀++\)นี่คือรถไฟของฟังก์ชั่น:

  • +\ เมทริกซ์ของผลรวมบางส่วนโดยแถว

  • + บวก

  • +⍀ เมทริกซ์ของผลรวมบางส่วนตามคอลัมน์

  • ¯1* ลบหนึ่งกำลังของ - เปลี่ยนอัตราเดิมพันเป็น¯1และ evens เป็น 1

  • ⊢× ทวีคูณด้วยข้อโต้แย้งของรถไฟ - ลบทุกอย่างยกเว้นมุมกล่อง

+⍀+\ ผลรวมบางส่วนโดยคอลัมน์ของผลรวมบางส่วนโดยแถว

5⌊ ขั้นต่ำนั้นและ 5

5| โมดูโล่ 5

a,¨จับคู่องค์ประกอบของaและเมทริกซ์ปัจจุบัน

0~¨⍨ ลบ 0 จากคู่

⊃¨ ก่อนอื่นสิ่งที่เหลืออยู่

s[ ] ใช้ทุกองค์ประกอบเป็นดัชนีใน s



@EriktheOutgolfer ไม่ต้องกังวลคำตอบนั้นถูกต้อง :) นิพจน์ที่เตรียมอาร์กิวเมนต์ (ผสมบรรทัดอินพุตดิบเข้ากับเมทริกซ์) ควรย้อนกลับเนื่องจาก↑⍞⍞...⍞ประเมินจากขวาไปซ้าย สำหรับตัวอย่างแรกมันไม่สำคัญและฉันลืมที่จะพูดถึงเรื่องนี้
ngn


@EriktheOutgolfer อ่าเข้าใจแล้ว ... ฉันจะลบคำตอบตอนนี้และฉันจะแก้ไขในภายหลัง ขอบคุณ
ngn

ควรได้รับการแก้ไขในขณะนี้
ก.ย.

0

> <> , 118 115 87 ไบต์

]0{i:0(?;:"-"=?\:"+"=?\:" "=?\$3l$g+}:ob(?
~$?:g2.10p1+4f:<p3l+10/.16@:$/>.!0"#"$
 #=-.

ลองออนไลน์!

หากสัญลักษณ์อย่างใดอย่างหนึ่งไม่ได้เป็น-เช่นนี้ก็อาจจะสั้นลง 6 ไบต์ เอ๊ะทำให้มันเล็กลงไปหน่อย

มันทำงานอย่างไร:

] Resets the stack
 0{ Pushes a 0 and rotates the stack
    If the stack is empty, this initialises 0 as the counter
    Otherwise it adds an extra 0 to the stack and pushes the counter to the top
   i:0(?; Gets input and ends if it is EOF
         :"-"=?\ If the inputted character is a -
         p1+4f:< Put a - at cell (19, 1)
      .10        And skip to the end of this line

         :"+"=?\ Else if the inputted character is +
            ?10/ Generate either -1 or 1, depending on what was last put into cell (19,1)
                 The question mark represents cell (19,1), which is either + or -
         p3l     Put this number on (3, length of the stack)
.10p1+4f:<       Repeat the exact same code as with the -, except we put a + at cell (19,1)
         :" "=?\ Else if the character is a space
            @:$/ Create a copy of the counter
         .16     Skip to cell (1,6)
      g2         Get the cell (2, counter) (the  #=-.)
   ~$?           If that cell is a zero, pop it, leaving the initial space. 
                 Else pop the space, leaving the fetched character
        Else if the character is a | or a newline
        $3l$g+   Get the cell at (3, length of the stack) and add it to the counter
    For everything but the last else, we are at the end of the second line
       >.!0"#"$ Skip to the 35th instruction on the first line

 } Push the counter to the bottom of the stack
  :o Output the current character
    b(? If the character is smaller than 11 (a newline)
 ]          Skip the clear stack at the start of the line
 Repeat this until EOF

0

C (gcc) , 190 179 ไบต์

-11 ไบต์ขอบคุณไปที่แมวป่า

ล้มเหลวหากขนาดของ (int)> 9 แต่จากนั้นคุณสามารถปลอบใจในความจริงที่ว่าคอมพิวเตอร์ของคุณมาจากอนาคต

l;*H,*h,d;f(S){h=H=calloc(l=index(S,10)-S,9);for(char*s=S;*s;s++)h=*s^10?h:H-1,d=*s-43?d:s!=S&s[-1]==45|s-S>l&s[~l]=='|'?-1:1,*h+=*s^45?0:d,h+=write(1,*s^32|*h>4?s:" #=-."+*h,1);}

ลองออนไลน์!

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