캥거루를 뛰어 넘다


36

뒷이야기

면책 조항 : 캥거루에 대한 정보를 포함 할 수 있습니다.

캥거루는 여러 단계의 개발을 거칩니다. 나이가 들수록 강해지면서 점점 더 높이 올라갈 수 있으며 배가 고파지기 전에 더 많은 시간을 뛰어 넘을 수 있습니다.

1 단계 에서 캥거루는 매우 작으며 전혀 점프 할 수 없습니다. 그럼에도 불구하고 지속적으로 영양분이 필요합니다. 우리는 이와 같은 1 단계 캥거루의 활동 패턴을 나타낼 수 있습니다 .

o

2 단계 에서 캥거루는 작은 점프를 할 수 있지만 배가 고파지기 전에 2 를 넘지 않아야 합니다. 우리는 이와 같은 2 단계 캥거루의 활동 패턴을 나타낼 수 있습니다 .

 o o
o o o

2 단계 후 캥거루가 빠르게 향상됩니다. 이후의 각 단계에서 캥거루는 조금 더 높이 (그래픽 표시에서 1 단위) 및 두 배로 점프 할 수 있습니다. 예를 들어 3 단계 캥거루의 활동 패턴은 다음과 같습니다.

  o   o   o   o
 o o o o o o o o
o   o   o   o   o

단계 n의 경우, 활동 패턴은 높이 n2 n-1 V 모양 점프 로 구성됩니다 .

예를 들어, 스테이지 4 , 거기에 팔이 높이 점프 4 .

   o     o     o     o     o     o     o     o
  o o   o o   o o   o o   o o   o o   o o   o o
 o   o o   o o   o o   o o   o o   o o   o o   o
o     o     o     o     o     o     o     o     o

태스크

양의 정수 n 을 입력으로 사용하고 스테이지 n 캥거루의 활동 패턴의 ASCII 아트 표현을 인쇄하거나 반환 하는 전체 프로그램 또는 함수를 작성하십시오 .

패턴이 위에 표시된대로 정확하게 보이는 한 주변 공백 및 ANSI 이스케이프 코드가 허용됩니다.

출력을 반환하는 함수를 선택하면 인쇄시 올바른 출력을 표시하는 단일 문자열 또는 문자 배열을 반환해야합니다. 문자열 배열을 반환하는 것은 허용되지 않습니다.

o액티비티 패턴 내에서 그리고 답변의 모든 패턴에서 일관성이 있는 한 인쇄 가능한 공백이 아닌 문자를 대신 사용할 수 있습니다 .

이것은 . 바이트 단위의 최단 답변이 이길 수 있습니다!


설명이 필요합니다. 당신은 당신이 나타내는 어떤 문자를 사용할 수 있다고 말했다 o. 공백을 나타내는 데 문자를 사용할 수 있습니까 (문자가 다른 한)?
Kodos Johnson

1
공백은 비워 두어야합니다. 실제 공백을 사용하거나 제어 코드를 사용하여 커서를 움직일 수 있지만 인쇄 가능한 공백이 아닌 문자는 사용할 수 없습니다.
데니스

답변:


8

05AB1E , 12 10 바이트

Îj¹FÐvû},À

설명:

Î              # Push zero and input
 j             # Prepend input - 1 spaces
  ¹F           # Input times do..
    Ð          #   Triplicate the string
     v }       #   Length times do..
      û        #     Palindromize
        ,      #   Pop and print with a newline
         À     #   Rotate the string on to the right

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오!


1
지퍼보다 재미 있고 똑똑합니다.
Magic Octopus Urn

14

MATLAB, 92 90 86 84 바이트

n=input('');p=eye(n)+32;A=repmat([fliplr(p),p,''],1,2^n/2);A(:,n+1:n:end)=[];disp(A)

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

eye항등 행렬을 만듭니다. 우리가 뒤집어서 원래의 [fliplr(p),p]것을 연결하면 (for n=3)를 얻습니다 .

0 0 1 1 0 0
0 1 0 0 1 0
1 0 0 0 0 1

함께 repmat(...,1,2^n/2)우리는이 반복 2^(n-1)시간을 얻을

0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0
0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 ...
1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1

이것으로 우리는 불필요한 열을 삭제합니다. A(:,n+1:n:end)=[];


