Từ -> Đường chân trời thành phố


40

Các thách thức

Chương trình hoặc chức năng của bạn sẽ chấp nhận đầu vào chuỗi đơn từ STDIN hoặc tham số chức năng. Bạn có thể giả sử đầu vào sẽ chỉ chứa các ký tự chữ cái (a-zA-Z), dấu cách và dấu dừng đầy đủ. Đầu vào không phân biệt chữ hoa chữ thường, vì vậy bạn nên đối xử với 'a' chính xác giống như bạn sẽ đối xử với 'A'.

Đối với mỗi ký tự trong chuỗi, bạn sẽ xuất đại diện cho một tòa nhà theo thông số kỹ thuật sau.

Mỗi tòa nhà phải có một mái nhà, được chỉ định bởi một dấu gạch dưới ở dòng trên cùng sau đó là dấu gạch chéo, dấu cách, dấu gạch chéo ngược trên dòng thứ hai.

 _
/ \

Sau đó, bạn sẽ có một số tầng, khớp với số chữ cái (a = 1, b = 2, c = 3, v.v.) được thể hiện bằng một bức tường (|) ở mỗi bên và một khoảng trống ở giữa. Tầng dưới cùng (và chỉ tầng dưới cùng) nên có một nền tảng, đó là một gạch dưới giữa các bức tường. Như thế này...

|_|

Vì vậy, ví dụ, 'b' sẽ trông như thế này

 _
/ \
| |
|_|

Bây giờ, chúng ta biết rằng các tòa nhà rất cao, hẹp không thể đứng và phải rộng hơn ở chân đế, vì vậy không có tòa nhà nào có thể cao hơn ba tầng mà không có một số hỗ trợ bổ sung. Vì vậy, cứ ba cấp độ (không ít hơn), bạn nên thêm một 'lớp mở rộng'. Lớp mở rộng bao gồm một dấu gạch chéo và dấu gạch chéo ngược ngay phía trên các bức tường của phần bên dưới nó, và phần bên dưới nên rộng hơn hai khoảng trống so với phần bên trên. Lớp bổ sung không được tính vào chiều cao của tòa nhà.

Các tòa nhà không nên chồng chéo nhưng không nên có bất kỳ khoảng trống không cần thiết nào giữa chúng và mặt đất luôn bằng phẳng để tất cả các tòa nhà nên có căn cứ của chúng ở cùng một cấp độ.

Ví dụ: 'abcdefga' sẽ trông như thế này.

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

Các không gian trong đầu vào chuỗi phải được biểu thị bằng một khoảng trắng kép.

Dừng hoàn toàn trong đầu vào chuỗi nên được thể hiện bằng đống đổ nát như thế này.

/\/\

Ví dụ khác

Đầu vào = Hello world.

Đầu ra =

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

Đầu vào = lorem ipsum

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

Đầu vào = a.a.a.x.x.x.a.a.a

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

Quy tắc

  • Tất nhiên đây là mã golf, điểm thấp nhất tính bằng byte thắng
  • Quy tắc kẽ hở tiêu chuẩn áp dụng
  • Bất kỳ số lượng dòng trống bổ sung trước hoặc sau khi đầu ra được cho phép
  • Bạn có thể chọn xuất toàn bộ kết quả trong một chuỗi hoặc cung cấp đầu ra dưới dạng một mảng trong đó mỗi phần tử đại diện cho một dòng đầu ra hoặc gửi đến STDOUT

chú thích

Đây là bài viết đầu tiên của tôi đến PPCG, vì vậy hãy đi dễ dàng với tôi. Nó đã đi qua hộp cát. Bất kỳ điểm tiêu cực hoặc cải thiện có thể xin vui lòng gửi như một nhận xét và tôi sẽ làm những gì tôi có thể


7
Chuyển đổi [a,z][A,Z]để [1,26]có vẻ như là một yêu cầu vô nghĩa. Sẽ tốt hơn nhiều nếu chỉ sử dụng một số nguyên danh sách làm đầu vào (phải 0là đầu vào cho đống đổ nát). Ngoài ra, việc đăng thử thách của bạn sau khi nó ở trong Sandbox chỉ trong 21 giờ , không cần chờ nhận bất kỳ phiếu bầu hay phản hồi nào từ nhiều người dùng, không được tính là đã "thông qua hộp cát". Bạn nên để các thử thách trong Sandbox tối thiểu trong 48-72 giờ, để mọi người có nhiều thời gian để xem xét chúng.
Mego

