N 슬래브 경사 슬래시 케이크


23

양의 정수 N을 취하는 프로그램이나 함수를 작성하십시오.

N이 1이면 출력

/\
\/

N이 2 인 경우 출력

/\/\
\/ /
/ /
\/

N이 3 인 경우 출력

/\/\/\
\/ / /
/ / /
\/ /
/ /
\/

N이 4 인 경우 출력

/\/\/\/\
\/ / / /
/ / / /
\/ / /
/ / /
\/ /
/ /
\/

N이 클수록 패턴이 계속되고 N이 증가 할 때마다 새로운 레이어가 추가됩니다.

  • "출력"은 슬래시 패턴을 인쇄하거나 문자열로 반환하는 것을 의미합니다.
  • 출력에서 단일 후행 줄 바꿈이 허용됩니다.
  • 출력의 후행 공백은 허용되지만 선행 공백은 허용되지 않습니다.

바이트 단위의 가장 짧은 코드가 이깁니다.

답변:


10

Pyth, 25 바이트

j_+t.iJ*R"/ "SQ+L\\J*Q"/\

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

설명:

j_+t.iJ*R"/ "SQ+L\\J*Q"/\   implicit: Q = input number
             SQ             create the list [1, 2, ..., Q]
       *R"/ "               repeat "/ " accordingly to this numbers
      J                     assign this list of strings to J
               +L\\J        create a 2nd list, which contains the same strings
                            as in J, just with a "\" prepended
    .i                      interleave these two lists
   t                        remove the first element
                    *Q"/\   repeat the string "/\" Q times
  +                         append it to the list
 _                          reverse it
j                           print each string on a separate line

10

CJam, 32 30 29 28 바이트

ri_"/\ /"2/f*)@,\f>+_z..e>N*

여기에서 테스트하십시오.

나는 Reto가 그의 CJam 답변에 도움을 주려고 노력했지만 그의 것과 관련이없는 솔루션으로 끝났으므로 직접 게시 할 수도 있다고 생각했습니다.

설명

출력의 대칭을 사용합니다. 특히 출력이 조옮김과 동일하다는 사실.

먼저 첫 번째 N+1줄 을 생성 하지만 왼쪽 가장자리는 없습니다.

ri       e# Read input and convert to integer N.
_        e# Duplicate.
"/\ /"2/ e# Push an array with two strings: ["/\" " /"]
f*       e# Repeat each of the two strings N times. That gives the first two rows.
)        e# Detach the second row.
@,       e# Pull up the other copy of N and turn into range [0 1 ... N-1].
\f>      e# For each element i in that range, discard the first i characters of
         e# the second row.
+        e# Add all those lines back to the first row.

이제 다음 표를 나타내는 문자열 배열이 있습니다.

/\/\/\/\
 / / / /
/ / / /
 / / /
/ / /

그 조옮김은 다음과 같습니다.

/ / /
\/ / 
/ / /
\/ / 
/ / /
\/ /
/ /
\/

여기에는 공백이 아닌 문자가 모두 필요합니다. 이제 각 해당 문자 쌍을 최대로 사용하여 Dennis의 rad tip 을 사용하여 두 개의 ASCII 그리드를 하나로 결합 할 수 있습니다 . 두 그리드가 다른 모든 위치에서 하나는 공백을 갖거나 다른 하나는 우리가 찾고있는 특성을 갖습니다. 벡터화 된 연산의 한 목록이 다른 목록보다 길면 더 긴 목록의 추가 요소가 그대로 유지됩니다. 이것이 바로 우리가 찾는 것입니다. 다른 경우에는 공백이 아닌 문자는 항상 두 문자의 최대 값이됩니다.

_z   e# Duplicate the grid and transpose it.
..e> e# For each pair of characters in corresponding positions, pick the maximum.
N*   e# Join the lines by linefeed characters.

7

Japt , 46 44 41 40 바이트

Uo-U £Y?"\\/"sYv)+" /"pU-Y/2 :"/\\"pU} ·

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

언 골프와 설명

Uo-U mXYZ{Y?"\\/"sYv)+" /"pU-Y/2 :"/\\"pU} qR