8
20k 축하합니다 !!
Luis Mendo

감사합니다. 확인 관 !
flawr

9

, 14 바이트

NλP^×λoF⁻λ¹‖O→

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

설명

Nλ에 정수를 입력합니다 λ. ( 와의 문자열 곱셈 P^)의 다 방향 인쇄 (SE 및 SW)입니다 . 그런 다음 for 루프 시간을 실행 하여 전체를 겹치게 오른쪽에 반영합니다.×λoλoF⁻λ¹λ - 1‖O→


" P^는 다 방향 인쇄 (SE 및 SW)입니다. "쿨, 그것은 당신이 프로그래밍 언어에서 자주 볼 수없는 것입니다!
Kevin Cruijssen


7

파이썬 2 , 87 바이트

n=input()
for i in range(n):print''.join(' o'[abs(j%(2*n)-n)==i]for j in range(1,n<<n))

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

(i,j)원이 포함 된 좌표에 수식을 사용한 다음 격자를 결합하고 인쇄합니다. 여기 ''.join에 두 개의 중첩 된 범위에 for걸쳐 많은 골프 냄새 exec가 있으므로 개선 될 가능성이 있습니다.


7

파이썬 2, 83 81 바이트

n=input()
i=0
exec"s=' '*n+'o'+' '*i;i+=1;print(s[i:-1]+s[:i:-1])*2**~-n+s[i];"*n

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


3
PPCG에 오신 것을 환영합니다! 좋은 첫 포스트!
Rɪᴋᴇʀ

3
그것은 일종의 과소 평가입니다. 파이썬에서 outgolfing xnor는 작은 위업이 아닙니다. 개선의 여지가 있습니다. while 루프는 바이트를 저장해야 하며 exec트릭 은 몇 가지를 더 저장할 수 있습니다.
Dennis

5

베 펀지, 98 91 바이트

이것은 사용 ,의 자리에 o그 바이트의 몇 가지를 저장하는 우리를 할 수 있기 때문에.

&::1>\1-:v
+\:v^*2\<_$\1-2*::!+00p*1
:-1_@v0\-g01:%g00:-1<:\p01
 ,:^ >0g10g--*!3g,:#^_$\55+

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

설명

스테이지 번호 n이 주어지면 패턴의 다음 세 가지 매개 변수를 계산하여 시작합니다.

jump_count = 2 ^ (n - 1)
jump_len   = (n - 1) * 2
width      = (jump_len * jump_count) + 1

jump_len는 그것이 1 단계 캥거루 대해 0을 피하기 위해 정규화된다 :

jump_len += !jumplen    

그런 다음 출력 영역 의 xy 좌표를 반복하고 각 위치에 대해 출력 할 적절한 문자를 계산 하여 점프 패턴을 출력 할 수 있습니다. Y는 행 카운트 다운 좌표 N - 1을 0으로하고, X는 로 카운트 다운을 조정 1 - 0으로 우리 도트 요구는 다음 식으로 표시 할 것인지 여부를 결정 :

jump_off = x % jump_len
show_dot = (jump_off == y) or (jump_off == (jump_len-y))

show_dot의 부울 각 위치에서의 실제 출력 특성을 결정하는 테이블 인덱스로서 사용된다. 공간을 절약하기 위해 마지막 소스 행의 시작을 해당 테이블로 사용하므로 o캐릭터가로 끝나게됩니다 ,.


5

J , 28 25 바이트

' o'{~]_&(](|.,}.)"1)=@i.

@ Conor O'Brien 덕분에 3 바이트를 절약했습니다 .

이것은 @muddyfish의 솔루션 에서 회문 트릭을 기반으로합니다 .

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

설명

' o'{~]_&(](|.,}.)"1)=@i.  Input: integer n
                       i.  Form the range [0, 1, ..., n-1]
                     =@    Equality table with itself.
                           Creates an identity matrix of order n
      ]                    Get n
       _&(          )      Repeat n times on x = identity matrix
           (     )"1         For each row
            |.                 Make a reversed copy
               }.              Get a copy with the head removed
              ,                Append them
          ]                  Use that as the new value of x
