Ukir beberapa perhiasan ASCII!

25

13 Maret diakui sebagai Hari Permata Nasional , yang merupakan tema tantangan ini. Jadi, diberi bilangan bulat di nmana nlebih besar dari 0, buat permata ASCII. Sebagai contoh:

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

Bagian bawah didefinisikan sebagai bagian paling bawah dari permata untuk pasangan tertinggi \/. Sisanya adalah bagian atas. Untuk contoh di atas di mana n = 1:

Bottom: \  /    Top:   __
         \/           /  \

Seperti yang Anda lihat, bagian bawah terbuat dari n + 1lapisan \/dengan (1 * lines from the bottom) * 2ruang di antaranya dengan garis maksimum ndari bagian bawah permata. Jika kita mengambil permata kedua ( n = 2), kita dapat melihat bahwa:

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

Bagian atas terbuat dari sepasang /\dengan n*2ruang di antaranya dengan n*2garis bawah di atasnya.

Aturan

  • Harus dapat menerima bilangan bulat positif bukan nol sebagai input pengguna
  • Harus membuat permata dengan spesifikasi yang ditentukan di atas (disajikan kembali di sini):
    • Bagian atas terbuat dari sepasang /\dengan n*2ruang di antaranya dengan n*2garis bawah di atasnya.
    • Bagian bawah terbuat dari n + 1lapisan \/dengan (1 * lines from the bottom) * 2ruang di antaranya dengan garis maksimum ndari bagian bawah permata.
  • Mengejar baris baru setelah permata, atau spasi tambahan di setiap baris diizinkan.
  • Tidak ada celah standar yang diizinkan

Kriteria Menang

Bytes terkecil menang!

Anthony Pham
sumber
4
Sebenarnya "bukan nol positif" berlebihan - jika Anda ingin memasukkan 0, Anda harus mengatakan "tidak negatif".
Dana Gugatan Monica
Bisakah jawabannya di PETSCII?
Shaun Bebbers
3
Ketika angkanya semakin tinggi, "perhiasan" mulai terlihat kurang seperti perhiasan dan lebih seperti irisan pizza, atau mungkin itu hanya waktu makan siang berbicara.
Marijn Stevering

Jawaban:

27

Arang , 17 byte

Kode:

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

Penjelasan:

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

Sebuah sangat rapi perintah ‖M, yang juga secara otomatis cermin /ke dalam \.

Menggunakan pengkodean Arang .

Cobalah online!

Adnan
sumber
Perintah cermin itu sangat keren! Apakah itu mencerminkan tanda kurung dan karakter lain juga? Dan adakah cara untuk mengesampingkan perilaku itu?
DJMcMayhem
2
@DJMcMayhem Ya dan ya :)
Adnan
27
Lol, kau membuat berlian dari arang!
SteeveDroz
8

05AB1E , 27 20 byte

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

Cobalah online!

Penjelasan

ƒ                      # 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
sumber
Haha bagus! Saya yakin Anda bisa berubah D„/\„\/‡menjadi Â.
Adnan
@ Adnan: Ya, saya baru sadar bahwa saya sendiri sedang mengerjakan perbaikan: P
Emigna
8

Python 2, 101 98 95 byte

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

Cobalah secara Online!

Fungsi anonim yang mengambil bilangan bulat positif dan mengembalikan string

Python 3.6, 92 byte (Terima kasih kepada Ben Frankel)

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

Saya tidak dapat menemukan juru bahasa online untuk versi ini, tetapi ini sedikit lebih pendek karena f-string di v3.6

pecandu matematika
sumber
Anda dapat menyimpan tiga byte dengan Python 3.6: lambda n:f' {"__"*n}\n/{" "*n}\\\n'+'\n'.join(' '*i+'\\'+' '*(n-i)+'/'for i in range(n+1)). Memanfaatkan f-string.
Ben Frankel
Saya cukup yakin repl.it memiliki test suite untuk Python 3
Anthony Pham
@AnthonyPham repl.it dan TryItOnline sama-sama menggunakan Python 3.5, saya sudah memeriksa
math junkie
Wah, akhirnya! Saya bertanya-tanya apa yang memakan Python begitu lama. Setiap bahasa berhak mendapatkan interpolasi string ...
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 versi pertama

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

Coba di sini!

Jörg Hülsermann
sumber
Di mana saya bisa mencoba ini?
Anthony Pham
@AnthonyPham Di Sini .
Adnan
Anda dapat membuat 119 byte: ideone.com/RPCVZe
Tschallacka
@ Schallacka jika saya berasumsi bahwa saya hanya menggunakan Linux Sytem
Jörg Hülsermann
Nah, selama Anda tidak mengedit dengan notepad.exe, sebagian besar editor memiliki akhiran garis linux ... i.imgur.com/QZsmf4r.png konsol windows akan dengan senang hati menampilkan \ n sebagai baris baru. Jadi ya, Anda dapat mencukur beberapa byte jawaban Anda.
Tschallacka
6

