Xây dựng lại thành phố ASCII


17
     + - +
+ - + | | + - + + - +
| | | | | | | |
+ - + + - + + - + + - +

Người dân ASCIIville đang xây dựng lại thành phố của họ và đang phác thảo những bản thiết kế mới. Công việc của bạn là vẽ thành phố mới của họ dựa trên số lượng tòa nhà họ muốn.

Đầu vào sẽ có bao nhiêu tòa nhà. Mỗi tòa nhà là một nửa chiều cao của đầu vào (làm tròn lên nếu lẻ), không bao gồm đỉnh và đáy của tòa nhà.

Hãy lấy một ví dụ cơ bản về 4

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

Như bạn có thể thấy ở đây, có hai |s trong mỗi tòa nhà vì đầu vào là bốn. Nhưng có một nhược điểm! (có nghĩa là ví dụ trên không chính xác và ví dụ ở đầu bài này là đầu ra thực sự cho 4)

Đối với mỗi tòa nhà không phải là số nguyên tố, chiều cao của nó giảm xuống một. Nếu số chia hết cho 3 , 5 hoặc 10 , nó sẽ giảm thêm một lần nữa. Nếu nó chia hết cho hai hoặc nhiều hơn những số đó, thì số tiền được khấu trừ cộng lại ( 10 chia hết cho 10 và 5, và nó không phải là số nguyên tố, vì vậy nó bị trừ đi 3 ).

Hãy xem xét một ví dụ với đầu vào là 5.

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

Đây là một ví dụ về 7

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

Và một ví dụ về 10

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

Và quay lại 6

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

Quy tắc:

  • Nếu một số bị trừ quá nhiều đến mức chiều cao của nó nhỏ hơn hoặc bằng 0, thì nó không được hiển thị nhưng vẫn còn một khoảng trống cho nó (tôi không tin điều này là có thể, 6là gần nhất tôi đã tìm thấy bằng 0) .
  • Không gian lưu trữ được cho phép.
  • Chiều rộng của mỗi tòa nhà phải là 2.
  • Đầu vào của bạn có thể từ stdin hoặc được mã hóa vào chương trình.
  • Chương trình của bạn phải là một chương trình đầy đủ , không có chức năng.
  • Chương trình của bạn phải có khả năng 4-15 bản dựng. 0-3 và số âm không cần thiết và không được chỉ định để làm bất cứ điều gì, có nghĩa là chúng có thể gây ra lỗi, in rác hoặc không làm gì cả.

@isaacg Yup! Chỉ cần sửa nó
giai đoạn

1
1 không phải là số nguyên tố. Từ các ví dụ, có vẻ như bạn trừ 1 từ chiều cao nếu chỉ số (dựa trên 1) là tổng hợp chứ không phải là số nguyên tố.
Dennis

Lưu ý rằng cửa sổ bảng điều khiển 80 ký tự tiêu chuẩn sẽ chỉ phù hợp với 16 tòa nhà, điều này có thể khiến yêu cầu tòa nhà 20 trở nên hơi xấu xí.
Thực phẩm điện tử

@ Hand-E-Food Cảm ơn bạn đã đề cập đến điều đó! Tôi đã thay đổi nó để bạn đặt các tòa nhà trên các dòng mới.
giai đoạn

@Dennis Tôi không chắc chắn nên thực hiện số nguyên tố hay số nguyên tố, vì vậy số này được giữ từ đó. Chỉ cần sửa nó!
giai đoạn

Câu trả lời:


4

CJam, 68 66 58 55 byte

Điều này là quá dài cho bây giờ. Nhưng một sự khởi đầu.

ri:K"!;tK"206b4b<{S5*a*"+--+ "a:I+K)2/)"|  | "e]I+}%zN*

CẬP NHẬT: Bây giờ mã hóa cứng cho đầu vào đến 15 thay vì tính toán bù. Đề xuất của Sp3000

Dùng thử trực tuyến tại đây


3

Python 2, 247 245 237 229 byte

I=input()
R=range
B=[(-~I/2)-(x%3<1)-(x%5<1)-(x%10<1)-(~all([x%a for a in R(2,x)]or[x==2])+2)for x in R(1,I+1)]
E='+--+'
O=['\n']*I
for r in R(I):
 for h in B:O[r]+=['|  |',' '*4,E][(r==h)+(r>=h)]
print ''.join(O[::-1])+'\n'+E*I

3

C #, 223 205 byte

Điều này tận dụng nhu cầu chỉ đi đến 15 tòa nhà.

