Giúp các kiến ​​trúc sư hình dung ra đường chân trời


29

Là một phần của dự án quy hoạch thành phố, bạn đã được giao nhiệm vụ tạo một chương trình hoặc chức năng sẽ hiển thị đường chân trời thành phố, được cung cấp một số đầu vào từ các kiến ​​trúc sư. Dự án chỉ trong giai đoạn khởi động, vì vậy một bản phác thảo rất thô là đủ. Tất nhiên, cách tiếp cận đơn giản nhất là vẽ đường chân trời trong nghệ thuật ASCII.

Tất cả các tòa nhà sẽ ở bên bờ sông, do đó tất cả chúng đều thẳng hàng. Các kiến ​​trúc sư sẽ cho chiều cao của mỗi tòa nhà làm đầu vào và mã của bạn sẽ hiển thị đường chân trời.

Đầu vào từ các kiến ​​trúc sư sẽ là một số nguyên hoặc một nửa số nguyên. Nếu số là một số nguyên, tòa nhà sẽ có một mái bằng, trong khi một nửa số nguyên sẽ dẫn đến một mái dốc. Một số không sẽ chỉ là mặt đất bằng phẳng. Các bức tường của một tòa nhà cách nhau 3 ký tự, trong khi số 0 sẽ là một ký tự rộng. Các tòa nhà liền kề chia sẻ các bức tường.

Để biết chi tiết và làm rõ về đầu ra, xin vui lòng xem các ví dụ dưới đây:

N = 3
 ___
|   |
|   |
|___|

N = 3.5
  _      
 / \
|   |
|   |
|___|

N = 6
 ___
|   |
|   |
|   |
|   |
|   |
|___|

n = 0
_

Ví dụ đầu vào: 3 3.5 0 2

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

Ví dụ đầu vào: 0 0 2.5 3 0 4 1

             ___
    _  ___  |   |
   / \|   | |   |
  |   |   | |   |___
__|___|___|_|___|___|

Louisville ,0 2 1 3.5 0 4 2 4 2 4 6 1 6 0 5 1

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

Các ký tự ASCII được sử dụng là: dòng mới, dấu cách và /\_|(mã điểm 10, 32, 47, 92, 95, 124).

Quy tắc:

  • Tùy chọn để tạo một chương trình chỉ lấy số nguyên làm đầu vào, bằng cách nhân tất cả các số với hai. Vì vậy, thay vì lấy 3 3.5 2, chương trình của bạn có thể mất 6 7 4. Nếu định dạng đầu vào thứ hai được chọn, đầu vào 6 sẽ dẫn đến tòa nhà 3 tầng, 7 sẽ là tòa nhà 3 tầng có mái dốc, v.v.
  • Đầu ra phải chính xác như được mô tả ở trên, nhưng dấu cách và dòng mới là OK.
  • Các định dạng chính xác của đầu vào là tùy chọn. Bất cứ điều gì là tốt nhất trong ngôn ngữ của bạn.
  • Kết quả phải được hiển thị trên màn hình, để các kiến ​​trúc sư có thể nhìn vào nó.
  • Bạn có thể giả sử sẽ có ít nhất một số nguyên được cung cấp và chỉ có đầu vào hợp lệ mới được cung cấp.

Đây là codegolf, vì vậy mã ngắn nhất tính bằng byte sẽ thắng.


1
Một tòa nhà có chiều cao 0,5 sẽ trông như thế nào?
Tom Carpenter

Không nghĩ về nó thực sự. Sự lựa chọn rõ ràng nhất sẽ chỉ là một mái dốc, gần giống như một ngôi nhà hobbit :-) nhưng bạn có thể tự do lựa chọn, hoặc bạn có thể cho rằng đầu vào sẽ không bao giờ là 0,5 ...
Stewie Griffin

1
Hiện tại, những điều kỳ lạ xảy ra vì không có tường (tôi cho rằng 0,5 cao không tồn tại), vì vậy tôi sẽ phải làm việc với câu trả lời của mình một chút.
Tom Carpenter

