Rời khỏi Kanguru


36

Backstory

Tuyên bố miễn trừ trách nhiệm: Có thể chứa thông tin tạo thành về kanguru.

Kanguru đi qua nhiều giai đoạn phát triển. Khi chúng lớn lên và khỏe hơn, chúng có thể nhảy cao hơn và dài hơn, và chúng có thể nhảy nhiều lần hơn trước khi chúng đói.

Ở giai đoạn 1 , chuột túi rất ít và không thể nhảy được. Mặc dù vậy, liên tục đòi hỏi phải nuôi dưỡng. Chúng ta có thể đại diện cho mô hình hoạt động của kangaroo giai đoạn 1 như thế này.

o

Ở giai đoạn 2 , chuột túi có thể thực hiện những cú nhảy nhỏ, nhưng không quá 2 trước khi nó đói. Chúng ta có thể đại diện cho mô hình hoạt động của kangaroo giai đoạn 2 như thế này.

 o o
o o o

Sau giai đoạn 2 , kangaroo cải thiện nhanh chóng. Trong mỗi giai đoạn tiếp theo, kangaroo có thể nhảy cao hơn một chút (1 đơn vị trong biểu diễn đồ họa) và gấp đôi nhiều lần. Ví dụ, mô hình hoạt động của kangaroo giai đoạn 3 trông như thế này.

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

Đối với giai đoạn n , mô hình hoạt động bao gồm 2 n-1 bước nhảy hình chữ V của chiều cao n .

Ví dụ, đối với giai đoạn 4 , có 8 lần nhảy có chiều cao 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

Bài tập

Viết một chương trình đầy đủ hoặc một hàm lấy số nguyên dương n làm đầu vào và in hoặc trả về biểu diễn nghệ thuật ASCII của mẫu hoạt động của giai đoạn n karooaroo.

Khoảng trắng bao quanh và mã thoát ANSI được cho phép, miễn là mẫu trông chính xác như được mô tả ở trên.

Nếu bạn chọn một hàm trả về đầu ra, nó phải trả về một chuỗi ký tự hoặc một chuỗi ký tự hiển thị đầu ra thích hợp khi được in. Trả lại một chuỗi các chuỗi không được phép.

Bạn có thể sử dụng bất kỳ ký tự không phải khoảng trắng có thể in thay thế o, miễn là nó phù hợp trong mẫu hoạt động và trên tất cả các mẫu trong câu trả lời của bạn.

Đây là ; có thể câu trả lời ngắn nhất trong byte giành chiến thắng!


Tôi cần một số làm rõ. Bạn nói rằng bạn có thể sử dụng bất kỳ nhân vật để đại diện o. Bạn cũng có thể sử dụng bất kỳ ký tự nào để thể hiện các khoảng trắng (miễn là chúng khác nhau?)?
Kodos Johnson

1
Các không gian phải trống. Bạn có thể sử dụng không gian thực tế hoặc bạn có thể sử dụng mã điều khiển để di chuyển con trỏ xung quanh, nhưng bạn không thể sử dụng các ký tự không phải không gian có thể in được.
Dennis

Câu trả lời:


8

05AB1E , 12 10 byte

Îj¹FÐvû},À

Giải trình:

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

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!


1
Thú vị, thông minh hơn zip.
Bạch tuộc ma thuật Urn

14

MATLAB, 92 90 86 84 byte

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

Hãy thử trực tuyến!

eyetạo ra một ma trận danh tính. Nếu chúng ta lật nó và ghép nối bản gốc tức là [fliplr(p),p]chúng ta nhận được (cho n=3):

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

Với repmat(...,1,2^n/2)chúng tôi lặp lại 2^(n-1)lần này và nhận được

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

Từ đây chúng ta chỉ cần xóa các cột không cần thiết, với A(:,n+1:n:end)=[];


8
Chúc mừng 20k !!
Luis Mendo

Cảm ơn !
flawr

9

Than , 14 byte

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

Hãy thử trực tuyến!

Giải trình

Nλnhập một số nguyên vào λ. P^là một bản in đa hướng (SE và SW) của ×λo(phép nhân chuỗi λvới o). Sau đó F⁻λ¹chạy một λ - 1thời gian vòng lặp , trong đó ‖O→phản ánh toàn bộ bên phải với sự chồng chéo.


