แกะสลักอัญมณี ASCII!


25

13 มีนาคมได้รับการยอมรับว่าเป็นวันอัญมณีแห่งชาติซึ่งเป็นหัวข้อหลักของการท้าทายนี้ ดังนั้นให้จำนวนเต็มnที่nมากกว่า 0 สร้างอัญมณี ASCII ตัวอย่างเช่น:

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

\/ด้านล่างมีการกำหนดเป็นด้านล่างสุดของอัญมณีที่จะคู่ที่สูงที่สุดของของ ส่วนที่เหลือคือด้านบน สำหรับตัวอย่างข้างต้นที่n = 1:

Bottom: \  /    Top:   __
         \/           /  \

ที่คุณสามารถดูด้านล่างทำจากn + 1ชั้น\/ที่มี(1 * lines from the bottom) * 2ช่องว่างในระหว่างที่มีสูงสุดของnสายจากด้านล่างของอัญมณีที่ หากเราใช้อัญมณีอันที่สอง ( n = 2) เราจะเห็นได้ว่า:

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

ด้านบนทำจากคู่หนึ่งของที่/\มีn*2ช่องว่างในระหว่างกับn*2ขีดล่างอยู่ด้านบน

กฎระเบียบ

  • ต้องสามารถใช้จำนวนเต็มบวกที่ไม่ใช่ศูนย์ใด ๆ ในฐานะอินพุตของผู้ใช้
  • ต้องสร้างอัญมณีที่มีรายละเอียดที่กำหนดไว้ด้านบน (ปรับปรุงใหม่ที่นี่):
    • ด้านบนทำจากคู่หนึ่งของที่/\มีn*2ช่องว่างในระหว่างกับn*2ขีดล่างอยู่ด้านบน
    • ด้านล่างทำจากn + 1ชั้น\/ที่มี(1 * lines from the bottom) * 2ช่องว่างในระหว่างที่มีสูงสุดของnสายจากด้านล่างของอัญมณีที่
  • การขึ้นบรรทัดใหม่ตามหลังอัญมณีหรือการเว้นวรรคต่อท้ายในแต่ละบรรทัดได้รับอนุญาต
  • ไม่อนุญาตช่องโหว่มาตรฐาน

เกณฑ์การชนะ

ไบต์ที่น้อยที่สุดชนะ!


4
การพูดอย่าง "ไม่ใช่ศูนย์บวก" นั้นซ้ำซ้อน - หากคุณต้องการรวม 0 คุณต้องพูดว่า "ไม่ติดลบ"
คดีของกองทุนโมนิกา

คำตอบสามารถเป็น PETSCII ได้หรือไม่
Shaun Bebbers

3
เมื่อจำนวนเพิ่มสูงขึ้น "อัญมณี" ก็เริ่มที่จะดูน้อยลงเช่นอัญมณีและอื่น ๆ เช่นชิ้นพิซซ่าหรืออาจเป็นเพียงการพูดคุยเวลาอาหารกลางวัน
Marijn Stevering

คำตอบ:


27

ถ่าน 17 ไบต์

รหัส:

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

คำอธิบาย:

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

อย่างมากคำสั่ง‖Mซึ่งโดยอัตโนมัติกระจกเข้าไป/\

ใช้ถ่านเข้ารหัส

ลองออนไลน์!


คำสั่งกระจกนั่นเจ๋งจริงๆ! มันเป็นตัวยึดกระจกและตัวละครอื่น ๆ ด้วยหรือไม่ และมีวิธีการแทนที่พฤติกรรมนั้นหรือไม่?
DJMcMayhem

2
@DJMcMayhem ใช่และใช่ :)
Adnan

27
ฮ่า ๆ คุณทำเพชรออกมาจากถ่าน!
SteeveDroz

8

05AB1E , 27 20 ไบต์

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

ลองออนไลน์!

คำอธิบาย

ƒ                      # 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

ฮ่าฮ่าดี! ผมเชื่อว่าคุณสามารถเปลี่ยนไปD„/\„\/‡ Â
Adnan

