Schnitzen Sie einige ASCII-Juwelen!

25

Der 13. März wird als nationaler Juwelentag anerkannt , der das Thema dieser Herausforderung ist. So gegeben, eine ganze Zahl , nwo ngrößer als 0 ist , erstellen Sie ein ASCII - Juwel. Beispielsweise:

n = 1          n = 2             n = 3
                                       ______
                     ____             /      \
 __                 /    \            \      /
/  \                \    /             \    /
\  /                 \  /               \  /
 \/                   \/                 \/

Der Boden ist definiert als der Boden des Schmuckstücks bis zum höchsten Paar von \/. Der Rest ist die Spitze. Für das obige Beispiel gilt n = 1:

Bottom: \  /    Top:   __
         \/           /  \

Wie Sie sehen können, besteht der Boden aus n + 1Schichten \/mit (1 * lines from the bottom) * 2Zwischenräumen mit maximaler Anzahl von nLinien vom Boden des Schmuckstücks. Wenn wir das zweite Juwel ( n = 2) nehmen, können wir das sehen:

 ____
/    \      
\    /  2 (or n) layers from the bottom with 1*2*2 or 4 spaces in between \/
 \  /   1 layer from the bottom with 1*1*2 or 2 spaces in between \/
  \/    The bottom (0 layers) with 1*0*2 spaces or 0 spaces in between \/

Das Oberteil besteht aus einem Paar /\mit n*2Zwischenräumen und n*2Unterstrichen.

Regeln

  • Muss in der Lage sein, alle positiven Ganzzahlen ungleich Null als Benutzereingabe zu erfassen
  • Es muss ein Juwel mit den oben definierten Spezifikationen erstellt werden (hier angepasst):
    • Das Oberteil besteht aus einem Paar /\mit n*2Zwischenräumen und n*2Unterstrichen.
    • Der Boden besteht aus n + 1Lagen \/mit (1 * lines from the bottom) * 2Zwischenräumen mit maximaler Anzahl von nLinien vom Boden des Schmuckstücks.
  • Es ist zulässig, Zeilenumbrüche nach dem Juwel oder Leerzeichen in jeder Zeile zu setzen.
  • Keine Standardlücken erlaubt

Gewinnkriterien

Die wenigsten Bytes gewinnen!

Anthony Pham
quelle
4
Streng genommen ist "positiv ungleich Null" überflüssig - wenn Sie 0 einschließen möchten, müssen Sie "nicht negativ" sagen.
Fund Monica's Lawsuit
Kann die Antwort in PETSCII sein?
Shaun Bebbers
3
Je höher die Zahl, desto weniger sehen die "Juwelen" aus wie Juwelen, sondern eher wie Pizzastücke, oder vielleicht ist es gerade Mittagspause.
Marijn Stevering

Antworten:

27

Holzkohle , 17 Bytes

Code:

NβG←β_↙↙¹→↘⁺β¹‖M→

Erläuterung:

Nβ                      # Place the input into β
   G←β_                 # Draw a line of length β with _ as the filling character
        ↙                # Move the cursor one down and one left
         ↙¹              # Draw a line from the cursor position to one position ↙
           →             # Move the cursor 1 to the right
             ⁺β¹         # Add one to the input and..
            ↘            # Create a line pointing ↘, with the size calculated above
                ‖M→     # Mirror to the right

Ein sehr ordentlich Befehl ist ‖M, der auch automatisch Spiegel /in\ .

Verwendet die Charcoal- Codierung .

Probieren Sie es online!

Adnan
quelle
Dieser Spiegelbefehl ist wirklich cool! Spiegelt es auch Klammern und andere Zeichen wider? Und gibt es eine Möglichkeit, dieses Verhalten außer Kraft zu setzen?
DJMcMayhem
2
@ DJMcMayhem Ja und ja :)
Adnan
27
Lol, du hast Diamanten aus Holzkohlen gemacht!
SteeveDroz
8

05AB1E , 27 20 Bytes

ƒN·ð×…\ÿ/}¹·'_×)R.c

Probieren Sie es online!

Erläuterung