' o'{~                     Index into the char array

31 바이트에 대한 대체 접근법 : ' o'{~3 :'(}."1,.~|."1)^:y=i.y'. 나는 그 명백한 동사를 제거하는 방법을 찾을 수 있으면 좋겠다 ... Darn ^:.
Conor O'Brien

ConorO'Brien 감사 @, 도움을 않는, 나는 그것이 짧아집니다 생각한다면 암묵적인
마일

@ ConorO'Brien 나는 그것을 암묵적으로 만들었습니다. 실제로 짧습니다!
마일

대박! 이것은 굉장합니다. 나는 u&v--quite nice 의 dyadic 사용법을 잊어 버렸습니다.
코너 오브라이언


4

하스켈 , 100 바이트

k 1="o"
k n|n<-n-1,m<-n*2=unlines[[last$' ':['o'|mod c m`elem`[m-r,r]]|c<-[0..m*2^n]]|r<-[n,n-1..0]]

온라인으로 사용해보십시오! 사용법 : k 3.

설명:

행을 감안할 때 r, 열 cm = 2(n-1)o경우 설정 c mod m동등 r하거나 m-r. 최 지능형리스트의 설정 범위 r에서 n-10의 다음의 한 세트의 범위 c에서 0행을 m*2^(n-1)상기 내측은 복귀 조건 역할을 'o'상기 식을 충족하고있는 경우 ' ', 그렇지. 이렇게하면 문자열 목록이로 줄 바꿈으로 구분 된 단일 문자열로 바뀝니다 unlines. 내용 n=1이 경우는 첫 번째 라인에 명시 적으로 처리하도록 기능, 0으로 나누기 오류를 생성한다.


나는 ['o'|mod c m`elem`[m-r,r]]부분을 정말로 좋아한다 !
flawr

4

C #, 180, 173 171 바이트

다른 C # 참가자에게 이길 수있는 것으로 게시하여 이기지 못합니다.

n=>{var s=new string[n];for(int a=-1,j=0,i,m=n-1,x=m;j<=m*(Math.Pow(2,n)*n+1);){i=j++%n;s[i]+=x==i?"o":"_";if(i==m&n>1){x+=a;a*=x%m==0?-1:1;}}return string.Join("\n",s);};

완전한 프로그램 :

using System;
public class P
{
    public static void Main()
    {
        Func<int, string> _ = n =>
        {
            var s = new string[n];
            for (int a = -1, j = 0, i, m = n - 1, x = m; j <= m * (Math.Pow(2, n) * n + 1);)
            {
                i = j++ % n;
                s[i] += x‌​ == i ? "o" : "_";
                if (i == m & n > 1)
                {
                    x += a;
                    a *= x % m == 0 ? -1 : 1;
                }
            }
            return string.Join("\n", s);
        };

        Console.Write(_(4));
        Console.ReadKey();
    }
}

편집 : @KevinCruijssen 덕분에 -7 바이트

편집 : -2 바이트, 단순화 된 경우


1
+1 골프를 치기위한 것들 : 정수는 for- 루프 안에 위치시킬 수 있으며, 추가 할 수도 있습니다 ,i; if-check i대신에 재사용 할 수 있습니다 n-1. ||될 수 있습니다 |; j++를 제거하고에 ++추가 할 수 있습니다 j. 총계 : (n)=>{var s=new string[n];for(int x=0,a=1,j=0,i;j<=Math.Pow(2,n)*(n*n-n);){i=j++%n;s[n-i-1]+=x%n==i?'o':' ';if(i==n-1){x+=a;a*=x==i|x==0?-1:1;}}return string.Join("\n",s);};( 173 bytes )
Kevin Cruijssen

@KevinCruijssen 멋진 캐치! 직장에서 돌아 오면 업데이트하겠습니다.
CSharpie

@KevinCruijssen 나는 allready 밖으로 golfed ||하고 &&있지만, 전체 프로그램에 다음 유지했다.
CSharpie

3

Pyth , 30 바이트

jC.<V*]+*dtQNh*tQ^2Q*+JUQtP_J^

정수를 입력 받아 결과를 출력하는 프로그램입니다. "대신 따옴표를 사용합니다 o.

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

작동 원리

jC.<V*]+*dtQNh*tQ^2Q*+JUQtP_J^    Program. Input: Q
jC.<V*]+*dtQNh*tQ^2Q*+JUQtP_J^QQ  Implicit input fill
      ]                           Yield a one-element list, A
        *dtQ                      cotaining Q-1 spaces
       +    N                     appended with a quote mark.
             h*tQ^2Q              Yield 1+(Q-1)*2^Q
     *                            Repeat A that many times, giving B
                       UQ         Yield [0, 1, 2, ..., Q-1]
                      J           (Store that in J)
                     +   tP_J     Append the reverse of J, discarding the first and last
                                  elements
                    *        ^QQ  Repeat the above Q^Q times, giving C
    V                             Vectorised map. For each pair [a,b] from B and C:
  .<                               Cyclically rotate a left by b characters
 C                                Transpose
