Membangun kembali Kota ASCII

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

Orang-orang ASCIIville membangun kembali kota mereka dan membuat sketsa cetak biru baru. Tugas Anda adalah menggambar kota baru mereka berdasarkan berapa banyak bangunan yang mereka inginkan.

Masukan akan berapa banyak bangunan yang ada. Setiap bangunan adalah setengah tinggi input (dibulatkan jika aneh), tidak termasuk bagian atas dan bawah bangunan.

Mari kita menggambar contoh dasar 4

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

Seperti yang Anda lihat di sini, ada dua |s di setiap bangunan karena inputnya empat. Tapi ada tangkapan! (artinya contoh di atas tidak benar, dan contoh di bagian atas posting ini adalah hasil nyata untuk 4)

Untuk setiap bangunan yang bukan bilangan prima, tingginya turun satu. Jika angkanya dibagi 3 , 5 , atau 10 , itu turun satu lagi. Jika itu dapat dibagi dengan dua atau lebih dari angka-angka itu, jumlah yang dikurangkan bertambah ( 10 dibagi dengan 10 dan 5, dan itu bukan bilangan prima, sehingga dikurangi oleh 3 ).

Mari kita lihat contoh dengan input 5.

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

Berikut ini contoh 7

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

Dan contoh dari 10

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

Dan kembali ke 6

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

Aturan:

  • Jika suatu angka dikurangkan sedemikian rupa sehingga tingginya kurang dari atau sama dengan nol, itu tidak diperlihatkan tetapi ada ruang tersisa untuk itu (saya tidak percaya ini mungkin, 6adalah yang terdekat yang saya temukan dengan mencapai nol) .
  • Ruang tambahan diperbolehkan.
  • Lebar setiap bangunan harus 2.
  • Masukan Anda dapat dari stdin atau disandikan ke dalam program.
  • Program Anda harus berupa program lengkap , tidak ada fungsi.
  • Program Anda harus mampu membangun 4-15. 0-3 dan angka negatif tidak diperlukan dan tidak ditentukan untuk melakukan apa pun, artinya mereka dapat melempar kesalahan, mencetak sampah, atau tidak melakukan apa-apa.
tahap
sumber
@isaacg Yup! Hanya memperbaikinya
fase
1
1 bukan bilangan prima. Dari contoh, sepertinya Anda mengurangi 1 dari ketinggian jika indeks (1-based) adalah komposit daripada non-prima.
Dennis
Perhatikan bahwa jendela konsol 80 karakter standar hanya akan muat 16 bangunan, yang bisa membuat persyaratan 20 gedung agak jelek.
Hand-E-Food
@ Hand-E-Food Terima kasih telah menyebutkan itu! Saya sudah mengubahnya sehingga Anda menempatkan bangunan di jalur baru.
fase
@ Dennis Saya tidak yakin apakah akan melakukan Fibonacci atau bilangan prima, jadi yang dijauhkan dari itu. Perbaiki saja!
fase

Jawaban:

4

CJam, 68 66 58 55 byte

Ini terlalu lama untuk saat ini. Tapi awal.

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

UPDATE: Sekarang hardcoding untuk input sampai 15 bukannya menghitung offset. Saran oleh Sp3000

Cobalah online di sini

Pengoptimal
sumber
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
Daniel Wakefield
sumber
3

C #, 223 205 byte

Ini mengambil keuntungan dari kebutuhan hanya pergi ke 15 bangunan.

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

Dan jawaban yang lebih umum yang akan bekerja untuk sejumlah gedung.

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?"|  | ":"+--+ ");
            }
    }
}
Makanan Tangan
sumber
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

Bagian pemeriksaan keutamaan meminjam algoritma @ xnor dari sini .

Jika kita meng-hardcode 15 offset pertama, kita bisa mendapatkan 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

Saya mengasumsikan spasi tambahan pada akhir setiap baris tidak apa-apa, tetapi jika pertanyaannya berarti spasi tambahan setelah seluruh output maka +9 byte untuk .rstrip().

Sp3000
sumber
2

Groovy, 234 , 225 , 223 219 byte

Menyalahgunakan batas 15 bangunan

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(" "))}
dbramwell
sumber
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")}

Ini kode indentasi

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

Bberisi jumlah bangunan.
pmengembalikan 1 ketika suatu angka tidak prima.

Saya perlu mengimpor Foundation untuk menggunakan ceilfungsi ini.

Saya tidak berhasil mengoptimalkan kode hanya untuk lima belas kasus, tetapi saya akhirnya akan membuatnya nanti.

sunting: Mengambil saran @Kametrixom dan mengoptimalkan modbagian (saya lupa mengurangi panjang nama var).

Gila
sumber
1
Anda dapat mengganti Foundationdengan Darwinuntuk menyimpan beberapa byte
Kametrixom
-1 dengan import UIKitalih - alih import Darwin.
Cœur