2
Nhắc nhở tôi về điều này . Thử thách đầu tiên tốt đẹp, nhưng tôi khuyên bạn nên xem xét việc thay đổi [a,z], những [1.26]phần mà Mego đã đề cập. Có tùy chọn thường là tốt nhất (trừ khi đó là một phần quan trọng của thử thách (không có ở đây).
Stewie Griffin

2
Tôi sẽ nói, đây là một thử thách đầu tiên rất hay. Chào mừng đến với trang web!
DJMcMayhem

1
Tôi có thể hiểu điểm về ánh xạ az đến số nguyên. Nó có ý nghĩa trong lần lặp đầu tiên của thử thách nhưng kể từ khi chỉnh sửa cho rõ ràng và ngắn gọn (có một cơ sở mà tôi đã loại bỏ), các chữ cái không còn phù hợp. Tôi sẽ chỉnh sửa phù hợp sớm nhất có thể
Darren H

1
Tôi thích az, không gian, thời gian, cá nhân.
isaacg

Câu trả lời:


10

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

Xây dựng nghệ thuật ASCII theo cách đệ quy, bắt đầu từ tầng dưới cùng và áp dụng một số biểu thức chính quy giữa mỗi giai đoạn:

(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)

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

1) Tầng dưới cùng

Chúng tôi bắt đầu bằng cách dịch chuỗi đầu vào thành tầng dưới cùng, chẳng hạn như:

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

Ở đâu:

  • y là một bí danh ngắn hơn cho dấu gạch chéo ngược (yêu cầu thoát)
  • Chữ số ( 0, 1hoặc 2) ngay trước một dãy _là bức tường bên trái của tòa nhà. Nó đại diện cho số lượng các bức tường phải được đặt phía trên nó trước khi 'lớp mở rộng' tiếp theo.
  • Chữ số sau một chuỗi _là bức tường bên phải của tòa nhà và luôn được đặt thành 0.

2) Biểu thức chính quy được áp dụng giữa mỗi giai đoạn

Quá trình đệ quy bao gồm áp dụng 9 thay thế ở tầng trước, sử dụng các biểu thức chính quy sau:

  1. /\/y/g=> " "(loại bỏ đống đổ nát)
  2. /_/g=> "x"(thay thế nền móng hoặc đỉnh của tòa nhà bằng một khối vững chắc)
  3. /\/xy/g=> " _ "(thay thế lớp mở rộng cuối cùng bằng đỉnh tòa nhà)
  4. /1/g=> "3"(tạm thời thay thế 1bằng 3- xem bước cuối cùng)
  5. /2/g=> "1"(Thay thế 2bằng 1)
  6. /\/xx(x+)y/g=> " 2$10 "(thay thế một lớp mở rộng bằng một bức tường mới hẹp hơn)
  7. /0(x+)0/g=> "/$1y"(thay thế đỉnh tường bằng một lớp mở rộng)
  8. /3/g=> "0"(Thay thế 3bằng 0)

Chẳng hạn, đây là các phép biến đổi liên tiếp của 2___0(tầng dưới cùng được tạo bởi 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 : Đỉnh của tòa nhà sau đó được thay thế bằng a x. Điều này không được hiển thị trong sơ đồ trên.

3) Biểu thức chính quy được áp dụng cho kết quả cuối cùng

Việc đệ quy dừng lại khi không còn gì để thay thế, điều đó có nghĩa là chúng tôi nằm ngoài đỉnh của tòa nhà cao nhất.

Bây giờ chúng ta cần dọn dẹp mọi thứ với một vài biểu thức thông thường khác:

  1. /\d/g=> "|"(thay thế chữ số bằng đường ống)
  2. /x/g=> " "(thay thế khối đặc bằng dấu cách)
  3. /y/g=> "\"(thay thế ybằng dấu gạch chéo ngược)

Ví dụ:

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

Bản giới thiệu

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

Người đóng góp:
4 byte được lưu nhờ Hedi
8 byte được lưu nhờ Không phải Charles


Bất cứ ai muốn lấy đầu vào làm số nguyên đều được chào đón nhưng tôi đề nghị một mục như vậy không nên cạnh tranh
mbomb007

@ mbomb007 - Cái này là cố định. .charCodeAt()Mặc dù vậy, tối ưu hóa hiện tại của tôi không bù đắp được chi phí của sự khét tiếng .
Arnauld