j                                 Join on newlines
                                  Implicitly print

3

파이썬 (2) , 115 (113) 108 98 바이트

lambda n:'\n'.join(map(''.join,zip(*[' '*abs(i)+'o'+~-n*' 'for i in range(-n+1,n-1)*2**~-n])))+'o'

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

사용 range(-n+1,n-1)바닥 사이의 공간의 절대 값을 생성하고,이 o생성 할

  o
 o
o
 o

그런 다음 더 많은 사본을 추가하고 90º 회전하고 마지막 o을 오른쪽 아래에 추가


3

J , 58 47 바이트

' o'{&:>~[:(,.}."1)&.>/(2^<:)#<@(|.,.}."1)@=@i.

@ flawr 's solution 의 항등 행렬 아이디어를 사용하여 11 바이트를 절약했습니다 .

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

정의의 간단한 적용.

설명

의 경우 n = 3차수 n 의 항등 행렬을 만듭니다 .

1 0 0
0 1 0
0 0 1

그런 다음 미러를 만들어

0 0 1 0 0
0 1 0 1 0
1 0 0 0 1

2 n -1 번 반복하고 각 행의 머리를 복제본에 놓습니다.

0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1

이 값을 char 배열의 인덱스로 사용 [' ', 'o']하여 2d char 배열을 출력하십시오.

  o   o   o   o  
 o o o o o o o o 
o   o   o   o   o

3

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

f=
n=>` `.repeat(n).replace(/ /g,"$'o$`-$`o$'-".repeat(1<<n-1)+`
`).replace(/-.?/g,``)
<input type=number min=1 oninput=o.textContent=f(this.value)><pre id=o>


3

젤리 , 11 바이트

ŒḄ¡ḶUz1Ṛa⁶Y

TryItOnline!

어떻게?

사용 가능한 인쇄 문자는 0입니다.

캥거루의 주제에 대한 그의 이전 질문에 대한 Dennis의 대답 방법을 바탕으로합니다 .

ŒḄ¡ḶUz1Ṛa⁶Y - Main link: n                      e.g. 3
ŒḄ          - bounce, initial implicit range(n) e.g. [1,2,3,2,1]
  ¡         - repeat n times                    e.g. [1,2,3,2,1,2,3,2,1,2,3,2,1,2,3,2,1]
                  i.e. [1,2,3,2,1] bounced to [1,2,3,2,1,2,3,2,1] bounced to [1,2,3,2,1,2,3,2,1,2,3,2,1,2,3,2,1]
   Ḷ        - lowered range (vectorises)        e.g. [[0],[0,1],[0,1,2],[0,1],[0],[0,1],[0,1,2],[0,1],[0],[0,1],[0,1,2],[0,1],[0],[0,1],[0,1,2],[0,1],[0]]
    U       - upend (vectorises)                e.g. [[0],[1,0],[2,1,0],[1,0],[0],[1,0],[2,1,0],[1,0],[0],[1,0],[2,1,0],[1,0],[0],[1,0],[2,1,0],[1,0],[0]]
     z1     - transpose with filler 1
       Ṛ    - ...and reverse                    e.g. [[1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1],
                                                      [1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1],
                                                      [0,1,2,1,0,1,2,1,0,1,2,1,0,1,2,1,0]]
        a⁶  - logical and with space character (all non-zeros become spaces)
          Y - join with line feeds              e.g.    0   0   0   0  
                                                       0 0 0 0 0 0 0 0 
                                                      0   0   0   0   0

2
좋은. 이것은 내 참조 솔루션과 관련이 ŒḄ¡Ṭ€z0o⁶ṚY있습니다.
데니스



2

펄 6 , 104 93 88 바이트

->\n{my @a;@a[$_;$++]="o" for [...] |(n-1,0,n-1)xx 2**n/2;say .join for @a».&{$_//" "}}

o2D 배열에 삽입 한 다음 인쇄합니다.


2

05AB1E , 16 바이트

L<¹Fû}ð×'o«.BøR»

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

왜 그리고 어떻게?

                 # Example input of n=2.
L<               # [0,1] (Push [1..a], decrement).
  ¹Fû}           # [0,1,0,1,0] (Palindromize n times).
      ð×'o«      # ['o',' o','o',' o','o'] (Push n spaces, append o's).
           .Bø   # ['o ',' o','o ',' o','o '] (Pad with spaces into 2D array, transpose).
              R» # Reverse, join and print.

