Zeichnen Sie einige ASCII-Sterne

15

Schreiben Sie ein Programm oder eine Funktion, die unter Berücksichtigung der Größe der Arme als Eingabe einen ASCII-Stern zeichnet.

Hier ist ein Stern von Größe 1

_/\_
\  /
|/\|

Hier ist ein Stern von Größe 2

   /\
__/  \__
\      /
 \    /
 | /\ |
 |/  \|

Hier ist ein Stern von Größe 3

     /\
    /  \
___/    \___
\          /
 \        /
  \      /
  |  /\  |
  | /  \ |
  |/    \|

Und so weiter.

Eingang

Eine einzelne positive ganze Zahl in jedem geeigneten Format , n > 0.

Ausgabe

Eine ASCII-artige Darstellung eines Sterns nach den oben genannten Regeln. Führende / nachfolgende Zeilenumbrüche oder andere Leerzeichen sind optional, sofern die Punkte richtig ausgerichtet sind.

Regeln

  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
AdmBorkBork
quelle
6
Ist es nur mein Bildschirm oder sehen die Sterne ungewöhnlich groß und dünn aus?
Caird Coinheringaahing
2
Dummes ASCII und sein Mangel an flachen Schrägen ...
totalhuman
@cairdcoinheringaahing Die von SE verwendete Schriftart ist nicht quadratisch - zwischen den Zeilen gibt es ein signifikantes Leerzeichen, wodurch die Verzerrung erhöht wird.
AdmBorkBork

Antworten:

12

Kohle , 20 17 Bytes

-3 Bytes dank Neil.

Nν↙ν↑↑ν↖ν ×_ν↗ν‖M

Probieren Sie es online! Link ist zur ausführlichen Version.

Ich bin ziemlich glücklich mit diesem Golf, also ...

Erläuterung

Nν                 take a number as input and store in ν
  ↙ν               print / ν times downwards to the left
    ↑              move up once
     ↑ν            print | ν times upwards
       ↖ν          print \ ν times upwards to the left
                   print a space
          ×_ν      print _ ν times
             ↗ν    print / ν times upwards to the right
               ‖M  reflect horizontally
     /\                           
    /  \    "No, this is Patrick!"
___/    \___                      
\   ☉ ☉    /                      
 \   𝐷    /                       
  \      /                        
  |  /\  |                        
  | /  \ |                        
  |/    \| 
total menschlich
quelle
Durch das Zeichnen von unten nach oben werden 2 Bytes gespart.
Neil
Das liegt daran, dass Polygonder Cursor auf dem letzten Zeichen bleibt, aber ich habe nicht verwendet Polygon... Tatsächlich habe ich auch nicht den besten Code verwendet, ich bin jetzt auf 17 gesunken.
Neil
Ich weiß nicht, ob ich 17 habe, wie du es getan hast, aber ... Danke!
Totalhuman
Fast genug. Hatte ich eigentlich Move(:Right); for (n) Print("_");.
Neil
5

SOGL V0.12 , 27 24 Bytes

╔*¹.╚№┼№.╝+ø┐.∙.1ž.╚┼+╬³

Probieren Sie es hier aus!

Erläuterung:

╔*                        push a string with input amount of underscores
  ¹                       wrap that in an array
   .╚                     push a "/" diagonal of the size of the input (the top lines)
     №                    reverse vertically
      ┼                   add horizontally the underscores behind the array
       №                  reverse vertically back
        .╝+               below that add a "\" diagonal (middle lines)
           ø              push an empty string as the base of the vertical bars
            ┐.∙           get an array of "|" with the length of the input
               .1ž        at [input; 1] in the empty string insert that
                  .╚┼     horizontally append a "/" diagonal
                     +    add that below everything else
                      ╬³  palindromize horizontally
dzaima
quelle
4

Python 2 ,  166 160 157 155  152 Bytes

Der execAnsatz ist genau die gleiche Anzahl von Bytes.

i=input();t,z=" \\";y=t*2
for k in range(i*3):s=k%i;o=i+~s;p=i+o;g="_ "[i>k+1]*p;print[g+"/"+y*k+z+g,t*s+z+y*p+"/",~-i*t+"|"+o*t+"/"+y*s+z+o*t+"|"][k/i]

Probieren Sie es online!

3 Bytes dank Jonathan Frech gespeichert .

Mr. Xcoder
quelle
Sie könnten ein paar Bytes speichern durch Ersetzen t=" ";y,z=t*2,"\\"mit t,z=" \\";y=t+t.
Jonathan Frech
@ JonathanFrech Vielen Dank.
Mr. Xcoder
3