Tôi vừa thử mã của bạn với chiều cao 0,5 và tôi đồng ý, "lạ" là một từ rất mô tả = PI chưa đi qua chi tiết, vì vậy tôi không chắc chuyện gì đang xảy ra ... Dù sao, bạn trả lời là hoàn toàn hợp lệ, bạn có thể cho rằng không có 0,5 tòa nhà nào ...
Stewie Griffin

Câu trả lời:


5

Python 2, 199 193 188 185 byte

a=map(int,raw_input().split())
l=max(a)+1|1
while~l:print''.join((x%2*'/  _\\ '[x<l::2]*(x<=l<x+4)or'_ '[x|1!=l>1]*3)[x<1:x+2]+'| '[x<=l>=y]*(x+y>0)for x,y in zip([0]+a,a+[0]))[1:];l-=2

Đây là một chương trình đầy đủ chấp nhận số nguyên làm đầu vào. Ví dụ đầu vào .


Tuyệt vời! Tôi phải ăn cắp một số mánh khóe này cho các gôn trong tương lai ...
quintopia

5

MATLAB, 219 209 203 byte

i=input('');x=1;c=0;m(1:4*numel(i))='_';for a=i;b=fix(a);m(1:b,x)='|';s=95;if a~=b;m(b+2,x+2)=95;s='/ \';end;m(b+1,x+(1:3))=s;x=x+(a>0)*3+1;m(1:b,x)='|';x=x+(a<1&c>0);c=a;end;disp(flipud(m(:,1:x-(a<1))))

Thật không may, điều này không hoạt động trên Octave . Không hoàn toàn chắc chắn tại sao, dường như là một cái gì đó để làm với bit phân tán / flipud bị phá vỡ.

Ngoài ra, hiện tại không có định nghĩa về việc tòa nhà có chiều cao 0,5 trông như thế nào, cũng không có bất kỳ đề cập nào về chúng, vì vậy trong mã này tôi cho rằng chúng không được phép.

Sau đây là mã theo cách dễ đọc hơn một chút:

i=input(''); %e.g. [0 0 2 1 3.5 0 4 2 4 2 4 6 1 6 0 5 1 0 0 1 0]
x=1;
c=0;
m(1:4*numel(i))='_';
for a=i;
    b=fix(a);
    m(1:b,x)='|';
    s=95;
    if a~=b;
        m(b+2,x+2)=95;
        s='/ \';
    end;
    m(b+1,x+(1:3))=s;
    x=x+(a>0)*3+1;
    m(1:b,x)='|';
    x=x+(a<1&c>0);
    c=a;
end;
disp(flipud(m(:,1:x-(a<1))))

Đầu tiên chúng ta lấy một đầu vào là một mảng và thực hiện một số khởi tạo biến.

i=input(''); %e.g. [0 0 2 1 3.5 0 4 2 4 2 4 6 1 6 0 5 1]
x=1;
c=0;

Bởi vì các tòa nhà có chiều cao bằng không là một nỗi đau - về cơ bản chúng có chiều rộng phụ thuộc vào những gì chúng bên cạnh (mặc dù những gì được in không thay đổi), chúng tôi đơn giản hóa mọi thứ bằng cách vẽ đủ mặt bằng cho tất cả các tòa nhà. Chúng tôi giả định rằng mỗi tòa nhà sẽ có chiều rộng 4 ký tự (vì các tòa nhà liền kề hợp nhất với nhau) - những tòa nhà có chiều cao bằng không, nhưng phần thừa sẽ được cắt bớt sau.

m(1:4*numel(i))='_';

Bây giờ chúng ta lần lượt rút ra từng tòa nhà.

for a=i

Đầu tiên chúng ta lấy phần nguyên của chiều cao vì điều này sẽ xác định có bao nhiêu '|' chúng ta cần.

    b=fix(a);

