Kata -> City Skyline

40

Tantangan

Program atau fungsi Anda akan menerima input string tunggal dari STDIN atau parameter fungsi. Anda dapat berasumsi bahwa input hanya akan berisi karakter alfabet (a-zA-Z), spasi, dan pemberhentian penuh. Input tidak peka huruf besar kecil, jadi Anda harus memperlakukan 'a' persis sama dengan Anda memperlakukan 'A'.

Untuk setiap karakter dalam string, Anda akan menampilkan representasi bangunan sesuai spesifikasi berikut.

Setiap bangunan harus memiliki atap, yang ditandai dengan garis bawah pada baris atas, kemudian garis miring, spasi, garis miring terbalik pada baris kedua.

 _
/ \

Anda kemudian akan memiliki sejumlah lantai, cocok dengan nomor huruf (a = 1, b = 2, c = 3 dll) yang diwakili oleh dinding (|) di setiap sisi dan ruang di tengah. Lantai bawah (dan hanya lantai bawah) harus memiliki fondasi, yang merupakan garis bawah antara dinding. Seperti ini...

|_|

Jadi misalnya, 'b' akan terlihat seperti ini

 _
/ \
| |
|_|

Sekarang, kita tahu bahwa bangunan yang sangat tinggi, sempit tidak dapat berdiri dan harus melebar di pangkalan, sehingga tidak ada bangunan yang dapat berdiri lebih dari tiga lantai tanpa dukungan tambahan. Jadi setiap tiga level (tidak kurang) Anda harus menambahkan 'pelebaran layer'. Lapisan pelebaran terdiri dari garis miring dan garis miring terbalik tepat di atas dinding bagian di bawahnya, dan bagian di bawah ini harus dua ruang lebih luas dari bagian di atas. Lapisan tambahan tidak dihitung terhadap ketinggian bangunan.

Bangunan tidak boleh tumpang tindih tetapi tidak boleh memiliki ruang yang tidak perlu di antara mereka, dan tanah selalu datar sehingga semua bangunan harus memiliki dasar pada tingkat yang sama.

Misalnya, 'abcdefga' akan terlihat seperti ini.

                           _
                          / \
                     _    | |
                _   / \   | |
           _   / \  | |   | |
          / \  | |  | |  /   \
       _  | |  | |  | |  |   |
    _ / \ | |  | | /   \ |   |
 _ / \| | | | /   \|   | |   |  _
/ \| || |/   \|   ||   |/     \/ \
|_||_||_||___||___||___||_____||_|

Spasi dalam input string harus diwakili oleh spasi ganda.

Pemberhentian penuh pada input string harus diwakili oleh puing-puing seperti ini.

/\/\

Contoh lebih lanjut

Input = Hello world.

Output =

                                                   _                                                  
                                                  / \                                                 
                                                  | |                                                 
                                                  | |                                                 
                                                  | |                                                 
                                                 /   \                                                
                                                 |   |                                                
                                                 |   |                       _                        
                                                 |   |                      / \                       
                                                /     \                     | |                       
                                                |     |                     | |                       
                                   _            |     |          _          | |                       
                                  / \           |     |         / \        /   \                      
                                  | |          /       \        | |        |   |                      
                                  | |          |       |        | |        |   |                      
                _        _        | |          |       |        | |        |   |        _             
               / \      / \      /   \         |       |       /   \      /     \      / \            
               | |      | |      |   |        /         \      |   |      |     |      | |            
               | |      | |      |   |        |         |      |   |      |     |      | |            
               | |      | |      |   |        |         |      |   |      |     |      | |            
   _          /   \    /   \    /     \       |         |     /     \    /       \    /   \           
  / \         |   |    |   |    |     |      /           \    |     |    |       |    |   |           
  | |         |   |    |   |    |     |      |           |    |     |    |       |    |   |           
  | |         |   |    |   |    |     |      |           |    |     |    |       |    |   |           
  | |    _   /     \  /     \  /       \     |           |   /       \  /         \  /     \          
 /   \  / \  |     |  |     |  |       |    /             \  |       |  |         |  |     |   _      
 |   |  | |  |     |  |     |  |       |    |             |  |       |  |         |  |     |  / \     
 |   |  | |  |     |  |     |  |       |    |             |  |       |  |         |  |     |  | |     
 |   |  | | /       \/       \/         \   |             | /         \/           \/       \ | |     
