Ketinggian Kotak

22

Lihatlah diagram seni ascii ini dari berbagai kotak:

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

Setiap kotak dibentuk dengan karakter pipa untuk bagian vertikal ( |), strip untuk bagian horizontal ( -), dan plus untuk sudut ( +).

Diagram juga menunjukkan kotak di dalam kotak lain. Kami akan memanggil jumlah kotak yang berisi kotak dalam lapisan kotak itu . Berikut diagram lagi dengan lapisan setiap kotak beranotasi:

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

Program Anda akan menerima diagram kotak serupa dengan yang ada di atas sebagai input. Sebagai output, program Anda harus menampilkan diagram kotak dengan:

  • Kotak pada layer 0 harus diisi dengan karakter #(NB: Hanya akan ada satu kotak di layer 0);
  • Kotak pada layer 1 harus diisi dengan karakter =;
  • Kotak pada layer 2 harus diisi dengan karakter -;
  • Kotak pada layer 3 harus diisi dengan karakter .;
  • Kotak pada layer 4 dan di atasnya tidak boleh diisi.

Berikut tampilan output dari contoh input:

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

Berikut ini adalah input dan output lain yang menunjukkan layer 3, 4, dan 5. Perhatikan garis horizontal di atas yang sangat berdekatan. Dalam kasus ini tidak ada cukup ruang untuk mengisi karakter apa pun di sana.

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

Hasil:

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

Input lain, kali ini dengan garis vertikal berdekatan juga:

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

Hasil:

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

catatan tambahan

  • Mungkin ada ruang kosong di sekitar kotak terluar.
  • Kotak tidak boleh memiliki lebar internal atau tinggi 0 (sehingga mereka akan selalu ada ruang di dalamnya)
  • Kotak pada lapisan yang sama dapat saling menyentuh.
Absinth
sumber

Jawaban:

3

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

Coba online: test case # 1 , test case # 2 .

Program tanpa ungolf:

  # 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
  }
Cristian Lupascu
sumber
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);}}

Ini membaca baris pertama untuk menentukan lebar kotak terluar. Dengan ini ia menyimpan array dengan panjang s. Array ini menyimpan dari kiri ke kanan di mana kotak mulai dan berakhir dan diinisialisasi dengan 0s. Ini juga menyimpan ketinggian kotak.

Program membaca baris input demi baris dan menonton untuk karakter berikut:

  • '+' adalah, seperti yang kita ketahui, tepi kotak. Jika char input ke kiri adalah '-', itu adalah akhir dari kotak, kalau tidak itu adalah awal. Array penanda diperbarui sebagai berikut:
    • Jika penanda pada indeks ini adalah 0, atur nilainya menjadi 1 (awal) atau -1 (akhir).
    • Lain mengatur nilai ke 0. (Kami mencapai bagian bawah kotak, itu tidak penting lagi)
  • '|' mengubah tinggi kotak saat ini oleh penanda di indeks saat ini.
  • '' Setiap char mendapatkan output seperti itu, kecuali untuk blank, yang diganti sesuai dengan tinggi kotak saat ini.

Sunting: Terima kasih kepada TheNumberOne untuk sarannya. Saya juga mengganti while (true) dengan untuk (;;).

ECS
sumber
1
Anda dapat menggantinya import java.util.Scannerdenganimport 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

Cobalah online di Internet juru bahasa CJam .

Bagaimana itu bekerja

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.
Dennis
sumber
2

JavaScript ( ES6 ) 156

Jalankan cuplikan di Firefox untuk menguji

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>

edc65
sumber
1

CJam, 76 74 byte

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

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

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 "-+".
Dennis
sumber
1

APL (Dyalog Unicode) , 50 byte SBCS

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

Cobalah online!

s←' #=-.+|' menetapkan string ke variabel s

input yang dievaluasi, harus berupa matriks karakter

⎕⍳⍨sganti setiap elemen dengan indeksnya dis

a← ditugaskan kepada a

5=mengembalikan matriks boolean di mana +-es berada di a( s[5]adalah'+' )

(⊢ׯ1*+⍀++\)ini adalah kereta fungsi:

  • +\ matriks jumlah parsial demi baris

  • + plus

  • +⍀ matriks jumlah parsial dengan kolom

  • ¯1* yang negatif dengan kekuatan - ubah odds menjadi ¯1 dan evens menjadi 1

  • ⊢× kalikan dengan argumen kereta - kosongkan semuanya kecuali sudut kotak

+⍀+\ jumlah parsial demi kolom jumlah parsial demi baris

5⌊ minimal itu dan 5

5| modulo 5

a,¨memasangkan elemen adan matriks saat ini

0~¨⍨ hapus 0 dari pasangan

⊃¨ pertama masing-masing dari apa yang tersisa

s[ ] gunakan setiap elemen sebagai indeks di s

ngn
sumber
Oh tidak!
Erik the Outgolfer
@EriktheOutgolfer Tidak perlu khawatir, jawabannya sudah benar :) Ekspresi yang menyiapkan argumen (campuran garis input mentah ke dalam matriks) harus membalikkannya karena ↑⍞⍞...⍞mengevaluasi dari kanan ke kiri. Sebagai contoh pertama tidak masalah dan saya lupa menyebutkan ini.
ngn
@EriktheOutgolfer ah, begitu ... Saya akan menghapus jawabannya sekarang dan saya akan memperbaikinya nanti. Terima kasih.
ngn
harus diperbaiki sekarang
ngn
0

> <> , 118 115 87 byte

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

Cobalah online!

Jika salah satu simbolnya bukan a -maka ini bisa lebih pendek 6 byte. Eh, toh membuatnya sedikit lebih kecil

Bagaimana itu bekerja:

] 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
Jo King
sumber
0

C (gcc) , 190 179 byte

-11 bytes berkat ceilingcat

Gagal jika sizeof (int)> 9, tetapi kemudian Anda dapat mengambil pelipur lara pada kenyataan bahwa komputer Anda dari masa depan.

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

Cobalah online!

gastropner
sumber