Chiều cao của hộp


22

Có một cái nhìn vào sơ đồ nghệ thuật ascii của các hộp khác nhau:

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

Mỗi hộp được hình thành với các ký tự ống cho các phần dọc ( |), dấu gạch ngang cho các phần nằm ngang ( -) và các điểm cộng cho các góc ( +).

Biểu đồ cũng cho thấy các hộp bên trong các hộp khác. Chúng tôi sẽ gọi số lượng hộp mà một hộp được chứa trong lớp của hộp đó . Đây là sơ đồ một lần nữa với lớp của mỗi hộp được chú thích:

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

Chương trình của bạn sẽ lấy một sơ đồ hộp tương tự như sơ đồ ở trên cùng làm đầu vào. Là đầu ra, chương trình của bạn sẽ xuất sơ đồ hộp với:

  • Hộp trên lớp 0 phải được điền đầy ký tự #(NB: Sẽ chỉ có một hộp trên lớp 0);
  • Các hộp trên lớp 1 phải được điền với ký tự =;
  • Các hộp trên lớp 2 phải được điền với ký tự -;
  • Các hộp trên lớp 3 phải được điền với ký tự .;
  • Hộp trên lớp 4 trở lên không nên điền.

Đây là những gì đầu ra của ví dụ đầu vào sẽ như thế nào:

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

Dưới đây là một đầu vào và đầu ra khác hiển thị các lớp 3, 4 và 5. Lưu ý các đường ngang ở trên cùng rất gần nhau. Trong những trường hợp này không có đủ không gian để điền vào bất kỳ ký tự nào ở đó.

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

Đầu ra:

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

Một đầu vào khác, lần này cũng có các đường thẳng đứng gần nhau:

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

Đầu ra:

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

Ghi chú bổ sung

  • Có thể có khoảng trắng xung quanh hộp ngoài cùng.
  • Các hộp không thể có chiều rộng hoặc chiều cao bên trong bằng 0 (vì vậy chúng sẽ luôn có một khoảng trống bên trong chúng)
  • Các hộp trên cùng một lớp có thể chạm vào nhau.

Câu trả lời:


3

Hồng ngọc 164 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)}

Thử trực tuyến: trường hợp thử nghiệm # 1 , trường hợp thử nghiệm # 2 .

Chương trình vô văn hóa:

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

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

Cái này đọc dòng đầu tiên để xác định (các) chiều rộng của hộp ngoài cùng. Với điều này, nó giữ một mảng dài s. Mảng này lưu trữ từ trái sang phải nơi các hộp bắt đầu và kết thúc và được khởi tạo bằng 0. Nó cũng lưu trữ chiều cao hộp.

Chương trình đọc dòng đầu vào theo dòng và theo dõi các ký tự sau:

  • '+' là, như chúng ta biết, cạnh của một hộp. Nếu char đầu vào bên trái là '-', thì đó là phần cuối của hộp, nếu không nó là bắt đầu. Mảng đánh dấu được cập nhật như sau:
    • Nếu điểm đánh dấu ở chỉ số này là 0, hãy đặt giá trị thành 1 (bắt đầu) hoặc -1 (kết thúc).
    • Khác đặt giá trị thành 0. (Chúng tôi đã chạm đến đáy hộp, nó không còn quan trọng nữa)
  • '|' thay đổi chiều cao hộp hiện tại bằng điểm đánh dấu tại chỉ mục hiện tại.
  • '' Mỗi char có đầu ra như cũ, ngoại trừ khoảng trống, được thay thế theo chiều cao hộp hiện tại.

Chỉnh sửa: Cảm ơn TheNumberOne về đề xuất này. Tôi cũng thay thế while (true) bằng for (;;).


1
Bạn có thể thay thế import java.util.Scannerbằngimport java.util.*
TheNumberOne

2

CJam, 114 111 108 104 103 102 98 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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

Chạy đoạn trích trong Firefox để kiểm tra

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 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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 byte SBCS

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

Hãy thử trực tuyến!

s←' #=-.+|' gán một chuỗi cho biến s

đánh giá đầu vào, nó phải là một ma trận ký tự

⎕⍳⍨sthay thế mọi yếu tố bằng chỉ số của nó trongs

a← giao cho a

5=trả về một ma trận boolean trong đó các +-es nằm trong a( s[5]is '+')

(⊢ׯ1*+⍀++\)đây là một tàu của các chức năng:

  • +\ ma trận tổng một phần theo hàng

  • + thêm

  • +⍀ ma trận tổng một phần theo cột

  • ¯1* tiêu cực với sức mạnh của - biến tỷ lệ cược thành ¯1 và tăng lên 1

  • ⊢× nhân với đối số của tàu - không có gì ngoài trừ các góc hộp

+⍀+\ tổng một phần theo cột của tổng một phần theo hàng

5⌊ tối thiểu đó và 5

5| modulo 5

a,¨ghép các phần tử của avà của ma trận hiện tại

0~¨⍨ xóa 0 khỏi các cặp

⊃¨ đầu tiên mỗi thứ còn lại

s[ ] sử dụng mọi yếu tố như một chỉ mục trong s



@EriktheOutgolfer Không cần phải lo lắng, câu trả lời là chính xác :) Biểu thức chuẩn bị đối số (trộn các dòng đầu vào thô vào một ma trận) sẽ đảo ngược nó vì ↑⍞⍞...⍞đánh giá từ phải sang trái. Ví dụ đầu tiên nó không thành vấn đề và tôi đã quên đề cập đến điều này.
ngn


@EriktheOutgolfer ah, tôi hiểu rồi ... Tôi sẽ xóa câu trả lời ngay bây giờ và tôi sẽ sửa nó sau. Cảm ơn.
ngn

nên được sửa ngay bây giờ
ngn

0

> <> , 118 115 87 byte

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

Hãy thử trực tuyến!

Nếu một trong các ký hiệu không phải là một -thì nó có thể ngắn hơn 6 byte. Dù sao, làm cho nó nhỏ hơn một chút

Làm thế nào nó hoạt động:

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

-11 byte nhờ trần

Thất bại nếu sizeof (int)> 9, nhưng sau đó bạn có thể an ủi trong thực tế rằng máy tính của bạn đến từ tương lai.

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

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.