/     \/   \|       ||       ||         |  /               \|         ||           ||       | | |     
|     ||   ||       ||       ||         |  |               ||         ||           ||       |/   \    
|_____||___||_______||_______||_________|  |_______________||_________||___________||_______||___|/\/\

Input = lorem ipsum

                                                                                             _                  
                                                                                            / \                 
                                                                              _             | |                 
                                                                             / \            | |                 
                          _                                                  | |            | |                 
                         / \                                                 | |           /   \                
                         | |                                    _            | |           |   |                
                         | |                                   / \          /   \          |   |                
              _          | |                                   | |          |   |          |   |                
             / \        /   \                                  | |          |   |         /     \               
             | |        |   |              _                   | |          |   |         |     |         _     
             | |        |   |             / \                 /   \        /     \        |     |        / \    
    _        | |        |   |             | |                 |   |        |     |        |     |        | |    
   / \      /   \      /     \            | |                 |   |        |     |       /       \       | |    
   | |      |   |      |     |            | |                 |   |        |     |       |       |       | |    
   | |      |   |      |     |           /   \               /     \      /       \      |       |      /   \   
   | |      |   |      |     |           |   |        _      |     |      |       |      |       |      |   |   
  /   \    /     \    /       \          |   |       / \     |     |      |       |     /         \     |   |   
  |   |    |     |    |       |          |   |       | |     |     |      |       |     |         |     |   |   
  |   |    |     |    |       |         /     \      | |    /       \    /         \    |         |    /     \  
  |   |    |     |    |       |         |     |      | |    |       |    |         |    |         |    |     |  
 /     \  /       \  /         \   _    |     |     /   \   |       |    |         |   /           \   |     |  
 |     |  |       |  |         |  / \   |     |     |   |   |       |    |         |   |           |   |     |  
 |     |  |       |  |         |  | |  /       \    |   |  /         \  /           \  |           |  /       \ 
 |     |  |       |  |         |  | |  |       |    |   |  |         |  |           |  |           |  |       | 
/       \/         \/           \ | |  |       |   /     \ |         |  |           | /             \ |       | 
|       ||         ||           |/   \ |       |   |     | |         |  |           | |             | |       | 
|       ||         ||           ||   |/         \  |     |/           \/             \|             |/         \
|_______||_________||___________||___||_________|  |_____||___________||_____________||_____________||_________|

Input = a.a.a.x.x.x.a.a.a

                             _                    _                    _                             
                            / \                  / \                  / \                            
                            | |                  | |                  | |                            
                            | |                  | |                  | |                            
                            | |                  | |                  | |                            
                           /   \                /   \                /   \                           
                           |   |                |   |                |   |                           
                           |   |                |   |                |   |                           
                           |   |                |   |                |   |                           
                          /     \              /     \              /     \                          
                          |     |              |     |              |     |                          
                          |     |              |     |              |     |                          
                          |     |              |     |              |     |                          
                         /       \            /       \            /       \                         
                         |       |            |       |            |       |                         
                         |       |            |       |            |       |                         
                         |       |            |       |            |       |                         
                        /         \          /         \          /         \                        
                        |         |          |         |          |         |                        
                        |         |          |         |          |         |                        
                        |         |          |         |          |         |                        
                       /           \        /           \        /           \                       
                       |           |        |           |        |           |                       
                       |           |        |           |        |           |                       
                       |           |        |           |        |           |                       
                      /             \      /             \      /             \                      
                      |             |      |             |      |             |                      
                      |             |      |             |      |             |                      
                      |             |      |             |      |             |                      
                     /               \    /               \    /               \                     
 _      _      _     |               |    |               |    |               |     _      _      _ 
/ \    / \    / \    |               |    |               |    |               |    / \    / \    / \
|_|/\/\|_|/\/\|_|/\/\|_______________|/\/\|_______________|/\/\|_______________|/\/\|_|/\/\|_|/\/\|_|

Aturan

  • Tentu saja ini golf kode, skor terendah dalam byte menang
  • Aturan celah standar berlaku
  • Sejumlah baris kosong tambahan sebelum atau setelah output diizinkan
  • Anda dapat memilih untuk output seluruh hasil dalam satu string atau menawarkan output sebagai array di mana setiap elemen mewakili satu baris output, atau kirim ke STDOUT

Catatan

Ini adalah posting pertama saya ke PPCG, jadi silakan saja. Sudah melalui kotak pasir. Setiap poin negatif atau perbaikan yang mungkin, silakan posting sebagai komentar dan saya akan melakukan apa yang saya bisa

