Reconstruyendo una ciudad ASCII

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

La gente de ASCIIville está reconstruyendo su ciudad y esbozando nuevos planos. Su trabajo es dibujar su nueva ciudad en función de cuántos edificios quieran.

La entrada será cuántos edificios hay. Cada edificio es la mitad de la altura de la entrada (redondeado si es impar), sin incluir la parte superior e inferior del edificio.

Dibujemos un ejemplo básico de 4

+ - + + - + + - + + - +
El | El | El | El | El | El | El | El |
El | El | El | El | El | El | El | El |
+ - + + - + + - + + - +

Como puede ver aquí, hay dos |s en cada edificio porque la entrada fue cuatro. Pero hay una trampa! (lo que significa que el ejemplo anterior es incorrecto, y el ejemplo en la parte superior de esta publicación es la salida real para 4)

Para cada edificio que no es un número primo, su altura se reduce en uno. Si el número es divisible por 3 , 5 o 10 , baja uno más. Si es divisible por dos o más de esos números, la cantidad deducida se suma ( 10 es divisible por 10 y 5, y no es primo, por lo que se deduce por 3 ).

Veamos un ejemplo con una entrada de 5.

     + - +
+ - + | El | + - + + - + + - +
El | El | El | El | El | El | El | El | El | El |
El | El | El | El | El | El | El | El | El | El |
+ - + + - + + - + + - + + - +

Aquí hay un ejemplo de 7

     + - + + - +
+ - + | El | + - + + - + + - + | El |
El | El | El | El | El | El | El | El | El | El | + - + | El |
El | El | El | El | El | El | El | El | El | El | El | El | El | El |
El | El | El | El | El | El | El | El | El | El | El | El | El | El |
+ - + + - + + - + + - + + - + + - + + - +

Y un ejemplo de 10

     + - + + - +
+ - + | El | + - + + - + + - + | El | + - +
El | El | El | El | El | El | El | El | El | El | + - + | El | El | El | + - +
El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | + - +
El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El |
El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El |
+ - + + - + + - + + - + + - + + - + + - + + - + + - + + - +

Y de vuelta a 6

     + - +
+ - + | El | + - + + - + + - +
El | El | El | El | El | El | El | El | El | El | + - +
El | El | El | El | El | El | El | El | El | El | El | El |
+ - + + - + + - + + - + + - + + - +

Reglas:

  • Si un número se deduce tanto que su altura es menor o igual a cero, no se muestra, pero queda un espacio para él (no creo que esto sea posible, 6es lo más cercano que he encontrado para llegar a cero) .
  • Se permiten espacios finales.
  • El ancho de cada edificio debe ser 2.
  • Su entrada puede ser de stdin o codificada en el programa.
  • Su programa debe ser un programa completo , sin funciones.
  • Su programa debe poder 4-15 compilaciones. Los números 0-3 y negativos no son necesarios y no están especificados para hacer nada, lo que significa que pueden arrojar un error, imprimir basura o no hacer nada.
fase
fuente
@isaacg ¡Sí! Solo lo arreglé
fase
1
1 no es un número primo. A partir de los ejemplos, parece que deduce 1 de la altura si el índice (basado en 1) es compuesto en lugar de no primo.
Dennis
Tenga en cuenta que una ventana de consola estándar de 80 caracteres solo se ajustará a 16 edificios, lo que podría hacer que el requisito de 20 edificios sea un poco feo.
Hand-E-Food
@ Hand-E-Food ¡Gracias por mencionar eso! Lo he cambiado para que pongas los edificios en nuevas líneas.
fase
@ Dennis No estaba seguro de si hacer Fibonacci o números primos, por lo que se evitó el uno. ¡Solo lo arreglé!
fase

Respuestas:

4

CJam, 68 66 58 55 bytes

Esto es demasiado largo por ahora. Pero un comienzo.

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

ACTUALIZACIÓN: ahora codificación para entradas hasta 15 en lugar de calcular el desplazamiento. Sugerencia por Sp3000

Pruébalo en línea aquí

Optimizador
fuente
3

Python 2, 247 245 237 229 bytes

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

C #, 223205 bytes

Esto aprovecha la necesidad de ir solo a 15 edificios.

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 bytes

Y una respuesta más genérica que funcionará para cualquier número de edificios.

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?"|  | ":"+--+ ");
            }
    }
}
Hand-E-Food
fuente
2

Python 2, 163 bytes

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 comprobación de primalidad parte toma prestado @ algoritmo de XNOR desde aquí .

Si nos codificar los 15 primeros desplazamientos, podemos obtener 137 bytes :

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

Asumo espacios finales al final de cada línea está bien, pero si la pregunta significaba espacios finales después de toda la producción, entonces es +9 bytes para .rstrip().

Sp3000
fuente
2

Groovy, 234 , 225 , 223 219 bytes

Abusar del límite de 15 edificios

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

Swift, 375 , 350 bytes

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

Aquí está el código sangrado

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 el número de edificios
pdevuelve 1 cuando un número no es primo.

Necesito importar Foundation para usar la ceilfunción.

No logré optimizar el código solo para los quince casos, pero eventualmente lo lograré más tarde.

editar: siguiendo los consejos de @Kametrixom y optimizando la modparte (olvidé reducir la longitud del nombre var).

Crazyrems
fuente
1
Puede reemplazar Foundationcon Darwinpara guardar algunos bytes
Kametrixom
-1 con en import UIKitlugar de import Darwin.
Coeur