@Adnan: ใช่ฉันเพิ่งรู้ว่าตัวเองในขณะที่การปรับปรุง: P
Emigna

8

Python 2, 101 98 95 ไบต์

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

ลองออนไลน์!

ฟังก์ชันไม่ระบุชื่อที่รับจำนวนเต็มบวกและส่งคืนสตริง

Python 3.6, 92 ไบต์ (ขอบคุณ Ben Frankel)

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

ฉันไม่พบล่ามออนไลน์สำหรับรุ่นนี้ แต่สั้นกว่านี้เล็กน้อยเนื่องจาก f-strings ใน v3.6


คุณสามารถบันทึกสามไบต์ในหลาม lambda n:f' {"__"*n}\n/{" "*n}\\\n'+'\n'.join(' '*i+'\\'+' '*(n-i)+'/'for i in range(n+1))3.6: ใช้ประโยชน์จาก f-strings
Ben Frankel

ฉันค่อนข้างมั่นใจว่า repl.it มีชุดทดสอบสำหรับ Python 3
Anthony Pham

@AnthonyPham repl.it และ TryItOnline ใช้ Python 3.5 ทั้งคู่ฉันได้ตรวจสอบแล้ว
math junkie

โอ้โหในที่สุด! ฉันสงสัยว่า Python ใช้เวลานานขนาดไหน ทุกภาษาสมควรได้รับการแก้ไขสตริง ...
เฟลิกซ์ Dombek

7

PHP, 123 ไบต์

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 เวอร์ชั่นแรก

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

ลองที่นี่!


ฉันจะลองสิ่งนี้ได้ที่ไหน
Anthony Pham

@AnthonyPham นี่
Adnan

คุณสามารถทำได้ 119 ไบต์: ideone.com/RPCVZe
Tschallacka

@Tschallacka ถ้าฉันคิดว่าฉันใช้ Linux Sytem เท่านั้น
JörgHülsermann

ดีตราบใดที่คุณไม่แก้ไขด้วย notepad.exe ผู้แก้ไขส่วนใหญ่มีจุดสิ้นสุดบรรทัด linux ... i.imgur.com/QZsmf4r.pngคอนโซลหน้าต่างจะแสดง \ n เป็นบรรทัดใหม่อย่างมีความสุข ใช่แล้วคุณสามารถโกนคำตอบของคุณไม่กี่ไบต์
Tschallacka

6

V , 28 27 26 ไบต์

บันทึก 1 ไบต์ด้วย @DJMcMayhem โดยใช้>แทนÉ

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

<esc> คือ 0x1b

ลองออนไลน์!

hexdump:

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

คำอธิบาย

ด้านบน:

À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

ด้านล่าง:

Ù                      " 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 ò

คำตอบที่ดี! คุณสามารถเปลี่ยนได้ว่าÉ<space>จะให้>แมโครใดที่ส่วนท้ายของแมโคร>>
DJMcMayhem

@DJMcMayhem คำแนะนำที่ดี! ดังนั้น>ย่อหน้าหนึ่งช่องว่างแทนที่จะเป็นหนึ่งแท็บ?
Kritixi Lithos

อ้อ! นั่นเป็นสาเหตุที่ฉันมีset expandtabและset shiftwidth=1
DJMcMayhem



3

Python 3, 107 105 ไบต์

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

รับ int จาก Stdin


3

MATL , 34 ไบต์

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

ลองที่MATL Online!

คำอธิบาย

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

3

PowerShell , 76 , 74 ไบต์

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

หมายเหตุ: ตัวอย่างออนไลน์มีการตัดคำเล็กน้อยเพื่อสาธิต วางในฟังก์ชั่น PoSH หรือสคริปต์เพื่อดำเนินการ

ลองออนไลน์!


ยินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดีและดีใจที่ได้เห็น PowerSheller อีกรอบ! คุณสามารถบันทึกไบต์คู่โดยใช้ตัวแปรที่เพิ่มขึ้นในวง - แทน' '*$i++ ' '*($n-$_)
AdmBorkBork

3

C, 131 ไบต์

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

ลองออนไลน์!