Darren H
sumber
7
Konversi [a,z]dan [A,Z]untuk [1,26]sepertinya persyaratan sia-sia. Akan jauh lebih baik menggunakan daftar integer sebagai input (setelah 0menjadi input untuk puing-puing). Juga, memposting tantangan Anda setelah berada di Sandbox hanya selama 21 jam , tanpa menunggu untuk mendapatkan suara atau umpan balik dari lebih dari satu pengguna, tidak dihitung karena telah "melalui kotak pasir". Disarankan untuk meninggalkan tantangan di Sandbox setidaknya selama 48-72 jam, untuk memberi orang banyak waktu untuk meninjaunya.
Mego
2
Mengingatkan saya pada ini . Tantangan pertama yang bagus, tapi saya sarankan Anda mempertimbangkan untuk mengubah [a,z], [1.26]bagian yang disebutkan Mego. Pilihan opsional sering kali merupakan yang terbaik (kecuali jika itu adalah bagian penting dari tantangan (tidak ada di sini)
Stewie Griffin
2
Saya akan mengatakan, ini adalah tantangan pertama yang sangat bagus. Selamat datang di situs ini!
DJMcMayhem
1
Saya bisa mengerti poin tentang pemetaan az ke bilangan bulat. Masuk akal dalam iterasi pertama tantangan tetapi sejak mengedit untuk kejelasan dan singkatnya (ada latar belakang yang telah saya hapus) surat-surat tidak lagi relevan. Saya akan mengeditnya sesegera mungkin
Darren H
1
Saya lebih suka az, ruang, titik, secara pribadi.
isaacg

Jawaban:

10

JavaScript (ES6), 330 326 ... 315 309 byte

Membangun seni ASCII secara rekursif, dimulai dengan lantai dasar dan menerapkan beberapa ekspresi reguler antara setiap tahap:

(a,l,R=(E,b)=>E.split`:`.map((e,i)=>l=(l||a).replace(RegExp(e,'g'),b?b.split`:`[i]:n=>(x=(n.charCodeAt()-65)%32)<0?x+1?'/y/y':n+n:x%3+'_'.repeat((x/3<<1)+1)+0)))=>(L=l)?(R('/y:_:/xy:1:2:/xx(x+)y:0(x+)0:3','  :x: _ :3:1: 2$10 :/$1y:0'),L==l?(l=a.join`
`,R('\\d:x:y','|: :\\'),l):f([l].concat(a),l)):f(R('.'),l)

Bagaimana itu bekerja

1) Lantai bawah

Kami mulai dengan menerjemahkan string input ke lantai bawah seperti:

"ab cd.df.hcab"  -->  "0_01_0  2_00___0/y/y0___02___0/y/y1_____02_00_01_0"

dimana:

  • y adalah alias yang lebih pendek untuk backslash (yang membutuhkan pelarian)
  • Digit ( 0, 1atau 2) tepat sebelum urutan _adalah dinding kiri bangunan. Ini mewakili jumlah dinding yang harus ditempatkan di atasnya sebelum 'pelebaran lapisan' berikutnya.
  • Angka setelah urutan _adalah dinding kanan bangunan dan selalu ditetapkan 0.

2) Ekspresi reguler diterapkan antara setiap tahap

Proses rekursif terdiri dari menerapkan 9 penggantian di lantai sebelumnya, menggunakan ekspresi reguler berikut:

  1. /\/y/g=> " "(hapus puing-puing)
  2. /_/g=> "x"(ganti fondasi atau bagian atas bangunan dengan balok padat)
  3. /\/xy/g=> " _ "(ganti layer pelebaran terakhir dengan bagian atas bangunan)
  4. /1/g=> "3"(ganti sementara 1dengan 3- lihat langkah terakhir)
  5. /2/g=> "1"(ganti 2dengan 1)
  6. /\/xx(x+)y/g=> " 2$10 "(ganti layer pelebaran dengan dinding baru yang lebih sempit)
  7. /0(x+)0/g=> "/$1y"(ganti bagian atas dinding dengan lapisan pelebaran)
  8. /3/g=> "0"(ganti 3dengan 0)

Misalnya, berikut adalah transformasi berturut-turut dari 2___0(lantai bawah yang dihasilkan oleh a 'f'):

