Reconstruire une ville ASCII

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

Les habitants de ASCIIville reconstruisent leur ville et esquissent de nouveaux plans. Votre travail consiste à dessiner leur nouvelle ville en fonction du nombre de bâtiments qu'ils souhaitent.

L'entrée sera le nombre de bâtiments. Chaque bâtiment est la moitié de la hauteur de l'entrée (arrondi si impair), sans compter le haut et le bas du bâtiment.

Tirons un exemple de base de 4

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

Comme vous pouvez le voir ici, il y a deux |s dans chaque bâtiment car l'entrée était de quatre. Mais il y a un hic! (ce qui signifie que l'exemple ci-dessus est incorrect, et l'exemple en haut de ce message est la sortie réelle pour 4)

Pour chaque bâtiment qui n'est pas un nombre premier, sa hauteur diminue d'une unité. Si le nombre est divisible par 3 , 5 ou 10 , il descend un de plus. S'il est divisible par au moins deux de ces nombres, le montant déduit s'additionne ( 10 est divisible par 10 et 5, et ce n'est pas un nombre premier, il est donc déduit par 3 ).

Regardons un exemple avec une entrée de 5.

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

Voici un exemple de 7

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

Et un exemple de 10

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

Et revenons à 6

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

Règles:

  • Si un nombre est tellement déduit que sa hauteur est inférieure ou égale à zéro, il n'est pas affiché mais un espace lui est laissé (je ne pense pas que ce soit possible, 6est le plus proche que j'ai trouvé pour atteindre zéro) .
  • Les espaces de fin sont autorisés.
  • La largeur de chaque bâtiment doit être de 2.
  • Votre entrée peut provenir de stdin ou être encodée dans le programme.
  • Votre programme doit être un programme complet , sans fonctions.
  • Votre programme doit être capable de 4 à 15 versions. 0-3 et les nombres négatifs ne sont pas nécessaires et ne sont pas spécifiés pour faire quoi que ce soit, ce qui signifie qu'ils peuvent lancer une erreur, imprimer des ordures ou ne rien faire.
phase
la source
@isaacg Yup! Juste corrigé
phase
1
1 n'est pas un nombre premier. D'après les exemples, il semble que vous déduisez 1 de la hauteur si l'index (basé sur 1) est composite plutôt que non premier.
Dennis
Notez qu'une fenêtre de console standard de 80 caractères ne peut accueillir que 16 bâtiments, ce qui pourrait rendre l'exigence de 20 bâtiments un peu moche.
Hand-E-Food
@ Hand-E-Food Merci d'avoir mentionné cela! Je l'ai changé pour que vous mettiez les bâtiments sur de nouvelles lignes.
phase
@ Dennis Je ne savais pas trop si je devais faire Fibonacci ou les nombres premiers, donc celui-ci a été gardé de cela. Je viens de le réparer!
phase

Réponses:

4

CJam, 68 66 58 55 octets

C'est trop long pour l'instant. Mais un début.

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

MISE À JOUR: Maintenant codage en dur pour les entrées jusqu'à 15 au lieu de calculer le décalage. Suggestion de Sp3000

Essayez-le en ligne ici

Optimiseur
la source
3

Python 2, 247 245 237 229 octets

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
la source
3

C #, 223 205 octets

Cela profite de la nécessité de ne se rendre que dans 15 bâtiments.

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 octets

Et une réponse plus générique qui fonctionnera pour n'importe quel nombre de bâtiments.

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
la source
2

Python 2, 163 octets

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 partie la vérification primalité @ Borrows algorithme de xnor d' ici .

Si nous codons en dur les 15 premiers décalages, nous pouvons obtenir 137 octets :

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

Je suppose que les espaces de fin à la fin de chaque ligne sont corrects, mais si la question signifiait des espaces de fin après la sortie entière, alors c'est +9 octets pour .rstrip().

Sp3000
la source
2

Groovy, 234 , 225 , 223 219 octets

Abuser de la limite de 15 bâtiments

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
la source
2

Swift, 375 , 350 octets

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

Voici le code en retrait

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

Bcontient le nombre de bâtiments.
prenvoie 1 lorsqu'un nombre n'est pas premier.

J'ai besoin d'importer Foundation pour utiliser la ceilfonction.

Je n'ai pas réussi à optimiser le code pour seulement les quinze cas, mais je finirai par le faire plus tard.

edit: Suivre les conseils de @Kametrixom et optimiser la modpièce (j'ai oublié de réduire la longueur du nom var).

Crazyrems
la source
1
Vous pouvez remplacer Foundationpar Darwinpour économiser quelques octets
Kametrixom
-1 avec import UIKitau lieu de import Darwin.
Cœur