ASCII都市の再構築


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

ASCIIvilleの人々は都市を再建し、新しい青写真をスケッチしています。あなたの仕事は、彼らが望む建物の数に基づいて、新しい都市を描くことです。

入力は、建物の数です。各建物は、入力の高さの半分(奇数の場合は切り上げ)であり、建物の上部と下部は含まれません。

の基本的な例を描きましょう 4

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

ここでわかるように|、入力が4だったため、すべての建物に2つのがあります。しかし、キャッチがあります!(つまり、上記の例は正しくなく、この投稿の上部の例は4の実際の出力です)

素数ではない各建物について、その高さは1つ下がります。数はで割り切れる場合は35、または10、それはより1ダウンします。それらの数値の2つ以上で割り切れる場合、差し引かれる金額は合計されます(10は10と5で割り切れ、素数ではないため、3が差し引かれます)。

の入力の例を見てみましょう5

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

以下に例を示します 7

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

そして例 10

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

そしてに戻る 6

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

ルール:

  • 高さがゼロ以下になるように数値が差し引かれる場合、表示されませんが、スペースが残ります(これが可能だ6とは思いませんが、ゼロに達するのに最も近いと思います) 。
  • 末尾のスペースは許可されます。
  • 各建物の幅は2でなければなりません。
  • 入力は、stdinから行うことも、プログラムにエンコードすることもできます。
  • あなたのプログラムは完全なプログラムでなければならず、機能はありません。
  • あなたのプログラムは4-15ビルドが可能でなければなりません。0〜3および負の数は必要ではなく、何もするように指定されていません。つまり、エラーをスローしたり、ゴミを出力したり、何もしないことがあります。

@isaacgうん!ちょうどそれを修正しました
フェーズ

1
1は素数ではありません。例から、(1ベースの)インデックスが非素数ではなく複合である場合、高さから1を差し引くように見えます。
デニス

標準の80文字のコンソールウィンドウは16棟の建物にしか収まらないため、20棟の要件が少しくなる可能性があります。
Hand-E-Food

@ Hand-E-Foodそれについて言及してくれてありがとう!建物を新しいラインに配置するように変更しました。
フェーズ

@Dennisフィボナッチを使うか素数を使うかはわからなかったので、それを避けました。修正しただけです!
フェーズ

回答:



3

Python 2、247 245 237 229バイト

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

Python 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

グルービー、234225223の 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

Swift、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を返します。

このceil機能を使用するには、Foundationをインポートする必要があります。

私は15のケースだけのためにコードを最適化することができませんでしたが、私は最終的に後でそれを作ります。

編集:@Kametrixomのアドバイスを取り、mod部品を最適化します(変数名の長さを減らすのを忘れていました)。


1
に置き換えFoundationDarwinいくつかのバイトを保存することができます
Kametrixom

-1のimport UIKit代わりにimport Darwin
クール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.