"2___0" > "1xxx0" > "0xxx0" > "/xxxy" > " 2x0 " > " 1x0 " > " 0x0 " > " /xy " > "  _  "

                                                                                   _   
                                                                        /xy       /xy  
                                                              0x0       0x0       0x0  
                                                    1x0       1x0       1x0       1x0  
                                          2x0       2x0       2x0       2x0       2x0  
                               /xxxy     /xxxy     /xxxy     /xxxy     /xxxy     /xxxy 
                     0xxx0     0xxx0     0xxx0     0xxx0     0xxx0     0xxx0     0xxx0 
           1xxx0     1xxx0     1xxx0     1xxx0     1xxx0     1xxx0     1xxx0     1xxx0 
 2___0     2___0     2___0     2___0     2___0     2___0     2___0     2___0     2___0 

NB : Bagian atas gedung kemudian diganti dengan a x. Ini tidak ditunjukkan pada diagram di atas.

3) Ekspresi reguler diterapkan pada hasil akhir

Rekursi berhenti ketika tidak ada lagi yang bisa diganti, yang berarti bahwa kita berada di atas puncak gedung tertinggi.

Kita sekarang perlu membersihkan semuanya dengan beberapa ekspresi reguler:

  1. /\d/g=> "|"(ganti digit dengan pipa)
  2. /x/g=> " "(ganti blok padat dengan spasi)
  3. /y/g=> "\"(ganti ydengan garis miring terbalik)

Contohnya:

  _            _  
 /xy          / \ 
 0x0          | | 
 1x0          | | 
 2x0   -->    | | 
/xxxy        /   \
0xxx0        |   |
1xxx0        |   |
2___0        |___|

Demo

let f =

(a,l,R=(E,b)=>E.split`:`.map((e,i)=>l=(l||a).replace(RegExp(e,'g'),b?b.split`:`[i]:n=>(x=(n.charCodeAt()-65)%32)<0?x+1?'/y/y':n+n:x%3+'_'.repeat((x/3<<1)+1)+0)))=>(L=l)?(R('/y:_:/xy:1:2:/xx(x+)y:0(x+)0:3','  :x: _ :3:1: 2$10 :/$1y:0'),L==l?(l=a.join`
`,R('\\d:x:y','|: :\\'),l):f([l].concat(a),l)):f(R('.'),l)

console.log(f('ab cd.df.hcab'));

Kontributor:
4 byte disimpan berkat Hedi
8 byte disimpan berkat Tidak, Charles

Arnauld
sumber
Siapa pun yang ingin mengambil input sebagai integer dipersilahkan untuk tetapi saya menyarankan entri seperti itu harus tidak bersaing
mbomb007
@ mbomb007 - Ini sudah diperbaiki Optimalisasi saya saat ini tidak mengimbangi biaya yang terkenal .charCodeAt().
Arnauld
Anda tidak perlu new dinew RegExp(e,'g')
Hedi
Saya suka pendekatan ini banyak. Beberapa ide yang dapat membantu: 1. gunakan arang seperti yitu yang tidak memerlukan pelarian untuk tebasan depan Anda. 2. jika Anda menggunakan _untuk lantai dasar, Anda masih dapat membedakan atas dengan regex: /_ /.
Bukan karena Charles
1
@NotthatCharles - Saya sebenarnya tidak pernah memperhatikan aturan "ruang ganda". ;) Ini sudah diperbaiki.
Arnauld
7

PHP, 386 376 367 364 362 358 356 byte

pendekatan pertama; mungkin masih bisa golf.

foreach(str_split($argv[1])as$c)for($n=28,$w='.'!=$c?1+2*ceil(1/3*$n=31&ord($c)):4,$p=$y=0;$y<36;){$s=str_pad("",$w,$y||!$n?" ":_);if($n>26&&!$y){$s="/\\/\\";$n=-1;}elseif($n-->0){$s[$p]=$s[$w-$p-1]="|";if($n%3<1){$o[$y++].=$s;$s=str_pad("",$w);$s[$p]="/";$s[$w-++$p]="\\";}}$o[$y++].=$s;if(!$n)$o[$y++].=str_pad(_,$w," ",2);}for($y=36;$y--;)echo"$o[$y]
";

PHP, 366 362 361 360 357 byte

pendekatan serupa dengan subfungsi:

function a($p,$r){global$o,$w,$y;$o[$y++].=str_pad(str_pad($r[0],2*$p,$r[1]).$r[2],$w," ",2);}foreach(str_split($argv[1])as$i=>$c)for($n=28,$w='.'!=$c?1+2*$p=ceil(1/3*$n=31&ord($c)):$p=4,$y=0;$y<36;)if($n>26&&!$y)$o[$n=$y++].="/\\/\\";elseif($n-->0){a($p,$y?"| |":"|_|");if($n%3<1)a($p--,"/ \\");if(!$n)a(1," _");}else a(0,"");for($y=36;$y--;)echo"$o[$y]
";

gangguan untuk pendekatan kedua

function a($p,$r)
{
    global$o,$w,$y;
    $o[$y++].=                  // 3. add result to current line, increase line counter
        str_pad(                // 2. pad ...
        str_pad($r[0],2*$p,$r[1]).$r[2]     // 1. A + inner width(=2*$p-1) times B + C
        ,$w," ",2);             // ... to $w with blanks on both sides # 2==STR_PAD_BOTH
}

foreach(str_split($argv[1])as$i=>$c)
    for(
    $n=28,
    $w='.'!=$c                          // $w=total width
        ?1+2*$p=ceil(1/3*$n=31&ord($c)) // $n=storey count, $p=(inner width+1)/2
        :$p=4                           // $n=28, $p <= $w=4 for rubble
    ,
    $y=0;$y<36;)                        // $y=line counter
        if($n>26&&!$y)
            $o[$n=$y++].="/\\/\\";      // bottom line=rubble, $n=0
        elseif($n-->0)
        {
            a($p,$y?"| |":"|_|");       // add storey
            if($n%3<1)a($p--,"/ \\");   // add widening layer/roof
            if(!$n)a(1," _");           // add roof top
        }
        else
            a(0,"");                    // idk why str_pad doesn´t yield a warning here

for($y=36;$y--;)if($s=rtrim($o[$y]))echo"$s\n"; // output

+16 byte jika baris baru tidak diizinkan:
Ganti echo"$o[$y]\n;dengan if($s=rtrim($o[$y]))echo"$s\n";.

-3 byte untuk sembarang ;<=>?[\]^_{|}~puing: Ganti 1) ($n=31&ord($c))dengan $n, 2) $n=28,$w='.'!=$cdengan ($n=31&ord($c))<27dan 3) 4dengan ($n=28)/7.

Lain -8 untuk >, ^atau ~sebagai puing-puing: Undo 3)