프로그램의 핵심은 U * 2항목 목록을 만들고 각각을 패턴의 한 행에 매핑 한 다음 줄 바꿈과 결합합니다.

Uo-U    // Build an array of all integers in the range [-U, U).
mXYZ{   // Map each item X and index Y in this array with the following function.
 ...
} qR    // Join the resulting array with newlines.

패턴 자체는 다음과 같습니다.

/\/\/\/\

\/   / / /
/    / / /
\/   / /
/    / /
\/   /
/    /
\/

여기에서 볼 수 있듯이 이제는 세 가지 간단한 패턴으로 나뉩니다. 첫 번째 코드는이 코드로 생성 된 가장 쉬운 방법입니다.

Y? ... :  // If Y, the current index, is 0,
"/\\"pU   // return the pattern "/\" repeated U*2 times.

이제 왼쪽 절반입니다. 홀수 인덱스는로 매핑되어야 \/하고 심지어로 매핑해야하므로이 /코드를 사용합니다.

"\\/"s  // Otherwise, slice the pattern "\/" at 
Yv)     //  if Y is even, 1; otherwise, 0.

이것은 반쪽을 더 쉽게 만든다; 우리가해야 할 일은  /몇 번 반복 하는 것입니다 .

" /"p  // Repeat the pattern " /"
U-Y/2  //  floor(U - (Y/2)) times.

제안을 환영합니다!


5

GNU 세드, 59

점수는 '-nr'옵션에 +2를 포함합니다 sed.

s|1|/\\|gp
y|/\\| /|
s| |\\|p
:
s|\\(..)|\1|p
s|/ |\\|p
t

이 메타 답변에 따라 단항으로 입력하십시오 .

테스트 출력 :

$ sed -nrf slantcake.sed <<< 111
/\/\/\
\/ / /
/ / /
\/ /
/ /
\/
$ 

4

CJam, 36 35 34 바이트