Bạn không cần new trongnew RegExp(e,'g')
Hedi

Tôi thích cách tiếp cận này rất nhiều. Một số ý tưởng có thể giúp: 1. sử dụng char như thế ykhông yêu cầu thoát cho dấu gạch chéo về phía trước của bạn. 2. nếu bạn sử dụng _cho tầng trệt, bạn vẫn có thể phân biệt đỉnh với regex : /_ /.
Không phải Charles

1
@NotthatCharles - Tôi thực sự không bao giờ nhận thấy quy tắc "không gian kép". ;) Điều này là cố định.
Arnauld

7

PHP, 386 376 367 364 362 358 356 byte

cách tiếp cận đầu tiên; vẫn có thể chơi được

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

cách tiếp cận tương tự với một chức năng con:

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]
";

sự cố cho cách tiếp cận thứ hai

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 nếu dòng mới hàng đầu không được phép:
Thay thế echo"$o[$y]\n;bằng if($s=rtrim($o[$y]))echo"$s\n";.

-3 byte cho bất kỳ ;<=>?[\]^_{|}~như là đống đổ nát: Thay thế 1) ($n=31&ord($c))bằng $n, 2) $n=28,$w='.'!=$cbằng ($n=31&ord($c))<27và 3) 4bằng ($n=28)/7.

Một -8 khác >, ^hoặc ~như đống đổ nát: Hoàn tác 3)


1
if(!$n){$o[$y++].=str_pad(_,$w," ",2);}-2 byte cho dấu ngoặc
Jörg Hülsermann

và đầu ra có thể được thực hiện ngắn hơn 3 byte : for($y=36;$y--;)echo"$o[$y]\n";; nhưng tôi có một cách tiếp cận mới giúp tiết kiệm 2 byte khác.
Tít

1
php.net/manual/en/fiances.anonymous.php cho cách tiếp cận thứ hai `chức năng a ($ p, $ r) sử dụng ($ o, $ w, $ y) 'thay vì toàn cầu
Jörg Hülsermann

@ JörgHülsermann: usechỉ hoạt động cho các chức năng ẩn danh. nó sẽ tiết kiệm được 2 byte; nhưng tôi sẽ phải lưu trữ hàm đó trong một biến $a=thay vì đặt tên cho nó (+3 byte) và thêm a $vào mỗi trong bốn cuộc gọi.
Tít

4

Pyth, 93 79 byte

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

Hãy thử trực tuyến. Bộ thử nghiệm.

Giải trình

Tôi đã giấu điều này theo mặc định vì nó quá dài.


4

Perl, 147 146 byte

Bao gồm +1 cho -p

Chạy với đầu vào trên STDIN, ví dụ:

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%__/|||\\ %

Hoạt động như được hiển thị, nhưng thay thế các \xhhlối thoát bằng giá trị theo nghĩa đen của chúng để có được điểm số được yêu cầu. Bạn có thể làm điều đó bằng cách sử dụng dòng lệnh này:

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

Tôi chưa thực sự khám phá bất kỳ cách tiếp cận nào khác, vì vậy điều này có thể rất dễ bị đánh bại ...


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

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}

Bạn cho phép thêm nhiều dòng mới như bạn muốn, vì vậy tôi đang tự do với điều đó. Bên cạnh đó, quy trình như sau:

  1. Khởi tạo một mảng đầu ra a.
  2. Đối với mỗi char:
    1. nếu đó là '', thêm  vàoa[0]
    2. nếu đó là '.', hãy thêm /\/\vàoa[0]
    3. nếu không thì:
      1. tính chiều cao ( c.upcase.ord + (c.upcase.ord-1)/3)
      2. cho mỗi hàng trong a:
        1. đệm hàng với khoảng trắng. a[t]+=w*(a[0].size-a[t].size)
        2. nếu chúng ta ở trên h, hãy tập trung vào_
        3. khác nếu chúng ta ở trên chiều cao, trung tâm a 
        4. khác nếu chúng ta thấp hơn chiều cao, trung tâm | |hoặc / \chiều rộng thích hợp ( 1+2*((h-t)/4), tùy thuộc vào việch-t%4==0
        5. thêm "|___|"chiều rộng đúnga[0]
  3. trở về a.reverse

Tôi cá là tôi có thể làm cho nó nhỏ hơn nếu tôi làm bài toán để tránh reverse


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,'
');

Một phiên bản dễ đọc hơn:

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, '
');
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.