V , 28 27 26 byte

1 byte disimpan berkat @DJMcMayhem dengan menggunakan >alih-alihÉ

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

<esc> aku s 0x1b

Cobalah online!

Hexdump:

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

Penjelasan

Teratas:

À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

Bawah:

Ù                      " 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
sumber
Jawaban bagus! Anda dapat mengubah É<space>ke >yang pada akhir makro secara implisit diisi ke>>
DJMcMayhem
@DJMcMayhem Saran yang bagus! Jadi >indentasi satu spasi bukan dengan satu tab?
Kritixi Lithos
Ya! Itu sebabnya saya punya set expandtabdanset shiftwidth=1
DJMcMayhem
5

Röda , 71 byte

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

Cobalah online!

fergusq
sumber
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
sumber
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")

Mengambil int dari Stdin

KarlKastor
sumber
3

MATL , 34 byte

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

Cobalah di MATL Online!

Penjelasan

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
sumber
3

PowerShell , 76 , 74 byte

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

Catatan: contoh online berisi sedikit pembungkus sebagai demonstrasi. Tempatkan dalam fungsi atau skrip PoSH untuk dijalankan.

Cobalah online!

Herbert Origas
sumber
Selamat datang di PPCG! Jawaban pertama yang bagus, dan senang melihat PowerSheller lain di sekitar! Anda dapat menyimpan beberapa byte dengan menggunakan variabel yang bertambah dalam loop - ' '*$i++alih - alih ' '*($n-$_).
AdmBorkBork
3

C, 131 byte

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

Cobalah online!

Steadybox
sumber
Di mana saya bisa menguji ini?
Anthony Pham
Tautan @AnthonyPham Tio ditambahkan.
Steadybox
Pendekatan yang bagus menggunakan lebar printf untuk mengisi spasi. Anda dapat menyimpan 9 byte lebih banyak jika Anda membuat makro untuk printf, hapus i = 0 pertama dan tambahkan variabel j baru alih-alih inisialisasi ulang i ke 0 pada run kedua: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 Terima kasih, tetapi kemudian fungsi akan menghasilkan output yang benar hanya ketika dipanggil untuk pertama kalinya, dan IIRC itu melanggar aturan di sini. Fungsi ini harus berfungsi tidak peduli berapa kali dipanggil.
Steadybox
@Steadybox oh saya mengerti, maaf untuk itu. Apakah ini berlaku untuk semua pertanyaan codegolf? Melihat hanya pada pertanyaan spesifik ini, sepertinya ia tidak menginginkan banyak input.
Claudiu
2

Pyth, 44 Bytes

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

Cobalah!

penjelasan

Kode ini terdiri dari 3 bagian:

+" "*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
sumber
2

Python3, 104 byte

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

Program ini mengambil integer dari STDIN dan mengembalikan permata ke STDOUT.

Josh
sumber
2

Pip , 43 byte

42 byte kode, +1 untuk -nbendera.

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

Mengambil input sebagai argumen baris perintah. Cobalah online!

Penjelasan

Buat dua garis pertama secara terpisah, lalu sisa permata dengan operasi peta:

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)

Solusi lain

Juga 42 +1 byte, kali ini dengan -lbendera:

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

TIO

DLosc
sumber
2

Pyth, 38 byte

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

C, 115 byte

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

Cobalah online!

C, 123 byte

Meskipun tantangan tidak memerlukannya, dengan mengorbankan 8 byte fungsi dapat dibuat kembali (solusi pertama menghemat 8 byte dengan mengandalkan inisialisasi implisit variabel global).

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

Cobalah online!

Itay Grudev
sumber
2

Batch, 152 byte

@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

Tes:

n = 1
 __
/  \
\  /
 \/

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

n = 3
 ______
/      \
\      /
 \    /
  \  /
   \/
Neil
sumber
Saya akan membutuhkan test suite untuk menguji ini.
Anthony Pham
2

C #, 187 byte

Saya yakin ada solusi yang lebih kompak di luar sana tetapi ini adalah upaya pertama saya:

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

Cobalah online ..

James Robertson
sumber
Saya akan membutuhkan test suite untuk menguji ini.
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
sumber
1

dc , 121 byte

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

Cobalah online!

R. Kap
sumber
1

Perl 5 109 94 + 1 (untuk flag -p) = 95 Bytes

Cobalah secara Online!

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

Dapat dijalankan seperti ini:

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

Tidak disatukan

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

Penjelasan

#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
sumber
Saya akan membutuhkan test suite untuk menguji ini karena tidak semua orang cukup mengerti atau memiliki kemampuan untuk menjalankan ini seperti yang Anda nyatakan
Anthony Pham
@AnthonyPham Saya menambahkan tautan Try It Online
CraigR8806