Bây giờ vẽ trong bức tường cho tòa nhà này - nếu có hai tòa nhà liền kề, bức tường cho cái mới này sẽ nằm trong cùng một cột với bức tường từ cái cuối cùng.

    m(1:b,x)='|';

Kiểm tra xem nếu đây là một tòa nhà cao một nửa. Nếu có thì mái nhà sẽ khác. Đối với một nửa chiều cao, mái nhà sẽ là / \trong khi chiều cao đầy đủ sẽ là ___(Matlab sẽ sao chép hoàn toàn điều này từ một dấu gạch dưới duy nhất, vì vậy hãy lưu một vài byte ở đó). Có thêm một chút mái cao hơn một hàng cho các tòa nhà cao một nửa, do đó cũng được thêm vào.

    s=95;
    if a~=b;
        m(b+2,x+2)=95;
        s='/ \';
    end;

Vẽ trên mái nhà

    m(b+1,x+(1:3))=s;

Bây giờ di chuyển đến điểm bắt đầu của tòa nhà tiếp theo và vẽ vào bức tường chung (nếu bức tường quá ngắn vào thời điểm này, nó sẽ được làm lớn hơn khi tòa nhà tiếp theo được vẽ). Lưu ý rằng các tòa nhà có chiều cao bằng không là 1 chiều rộng, các tòa nhà bình thường là 4 chiều rộng, vì vậy chúng tôi đơn giản hóa những gì sẽ là if-if bằng cách coi (a> 0) là số thập phân không phải là số Boolean.

    x=x+(a>0)*3+1;
    m(1:b,x)='|';

Tiếp đến là một chút tin tặc để làm việc với các tòa nhà có chiều cao bằng không. Về cơ bản điều này nói là nếu tòa nhà này có chiều cao bằng không, và tòa nhà trước đó thì không, có nghĩa là nơi của tòa nhà tiếp theo cần tăng thêm 1 vì tòa nhà có chiều cao bằng 0 được kẹp giữa hai tòa nhà khác có hiệu quả rộng gấp đôi - điều này tài khoản cho bức tường phụ thường được chia sẻ với một tòa nhà liền kề. Chúng tôi cũng theo dõi chiều cao tòa nhà này để thực hiện kiểm tra này vào lần tới.

    x=x+(a<1&c>0);
    c=a;
end;

Sau khi hoàn thành, lật ma trận tòa nhà để trở thành cách chính xác và hiển thị nó. Lưu ý rằng chúng tôi cũng cắt bỏ bất kỳ mặt bằng dư thừa ở đây là tốt.

disp(flipud(m(:,1:x-(a<1))))

Vì vậy, khi chúng tôi chạy tập lệnh này, chúng tôi được yêu cầu nhập liệu, ví dụ:

[0 0 2 1 3.5 0 4 2 4 2 4 6 1 6 0 5 1 0 0 1 0]

Sau đó, nó tạo ra tòa nhà và hiển thị kết quả. Đối với đầu vào trên, sau đây được tạo ra:

                                     ___     ___                   
                                    |   |   |   |  ___             
            _    ___     ___     ___|   |   |   | |   |            
           / \  |   |   |   |   |   |   |   |   | |   |            
   ___    |   | |   |___|   |___|   |   |   |   | |   |            
  |   |___|   | |   |   |   |   |   |   |___|   | |   |___    ___  
__|___|___|___|_|___|___|___|___|___|___|___|___|_|___|___|__|___|_

Làm rất tốt
Stewie Griffin

4

Kotlin, 447 438 byte

val a={s:String->val f=s.split(" ").map{it.toFloat()}.toFloatArray();val m=(f.max()!!+1).toInt();for(d in m downTo 0){var l=0f;for(c in f){val h=c.toInt();print(if(h==d&&d!=0)if(h<l-0.5)"|" else{" "}+if(c>h)"/ \\" else "___" else if(h<d)if(d<l-0.5)"|" else{" "}+if(h==0)" " else if((c+0.5).toInt()==d)" _ " else "   " else{if(h==0)if(l<1)"  " else "| " else "|   "}.replace(' ',if(d==0)'_' else ' '));l=c;};if(d<l-0.5)print("|");println();}}

