重建ASCII城市


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

ASCIIville人民正在重建他们的城市并草拟新的蓝图。您的工作是根据所需的建筑物来绘制新城市。

输入将是有多少座建筑物。每个建筑物的高度是输入值的一半(如果是奇数,则四舍五入),不包括建筑物的顶部和底部。

让我们画一个基本的例子 4

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

如您在此处看到的,|由于输入为四个,所以每座建筑物中都有两个。但是有一个陷阱!(这意味着上面的示例是不正确的,而本文顶部的示例是4 的实际输出)

对于不是素数的每栋建筑物,其高度都会降低一个。如果该数量整除35,或10,它会下沉一个。如果它可以被两个或多个这些数字整除,则扣除的金额相加(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感谢您提及!我已对其进行了更改,因此您将建筑物重新排列。
阶段

@丹尼斯我不确定是否要进行斐波那契数或素数运算,因此该数保持不变。刚刚修复!
阶段

Answers:


4

CJam,68 66 58 55字节

现在太长了。但是一个开始。

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

更新:现在将输入硬编码到15,而不是计算偏移量。Sp3000的建议

在这里在线尝试


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

Groovy中,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。

我需要导入Foundation才能使用 ceil功能。

我没有设法仅针对15种情况来优化代码,但最终我会在以后进行。

编辑:接受@Kametrixom建议并优化mod零件(我忘记减少var名称的长度)。


1
您可以替换FoundationDarwin以保存一些字节
Kametrixom 2015年

-1 import UIKit代替import Darwin
心教堂
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.