ri_"/\\"*N@,W%{'\'/@" /"*+_N\N}/;;

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

추가 사항을 지적 해 주신 @NinjaBearMonkey에게 감사드립니다 ;.

이것은 상대적으로 우아하지 않지만 몇 가지 다른 옵션을 시도했지만 더 이상 짧지 않았습니다.

설명:

ri_     Get input, convert to integer, and copy.
"/\\"   Pattern for first line.
*N      Repeat N times, and add a newline.
@,      Rotate N to top, and create [0 .. N-1] sequence.
W%      Invert sequence to [N-1 .. 0].
{       Loop over counts, creating two lines for each.
  '\      Leading character for first in pair of lines. Rest will be the same
          for both lines.
  '/      First character for repeated part.
  @       Rotate count to top.
  " /"    Repetitive pattern.
  *       Replicate it by count.
  +       Concatenate with '/.
  _       Copy whole thing for use as second in pair of lines.
  N\      Put a newline between the pair of lines.
  N       Add a newline after second line.
}/      End of loop over counts.
;;      Created an extra line, get rid of it.

1
이제 마지막 ;s 중 하나만 제거하면 됩니다.
NinjaBearMonkey

또는 교체 ;;; +로;
GamrCorps

3

파이썬 2, 80 바이트

n=input()
print"/\\"*n
for i in range(n*2,1,-1):print"\\"*(1-i%2)+"/ "*(i/2+i%2)


2

자바-141 바이트

물론 가장 짧은 것은 아니지만 Java 솔루션을 사용하는 것이 좋습니다.

String a(int a){String s="";int b=-1,c,e;for(a*=2;++b<a;){for(c=-1;++c<a;)s+=(e=b+c)>a?" ":e%2==0?"/":b==0||c==0?"\\":" ";s+="\n";}return s;}

언 골프

String a(int a){
    String s ="";
    int b=-1,c,e;
    for (a*=2;++b < a;){
        for (c = -1 ; ++c < a ;)
            s+= (e=b+c)>a?" ": e%2==0? "/" : b==0||c==0? "\\" : " ";
        s+="\n";
    }
    return s;
}

입력

System.out.println(a(5));

산출

/\/\/\/\/\
\/ / / / /
/ / / / / 
\/ / / /  
/ / / /   
\/ / /    
/ / /     
\/ /      
/ /       
\/    


1

자바 스크립트, 128 125 123 114 바이트

n=>{r='';for(i=0;i<n;i++)r+='/\\';for(j=0;j<2*n-1;j++){r+='\n'+(j%2?'':'\\');for(i=n-j/2;i>0;i--)r+='/ '}return r}

골프 골프 (또한 ES5로 변환) + 데모 ​​:

function c(n) {
    r = '';
    for (i = 0; i < n; i++) r += '/\\';
    for (j = 0; j < 2 * n - 1; j++) {
        r += '\n' + (j % 2 ? '' : '\\');
        for (i = n - j / 2; i > 0; i--) r += '/ '
    }
    return r
}

alert(c(prompt()));


1

루비, 50 바이트

->n{s='/\\'*n
n.times{|i|puts s,?\\+s='/ '*(n-i)}}

테스트 프로그램에서 :

f=->n{s='/\\'*n
n.times{|i|puts s,?\\+s='/ '*(n-i)}}
f[gets.to_i]

루프는 i = 0에서 i = n-1까지 반복 할 때마다 2 개의 행을 인쇄합니다.

두 번째 행은 항상 '\'ni 발생률로 이어집니다 '/ '.

첫 번째 행은 이전 반복의 두 번째 행과 동일하지만 '\'누락되었습니다 s. 따라서 이전 반복의 두 번째 행을 인쇄 할 때이 값을 저장합니다 .

유일한 예외는 반복 0이며로 초기화 s하면 처리됩니다 '/\'*n.


1

자바 (ES6) 107 104 100 98 97 91 90 바이트

p=>{s=`/\\`.repeat(p++)+`
`;for(i=p;i>2;s+='\\'+o+o)o=`/ `.repeat(--i)+`
`;return s+'\\/'}

첫 번째 게시물!

사용 했지만 지금은 Ruby와 비슷합니다 .Array(len).join(str) String.repeat(len)operator*(str,len)

언 골프 드 :

len => {
    var str = `/\\`.repeat(len++) + '\n';

    for (var i = len, mid; i > 2; str += '\\' + mid + mid) {
        mid = `/ `.repeat(--i) + '\n';
    }

    return str + '\\/';
}


덕분에 :
107 => 104 바이트 : @insertusernamehere
97 => 90 바이트 : @ user81655


1
당신은 절약 할 수 있습니다 3 바이트 : p=>{s=Array(++p).join('/\\')+'\n';for(i=p;i>2;i--,s+='\\'+o+o)o=Array(i).join('/ ')+'\n';return s+'\\/'}.
insertusername 여기

답변이 너무 비슷하지만 답변이 삭제되었으므로 답변을 삭제했습니다.
user81655

@ user81655 아, 죄송합니다. repeat방법 을 보여 주셔서 감사합니다 .
usandfriends 2016

1

파이썬 2, 66 바이트

n=input();b=1
print'/\\'*n
while~-n+b:print'\\'*b+'/ '*n;b^=1;n-=b

꽤 직설적 인. 값 n의 수입니다 /라인에, 그리고 b라인이 시작 여부를 말한다 \. 값은 b0과 1 사이 에서 번갈아 가며 n매 초마다 감소합니다. 때 못생긴 종료 조건이 중지됩니다 n=1, b=0. exec루프 의 대안은에 대한 많은 이스케이프가 필요한 문제가 있습니다 "'\\\\'".

이 방법이 단일 숫자를 사용하는 것보다 짧다는 것을 알고 놀랐습니다 k=2*n+b. 이것은 68 바이트입니다.

k=2*input()+1
print k/2*"/\\"
while k>2:print k%2*'\\'+k/2*'/ ';k-=1

대안 전략은 외형을 따로 피할 수 print있지만 간결한 방법은 보지 못했습니다.


1

Minkolang 0.14 , 46 바이트

나는 이것이 골프를 칠 수 있다고 확신하지만, 여기 4시에 있습니다.

n$z"/\"z$D$OlOz[" /"zi-$Dlr$d"\"zi1+-3&5$X$O].

여기에서 시도하십시오.

설명

n$z               Take number from input (n) and store it in the register (z)
   "/\"           Push these characters (in reverse)
       z$D        Push register value and duplicate the whole stack that many times
          $O      Output whole stack as characters
            lO    Output newline

z                                   Push n from register
 [                                  Open for loop that repeats n times
  " /"                              Push these characters (in reverse)
      zi-                           n - loop counter
         $D                         Pop k and duplicate whole stack k times
           l                        Push 10 (for newline)
            r                       Reverse stack
             $d                     Duplicate whole stack
               "\"                  Push this character
                  zi1+-             0 if n = loop counter + 1, truthy otherwise
                       3&           Do the next three characters if top of stack is 0
                         5$X        Dump the bottom-most five items of the stack
                            $O      Output whole stack as characters
                              ].    Close for loop and stop

1

배치, 121 바이트

@echo off
set/an=%1-1
if %1==1 (echo /\%2) else call %0 %n% /\%2
set a=/\%2
echo \%a:\= %
if not \%2==\ echo %a:\= %

또는 단항이 허용되는 경우 107 바이트 :

@echo off
set a=%1
echo %a:1=/\%
:a
echo \%a:1=/ %
set a=%a:~1%
if not %a%1==1 echo / %a:1=/ %&goto a

적절한 수의 1로 호출하십시오.


0

Matlab, 122 바이트

M=2*input('');
z=zeros(M);[y,x]=ndgrid(1:M);
z(~mod(x+y,2)&x+y<M+3)=1;v=2-mod(1:M,2);
z(1,:)=v;z(:,1)=v;disp([15*z.^2+32,''])

0

하스켈, 99 바이트

길이가 같은 두 가지 솔루션.

전화하십시오 f.

f n=mapM_ putStrLn$[[x?y|x<-[0..2*n-y-0^y]]|y<-[0..2*n-1]]
x?y|mod(x+y)2==0='/'|x*y==0='\\'|0<1=' '

f n=mapM_ putStrLn$[[x?y|x<-[y..2*n-0^y]]|y<-[0..2*n-1]]
x?y|mod x 2==0='/'|mod y x==0='\\'|0<1=' '

0

하스켈, 96

f=g.(*2)
g m=unlines$t m(c"/\\"):[t n l|(n,l)<-zip[m,m-1..2]$c['\\':p,p]]
p=c"/ "
c=cycle
t=take

문자열을 인쇄하는 대신 반환하여 5자를 절약하기 때문에 기존 Haskell 솔루션 과 실제로 경쟁이되지 않습니다 . 무한 패턴 접근법이 좌표 기반 접근법과 어떻게 비교되는지 보여주기 위해 게시하고 있습니다. 노트:

  • p 길이의 변화없이 인라인 될 수 있습니다.
  • [t n l|(n,l)<-...]2 이상을 저장합니다 (map(uncurry t)$...).

0

실론, 100

String s(Integer n)=>"\n".join{"/\\".repeat(n),for(i in 2*n+1..3)"\\".repeat(i%2)+"/ ".repeat(i/2)};

여기에는 join(명명 된 인수는 없지만 반복 가능한 이해도없이) "명명 된 인수 목록" 과 여러 용도 String.repeat(실제로는 "홀수에만 포함"을 의미 함 i)가 있습니다.

형식화 :

String s(Integer n) =>
        "\n".join{
            "/\\".repeat(n),
            for (i in 2*n + 1 .. 3)
                "\\".repeat(i % 2)
                        + "/ ".repeat(i / 2)
        };

0

PHP, 117 바이트

<?$n=$argv[1];$r=str_repeat;echo$r("/\\",$n);for(;$i++<$n*2-1;)echo"\n".($i%2?"\\":'').$r("/ ",$n-floor(($i-1)/2));?>

통지를 끄고 명령 행에서 입력을받는다고 가정합니다.

언 골프 드 :

<?php
error_reporting(E_ALL & ~E_NOTICE);

$n = $argv[1];
$r='str_repeat';
echo $r("/\\",$n);
for(;$i++<$n*2-1;){
    echo"\n".(($i%2)?"\\":'') . $r("/ ",$n-floor(($i-1)/2));
}
?>

의견 환영합니다 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.