Phiên bản bị đánh cắp:

val ungolfed: (String) -> Unit = {
    s ->

    val floats = s.split(" ").map { it.toFloat() }.toFloatArray()
    val maxH = (floats.max()!! + 1).toInt()

    for (drawHeight in maxH downTo 0) {
        var lastBuildingH = 0f
        for (f in floats) {
            val buildingH = f.toInt()
            if (drawHeight == 0) {
                // Baseline
                if (buildingH == 0)
                    if (lastBuildingH.toInt() == 0) print("__")
                    else print("|_")
                else print("|___")
            } else if (buildingH == drawHeight) {
                // Ceiling
                if (buildingH < lastBuildingH - 0.5) print("|")
                else print(" ")
                if (f > buildingH) print("/ \\")
                else print("___")
            } else if (buildingH < drawHeight) {
                // Above building
                if (drawHeight < lastBuildingH - 0.5) print("|")
                else print(" ")
                if (buildingH == 0) print(" ")
                else {
                    if ((f + 0.5).toInt() == drawHeight) print(" _ ")
                    else print("   ")
                }
            } else {
                if (buildingH == 0) print("| ")
                else print("|   ")
            }
            lastBuildingH = f;
        }
        if (drawHeight < lastBuildingH - 0.5) print("|")
        println()
    }
}

3

Python 2, 357 306 299 294 287 281 276 byte

def s(l):
 d=len(l)+1;l=[0]+l+[0];h=(max(l)+3)/2;o=''
 for i in range(d*h):
  a=l[i%d+1];c=l[i%d];b=2*(h-1-i/d);o+="|"if(a>b+1)+(c>b+1)else" "*(a+c>0);o+=" _/__  _\\"[a-b+1::3]if b*(1>=abs(a-b))else" "*(1+2*(a>0))
  if b==0:o=o.replace(" ","_")
  if i%d==d-1:print o[:-1];o=''

Điều này sử dụng mã hóa "nhân đôi", được chuyển đến hàm dưới dạng danh sách. Chỉnh sửa: Cạo byte bằng cách làm lại một phần của điều kiện lớn dưới dạng bộ chọn mảng và chuyển sang mã hóa nhân đôi. Cạo nhiều byte hơn bằng cách sắp xếp lại các điều kiện thậm chí nhiều hơn và chuyển đổi nhiều logic hơn sang số học.

EDIT: xsot là tốt hơn

Giải trình:

d=len(l)+1;l=[0]+l+[0];m=max(l);h=m/2+m%2+1;o=''

dlớn hơn 1 chiều dài của mảng, bởi vì chúng ta sẽ thêm các số 0 ở mỗi đầu của danh sách từ phần tử thứ hai cho đến số 0 mà chúng ta đã thêm vào cuối. hlà chiều cao của bản vẽ. (Chúng tôi phải chia cho 2 trong tính toán này vì chúng tôi đang sử dụng đại diện nhân đôi, chúng tôi sử dụng cụ thể để tránh phải thả phao cho ints khắp nơi. Chúng tôi cũng thêm 1 trước khi chia độ cao kỳ lạ - các tòa nhà nhọn-- nhận được một chút giải phóng mặt bằng hơn loại thông thường.) olà chuỗi đầu ra.

 for i in range(d*h):

Một mẹo tiêu chuẩn để thu gọn một vòng lặp for thành một vòng lặp for. Khi chúng tôi làm:

  a=l[i%d+1];c=l[i%d];b=2*(h-1-i/d)

bây giờ chúng ta đã hoàn thành giống như:

for b in range(2*h-2,-2,-2):
 for j in range(d):
  a=l[j+1];c=l[j]

nhưng theo cách mà chúng tôi đã lưu mười byte (bao gồm cả khoảng trắng trên các dòng sau).

  o+="|"if(a>b+1)+(c>b+1)else" "*(a+c>0)