class P{
    static void Main(string[]a){
        int w=int.Parse(a[0]),
            h=(w+3)/2,
            b,
            x,
            y=-1;
        for(;++y<=h;)
            for(x=-2;++x<w;)
                System.Console.Write(x<0?"\n":(b=y-("012021101211102"[x]&7))<0?"     ":b>0&y<h?"|  | ":"+--+ ");
    }
}

260 byte

Và một câu trả lời chung chung hơn sẽ làm việc cho bất kỳ số lượng các tòa nhà.

class P{
    static void Main(string[]a){
        int w=int.Parse(a[0]),
            h=(w+3)/2,
            b,
            x,
            y=-1;
        for(;++y<=h;)
            for(x=-2;++x<w;){
                if(x<1)
                    b=-1;
                else
                    for(b=1;++b<x;)
                        if((x+1)%b<1)break;
                System.Console.Write(x<0?"\n":(b=y-x%3/2-x%5/4-x%10/9-(b<x?0:1))<0?"     ":b>0&y<h?"|  | ":"+--+ ");
            }
    }
}

2

Python 2, 163 byte

n=input()
k=-~n/2
for i in range(k+2):
 s="";p=j=1
 while~n+j:a=(j%3<1)+(j%5<1)+(j%10<1)+(p%j<1);s+=" |+  -  - |+   "[(i>=a)+(i in{a,k+1})::3];p*=j*j;j+=1
 print s

Phần kiểm tra tính nguyên thủy mượn thuật toán của @ xnor từ đây .

Nếu chúng ta mã hóa 15 lần bù đầu tiên, chúng ta có thể nhận được 137 byte :

n=input()
k=-~n/2
for i in range(k+2):
 s=""
 for j in range(n):a=881740113>>2*j&3;s+=" |+  -  - |+   "[(i>=a)+(i in{a,k+1})::3]
 print s

Tôi giả sử khoảng trắng ở cuối mỗi dòng là ổn, nhưng nếu câu hỏi có nghĩa là dấu cách sau toàn bộ đầu ra thì nó là +9 byte cho .rstrip().


2

Groovy, 234 , 225 , 223 219 byte

Lạm dụng giới hạn tòa nhà 15

b=args[0]as int
m={n->(n!=2&(2..n-1).any{n%it==0}?1:0)+([3,5,10].sum{n%it==0?1:0})}
(9..0).each{println((1..b).collect{d=((b/2)as int)+1-m(it);(0..9).collect{it!=d&it!=0?it<d?"|  |":"    ":"+--+"}}*.get(it).join(" "))}

2

Swift, 375 , 350 byte

import Darwin;let(B,u,z,d)=(4.0,1.0,0.0,2.0);let H=ceil(B/d);func p(n:Double)->Double{var D=d;while D<n{if n%D==0{return 1};D++};return n==1 ?1:0};for var h=z;h<H+2;h++ {for var b=u;b<=B;b++ {var m=b%3==0 ?u:z+b%5==0 ?1:0;m=min(2,b%10==0 ?m+1:m);m += p(b);if h<m {print("     ")}else if h==H+1||h==m {print("+--+ ")}else{print("|  | ")}};print("\n")}

Đây là mã thụt lề

import Darwin
let(B,u,z,d)=(4.0,1.0,0.0,2.0)
let H=ceil(B/d)
func p(n:Double)->Double{
     var D=d
    while D<n{
        if n%D==0{
            return 1
        }
        D++
    }
    return n==1 ?1:0
}
for var h=z;h<H+2;h++ {
    for var b=u;b<=B;b++ {
        var m=b%3==0 ?u:z+b%5==0 ?1:0
        m=min(2,b%10==0 ?m+1:m)
        m += p(b)
        if h<m {
            print("     ")
        }
        else if h==H+1||h==m {
            print("+--+ ")
        }
        else{
            print("|  | ")
        }
    }
    print("\n")
}

Bchứa số lượng tòa nhà.
ptrả về 1 khi một số không phải là số nguyên tố.

Tôi cần nhập Foundation để sử dụng ceilchức năng.

Tôi đã không quản lý để tối ưu hóa mã chỉ trong mười lăm trường hợp, nhưng cuối cùng tôi sẽ làm nó sau.

chỉnh sửa: Lấy lời khuyên @Kametrixom và tối ưu hóa modphần (Tôi quên giảm độ dài tên var).


1
Bạn có thể thay thế Foundationbằng Darwinđể lưu một số byte
Kametrixom 16/07/2015

-1 import UIKitthay vì import Darwin.
Cœur
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.