" P^Là một bản in đa chiều (SE và SW) " Thật tuyệt, đó là thứ bạn không thường thấy trong các ngôn ngữ lập trình!
Kevin Cruijssen


7

Python 2 , 87 byte

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

Hãy thử trực tuyến!

Sử dụng một công thức cho các tọa độ (i,j)có chứa một vòng tròn, sau đó tham gia và in lưới. Có rất nhiều mùi golf ở đây - ''.join, hai dãy lồng nhau, fortrên exec, do đó có khả năng được cải tiến.


7

Python 2, 83 81 byte

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

Hãy thử trực tuyến!


3
Chào mừng đến với PPCG! Bài đăng đầu tiên rất hay!
Rɪᴋᴇʀ

3
Đó là một cách nói nhẹ nhàng; outnolfing xnor trong Python là một kỳ công không nhỏ. Tôi thấy một số phòng để cải thiện. Một vòng lặp while nên tiết kiệm một byte và các execthủ thuật có thể tiết kiệm một vài chi tiết.
Dennis

5

Befunge, 98 91 byte

Điều này sử dụng ,thay cho o, vì điều đó cho phép chúng ta lưu một vài byte.

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

Hãy thử trực tuyến!

Giải trình

Cho số giai đoạn, n , chúng ta bắt đầu bằng cách tính ba tham số sau của mẫu:

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

Các jump_len được chuẩn hóa để tránh nó là zero cho một giai đoạn 1 con kangaroo với:

jump_len += !jumplen    

Sau đó, chúng ta có thể xuất mô hình nhảy bằng cách lặp qua tọa độ xy của khu vực đầu ra và tính toán các charater thích hợp để xuất ra cho từng vị trí. Các y phối hợp đếm xuống từ n - 1 nghiêng về 0, và x phối hợp đếm xuống từ chiều rộng - 1 nghiêng về 0. Chúng tôi xác định xem một dấu chấm cần phải được hiển thị với công thức sau:

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

Các show_dot boolean được sử dụng như một chỉ số bảng để xác định nhân vật thực tế để đầu ra tại mỗi địa điểm. Để tiết kiệm không gian, chúng tôi sử dụng điểm bắt đầu của dòng nguồn cuối cùng là bảng đó, đó là lý do tại sao onhân vật của chúng tôi kết thúc là a ,.


5

J , 28 25 byte

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

Đã lưu 3 byte nhờ @ Conor O'Brien .

Điều này dựa trên thủ thuật palindrom từ giải pháp của @ muddyfish .

Hãy thử trực tuyến!

Giải trình

' 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

Một cách tiếp cận thay thế cho 31 byte : ' o'{~3 :'(}."1,.~|."1)^:y=i.y'. Tôi ước tôi có thể tìm ra cách để loại bỏ động từ rõ ràng đó ... Darn ^:.
Conor O'Brien

@ ConorO'Brien Cảm ơn, mà không giúp đỡ, tôi nghĩ rằng nó sẽ ngắn hơn nếu ngầm
dặm

@ ConorO'Brien Tôi đã làm cho nó ngầm, nó thực sự ngắn hơn!
dặm

Tuyệt vời! Điều này là khá tuyệt vời. Tôi tiếp tục quên cách sử dụng dyadic của u&v--quite đẹp.
Conor O'Brien


4

Haskell , 100 byte

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]]

Hãy thử trực tuyến! Cách sử dụng : k 3.

Giải trình:

Cho một hàng r, một cột cm = 2(n-1)một ođược đặt nếu c mod mbằng rhoặc m-r. Việc hiểu danh sách ngoài cùng thiết lập phạm vi rtừ n-1đến 0, tiếp theo đặt phạm vi ctừ 0đến m*2^(n-1)và trong cùng đóng vai trò trả về có điều kiện 'o'nếu công thức trên được thực hiện theo ' 'cách khác. Điều này mang lại một danh sách các chuỗi được biến thành một chuỗi mới được phân tách bằng một unlines. Đối với n=1hàm tạo ra lỗi chia cho 0, vì vậy trường hợp này được xử lý rõ ràng trong dòng đầu tiên.