Dán tường bất cứ lúc nào chiều cao của tòa nhà hiện tại hoặc tòa nhà trước đó cao hơn đường hiện tại, miễn là có ít nhất một ranh giới tòa nhà ở đây. Nó tương đương với các điều kiện sau:

  o+=("|" if a>b+1 or c>b+1 else " ") if a or c else ""

Trong đó b là chiều cao quét hiện tại, a là chiều cao tòa nhà hiện tại và c là chiều cao tòa nhà trước đó. Phần sau của điều kiện ngăn chặn việc đặt các bức tường giữa các không gian mặt đất.

  o+=" _/__  _\\"[a-b+1::3]if b*(1>=abs(a-b))else" "*(1+2*(a>0))

Đây là phần vẽ mái chính xác, chọn các phần mái bằng cách so sánh chiều cao của tòa nhà với chiều cao quét hiện tại. Nếu một mái nhà không đi đến đây, nó sẽ in một số lượng không gian thích hợp (3 khi đó là một tòa nhà thực tế, ví dụ: a> 0, nếu không là 1). Lưu ý rằng khi chúng ta ở tầng trệt, nó không bao giờ cố gắng vẽ một mái nhà, điều đó có nghĩa là các tòa nhà kích thước 0,5 không có mái nhọn. Ồ tốt

  if b==0:o=o.replace(" ","_")

Khi chúng tôi ở mặt đất, chúng tôi muốn gạch dưới thay vì không gian. Chúng tôi chỉ cần thay thế tất cả trong cùng một lúc ở đây.

  if i%d==d-1:print o[:-1];o=''

Ngay trước khi chúng tôi bắt đầu xử lý dòng tiếp theo, hãy in dòng hiện tại và xóa dòng đầu ra. Chúng tôi loại bỏ ký tự cuối cùng bởi vì đó là "_" tương ứng với không gian mặt đất mà chúng tôi đã thêm bằng cách thêm số 0 vào đầu hàm. (Chúng tôi đã thêm số 0 vì vậy chúng tôi sẽ không phải thêm trường hợp đặc biệt để chèn một bức tường bên phải, nếu nó tồn tại, nó sẽ thêm nhiều mã hơn nhiều so với chúng tôi đã thêm bằng cách thêm 0 và cắt bỏ "_".)


Chơi gôn ô tô. Ồ (Ngoài ra, +1)
vỗ tay vào

2

Con trăn 3

725 byte

608 byte

Mã đánh gôn:

import sys,math;
m,l,w,s,bh,ls,ins,r,a="|   |","___","|"," ",0,[],[],range,sys.argv[1:]
def ru(n):return math.ceil(n)
def bl(h,n):
    if(n>ru(h)):return(s*5,s)[h==0]
    if(h==0):return"_"
    if(n==0):return w+l+w
    if(n<h-1):return m
    return("  _  "," / \ ")[n==ru(h)-1]if(h%1)else(s+l+s,m)[n==h-1]
for arg in a:
    f=ru(float(arg))
    if(bh<f):bh=f
for i in r(bh,-1,-1):
    ln=""
    for bld in a:ln+=bl(float(bld),i)
    ls.append(ln)
for i in r(len(ls[-1])-1):
    if(ls[-1][i]==ls[-1][i+1]==w):ins.append(i-len(ins))
for ln in ls:
    for i in ins:ln=(ln[:i]+ln[i+1:],ln[:i+1]+ln[i+2:])[ln[i]==w]
    print(ln)

Đây là mã vô danh. Có một số ý kiến ​​nhưng ý tưởng cơ bản là tạo ra các tòa nhà với những bức tường đôi, vì vậy điểm mấu chốt trông như sau:

_|___||___|_|___||___|

Sau đó, để lấy chỉ mục của các bức tường đôi và loại bỏ các cột đó để chúng tôi nhận được:

_|___|___|_|___|___|

Mã số:

import sys
import numbers
import math

