Melompati Kanguru


36

Backstory

Penafian: Dapat berisi informasi buatan tentang kanguru.

Kanguru melewati beberapa tahap perkembangan. Seiring bertambahnya usia dan semakin kuat, mereka bisa melompat lebih tinggi dan lebih lama, dan mereka bisa melompat lebih banyak sebelum mereka lapar.

Pada tahap 1 , kanguru sangat kecil dan tidak bisa melompat sama sekali. Meskipun demikian, secara konstan membutuhkan makanan. Kita bisa mewakili pola aktivitas kanguru tahap 1 seperti ini.

o

Pada tahap 2 , kanguru dapat membuat lompatan kecil, tetapi tidak lebih dari 2 sebelum lapar. Kita bisa mewakili pola aktivitas kanguru tahap 2 seperti ini.

 o o
o o o

Setelah tahap 2 kangguru membaik dengan cepat. Pada setiap tahap selanjutnya, kanguru dapat melompat sedikit lebih tinggi (1 unit dalam representasi grafis) dan dua kali lebih banyak. Misalnya, pola aktivitas kanguru tahap 3 terlihat seperti ini.

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

Untuk tahap n , pola aktivitas terdiri dari 2 n-1 V-berbentuk melompat dari ketinggian n .

Misalnya, untuk tahap 4 , ada 8 lompatan tinggi 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

Tugas

Menulis sebuah program penuh atau fungsi yang mengambil bilangan bulat positif n sebagai masukan dan cetak atau mengembalikan ASCII seni representasi dari tahap n pola aktivitas kanguru.

Ruang putih dan kode pelarian ANSI yang diperbolehkan diperbolehkan, selama polanya terlihat persis seperti yang digambarkan di atas.

Jika Anda memilih fungsi yang mengembalikan output, itu harus mengembalikan string atau karakter array yang menampilkan output yang tepat saat dicetak. Mengembalikan array string tidak diizinkan.

Anda dapat menggunakan karakter apa pun yang dapat dicetak dan bukan spasi putih o, asalkan konsisten dalam pola aktivitas dan melintasi semua pola dalam jawaban Anda.

Ini adalah ; semoga jawaban tersingkat dalam byte menang!


Saya perlu klarifikasi. Anda bilang Anda bisa menggunakan karakter apa saja untuk mewakili o. Bisakah Anda menggunakan karakter apa pun untuk mewakili spasi (asalkan berbeda?)?
Kodos Johnson

1
Ruang harus kosong. Anda dapat menggunakan spasi aktual atau menggunakan kode kontrol untuk memindahkan kursor, tetapi Anda tidak dapat menggunakan karakter non-spasi yang dapat dicetak.
Dennis

Jawaban:


8

05AB1E , 12 10 byte

Îj¹FÐvû},À

Penjelasan:

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

Menggunakan pengkodean CP-1252 . Cobalah online!


1
Menarik, lebih pintar dari zip.
Magic Octopus Mm

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)

Cobalah online!

eyemenciptakan matriks identitas. Jika kita membalik dan menggabungkan yang asli yaitu [fliplr(p),p]kita mendapatkan (untuk n=3):

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

Dengan repmat(...,1,2^n/2)kami ulangi 2^(n-1)kali ini dan dapatkan

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

Dari ini kami hanya menghapus kolom yang tidak perlu, dengan A(:,n+1:n:end)=[];


8
Selamat atas 20rb !!
Luis Mendo

Terima kasih !
flawr

9

Arang , 14 byte

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

Cobalah online!

Penjelasan

Nλmemasukkan bilangan bulat ke dalam λ. P^adalah cetak multi arah (SE dan SW) dari ×λo(perkalian string λdengan o). Kemudian F⁻λ¹jalankan a untuk λ - 1kali loop , di mana ‖O→mencerminkan semuanya ke kanan dengan tumpang tindih.


" P^adalah cetak multi-arah (SE dan SW) " Keren, itu adalah sesuatu yang jarang Anda lihat dalam bahasa pemrograman!
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))

Cobalah online!

Menggunakan rumus untuk koordinat (i,j)yang berisi lingkaran, lalu bergabung dan mencetak kisi. Ada banyak aroma golf di sini - ''.join, dua rentang bersarang, forlebih exec, jadi mungkin ada perbaikan.


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

Cobalah online!


3
Selamat datang di PPCG! Posting pertama yang bagus!
R

3
Itu semacam pernyataan yang meremehkan; mengalahkan xnor dengan Python bukanlah hal kecil. Saya memang melihat beberapa ruang untuk perbaikan. Sebuah loop sementara harus menyimpan byte dan para exectrik dapat menyimpan beberapa lagi.
Dennis

5

Befunge, 98 91 byte

Ini menggunakan a ,di tempat o, karena itu memungkinkan kita untuk menyimpan beberapa byte.

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

Cobalah online!

Penjelasan

Dengan diberi nomor tahap, n , kita mulai dengan menghitung tiga parameter pola berikut:

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

The jump_len dinormalkan untuk menghindari itu menjadi nol untuk tahap 1 kanguru dengan:

jump_len += !jumplen    

Kita kemudian dapat menampilkan pola lompatan dengan mengulangi koordinat x dan y dari area output, dan menghitung karakter yang sesuai untuk output untuk setiap lokasi. The y koordinat menghitung turun dari n - 1 ke 0, dan x mengkoordinasikan jumlah turun dari lebar - 1 ke 0. Kami menentukan apakah sebuah titik yang perlu ditampilkan dengan rumus berikut:

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

