Wiederaufbau einer ASCII-Stadt

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

Die Leute von ASCIIville bauen ihre Stadt wieder auf und skizzieren neue Pläne. Ihre Aufgabe ist es, ihre neue Stadt basierend auf der Anzahl der gewünschten Gebäude zu zeichnen.

Die Eingabe wird sein, wie viele Gebäude es gibt. Jedes Gebäude ist halb so hoch wie die Eingabe (aufgerundet, wenn ungerade), ohne Ober- und Unterseite des Gebäudes.

Zeichnen wir ein grundlegendes Beispiel für 4

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

Wie Sie hier sehen können, gibt es |in jedem Gebäude zwei s, da der Eingang vier war. Aber da ist ein Fang! (Dies bedeutet, dass das obige Beispiel falsch ist und das Beispiel oben in diesem Beitrag die tatsächliche Ausgabe für 4 darstellt.)

Für jedes Gebäude, das keine Primzahl ist, verringert sich seine Höhe um eins. Wenn die Zahl durch 3 , 5 oder 10 teilbar ist , wird sie um eins verringert. Wenn es durch zwei oder mehr dieser Zahlen teilbar ist, addiert sich der abgezogene Betrag ( 10 ist durch 10 und 5 teilbar, und es ist keine Primzahl, also wird er durch 3 abgezogen ).

Schauen wir uns ein Beispiel mit einer Eingabe von an 5.

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

Hier ist ein Beispiel für 7

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

Und ein Beispiel von 10

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

Und zurück zu 6

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

Regeln:

  • Wenn eine Zahl so stark abgezogen wird, dass ihre Höhe kleiner oder gleich Null ist, wird sie nicht angezeigt, es bleibt jedoch ein Leerzeichen übrig (ich glaube nicht, dass dies möglich ist, 6ist das, was ich am ehesten gefunden habe, um Null zu erreichen) .
  • Nachgestellte Leerzeichen sind erlaubt.
  • Die Breite jedes Gebäudes muss 2 betragen.
  • Ihre Eingabe kann von stdin oder in das Programm codiert sein.
  • Ihr Programm muss ein vollständiges Programm sein , keine Funktionen.
  • Ihr Programm muss 4-15 Builds können. 0-3 und negative Zahlen werden nicht benötigt und sind nicht dazu bestimmt, irgendetwas zu tun, was bedeutet, dass sie einen Fehler auslösen, Müll drucken oder nichts tun können.
Phase
quelle
@isaacg Yup! Einfach behoben
Phase
1
1 ist keine Primzahl. In den Beispielen sieht es so aus, als würden Sie 1 von der Höhe abziehen, wenn der (1-basierte) Index eher zusammengesetzt als nicht primitiv ist.
Dennis
Beachten Sie, dass ein Standardkonsolenfenster mit 80 Zeichen nur für 16 Gebäude geeignet ist, was die Anforderungen für 20 Gebäude möglicherweise etwas hässlich macht.
Hand-E-Food
@ Hand-E-Food Danke für die Erwähnung! Ich habe es geändert, damit Sie die Gebäude in neue Linien setzen.
Phase
@Dennis Ich war mir nicht sicher, ob ich Fibonacci oder Primzahlen machen sollte, also wurde die eine davon abgehalten. Einfach repariert!
Phase

Antworten:

4

CJam, 68 66 58 55 Bytes

Das ist vorerst zu lang. Aber ein Anfang.

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

UPDATE: Jetzt für Eingaben bis 15 hardcodieren, anstatt den Offset zu berechnen. Vorschlag von Sp3000

Probieren Sie es hier online aus

Optimierer
quelle
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
quelle
3

C #, 223 205 Bytes

Dies nutzt die Notwendigkeit, nur 15 Gebäude zu betreten.

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

Und eine allgemeinere Antwort, die für eine beliebige Anzahl von Gebäuden funktioniert.

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

Die primality Prüfteil leiht @ xnor Algorithmus von hier .

Wenn wir die ersten 15 Offsets fest codieren, können wir 137 Bytes erhalten :

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

Ich gehe davon aus, dass nachfolgende Leerzeichen am Ende jeder Zeile in Ordnung sind, aber wenn die Frage nachfolgende Leerzeichen nach der gesamten Ausgabe bedeutete, dann sind es +9 Bytes für .rstrip().

Sp3000
quelle
2

Groovy, 234 , 225 , 223, 219 Bytes

Missbrauch der 15 Gebäudegrenze

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

Hier ist der eingerückte Code

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

Benthält die Anzahl der Gebäude.
pGibt 1 zurück, wenn eine Zahl keine Primzahl ist.

Ich muss Foundation importieren, um die ceilFunktion nutzen zu können.

Es ist mir nicht gelungen, den Code nur für die fünfzehn Fälle zu optimieren, aber ich werde es später schaffen.

edit: @Kametrixom Ratschläge einholen und das modTeil optimieren (ich habe vergessen, die Länge des Variablennamens zu reduzieren).

Crazyrems
quelle
1
Sie können ersetzen Foundationmit ein Darwinpaar Bytes speichern
Kametrixom
-1 mit import UIKitstatt import Darwin.
Cœur