สร้างเมือง ASCII ขึ้นใหม่


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

ผู้คนใน ASCIIville กำลังสร้างเมืองขึ้นใหม่และร่างภาพร่างใหม่ออกมา งานของคุณคือการวาดเมืองใหม่ของพวกเขาตามจำนวนอาคารที่พวกเขาต้องการ

การป้อนข้อมูลจะเป็นจำนวนอาคารที่มี อาคารแต่ละหลังมีความสูงครึ่งหนึ่งของอินพุต (ปัดเศษขึ้นถ้าเป็นเลขคี่) ไม่รวมด้านบนและด้านล่างของอาคาร

ลองวาดตัวอย่างพื้นฐานของ 4

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

อย่างที่คุณเห็นที่นี่มีสอง|อาคารในทุกตึกเพราะมีสี่ แต่มีการจับ! (หมายถึงตัวอย่างข้างต้นไม่ถูกต้องและตัวอย่างที่ด้านบนของโพสต์นี้เป็นผลลัพธ์ที่แท้จริงสำหรับ 4)

สำหรับแต่ละอาคารที่ไม่ใช่ตัวเลขเฉพาะความสูงของอาคารจะลดลงทีละหนึ่ง ถ้าจำนวนหารด้วย3 , 5หรือ10ก็จะลดลงอีกหนึ่ง หากมันหารด้วยตัวเลขสองตัวหรือมากกว่านั้นจำนวนที่หักจะถูกรวมเข้าด้วยกัน ( 10 คือหารด้วย 10 และ 5 และไม่ใช่เอกสิทธิ์ดังนั้นมันจะถูกหักด้วย 3 )

ดู Let 's 5ตัวอย่างด้วยการป้อนข้อมูลของ

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

นี่คือตัวอย่างของ 7

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

และเป็นตัวอย่างของ 10

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

และกลับไป 6

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

กฎ:

  • หากตัวเลขได้รับการหักมากจนความสูงน้อยกว่าหรือเท่ากับศูนย์จะไม่แสดง แต่มีพื้นที่เหลือสำหรับมัน (ฉันไม่เชื่อว่าเป็นไปได้6เป็นสิ่งที่ใกล้เคียงที่สุดที่ฉันเคยพบมาถึงศูนย์) .
  • อนุญาตให้ใช้ช่องว่างต่อท้าย
  • ความกว้างของแต่ละอาคารจะต้องเป็น 2
  • ข้อมูลที่คุณป้อนอาจมาจาก stdin หรือเข้ารหัสลงในโปรแกรม
  • โปรแกรมของคุณจะต้องเป็นโปรแกรมเต็มรูปแบบไม่มีฟังก์ชั่น
  • โปรแกรมของคุณจะต้องมีความสามารถในการสร้าง 4-15 ไม่จำเป็นต้องใช้ตัวเลข 0-3 และลบและไม่ได้ระบุว่าจะทำอะไรก็ได้ซึ่งหมายความว่าพวกเขาสามารถโยนข้อผิดพลาดพิมพ์ขยะหรือไม่ทำอะไรเลย

@isaacg Yup! เพิ่งแก้ไข
เฟส

1
1 ไม่ใช่หมายเลขเฉพาะ จากตัวอย่างดูเหมือนว่าคุณจะหัก 1 จากความสูงหากดัชนี (ตาม 1) นั้นประกอบกันแทนที่จะไม่ใช่แบบเฉพาะ
Dennis

โปรดทราบว่าหน้าต่างคอนโซล 80 ตัวอักษรมาตรฐานจะพอดีกับสิ่งปลูกสร้างเพียง 16 อาคารเท่านั้นซึ่งอาจทำให้ความต้องการอาคารทั้ง 20 แห่งนั้นน่าเกลียดเล็กน้อย
Hand-E-Food

@ Hand-E-Food ขอบคุณที่พูดถึงมัน! ฉันเปลี่ยนมันเพื่อให้คุณใส่สิ่งปลูกสร้างในบรรทัดใหม่
เฟส

@ เดนนิสฉันไม่แน่ใจว่าจะทำฟีโบนักชีหรือหมายเลขสำคัญดังนั้นหมายเลขนั้นจึงถูกกันออกไป เพิ่งแก้ไขมัน!
ช่วง

คำตอบ:


4

CJam, 68 66 58 55 ไบต์

ตอนนี้ยาวเกินไป แต่เป็นการเริ่มต้น

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

ปรับปรุง: ตอนนี้ hardcoding สำหรับอินพุตจนถึง 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 #, 223 205 ไบต์

สิ่งนี้ใช้ประโยชน์จากความต้องการเพียงแค่ไปถึง 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

การตรวจสอบ primality ส่วนขอยืม @ อัลกอริทึม 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, 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ฟังก์ชัน

ฉันไม่สามารถปรับรหัสให้เหมาะสมสำหรับกรณีที่สิบห้า แต่ในที่สุดฉันจะทำให้มันในภายหลัง

แก้ไข: ใช้คำแนะนำ @ Kametrixom และปรับแต่งmodส่วน (ฉันลืมที่จะลดความยาวชื่อ var)


1
คุณสามารถแทนที่Foundationด้วยDarwinเพื่อบันทึกบางไบต์
Kametrixom

-1 กับแทนimport UIKit import Darwin
Cœur
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.