Wyrzeźb kilka klejnotów ASCII!

25

13 marca uznawany jest za Narodowy Dzień Klejnotu , który jest tematem tego wyzwania. Tak więc, biorąc pod uwagę liczbę całkowitą, nktóra njest większa niż 0, utwórz klejnot ASCII. Na przykład:

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

Dno jest zdefiniowane jako sam dół klejnotu do najwyższej pary \/. Reszta jest górą. W powyższym przykładzie gdzie n = 1:

Bottom: \  /    Top:   __
         \/           /  \

Jak widać, spód jest wykonany z n + 1warstw \/z (1 * lines from the bottom) * 2odstępami pomiędzy nimi, z maksymalną liczbą nlinii od dołu klejnotu. Jeśli weźmiemy drugi klejnot ( n = 2), możemy zobaczyć, że:

 ____
/    \      
\    /  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 \/

Góra składa się z jednej pary /\z n*2odstępami pomiędzy nimi z n*2podkreślnikami na górze.

Zasady

  • Musi mieć możliwość przyjmowania niezerowych liczb całkowitych dodatnich jako danych wejściowych użytkownika
  • Musisz stworzyć klejnot ze specyfikacjami zdefiniowanymi powyżej (ponownie tutaj):
    • Góra składa się z jednej pary /\z n*2odstępami pomiędzy nimi z n*2podkreślnikami na górze.
    • Dno jest wykonane z n + 1warstw \/z (1 * lines from the bottom) * 2odstępami pomiędzy nimi, z maksimum nlinii od dołu klejnotu.
  • Końcowe znaki nowej linii po klejnocie lub końcowe spacje w każdej linii są dozwolone.
  • Niedozwolone są standardowe luki

Zwycięskie kryteria

Najmniej bajtów wygrywa!

Anthony Pham
źródło
4
Ściśle mówiąc „niezerowy pozytywny” jest zbędny - jeśli chcesz podać 0, musisz powiedzieć „nieujemny”.
Pozew funduszu Moniki z
Czy odpowiedź może być w PETSCII?
Shaun Bebbers
3
W miarę wzrostu liczby „klejnoty” zaczynają mniej przypominać klejnoty, a bardziej plastry pizzy, a może to tylko pora lunchu.
Marijn Stevering

Odpowiedzi:

27

Węgiel drzewny , 17 bajtów

Kod:

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

Wyjaśnienie:

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

Bardzo schludny komenda ‖M, która automatycznie lusterka /język \.

Wykorzystuje kodowanie węgla drzewnego .

Wypróbuj online!

Adnan
źródło
To polecenie lustrzane jest naprawdę fajne! Czy odzwierciedla także nawiasy i inne znaki? Czy istnieje sposób na obejście tego zachowania?
DJMcMayhem
2
@DJMcMayhem Tak i tak :)
Adnan
27
Lol, zrobiłeś diamenty z węgla drzewnego!
SteeveDroz
8

05AB1E , 27 20 bajtów

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

Wypróbuj online!

Wyjaśnienie

ƒ                      # 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
źródło
Haha, miło! Wierzę, że możesz się zmienić D„/\„\/‡na Â.
Adnan
@Adnan: Tak, właśnie zdałem sobie sprawę, że sam pracuję nad ulepszeniem: P
Emigna
8

Python 2, 101 98 95 bajtów

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

Wypróbuj online!

Anonimowa funkcja, która przyjmuje dodatnią liczbę całkowitą i zwraca ciąg znaków

Python 3.6, 92 bajty (Podziękowania dla Bena Frankela)

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

Nie mogłem znaleźć tłumacza online dla tej wersji, ale jest on nieco krótszy z powodu f-stringów w wersji v3.6

ćpun matematyki
źródło
Można zapisać trzy bajty w Pythonie 3.6: lambda n:f' {"__"*n}\n/{" "*n}\\\n'+'\n'.join(' '*i+'\\'+' '*(n-i)+'/'for i in range(n+1)). Korzystając z f-stringów.
Ben Frankel
Jestem całkiem pewien, że repl.it ma pakiet testowy dla Pythona 3
Anthony Pham
@AnthonyPham repl.it i TryItOnline używają Pythona 3.5, sprawdziłem
matematyka ćpun
W końcu! Zastanawiam się, co zajęło Pythonowi tak długo. Każdy język zasługuje na interpolację łańcuchów ...
Felix Dombek
7

PHP, 123 bajtów

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 bajtów pierwsza wersja

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";

Wypróbuj tutaj!

Jörg Hülsermann
źródło
Gdzie mogę tego spróbować?
Anthony Pham
@AnthonyPham Tutaj .
Adnan
Możesz zrobić to 119 bajtów: ideone.com/RPCVZe
Tschallacka
@Tschallacka, jeśli założę, że używam tylko systemu Linux
Jörg Hülsermann
Cóż, o ile nie edytujesz za pomocą notepad.exe, większość edytorów ma zakończenia linii linuksowej ... i.imgur.com/QZsmf4r.png konsola Windows z przyjemnością wyświetli \ n jako prawdziwą nową linię. Więc tak, możesz ogolić kilka bajtów swojej odpowiedzi.
Tschallacka
6

