ASCII Şehrini İnşa Etmek


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

ASCIIville halkı şehirlerini yeniden inşa ediyor ve yeni planlar hazırlıyor. İşiniz, istedikleri binaya göre yeni şehirlerini çizmektir.

Girdi kaç bina olacak. Her bina, binanın üst ve altını içermeyen girişin yüksekliğinin yarısıdır (tek ise yuvarlanır).

Temel bir örnek çizelim 4

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

Burada görebileceğiniz gibi |, giriş dört olduğu için her binada iki s vardır . Ama bir sorun var! (yani yukarıdaki örnek yanlıştır ve bu yazının en üstündeki örnek 4 için gerçek çıktıdır)

Asal sayı olmayan her bina için yüksekliği bir azalır. Sayı 3 , 5 veya 10 ile bölünebilirse , bir daha azalır. Bu sayıların iki veya daha fazlasıyla bölünebilirse, düşülen tutar toplanır ( 10, 10 ve 5 ile bölünebilir ve bu bir asal değildir, bu nedenle 3 ile düşülür. ).

Girdi ile bir örneğe bakalım 5.

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

İşte bir örnek 7

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

Ve bir örnek 10

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

Ve geri 6

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

Kurallar:

  • Bir sayı, yüksekliği sıfıra eşit veya daha az olacak şekilde o kadar çok düşülürse, gösterilmez ancak bunun için bir alan kalır (bunun mümkün olduğuna inanmıyorum, 6sıfıra ulaştığım en yakın şey) .
  • Sondaki boşluklara izin verilir.
  • Her binanın genişliği 2 olmalıdır.
  • Girişiniz stdin'den veya programa kodlanmış olabilir.
  • Programınız tam bir program olmalı , işlevsiz olmalıdır.
  • Programınız 4-15 derleme yapabilmelidir. 0-3 ve negatif sayılara gerek yoktur ve hiçbir şey yapmaları için belirtilmezler, yani bir hata atabilir, çöp yazdırabilir veya hiçbir şey yapamazlar.

@isaacg Yup! Sadece düzelttim
faz

1
1 asal bir sayı değildir. Örneklerden, eğer (1 tabanlı) dizin asal değil de kompozitse 1'i yükseklikten düştüğünüz anlaşılıyor.
Dennis

Standart 80 karakterlik bir konsol penceresinin sadece 16 binaya uyacağını ve bu da 20 bina gereksinimini biraz çirkin hale getirebileceğini unutmayın.
Hand-E-Food

@ Hand-E-Food Bahsettiğiniz için teşekkürler! Bunu değiştirdim, böylece binaları yeni hatlara koydun.
faz

@Dennis Fibonacci mi yoksa asal sayılar mı yapılacağından emin değildim, bu yüzden bundan saklandım. Sadece düzelttim!
faz

Yanıtlar:


4

CJam, 68 66 58 55 bayt

Bu şimdilik çok uzun. Ama bir başlangıç.

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

GÜNCELLEME: Şimdi ofseti hesaplamak yerine 15'e kadar girişler için sabit kodlama. Sp3000 tarafından öneri

Buradan çevrimiçi deneyin


3

Python 2, 2472424237229 bayt

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 bayt

Bu sadece 15 binaya gitme ihtiyacından yararlanır.

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 bayt

Ve herhangi bir sayıda bina için işe yarayacak daha genel bir cevap.

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 bayt

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

Öncelik kontrol kısmı @ xnor'ın algoritmasını buradan ödünç alıyor .

İlk 15 ofseti kodlarsak 137 bayt alabiliriz :

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

Her satırın sonundaki sondaki boşlukların iyi olduğunu varsayıyorum, ancak soru tüm çıktıdan sonra boşluk bırakıyorsa, +9 bayt için .rstrip().


2

Groovy, 234 , 225 , 223 219 bayt

15 bina sınırını kötüye kullanma

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 bayt

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

Girintili kod

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

Bbina sayısını içerir.
pBir sayı asal olmadığında 1 değerini döndürür.

ceilİşlevi kullanabilmek için Vakfı içe aktarmam gerekiyor .

Kodu sadece on beş vaka için optimize etmeyi başaramadım, ancak sonunda daha sonra yapacağım.

edit: @Kametrixom tavsiye alarak ve modparçası optimize (ben var isim uzunluğunu azaltmak unuttum).


1
Bazı baytları kaydetmek için Foundationile değiştirebilirsinizDarwin
Kametrixom

-1 ile import UIKityerine import Darwin.
Cur
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.