The show_dot boolean digunakan sebagai indeks tabel untuk menentukan karakter yang sebenarnya untuk output pada setiap lokasi. Untuk menghemat ruang, kita menggunakan awal baris terakhir sumber sebagai tabel itu, itulah sebabnya okarakter kita akhirnya menjadi a ,.


5

J , 28 25 byte

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

Disimpan 3 byte berkat @ Conor O'Brien .

Ini didasarkan pada trik palindrome dari solusi @ muddyfish .

Cobalah online!

Penjelasan

' 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

Suatu pendekatan alternatif untuk 31 byte: ' o'{~3 :'(}."1,.~|."1)^:y=i.y'. Saya berharap bisa menemukan cara untuk menghapus kata kerja eksplisit itu ... Sial ^:.
Conor O'Brien

@ ConorO'Brien Terima kasih, itu membantu, saya pikir akan lebih pendek jika diam
mil

@ ConorO'Brien Saya membuatnya diam-diam, ini memang lebih pendek!
mil

Luar biasa! Ini sangat mengagumkan. Saya selalu lupa penggunaan diad dari - u&vcukup bagus.
Conor O'Brien

4

Pyke, 11 byte

XFd*\o+Q^Vs

Coba di sini!

 F          -  for i in range(input)
  d*\o+     -     " "*i+"o"
       Q^   -    ^.lpad(input)
         Vs -   repeat len(^): palindromise()
X           - print(reversed(^))

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

Cobalah online! Penggunaan: k 3.

Penjelasan:

Diberikan satu baris r, satu kolom cdan m = 2(n-1)satu odiatur jika c mod msama dengan ratau m-r. Pemahaman daftar terluar menetapkan rentang rdari n-1ke 0, yang berikutnya menetapkan rentang cdari 0ke m*2^(n-1)dan tindakan paling dalam sebagai pengembalian bersyarat 'o'jika formula di atas dipenuhi dan ' 'sebaliknya. Ini menghasilkan daftar string yang diubah menjadi string baris baru yang dipisahkan oleh unlines. Untuk n=1fungsi menghasilkan kesalahan pembagian-oleh-nol, jadi kasus ini ditangani secara eksplisit di baris pertama.


Saya sangat suka ['o'|mod c m`elem`[m-r,r]]bagian itu!
flawr

4

C #, 180, 173 171 byte

Tidak akan memenangkan ini, memposting untuk kontestan C # lainnya sebagai sesuatu yang dapat mereka kalahkan.

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

program lengkap:

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

sunting: -7 byte terima kasih kepada @KevinCruijssen

sunting: -2 byte, disederhanakan jika


1
+1 Beberapa hal untuk golf: Int dapat ditempatkan di dalam for-loop, dan Anda juga dapat menambahkan ,i; Anda dapat menggunakan kembali ialih-alih n-1setelah if-check; ||bisa |; j++dapat dihapus dan ++dapat ditambahkan ke j. Jadi total: (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 Tangkapan bagus! Saya akan memperbarui setelah saya kembali dari kantor.
CSharpie

@KevinCruijssen Saya sudah siap bermain golf ||dan &&kemudian menyimpannya dalam program yang lengkap.
CSharpie

3

Pyth , 30 byte

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

Program yang mengambil input bilangan bulat dan mencetak hasilnya. Gunakan tanda kutip "sebagai ganti o.

Cobalah online!

Bagaimana itu bekerja

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'

Cobalah online!

Menggunakan range(-n+1,n-1)untuk membuat jumlah ruang mutlak antara bagian bawah dan ountuk menghasilkan

  o
 o
o
 o

dan kemudian menambahkan lebih banyak salinan, memutar semuanya 90º dan menambahkan yang terakhir odi kanan bawah


3

J , 58 47 byte

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

Disimpan 11 byte menggunakan ide matriks identitas dari solusi @ flawr .

Cobalah online!

Aplikasi langsung dari definisi.

Penjelasan

Untuk n = 3, membuat matriks identitas pesanan n .

1 0 0
0 1 0
0 0 1

Lalu cermin untuk membuatnya

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

Ulangi itu 2 n -1 kali dan jatuhkan kepala setiap baris pada duplikat

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

Gunakan nilai-nilai itu sebagai indeks ke dalam array char [' ', 'o']untuk menghasilkan array 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

Jelly , 11 byte

ŒḄ¡ḶUz1Ṛa⁶Y

TryItOnline!

Bagaimana?

Karakter yang dapat dicetak yang digunakan adalah 0.

Mengembangkan metode jawaban Dennis untuk pertanyaan sebelumnya tentang masalah kanguru.

ŒḄ¡Ḷ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
Bagus. Ini terkait dengan solusi referensi saya ŒḄ¡Ṭ€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')

Cobalah online!


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».&{$_//" "}}

Sisipan oke dalam array 2D, lalu cetak.


2

05AB1E , 16 byte

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

Cobalah online!

Kenapa dan bagaimana?

                 # 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

Golf:

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

Tidak Disatukan:

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

}

Output program:

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

Tidak Disatukan:

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

}

Anda dapat mengganti setiap 'o'dengan 1dan setiap ''dengan 0. Semoga berhasil, Juga, ruang dapat diganti oleh Oatau 9. Yang penting adalah polanya, sesuai aturan. Tapi verifikasi dulu
Ismael Miguel
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.