1

자바 8, 254 바이트

골프 :

n->{if(n==1)return"o";int k,x,y,m=n+n-2;char[][]p=new char[n][m];for(y=0;y<n;++y)for(x=0;x<m;)p[y][x++]=' ';for(k=0;k<m;++k)p[k<n?n-k-1:k-n+1][k]='o';String s="";for(y=0;y<n;++y){for(k=0;k<1<<(n-1);++k)for(x=0;x<m;)s+=p[y][x++];if(y==n-1)s+='o';s+='\n';}

언 골프 드 :

import java.util.function.*;

public class LeapingKangaroos {

  public static void main(final String[] args) {
    for (int i = 1; i <= 4; ++i) {
      System.out.println(toString(n -> {
        if (n == 1) {
          return "o";
        }
        int k, x, y, m = (n + n) - 2;
        char[][] p = new char[n][m];
        for (y = 0; y < n; ++y) {
          for (x = 0; x < m;) {
            p[y][x++] = ' ';
          }
        }
        for (k = 0; k < m; ++k) {
          p[k < n ? n - k - 1 : (k - n) + 1][k] = 'o';
        }
        String s = "";
        for (y = 0; y < n; ++y) {
          for (k = 0; k < (1 << (n - 1)); ++k) {
            for (x = 0; x < m;) {
              s += p[y][x++];
            }
          }
          if (y == (n - 1)) {
            s += 'o';
          }
          s += '\n';
        }
        return s;
      } , i));
      System.out.println();
      System.out.println();
    }
  }

  private static String toString(final IntFunction<String> func, final int level) {
    return func.apply(level);
  }

}

프로그램 출력 :

o

 o o
o o o


  o   o   o   o 
 o o o o o o o o
o   o   o   o   o


   o     o     o     o     o     o     o     o  
  o o   o o   o o   o o   o o   o o   o o   o o 
 o   o o   o o   o o   o o   o o   o o   o o   o
o     o     o     o     o     o     o     o     o

0

PHP, 157 바이트

for($i=$n=$argv[1],$r=str_repeat;$i>0;)echo$r($r(' ',$i-1).'o'.$r(' ',2*$n-2*$i-1).($i==$n|$i==1?'':'o').$r(' ',$i-2),2**($n-1)).($i--==1&$n!=1?'o':'')."\n";

언 골프 드 :

for($i=$n=$argv[1];$i>0;) {

    // Spacing from beginning of pattern to first 'o'   
    $o  = str_repeat(' ',$i-1); 

    // First 'o' for the ascent
    $o .= 'o'; 

    // Spacing between ascent and descent
    $o .= str_repeat(' ',2*$n-2*$i-1); 

    // Second 'o' for the descent, unless we are at the apex or the bottom
    $o .= ($i==$n|$i==1?'':'o'); 

    // Spacing to the end of the pattern
    $o .= str_repeat(' ',$i-2); 

    // Repeat the pattern 2^(n-1) times
    echo str_repeat($o, 2**($n-1)); 

    // Output final 'o' if we are at the bottom in the last pattern
    echo $i--==1&$n!=1?'o':''; 

    // End of line 
    echo "\n"; 

}

당신은 모든 교체 할 수 있습니다 'o'1모든 ''0. 그것이 효과가 있기를 바랍니다. 또한 공백은 O또는 로 바꿀 수 있습니다 9. 규칙에 따라 패턴이 중요합니다. 그러나 먼저 확인하십시오
Ismael Miguel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.