ASCII 보석을 개척하십시오!


25

3 월 13 일은 이 도전의 주제 인 National Jewel Day 로 인정 받고 있습니다. 따라서 0보다 큰 정수 n가 주어지면 nASCII 보석을 만듭니다. 예를 들면 다음과 같습니다.

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

바닥은 보석의 가장 아래에있는 가장 높은 쌍으로 정의됩니다 \/. 나머지는 최고입니다. 여기서, 상기 한 예를 들어 n = 1:

Bottom: \  /    Top:   __
         \/           /  \

보시다시피, 바닥은 보석 바닥에서 최대 줄 사이에 공간이있는 n + 1레이어로 구성 \/됩니다 . 두 번째 보석 ( )을 가져 가면 다음 을 볼 수 있습니다.(1 * lines from the bottom) * 2nn = 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*2n*2

규칙

  • 사용자 입력으로 0이 아닌 양의 정수를 사용할 수 있어야합니다.
  • 위에 정의 된 사양으로 보석을 만들어야합니다 (여기서 설명).
    • 상단은 밑줄과 맨 위에 공백이있는 한 쌍으로 구성 /\됩니다 .n*2n*2
    • 바닥은 보석 바닥에서 최대 줄 사이에 공간이있는 n + 1층으로 구성 \/됩니다 .(1 * lines from the bottom) * 2n
  • 보석 다음의 후행 줄 바꿈 또는 각 줄의 후행 공백이 허용됩니다.
  • 표준 허점은 허용되지 않습니다

승리 기준

최소 바이트가 이깁니다!


4
엄밀히 말하면 "0이 아닌 양수"는 중복됩니다. 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

파이썬 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))

이 버전의 온라인 인터프리터를 찾을 수 없지만 v3.6의 f- 문자열로 인해 약간 짧습니다.


Python 3.6에서는 3 바이트를 저장할 수 있습니다 lambda n:f' {"__"*n}\n/{" "*n}\\\n'+'\n'.join(' '*i+'\\'+' '*(n-i)+'/'for i in range(n+1)). F- 스트링 활용하기.
벤 프랭클

repl.it에는 Python 3 용 테스트 스위트가 있다고 확신합니다.
Anthony Pham

@AnthonyPham의 repl.it 및 TryItOnline 사용 모두 파이썬 3.5, 내가 확인 한
수학 마약 중독자

우와, 마침내! 파이썬이 왜 그렇게 오래 걸 렸는지 궁금합니다. 모든 언어는 ... 문자열 보간을받을 권리
펠릭스 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 바이트 첫 번째 버전

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

notepad.exe로 편집하지 않는 한 대부분의 편집기에는 Linux 줄 끝이 있습니다 ... i.imgur.com/QZsmf4r.png Windows 콘솔은 \ n을 실제 줄 바꿈으로 표시합니다. 따라서 몇 바이트의 답을 면도 할 수 있습니다.
Tschallacka

6

V , 28 27 26 바이트

@DJMcMayhem 덕분에 >대신에 1 바이트를 절약했습니다.É

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

<esc> 이다 0x1b

온라인으로 사용해보십시오!

16 진 덤프 :

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


5

자바 스크립트 (ES6), 80 바이트

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>


3

파이썬 3, 107105 바이트

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

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의 너비를 사용하는 멋진 접근 방식. printf에 대한 매크로를 생성하고 두 번째 실행에서 i를 0으로 다시 초기화하는 대신 첫 번째 i = 0을 제거하고 새 변수 j를 추가하면 9 바이트를 더 절약 할 수 있습니다.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

피 이스, 44 바이트

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

시도 해봐!

설명

코드는 세 부분으로 구성됩니다.

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

, 43 바이트

42 바이트의 코드, -n플래그의 경우 +1

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)

다른 해결책

또한 -l플래그 와 함께 42 + 1 바이트 :

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 5109 94 + 1 (플래그 -p의 경우) = 95 바이트

온라인으로 사용해보십시오!

$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

언 골프

$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.