Ricostruzione di una città ASCII


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

La gente di ASCIIville sta ricostruendo la sua città e sta disegnando nuovi progetti. Il tuo compito è quello di disegnare la loro nuova città in base a quanti edifici vogliono.

L'input sarà quanti edifici ci sono. Ogni edificio è metà dell'altezza dell'ingresso (arrotondato per eccesso se dispari), escluso la parte superiore e inferiore dell'edificio.

Facciamo un esempio di base di 4

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

Come puoi vedere qui, ci sono due |s in ogni edificio perché l'input era quattro. Ma c'è un problema! (significa che l'esempio sopra è errato e l'esempio all'inizio di questo post è l' output reale per 4)

Per ogni edificio che non è un numero primo, la sua altezza scende di uno. Se il numero è divisibile per 3 , 5 o 10 , diminuisce di un altro. Se è divisibile per due o più di quei numeri, l'importo dedotto si somma ( 10 è divisibile per 10 e 5, e non è un numero primo, quindi viene dedotto per 3 ).

Diamo un'occhiata a un esempio con un input di 5.

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

Ecco un esempio di 7

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

E un esempio di 10

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

E di nuovo a 6

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

Regole:

  • Se un numero viene dedotto così tanto che la sua altezza è inferiore o uguale a zero, non viene mostrato ma viene lasciato uno spazio per esso (non credo che sia possibile, 6è il più vicino che ho trovato per raggiungere lo zero) .
  • Sono consentiti spazi finali.
  • La larghezza di ogni edificio deve essere 2.
  • Il tuo input può provenire da stdin o codificato nel programma.
  • Il tuo programma deve essere un programma completo , senza funzioni.
  • Il tuo programma deve essere in grado di 4-15 build. Non sono necessari 0-3 e numeri negativi e non sono specificati per fare nulla, il che significa che possono generare un errore, stampare immondizia o non fare nulla.

@isaacg Yup! L'ho appena risolto
fase

1
1 non è un numero primo. Dagli esempi, sembra che tu deduca 1 dall'altezza se l'indice (basato su 1) è composito piuttosto che non primo.
Dennis,

Nota che una finestra standard da 80 caratteri si adatta solo a 16 edifici, il che potrebbe rendere un po 'brutto il fabbisogno di 20 edifici.
Hand-E-Food,

@ Hand-E-Food Grazie per averlo menzionato! L'ho cambiato in modo da mettere gli edifici su nuove linee.
fase

@Dennis Non ero sicuro se fare Fibonacci o numeri primi, quindi quello era tenuto da quello. L'ho appena risolto!
fase

Risposte:


4

CJam, 68 66 58 55 byte

Questo è troppo lungo per ora. Ma un inizio.

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

AGGIORNAMENTO: ora hardcoding per input fino a 15 invece di calcolare l'offset. Suggerimento di Sp3000

Provalo online qui


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

3

C #, 223 205 byte

Questo sfrutta la necessità di raggiungere solo 15 edifici.

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

E una risposta più generica che funzionerà per qualsiasi numero di edifici.

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 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

La parte di controllo della primalità prende in prestito l'algoritmo di @ xnor da qui .

Se eseguiamo il hardcode dei primi 15 offset, possiamo ottenere 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

Suppongo che gli spazi finali alla fine di ogni riga siano a posto, ma se la domanda significava spazi finali dopo l'intero output, allora sono +9 byte per .rstrip().


2

Groovy, 234 , 225 , 223 219 byte

Abusare del limite di 15 edifici

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

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

Ecco il codice rientrato

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

Bcontiene il numero di edifici.
prestituisce 1 quando un numero non è primo.

Devo importare Foundation per usare il ceil funzione.

Non sono riuscito a ottimizzare il codice solo per i quindici casi, ma alla fine lo farò in seguito.

modifica: seguendo i consigli di @Kametrixom e ottimizzando la modparte (ho dimenticato di ridurre la lunghezza del nome var).


1
È possibile sostituire Foundationcon Darwinper salvare alcuni byte
Kametrixom

-1 con import UIKitanziché import Darwin.
Cœur
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.