mid="|   |";
l="___";
w="|";
s=" ";

def printList(lst):
    for it in lst:
        print(it);

# h = height of building
# l = line numeber starting at 0
def buildingline(h,n):
    #if (h==0):
    #   return " " if(n>math.ceil(h)) else "   ";
    if(n>math.ceil(h)):
        return s if(h == 0) else s*5;
    if(h==0): return "_";
    if(n==0): return w+l+w;
    if(n<h-1): return mid;
    if(h.is_integer()):
        return mid if(n==h-1) else  s+l+s;
    else:
        return " / \ " if (n==math.ceil(h)-1) else "  _  "; 
# max height
bh=0;

for arg in sys.argv[1:]:
    f = math.ceil(float(arg));
    if(bh<f):bh=f;

# lines for printing
lines = []

for i in range(bh,-1,-1):
    line="";
    for bld in sys.argv[1:]:
        bld=float(bld);
        line += buildingline(bld,i);
        #lh = bld;
    lines.append(line);

#for line in lines:
#   print(line);
#printList(lines);


# column merging
#find indexes for merging (if there are | | next to each other)
indexes = [];
for i in range(len(lines[-1])-1):
    if (lines[-1][i]=='|' and lines[-1][i+1] == '|'):
        indexes.append(i-len(indexes));

#printList(indexes);

#index counter
for line in lines:
    newLine = line;
    for i in indexes:
        if newLine[i] == '|' :
            newLine=newLine[:i+1] + newLine[i+2:];
        else : newLine = newLine[:i] + newLine[i+1:];
    print(newLine);

Thời gian để làm một số golf!


Bạn có thể muốn có một cái nhìn ở đây . Tôi nghĩ rằng có rất nhiều tiềm năng chơi gôn ở đây =) Tôi chỉ biết Python cơ bản, vì vậy tôi không thể đề xuất bất cứ điều gì cụ thể Tôi sợ ...
Stewie Griffin

Có vẻ như tôi đã loại bỏ khoảng trắng và rút ngắn tên biến, nhưng phần còn lại không thay đổi. Bạn nên cố gắng tìm ra những cách thông minh để loại bỏ một số vòng lặp, sử dụng ít so sánh hơn, v.v ... Tất nhiên, những thứ như ru(n):return math.ceil(n)được tính là chơi golf, nhưng vẫn ... Xin đừng hiểu điều này theo cách tiêu cực, tôi không phải là một golfer tốt bản thân mình, và chắc chắn không phải là một lập trình viên giỏi. Tôi khuyên bạn nên cố gắng cải thiện nó ... Thật sự rất vui khi bạn nhận ra mình đã rút ngắn được. Tôi đã đi từ nhiều đến 120 đến 55 một vài ngày trước. Vì vậy, nó có thể ngay cả khi bạn là người mới.
Stewie Griffin

@StewieGriffin Cảm ơn bạn vì liên kết đó! Tôi thực sự là một người mới chơi golf, vì vậy, nó hoàn thành về việc hoàn thành nhiệm vụ thực tế hơn là chơi golf cho tôi. Nhưng thật tuyệt vời khi khám phá các khả năng của các ngôn ngữ khác nhau
Cajova_Houba

FTR: Đối với một số thử thách phức tạp hơn, chẳng hạn như thử thách này, tôi sẽ rất vui khi tự mình hoàn thành nó =)
Stewie Griffin

2

PHP, 307 297 293 byte

<?$r=str_pad("",$p=((max($argv)+1)>>1)*$w=4*$argc,str_pad("\n",$w," ",0));for(;++$i<$argc&&$r[$p++]=_;$m=$n)if($n=$argv[$i]){$q=$p+=!$m;eval($x='$r[$q-1]=$r[$q]=$r[$q+1]=_;');for($h=$n>>1;$h--;$q-=$w)$r[$q-2]=$r[$q+2]="|";$n&1?($r[$q-1]="/")&($r[$q-$w]=_)&$r[$q+1]="\\":eval($x);$p+=3;}echo$r;

