ASCII 도시 재건


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

ASCIIville의 사람들은 도시를 재건하고 새로운 청사진을 스케치하고 있습니다. 당신의 임무는 그들이 원하는 건물 수에 따라 새로운 도시를 그리는 것입니다.

입력은 건물 수입니다. 각 건물은 건물의 상단과 하단을 포함하지 않고 입력 높이의 절반입니다 (홀수이면 반올림).

의 기본 예를 그려 봅시다 4

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

보시다시피 |, 입력이 4이기 때문에 모든 건물에 2가 있습니다 . 그러나 캐치가 있습니다! (위의 예는 정확하지 않으며이 게시물의 맨 위 예는 4 의 실제 출력입니다.)

소수가 아닌 각 건물의 높이는 1 씩 줄어 듭니다. 숫자를 3 , 5 또는 10으로 나눌 수 있으면 하나 더 내려갑니다. 이 숫자 중 두 개 이상으로 나눌 수있는 경우 공제 금액이 합산됩니다 ( 10은 10과 5로 나눌 수 있으며 소수가 아니므로 3만큼 공제됩니다 ).

입력 값이있는 예를 살펴 보겠습니다 5.

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

다음은 예입니다 7

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

그리고 예 10

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

그리고 다시 6

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

규칙 :

  • 숫자가 너무 작아서 높이가 0보다 작거나 같으면 표시되지 않지만 공백이 남아 있습니다 (가능한 것으로 생각하지 않습니다 .0 6에 가장 가까운 것으로 나타났습니다) .
  • 후행 공백이 허용됩니다.
  • 각 건물의 너비는 2 여야합니다.
  • 입력은 stdin에서 시작하거나 프로그램으로 인코딩 될 수 있습니다.
  • 귀하의 프로그램은 기능이 아닌 완전한 프로그램이어야합니다 .
  • 프로그램은 4-15 빌드가 가능해야합니다. 0-3과 음수는 필요하지 않으며 아무 것도하도록 지정되어 있지 않습니다. 즉, 오류를 발생 시키거나 가비지를 인쇄하거나 아무 것도 할 수 없습니다.

트윗 담아 가기 그냥 고정

1
1은 소수가 아닙니다. 예에서, (1 기반) 인덱스가 비 프라임이 아닌 복합 인 경우 높이에서 1을 빼는 것처럼 보입니다.
Dennis

표준 80 자 콘솔 창은 16 개의 건물에만 적용되므로 20 개의 건물 요구 사항이 약간 추악해질 수 있습니다.
Hand-E-Food

@ Hand-E-Food 언급 해 주셔서 감사합니다! 건물을 새 줄에 놓도록 변경했습니다.
Phase

@Dennis 피보나치 또는 소수를 할 것인지 확실하지 않았으므로 그중 하나가 유지되었습니다. 방금 고 쳤어요!
Phase

답변:



3

파이썬 2, 247245237229 바이트

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 #, 223205 바이트

이것은 단지 15 건물에 갈 필요성을 이용합니다.

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 바이트

그리고 많은 건물에 적용되는보다 일반적인 대답입니다.

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

파이썬 2, 163 바이트

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

원시성 검사 부분은 @xnor의 알고리즘을 여기 .

처음 15 개의 오프셋을 하드 코딩하면 137 바이트를 얻을 수 있습니다 .

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

각 줄의 끝에 후행 공백은 괜찮다고 가정하지만 질문이 전체 출력 후의 후행 공백을 의미하는 경우에 +9 바이트입니다 .rstrip().


2

당연, 234 , 225 , 223 219 바이트

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

스위프트, 375 , 350 바이트

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

들여 쓴 코드는 다음과 같습니다.

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

B건물 수를 포함합니다.
p숫자가 소수가 아닌 경우 1을 반환합니다.

사용하려면 Foundation을 가져와야합니다. ceil 기능 합니다.

나는 단지 15 건의 경우 코드를 최적화하지는 못했지만 나중에 나중에 만들 것입니다.

편집 : @ Kametrixom 조언을 취하고 mod부분을 최적화하십시오 (나는 var 이름 길이를 줄이는 것을 잊었습니다).


1
당신은 대체 할 수 FoundationDarwin몇 바이트를 저장
Kametrixom

-1 import UIKit대신 import Darwin.
Cœur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.