ฉันจะทดสอบสิ่งนี้ได้ที่ไหน
Anthony Pham

เพิ่มลิงก์ @AnthonyPham Tio แล้ว
Steadybox

วิธีการที่ดีโดยใช้ความกว้างของ printf เพื่อเติมเต็มช่องว่าง คุณสามารถบันทึก 9 ไบต์ได้มากขึ้นถ้าคุณสร้างแมโครสำหรับ printf ลบ i = 0 ตัวแรกและเพิ่มตัวแปรใหม่ j แทนการเริ่มต้น i อีกครั้งเป็น 0 ในการรันครั้งที่สอง: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 ขอบคุณ แต่แล้วฟังก์ชั่นจะสร้างผลลัพธ์ที่ถูกต้องเฉพาะเมื่อมันถูกเรียกเป็นครั้งแรกและ IIRC นั้นผิดกฎที่นี่ ฟังก์ชั่นควรใช้งานได้ไม่ว่าจะเรียกว่ากี่ครั้งก็ตาม
Steadybox

@ Steadybox โอ้ฉันเห็นแล้วขอโทษด้วย สิ่งนี้ใช้ได้กับคำถาม codegolf ทั้งหมดหรือไม่ เมื่อมองไปที่คำถามเฉพาะนี้ดูเหมือนว่ามันจะไม่ต้องการหลายอินพุต
Claudiu

2

Pyth, 44 ไบต์

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

ลองมัน!

คำอธิบาย

รหัสประกอบด้วย 3 ส่วน

+" "*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)*" "+"/"

2

Python3, 104 ไบต์

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

โปรแกรมใช้จำนวนเต็มจาก STDIN และส่งคืนค่าอัญมณีเป็น STDOUT


2

Pip , 43 ไบต์

โค้ดขนาด 42 ไบต์ +1 สำหรับการ-nตั้งค่าสถานะ

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

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง ลองออนไลน์!

คำอธิบาย

สร้างสองบรรทัดแรกแยกกันจากนั้นส่วนที่เหลือของอัญมณีด้วยการใช้แผนที่:

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)

ทางออกอื่น

ด้วย 42 + 1 ไบต์เวลานี้มีการ-lตั้งค่าสถานะ:

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

TIO



2

C, 115 ไบต์

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

ลองออนไลน์!

C, 123 ไบต์

แม้ว่าความท้าทายไม่จำเป็นต้องใช้ค่าใช้จ่าย 8 ไบต์สามารถนำกลับมาใช้ฟังก์ชันใหม่ได้ (โซลูชันแรกช่วยประหยัด 8 ไบต์โดยอาศัยการกำหนดค่าเริ่มต้นโดยนัยของตัวแปรส่วนกลาง)

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

ลองออนไลน์!


2

แบตช์ 152 ไบต์

@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

แบบทดสอบ:

n = 1
 __
/  \
\  /
 \/

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

n = 3
 ______
/      \
\      /
 \    /
  \  /
   \/

ฉันจะต้องใช้ชุดทดสอบเพื่อทดสอบสิ่งนี้
Anthony Pham

2

C #, 187 ไบต์

ฉันแน่ใจว่ามีวิธีแก้ไขปัญหาที่กะทัดรัดกว่า แต่นี่เป็นความพยายามครั้งแรกของฉัน

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

ลองออนไลน์ ..


ฉันจะต้องใช้ชุดทดสอบเพื่อทดสอบสิ่งนี้
Anthony Pham

1

JavaScript (ES6), 93 ไบต์

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

การสาธิต



1

Perl 5 109 94 + 1 (สำหรับแฟล็ก -p) = 95 Bytes

ลองออนไลน์!

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

สามารถทำงานได้เช่น:

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

คำอธิบาย

#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

ฉันจะต้องมีชุดทดสอบเพื่อทดสอบสิ่งนี้เนื่องจากทุกคนไม่เข้าใจหรือมีความสามารถในการทำงานตามที่คุณได้กล่าวไว้
Anthony Pham

@AnthonyPham ฉันได้เพิ่มลิงค์ทดลองใช้งานออนไลน์
CraigR8806
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.