Lấy đối số * 2 từ dòng lệnh. lưu vào tập tin, chạy với php <filename> <parameters>.

phá vỡ

// initialize result    
$r=str_pad("",              // nested str_pad is 3 bytes shorter than a loop
    $p=                     // cursor=(max height-1)*(max width)=(start of last line)
    ((max($argv)+1)>>1)     // max height-1
    *
    $w=4*$argc              // we need at least 4*($argc-1)-1, +1 for newline
    ,
    // one line
    str_pad("\n",$w," ",0)  // (`str_pad("",$w-1)."\n"` is one byte shorter,
);                          // but requires `$w+1`)

// draw skyline
for(;
    ++$i<$argc              // loop through arguments
    &&$r[$p++]=_                // 0. draw empty ground and go one forward
    ;
    $m=$n                       // 7. remember value
)
    if($n=$argv[$i])            // if there is a house
    {
        $q=                         // 2. copy $p to $q
        $p+=!$m;                    // 1. go one forward if there was no house before this
        // offset all further positions by -2 (overwrite empty ground, share walls)
        eval($x=                    // 3. draw floor
        '$r[$q-1]=$r[$q]=$r[$q+1]=_;'
        );
        for($h=$n>>1;$h--;$q-=$w)   // 4. draw walls
            $r[$q-2]=$r[$q+2]="|";
        $n&1                        // 5. draw roof
            ?($r[$q-1]="/")&($r[$q-$w]=_)&$r[$q+1]="\\"
            :eval($x)               // (eval saved 7 bytes)
        ;                           // (ternary saved 6 bytes over `if`)
        $p+=3;                      // 6. go three forward (5-2)
    }

// output
echo$r;

1

C ++, vô danh

(hoặc có thể không thể hiểu được)

Giả sử có ít hơn 100 phần tử và mỗi phần tử nhỏ hơn 100. slà số lượng tòa nhà (bắt buộc trong đầu vào).

#include <iostream>
using namespace std;
int main()
{
float a[100];
int i,j,s;
cin>>s;
for(i=0;i<s;++i)
 cin>>a[i];
for(i=100;i>=1;--i)
{
for(j=0;j<s;++j)
{
if((a[j]>=i)||(a[j-1]>=i))
 cout<<"|";
else
 cout<<" ";
if(i==1)
 cout<<"___";
else if(a[j]+1==i)
 cout<<"___";
else if(a[j]+1.5==i)
 cout<<" _ ";
else if(a[j]+0.5==i)
 cout<<"/ \\";
else cout<<"   ";
}
if(a[s-1]>=i)
 cout<<"|";
cout<<endl;
}
}

Có một vài lỗi trong đầu ra ... Mặt đất rộng 3 ký tự (chỉ nên là 1) và bức tường cuối cùng bị thiếu.
Stewie Griffin

@StewieGriffin Tôi vẫn đang phân loại lỗi khi tôi đăng bài này. 1. Tôi đã thêm bức tường cuối cùng. 2. Mặt đất phải rộng 3 ký tự, vì mái xéo / _ \ rộng 3 ký tự.
ghosts_in_the_code

1
* Mặt đất giữa các tòa nhà, không bên trong.
Stewie Griffin

Nếu bạn vẫn đang làm việc với nó, bạn có thể muốn đợi, nhưng bạn có thể loại bỏ nhiều byte nếu bạn xóa các dòng mới và thụt lề. Tôi chưa khắc phục được sự cố cơ bản, nhưng điều này hoạt động .346 byte thay vì 401.
Stewie Griffin

@StewieGriffin Tôi thực sự không có ý định gửi câu trả lời đánh gôn vì dù sao nó cũng quá dài. Tôi có thể đặt cược rằng tồn tại các ngôn ngữ tốt hơn trong đó nó được thực hiện dưới 100 byte. Vì vậy, mã của tôi là một giải pháp tham khảo cho người khác.
ghosts_in_the_code
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.