Titus
sumber
1
if(!$n){$o[$y++].=str_pad(_,$w," ",2);}-2 Bytes untuk kurung
Jörg Hülsermann
dan output dapat dilakukan 3 byte lebih pendek: for($y=36;$y--;)echo"$o[$y]\n";; tapi saya punya pendekatan baru yang menyimpan 2 byte lainnya.
Titus
1
php.net/manual/en/functions.anonymous.php untuk pendekatan kedua `berfungsi a ($ p, $ r) gunakan ($ o, $ w, $ y) 'sebagai ganti global
Jörg Hülsermann
@ JörgHülsermann: usehanya berfungsi untuk fungsi anonim. itu akan menghemat 2 byte; tapi saya harus menyimpan fungsi itu dalam variabel $a=alih-alih memberinya nama (+3 byte) dan menambahkan $ke masing-masing dari empat panggilan.
Titus
4

Pyth, 93 79 byte

K"/\\"j_.tsm?hJxGdC_m.[hyNk\ +\_mj*hy/k4?nkJ\ \_?%k4"||"Kh=+J=Nh/J3[F*2|@d;Krz0

Cobalah online. Suite uji.

Penjelasan

Saya menyembunyikannya secara default karena terlalu lama.

PurkkaKoodari
sumber
4

Perl, 147 146 byte

Termasuk +1 untuk -p

Jalankan dengan input pada STDIN, mis

citysky.pl <<< " abcdefgxyz."

citysky.pl:

#!/usr/bin/perl -p
s%.%@{[map chr~-ord(lc$&)*4/3-4*(abs||-9),-9..9]}%g;y/M\xa248
A|-\xc6\0-\xff/MA||
A}-\xc6A/d,$a=(lc$a).$_ for($_)x36;*_=a;s/\x9f.*?\K\x9f/\xa3/g;y%A\xc6\x9f-\xa3\x0b-\xff%__/|||\\ %

Bekerja seperti yang ditunjukkan, tetapi ganti \xhhlolos dengan nilai literal mereka untuk mendapatkan skor yang diklaim. Anda dapat melakukannya menggunakan perintah ini:

perl -0pi -e 's/\\x(..)/chr hex $1/eg;s/\n$//' citysky.pl

Saya belum benar-benar menjelajahi pendekatan lain, jadi ini mungkin sangat bisa dikalahkan ...

Ton Hospel
sumber
2

Haskell, 289 byte

c?l=c++l++c
c%s=("|"?(drop 2(r s)>>c)):s
g 46=["/\\"?""]
g 32=["  "]
g x="_"%h(mod x 32)
h 1=["/ \\"," _ "]
h x=(" "%h(x-1))!x
v!x|mod x 3/=1=v|z<-'/':r v++"\\"=z:map(" "?)v
r v=v!!0>>" "
f t|l<-map(g.fromEnum)t,m<-maximum(map length l)-1=unlines[l>>= \x->(x++cycle[r x])!!i|i<-[m,m-1..0]]
Damien
sumber
2

Ruby, 245

->s{a=['']*36
w=' '
s.chars{|c|a[u=0]+=c<?!?w*2:c<?/?"/\\"*2:(h=c.upcase.ord-64
1.upto(1+h+=(h-1)/3){|t|u=[u,l=1+2*((f=h-t)/4)].max
a[t]+=w*(a[0].size-a[t].size)+(f<-1?w:f<0??_:(f%4<1?[?/,?\\]:[?|]*2)*(w*l)).center(u+2)}
"|#{?_*u}|")}
a.reverse}

Anda mengizinkan baris baru tambahan sebanyak yang Anda inginkan, jadi saya mengambil kebebasan dengan itu. Selain itu, prosesnya adalah sebagai berikut:

  1. Inisialisasi array keluaran a.
  2. Untuk setiap karakter:
    1. jika '', tambahkan  kea[0]
    2. jika '.', tambahkan /\/\kea[0]
    3. jika tidak:
      1. menghitung tinggi ( c.upcase.ord + (c.upcase.ord-1)/3)
      2. untuk setiap baris di a:
        1. pad baris dengan spasi putih. a[t]+=w*(a[0].size-a[t].size)
        2. jika kita satu di atas h, pusat a_
        3. kalau tidak kita berada di atas ketinggian, pusat a 
        4. lain jika kita di bawah tinggi, tengah | |atau / \lebar yang tepat ( 1+2*((h-t)/4), tergantung pada apakahh-t%4==0
        5. tambahkan "|___|"lebar kanan kea[0]
  3. kembali a.reverse

Saya yakin saya bisa membuatnya lebih kecil jika saya menghitung matematika untuk menghindari reverse

Bukan itu Charles
sumber
2

PHP, 297 byte

foreach(str_split($argv[1])as$c)for($j=0,$h=ord($c)-64,$g=$h+$f=ceil($h/3),$w=$v=$h<0?$h<-18?2:4:2*$f+1;$j<36;$j++,$g--,$v-=$h>0&&$v>1?($g%4||!$j)?0*$n="|$s|":2+0*$n="/$s\\":$v+0*$n=['','_','',0,'/\/\\'][$v],$o[$j].=str_pad($n,$w,' ',2))$s=str_repeat($j?' ':'_',$v-2);krsort($o);echo join($o,'
');

Versi yang lebih mudah dibaca:

foreach (str_split($argv[1]) as $character) {
    for (
        $line = 0,
        $buildingHeight = ord($character) - 64,
        $floorsLeft = $buildingHeight + $supportFloors = ceil($buildingHeight / 3),
        $buildingWidth = $widthOnThisFloor = $buildingHeight < 0
            ? $buildingHeight < -18
                ? 2
                : 4
            : 2 * $supportFloors + 1;

        $line < 36;

        // The body of the for-loop is executed between these statements

        $line++,
        $floorsLeft--,
        $widthOnThisFloor -= $buildingHeight > 0 && $widthOnThisFloor > 1
            ? ($floorsLeft % 4 || !$line)
                ? 0 * $floorString = "|$middleSpacing|"
                : 2 + 0 * $floorString = "/$middleSpacing\\"
            : $widthOnThisFloor + 0 * $floorString = ['', '_', '', 0, '/\/\\'][$widthOnThisFloor],
        $outputArray[$line] .= str_pad($floorString, $buildingWidth, ' ', 2)
    ) {
        $middleSpacing = str_repeat($line ? ' ' : '_', $widthOnThisFloor - 2);
    }
}
krsort($outputArray);
echo join($outputArray, '
');
chocochaos
sumber