ƒ                      # for N in range[0 ... n]
 N·ð×                  # push N*2 spaces
     …\ÿ/              # push the string "\ÿ/" with "ÿ" replaced by the spaces 
         }             # end loop
          Â            # push a reversed copy of the top of the stack 
                       # (the largest row of the bottom of the diamond)
           ¹·'_×       # push input*2 underscores
                )      # wrap the stack in a list
                 R     # reverse the list
                  .c   # join the list on newlines, padding each row to equal length
Emigna
quelle
Haha schön! Ich glaube , Sie können sich ändern D„/\„\/‡zu Â.
Adnan
@Adnan: Ja, ich habe das gerade selbst gemerkt, als ich an einer Verbesserung gearbeitet habe: P
Emigna
8

Python 2, 101 98 95 Bytes

lambda n:'\n'.join([' '+'__'*n,'/'+'  '*n+'\\']+[' '*i+'\\'+'  '*(n-i)+'/'for i in range(n+1)])

Probieren Sie es online!

Anonyme Funktion, die eine positive Ganzzahl aufnimmt und eine Zeichenfolge zurückgibt

Python 3.6, 92 Bytes (Dank an Ben Frankel)

lambda n:f' {"__"*n}\n/{"  "*n}\\\n'+'\n'.join(' '*i+'\\'+'  '*(n-i)+'/'for i in range(n+1))

Ich konnte keinen Online-Interpreter für diese Version finden, aber er ist aufgrund von F-Strings in Version 3.6 etwas kürzer

Mathe-Junkie
quelle
Sie können drei Bytes in Python 3.6 speichern: lambda n:f' {"__"*n}\n/{" "*n}\\\n'+'\n'.join(' '*i+'\\'+' '*(n-i)+'/'for i in range(n+1)). Nutzen Sie die Vorteile von F-Strings.
Ben Frankel
Ich bin mir ziemlich sicher, dass repl.it eine Testsuite für Python 3
Anthony Pham am
@AnthonyPham repl.it und TryItOnline verwenden beide Python 3.5, ich habe überprüft
Math Junkie
Whoa, endlich! Ich frage mich, was Python so lange gedauert hat. Jede Sprache verdient String-Interpolation ...
Felix Dombek
7

PHP, 123 Bytes

echo($s=str_pad)(" ",$z=1+2*$a=$argv[1],_).$s("\n/",$z+1," ")."\\\n";for($i=0;$i<=$a;)echo$s($s("",$i)."\\",$z-$i++)."/\n";

143 Bytes erste Version

for(;$i<3+$a=$argv[1];$i++)echo 1-$i?str_pad("",$i?$i-2:1):"/",str_pad($i>1?"\\":"",$i<2?2*$a:2*($a-$i+2)+1,$i?" ":_),$i<2?$i?"\\":"":"/","\n";

Probieren Sie es hier aus!

Jörg Hülsermann
quelle
Wo kann ich das probieren?
Anthony Pham
@ AnthonyPham hier .
Adnan
Sie können es 119 Bytes machen: ideone.com/RPCVZe
Tschallacka
@Tschallacka wenn ich davon ausgehe, dass ich nur ein Linux System benutze
Jörg Hülsermann
Nun, solange Sie mit nicht bearbeiten tun notepad.exe meisten Editoren Linux - Zeilenenden haben ... i.imgur.com/QZsmf4r.png Windows - Konsole wird gerne angezeigt \ n als echte Newline. Ja, Sie können ein paar Bytes Ihrer Antwort rasieren.
Tschallacka
6

V , 28 27 26 Bytes

1 Byte, die dank @DJMcMayhem durch Verwendung von >anstelle von gespeichert wurdenÉ

Ài__<esc>É ÙÒ r/Á\Ùr\$r/òÙlxx>

<esc> ist 0x1b

Probieren Sie es online!

Hexdump:

00000000: c069 5f5f 1bc9 20d9 d220 722f c15c d972  .i__.. .. r/.\.r
00000010: 5c24 722f f2d9 6c78 783e                 \$r/..lxx>

Erläuterung

Oben:

Ài__<esc>              " Write argument times __
É<space>               " Prepend a space to the line
Ù                      " Duplicate line below cursor, cursor also moves down
Ò<space>               " Replace every character with a space
r/                     " Change the first character in the line to a /
Á\                     " Append a \ to the end of the line

Unterseite:

Ù                      " Duplicate
r\                     " Change the first character in the line to a \
$r/                    " Replace the last character with a /
ò                      " Until a breaking error occurs do:
  Ù                    "  Duplicate
  lxx                  "  Remove 2 middle characters (spaces)
  >                    "  Indent by one space (implicit ending >)
                       " Implicit ending ò
Kritixi Lithos
quelle
Gute Antwort! Sie können ändern, É<space>auf >welche am Ende eines Makros implizit ausgefüllt wird>>
DJMcMayhem
@ DJMcMayhem Netter Vorschlag! Die >Einrückungen werden also um ein Leerzeichen anstatt um einen Tabulator verschoben.
Kritixi Lithos
Ja! Das ist, weil ich habe set expandtabundset shiftwidth=1
DJMcMayhem
5

Röda , 71 Bytes

f n{a=" ";[a,"__"*n,"
/",a*2*n,`\
`];seq n,0|[a*(n-_),`\`,a*2*_1,"/
"]}

Probieren Sie es online!

fergusq
quelle
5

JavaScript (ES6), 80 Byte

f=
n=>` ${"_".repeat(n*2)}
/${s=" ".repeat(n)}${s}\\`+s.replace(/|/g,"\n$`\\$'$'/")
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

Neil
quelle
3

Python 3, 107 105 Bytes

n,s=int(input())," "
print(s+n*"__","/"+n*2*s+"\\",*[i*s+"\\"+2*(n-i)*s+"/"for i in range(n+1)],sep="\n")

Nimmt ein Int von Stdin

KarlKastor
quelle
3

MATL , 34 Bytes

QE:qgOO(t~E3O(GQXy3*tPgEhv'_/\ 'w)

Probieren Sie es bei MATL Online!

Erläuterung

QE:qg   % Create array [0 1 1 ... 1 1] of size2*(n+1)
OO(     % Turns last 1 into a 0: [0 1 1 ... 1 0]
t~      % Duplicate and negate: [1 0 0 ... 0 1]
E3O(    % Multiply by 2, turn last 2 into 3: [2 0 0 ... 0 3]
GQXy    % Push identity matrix of size n+1
3*      % Multiply by 3
tPgE    % Duplicate, flip, turn 3 into 2
h       % Concatenate the two matrices horizontally
v       % Concatenate all arrays vertically into a matrix
'_/\ '  % Push this string
w)      % Index (modular, 1-based) with the matrix into the string. Implicitly display
Luis Mendo
quelle
3

PowerShell , 76 , 74 Bytes

param($n)" "+'_'*2*$n;"/$(' '*$n*2)\";$n..0|%{' '*($n-$_)+"\$(' '*$_*2)/"}

Hinweis: Das Online-Beispiel enthält eine kurze Zusammenfassung als Demonstration. Platzieren Sie diese in einer PoSH-Funktion oder einem Skript, um sie auszuführen.

Probieren Sie es online!

Herbert Origas
quelle
Willkommen bei PPCG! Schöne erste Antwort und schön, einen anderen PowerSheller in der Nähe zu sehen! Sie können ein paar Bytes speichern, indem Sie eine inkrementierende Variable in der Schleife verwenden - ' '*$i++anstelle von ' '*($n-$_).
AdmBorkBork
3

C 131 Bytes

i;f(n){for(printf(" ",i=0);i++<n*2;)printf("_");for(printf("\n/%*c\n",n*2+1,92,i=0);i++<n+1;)printf("%*c%*c\n",i,92,(n-i)*2+3,47);}

Probieren Sie es online!

Steadybox
quelle
Wo kann ich das testen?
Anthony Pham
@AnthonyPham Tio Link hinzugefügt.
Steadybox
Nizza Ansatz mit printf Breite, um die Leerzeichen auszufüllen. Sie können 9 weitere Bytes einsparen, wenn Sie ein Makro für den Ausdruck erstellen, das erste i = 0 entfernen und eine neue Variable j hinzufügen, anstatt i beim zweiten Durchlauf auf 0 neu zu initialisieren:i,j;f(n){for(p(" ");i++<n*2;p("_"));for(p("\n/%*c\n",n*2+1,92);j++<n+1;p("%*c%*c\n",j,92,(n-j)*2+3,47));}
Claudiu
@Claudiu Danke, aber dann würde die Funktion nur dann eine korrekte Ausgabe erzeugen, wenn sie zum ersten Mal aufgerufen wird, und IIRC ist hier gegen die Regeln. Die Funktion sollte funktionieren, egal wie oft sie aufgerufen wird.
Steadybox
@Steadybox oh ich verstehe, sorry dafür. Gilt das für alle Codegolf-Fragen? Betrachtet man nur diese spezielle Frage, scheint es nicht so zu sein, dass mehrere Eingaben gewünscht werden.
Claudiu
2

Pyth, 44 Bytes

+" "*Q"__"++\/**2Qd\\jm+++*d\ \\**2-Qd\ \/hQ

Versuch es!

Erläuterung

Der Code besteht aus 3 Teilen:

+" "*Q"__"               # pretty straightforward " "+input()*"__"
++\/**2Qd\\              # d is defined as " ":  "/"+2*input()*d+"\"
jm+++*d\ \\**2-Qd\ \/hQ  # The third part is a bit more complex so I'll explain it further:

jm                   hQ  # Map some lambda function onto range(input()+1) and join the result on newlines
  +++*d\ \\**2-Qd\ \/    # Here d is the lambda argument (so I can't use it for spaces -.-) 
  +++*d\ \\**2-Qd\ \/    # In Python: d*" "+"\\"+2*(Q-d)*" "+"/"
KarlKastor
quelle
2

Python3, 104 Bytes

n=int(input());print(" "+"__"*n+"\n/"+"  "*n+"\\")
for i in range(n+1):print(" "*i+"\\"+"  "*(n-i)+"/")

Das Programm nimmt eine Ganzzahl von STDIN und gibt das Juwel an STDOUT zurück.

Josh
quelle
2

Pip , 43 Bytes

42 Byte Code, +1 für -nFlag.

Ps.'_Xa*2P"/\"JsXa*2sX_.'\.sXa-_X2.'/M,a+1

Übernimmt die Eingabe als Befehlszeilenargument. Probieren Sie es online!

Erläuterung

Konstruiert die ersten beiden Zeilen separat, dann den Rest des Juwel mit einer Kartenoperation:

Ps.'_Xa*2
      a*2  Cmdline arg, times 2
   '_X     That many underscore characters
 s.        Concatenated to a space character
P          Print (with newline)

P"/\"JsXa*2
        a*2  Cmdline arg, times 2
      sX     That many space characters
 "/\"J       Join the string "/\" with the above as the separator
P            Print (with newline)

sX_.'\.sXa-_X2.'/M,a+1
                  ,a+1  Numbers from 0 up to and including a
                 M      Map the following lambda function:
sX_                      Space, repeated (fn arg) times
   .'\                   Concatenate \
      .                  Concatenate:
       sXa-_              Space, repeated (a - (fn arg)) times
            X2            repeated twice
              .'/        Concatenate /
                         Print result list, newline separated (implicit, -n flag)

Eine andere Lösung

Auch 42 + 1 Bytes, diesmal mit dem -lFlag:

Ys.tAL'_.sX2+,a.0(yALRVyRXD1-_)R0'\R1'/ZDs

TIO

DLosc
quelle
2

Pyth, 38 Bytes

j[*yQ\_j*yQpd"/\\"jm+*\ dj*\ y-Qd"\/"h
Steven H.
quelle
2

C 115 Bytes

#define p printf(
i;j;f(n){for(p" ");i++<n;p"__"));for(p"\n/%*c",2*n+1,92);j<=n;p"\n%*c%*c",++j,92,n*2-j*2+3,47));}

Probieren Sie es online!

C, 123 Bytes

Obwohl die Herausforderung dies nicht erfordert, kann die Funktion auf Kosten von 8 Byte wiederverwendbar gemacht werden (die erste Lösung spart 8 Byte, indem auf die implizite Initialisierung globaler Variablen zurückgegriffen wird).

#define p printf(
i;f(n){for(i=0,p" ");i++<n;p"__"));for(i=0,p"\n/%*c\n",2*n+1,92);i<=n;p"%*c%*c\n",++i,92,n*2-i*2+3,47));}

Probieren Sie es online!

Itay Grudev
quelle
2

Batch, 152 Bytes

@set s=
@for /l %%i in (1,1,%1)do @call set s=  %%s%%
@echo  %s: =_%
@echo /%s%\
@set s=\%s%/
:l
@echo %s%
@if %s:~-2%==/ set s=%s:\  = \%&goto l

Tests:

n = 1
 __
/  \
\  /
 \/

n = 2
 ____
/    \
\    /
 \  /
  \/

n = 3
 ______
/      \
\      /
 \    /
  \  /
   \/
Neil
quelle
Ich benötige eine Testsuite, um dies zu testen.
Anthony Pham
2

C #, 187 Bytes

Ich bin mir sicher, dass es eine kompaktere Lösung gibt, aber dies ist mein erster Versuch:

var a=" "+new string('_',2*n)+"\n/"+new string(' ',2*n)+"\\\n";for(int i=n;i>0;i--){a+=new string(' ',n-i)+"\\"+new string(' ',2*i)+"/\n";}a+=new string(' ',n)+"\\/";Console.Write(a);

Probieren Sie es online ..

James Robertson
quelle
Ich benötige eine Testsuite, um dies zu testen.
Anthony Pham
1

JavaScript (ES6), 93 Byte

n=>(` 0
/2\\`+`
1\\4/`.repeat(k=++n)).replace(/\d/g,c=>' _'[+!+c].repeat(c&1?k-n-2:+c+--n*2))

Demo

Arnauld
quelle
1

Gleichstrom , 121 Bytes

?d1+sa2*sb32P[0sq[lvPlq1+dsqlj>h]shlj0<h]srlbsj95svlrx2607Plbsj32svlrx[\]p0sd[ldsjlrx92Plbsjlrxlb2-sb[/]pld1+dsdla>k]dskx

Probieren Sie es online!

R. Kap
quelle
1

Perl 5 109 94 + 1 (für Flag -p) = 95 Bytes

Probieren Sie es online!

$l=$_*2;$s=" "."_"x$l."\n/"." "x$l."\\\n";$s.=" "x$_."\\"." "x($l-$_*2)."/\n"for 0..$_;print$s

Kann so ausgeführt werden:

perl -p <name of file> <<< n

Ungolfed

$l=$_*2;
$s=" "."_"x$l."\n/"." "x$l."\\\n";
$s.=" "x$_."\\"." "x($l-$_*2)."/\n"for 0..$_;
print$s

Erläuterung

#Sets $l to twice the value of the input 'n'
$l=$_*2;  

#Top 2 rows of jewel adding $l underscores then newline  
#followed by '/' and $l spaces.  The '\\\n' is an escaped '\' and a newline
$s=" "."_"x$l."\n/"." "x$l."\\\n";

#The meat of the jewel generation.  It contains a for-loop
#that iterates from 0 to $_ (the input value 'n')
#The loop uses its iterator value ($_ (which overrides the outer $_))
#to determine how many leading spaces it needs to apply.
#Then it adds a '\' with '\\' followed by $l-$_*2 number of spaces
#(the inside of the jewel).  Again, while under the umbrella of the for-loop,
#the $_ refers to the iterator value of the for-loop.
#After the inner spaces, it goes on to add in the '/' and a new line
$s.=" "x$_."\\"." "x($l-$_*2)."/\n"for 0..$_;

#Lastly, it prints the compiled Scalar value $s.  (In Perl, Strings are Scalar values or references
print$s
CraigR8806
quelle
Ich benötige eine Testsuite, um dies zu testen, da nicht jeder dies so versteht oder ausführen kann, wie Sie es angegeben haben
Anthony Pham
@AnthonyPham Ich habe den Link "Online testen" hinzugefügt
CraigR8806