Tôi thực sự thích ['o'|mod c m`elem`[m-r,r]]một phần!
flawr

4

C #, 180, 173 171 byte

Sẽ không giành được điều này, đăng bài cho các thí sinh C # khác như một thứ họ có thể đánh bại.

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

hoàn thành chương trình:

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

chỉnh sửa: -7 byte nhờ @KevinCruijssen

chỉnh sửa: -2 byte, được đơn giản hóa nếu


1
+1 Một số điều để chơi gôn: Các số nguyên có thể được đặt bên trong vòng lặp for và bạn cũng có thể thêm ,i; bạn có thể sử dụng lại ithay vì n-1sau khi kiểm tra if; ||có thể được |; j++có thể được gỡ bỏ và ++có thể được thêm vào j. Vì vậy, trong tổng số: (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 byte )
Kevin Cruijssen

@KevinCruijssen Bắt đẹp! Tôi sẽ cập nhật khi tôi đi làm về.
CSharpie

@KevinCruijssen Tôi đã sẵn sàng đánh gôn ||&&sau đó giữ nguyên chương trình.
CSharpie

3

Bình thường , 30 byte

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

Một chương trình lấy đầu vào của một số nguyên và in kết quả. Sử dụng một dấu ngoặc kép "thay vì o.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Python 2 , 115 113 108 98 byte

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

Hãy thử trực tuyến!

Sử dụng range(-n+1,n-1)để tạo số lượng không gian tuyệt đối giữa đáy và ođể tạo

  o
 o
o
 o

và sau đó nối thêm các bản sao, xoay 90 độ mọi thứ và nối thêm bản cuối cùng oở dưới cùng bên phải


3

J , 58 47 byte

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

Đã lưu 11 byte bằng cách sử dụng ý tưởng ma trận danh tính từ giải pháp của @ flawr .

Hãy thử trực tuyến!

Một ứng dụng đơn giản của định nghĩa.

Giải trình

Cho n = 3, tạo ma trận danh tính của thứ tự n .

1 0 0
0 1 0
0 0 1

Sau đó phản chiếu nó để làm

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

Lặp lại 2 n -1 lần đó và thả đầu của mỗi hàng vào các mục trùng lặp

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

Sử dụng các giá trị này làm chỉ mục vào mảng char [' ', 'o']để xuất ra mảng char 2d

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

3

JavaScript (ES6), 83 byte

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

Thạch , 11 byte

ŒḄ¡ḶUz1Ṛa⁶Y

Dùng thử trực tuyến!

Làm sao?

Các ký tự có thể in được sử dụng là 0.

Xây dựng theo phương pháp trả lời của Dennis cho câu hỏi trước đây của anh ấy về chủ đề chuột túi.

ŒḄ¡Ḷ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
Tốt đẹp. Mối quan hệ này với giải pháp tham khảo của tôi , ŒḄ¡Ṭ€z0o⁶ṚY.
Dennis


2

Python 3 , 177 byte

n=5;f=n-1;w=''
for i in range(n):
 s='';a=0;d='\n'
 if i==f:w='';a=-1;d=''
 for _ in range(2**f):
  s+=' '*(f-i)+'o'+' '*(2*i-1)+w+' '*(n-i-2+a)
 print(s,end=d);w='o'
print('o')

Hãy thử trực tuyến!


2

Perl 6 , 104 93 88 byte

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

Chèn ovào một mảng 2D và sau đó in nó.


2

05AB1E , 16 byte

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

Hãy thử trực tuyến!

Lý do tại sao và làm thế nào?

                 # 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

Java 8, 254 byte

Chơi gôn

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

Ung dung:

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

}

Đầu ra chương trình:

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 byte

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

Ung dung:

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

}

Bạn có thể thay thế mọi 'o'với 1và mọi ''với 0. Hy vọng rằng hoạt động, Ngoài ra, các không gian có thể được thay thế bằng Ohoặc 9. Điều quan trọng là mô hình, theo các quy tắc. Nhưng hãy xác minh trước
Ismael Miguel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.