V , 28 27 26 bajtów

1 bajt zapisany dzięki @DJMcMayhem przy użyciu >zamiastÉ

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

<esc> jest 0x1b

Wypróbuj online!

Hexdump:

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

Wyjaśnienie

Top:

À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

Dolny:

Ù                      " 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
źródło
Niezła odpowiedź! Możesz zmienić, É<space>do >którego na końcu makra jest domyślnie wypełnione>>
DJMcMayhem
@DJMcMayhem Ładna sugestia! Więc >wcięcia o jedną spację zamiast o jedną tabulację?
Kritixi Lithos
Tak! To dlatego, że mam set expandtabiset shiftwidth=1
DJMcMayhem
5

Röda , 71 bajtów

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

Wypróbuj online!

fergusq
źródło
5

JavaScript (ES6), 80 bajtów

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
źródło
3

Python 3, 107 105 bajtów

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

Bierze int ze Stdina

KarlKastor
źródło
3

MATL , 34 bajty

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

Wypróbuj w MATL Online!

Wyjaśnienie

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
źródło
3

PowerShell , 76 , 74 bajty

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

Uwaga: przykład online zawiera trochę zawijania jako demonstrację. Umieść w funkcji lub skrypcie PoSH do wykonania.

Wypróbuj online!

Herbert Origas
źródło
Witamy w PPCG! Ładna pierwsza odpowiedź i miło widzieć kolejny PowerSheller! Możesz zapisać kilka bajtów, używając zmiennej zwiększającej w pętli - ' '*$i++zamiast ' '*($n-$_).
AdmBorkBork
3

C, 131 bajtów

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

Wypróbuj online!

Steadybox
źródło
Gdzie mogę to przetestować?
Anthony Pham
Dodano link @AnthonyPham Tio.
Steadybox
Ładne podejście wykorzystujące szerokość printf do wypełniania spacji. Możesz zapisać jeszcze 9 bajtów, jeśli utworzysz makro dla printf, usuń pierwsze i = 0 i dodaj nową zmienną j zamiast ponownej inicjalizacji i na 0 przy drugim uruchomieniu: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 Dzięki, ale wtedy funkcja wygeneruje poprawne wyjście tylko wtedy, gdy zostanie wywołana po raz pierwszy, a IIRC jest niezgodne z regułami tutaj. Funkcja powinna działać bez względu na to, ile razy zostanie wywołana.
Steadybox
@ Steadybox och, rozumiem, przepraszam za to. Czy dotyczy to wszystkich pytań o codegolf? Patrząc tylko na to konkretne pytanie, nie wydaje się, że chce wielu danych wejściowych.
Claudiu
2

Pyth, 44 bajtów

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

Spróbuj!

wyjaśnienie

Kod składa się z 3 części:

+" "*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
źródło
2

Python3, 104 bajty

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

Program pobiera liczbę całkowitą ze STDIN i zwraca klejnot do STDOUT.

Josh
źródło
2

Pip , 43 bajty

42 bajty kodu, +1 dla -nflagi.

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

Pobiera dane wejściowe jako argument wiersza polecenia. Wypróbuj online!

Wyjaśnienie

Konstruuje pierwsze dwie linie osobno, a następnie resztę klejnotu za pomocą operacji na mapie:

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)

Inne rozwiązanie

Również 42 + 1 bajtów, tym razem z -lflagą:

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

TIO

DLosc
źródło
2

Pyth, 38 bajtów

j[*yQ\_j*yQpd"/\\"jm+*\ dj*\ y-Qd"\/"h
Steven H.
źródło
2

C, 115 bajtów

#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));}

Wypróbuj online!

C, 123 bajty

Chociaż wyzwanie nie wymaga tego, kosztem 8 bajtów funkcja może zostać ponownie użyta (pierwsze rozwiązanie pozwala zaoszczędzić 8 bajtów, polegając na niejawnej inicjalizacji zmiennych globalnych).

#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));}

Wypróbuj online!

Itay Grudev
źródło
2

Partia, 152 bajty

@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

Testy:

n = 1
 __
/  \
\  /
 \/

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

n = 3
 ______
/      \
\      /
 \    /
  \  /
   \/
Neil
źródło
Potrzebuję zestawu testów, aby to przetestować.
Anthony Pham
2

C #, 187 bajtów

Jestem pewien, że istnieje bardziej kompaktowe rozwiązanie, ale to moja pierwsza próba:

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);

Wypróbuj online ..

James Robertson
źródło
Potrzebuję zestawu testów, aby to przetestować.
Anthony Pham
1

JavaScript (ES6), 93 bajty

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

Próbny

Arnauld
źródło
1

dc , 121 bajtów

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

Wypróbuj online!

R. Kap
źródło
1

Perl 5 109 94 + 1 (dla flagi -p) = 95 bajtów

Wypróbuj online!

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

Można uruchomić tak:

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

Nie golfił

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

Wyjaśnienie

#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
źródło
Będę potrzebował zestawu testów, aby to przetestować, ponieważ nie wszyscy rozumieją lub mają zdolność uruchamiania tego w sposób, w jaki napisałeś
Anthony Pham
@AnthonyPham Dodałem link Try It Online
CraigR8806