Java 8, 385 376 344 304 285 280 268 264 252 250 + 19 Bytes

n -> {int s = 2 · n, w = 2 · s, e = n - 1, i = 0, o, l [] [] = neues int [n · 3] [w]; für (; i <n; l [i] [s + ~ i] = l [n + i] [w + ~ i] = l [o] [s + ~ i] = 47, l [i] [o] = l [o] [ o] = l [n + i] [i] = 92, l [e] [i] = l [e] [w - ++ i] = 95, l [o] [e] = l [o] [ s + n] = 124) o = s + i; für (int [] b: l) System.out.println (neuer String (b, 0, w) .replace (" ", "");}

Probieren Sie es online!

Roberto Graham
quelle
Sie können es mit bitweisen Tricks um 10 Bytes kürzen und alle Ihre Integer-Deklarationen außerhalb Ihrer Schleifen ( 270 Bytes ) verschieben
Mr. Xcoder
Und Sie können weitere 2 Bytes einsparen, indem Sie int o=die Schleife ebenfalls nach außen verschieben ( 268 Bytes )
Mr. Xcoder,
Sie können 4 weitere Bytes einsparen, indem Sie die for-Loop-Klammern entfernen und ++direkt beim letzten Auftreten von iwie folgt vorgehen : 264 Bytes .
Kevin Cruijssen
1
252 Bytes
Nevay
@ Nevay Sehr klug, danke
Roberto Graham
2

Mathematica, 189 Bytes

n(
  s_±x_±y_:=s->Array[If[x==y,s," "]&,{n,n}];
  StringRiffle[Characters@{"_/\\_","\\  /","|/\\:"}/.
    {"_"±#±n,"|"±#2±n,":"±#2±1,"\\"±#±#2,"/"±(n-#+1)±#2," "±0±1}
    /.":"->"|"//ArrayFlatten,"
",""])

Zeile 2 definiert den Hilfsoperator ±, mit dem Zeile 4 ausgewertet wird, um:

{"_"  -> Array[If[#1 == n,          "_", " "] &, {n, n}], 
 "|"  -> Array[If[#2 == n,          "|", " "] &, {n, n}], 
 ":"  -> Array[If[#2 == 1,          ":", " "] &, {n, n}], 
 "\\" -> Array[If[#1 == #2,         "\\"," "] &, {n, n}], 
 "/"  -> Array[If[1 + n - #1 == #2, "/", " "] &, {n, n}], 
 " "  -> Array[If[0 == 1,           " ", " "] &, {n, n}]}

In Zeile 3 nimmt das ReplaceAll( /.) eine Matrix, die den Stern der Größe 1 sowie die Liste der obigen Regeln darstellt. Für die letzten Schritte verwenden wir ArrayFlatten, was kürzer als SubstitutionSystemund ist StringRiffle.

hftf
quelle
2

Java 7, 295 Bytes

Lösung ist Methode f.

String s(String s,int n){while(n-->0)s=" "+s;return s;}String f(int x){String n="\n",s="/",b="\\",o="",u="_";int i=0;for(x--;i<x;u+="_")o+=s(s,2*x-i+1)+s(b,2*i++)+n;o+=u+s+s(b,2*i)+u+n;while(i>=0)o+=s(b,x-i)+s(s,4*x-2*(x+~i--))+n;while(i++<x)o+=s("|",x)+s(s,x-i)+s(b,2*i)+s("|",x-i)+n;return o;}

Probieren Sie es online testen (JDK 8)

Ungolfed

String s(String s, int n) {
    while (n-- > 0)
        s = " " + s;
    return s;
}

String f(int x) {
    String
        n = "\n",
        s = "/",
        b = "\\",
        o = "",
        u = "_"
    ;
    int i = 0;
    for (x--; i < x; u += "_")
        o += s(s, 2*x - i + 1) + s(b, 2 * i++) + n;
    o += u + s + s(b, 2 * i) + u + n;
    while (i >= 0)
        o += s(b, x - i) + s(s, 4*x - 2*(x + ~i--)) + n;
    while (i++ < x)
        o += s("|", x) + s(s, x - i) + s(b, 2 * i) + s("|", x - i) + n;
    return o;
}

Danksagung

  • -1 Byte dank Kevin Cruijssen
Jakob
quelle
0

Python 2 , 137 Bytes

n=input()
b,f,s,v='\/ |'
for i in range(3*n):u=i/~-n*n*'_';d=f+i%n*2*s+b;print[u+d+u,b+s*2*(3*n+~i)+f,v+d.center(2*n)+v][i/n].center(4*n)

Probieren Sie es online!

Lynn
quelle