Sıçrayan kanguru


36

backstory

Feragatname: Kangurularla ilgili bilgiler içerebilir.

Kanguru gelişmenin birkaç aşamasını geçiyor. Yaşlandıkça ve güçlendikçe, daha yükseğe ve daha uzun zıplayabilirler ve aç olmadan önce daha fazla zıplayabilirler.

1. aşamada , kanguru çok azdır ve hiç atlayamaz. Buna rağmen sürekli beslenme gerektirir. Böyle bir aşama 1 kanguru aktivitesini temsil edebiliriz .

o

Aşamada 2 , kanguru küçük sıçramalar yapabilir, ancak en fazla 2 önce acıkır. Böyle bir aşama 2 kangaroo'nun aktivite modelini temsil edebiliriz .

 o o
o o o

2. aşamadan sonra , kanguru hızla iyileşir. Takip eden her bir aşamada, kanguru biraz daha yükseğe (grafiksel gösterime göre 1 birim) ve iki kez daha zıplayabilir. Örneğin, bir aşama 3 kanguru aktivite kalıbı buna benziyor.

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

Aşaması için , n , etkinlik modeli oluşur 2 , n-1 yüksekliğinin V-şekilli atlar n .

Örneğin, evre 4 için , 8 yükseklikten 4 atlama var .

   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

Görev

Tam bir program ya da girdi olarak pozitif bir tamsayı n alan ve bir aşama n kangaroo'nun aktivite modelinin ASCII sanat temsilini basan veya döndüren bir fonksiyon yazın .

Çevreleyen boşluk ve ANSI çıkış kodlarına izin verilir, desen yukarıda gösterildiği gibi görünür.

Çıktıyı döndüren bir işlev seçerseniz, yazdırıldığında uygun çıktıyı görüntüleyen tek bir dize veya karakter dizisi döndürmesi gerekir. Bir dizi dizenin döndürülmesine izin verilmez.

oEtkinlik deseninde ve cevabınızdaki tüm desenlerde tutarlı olduğu sürece, yazdırılabilir, beyaz olmayan herhangi bir karakteri kullanabilirsiniz .

Bu ; bayt cinsinden en kısa cevap kazanabilir!


Biraz açıklamaya ihtiyacım var. Temsil etmek için herhangi bir karakteri kullanabileceğinizi söylemiştiniz o. Boşlukları temsil etmek için herhangi bir karakteri de kullanabilir misiniz (farklı oldukları sürece?)?
Kodos Johnson

1
Boşlukların boş bırakılması gerekir. Gerçek boşlukları kullanabilir veya imleci hareket ettirmek için kontrol kodlarını kullanabilirsiniz, ancak yazdırılabilir boşluksuz karakterleri kullanamazsınız.
Dennis

Yanıtlar:


8

05AB1E , 12 10 bayt

Îj¹FÐvû},À

Açıklama:

Î              # 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 kodlamasını kullanır . Çevrimiçi deneyin!


1
İlginç, fermuardan daha akıllı.
Magic Octopus Urn

14

MATLAB, 92 90 86 84 bayt

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

Çevrimiçi deneyin!

eyebir kimlik matrisi yaratır. Biz onu çevirmek ve özgün ie bitiştirmek Eğer [fliplr(p),p]biz (olsun n=3):

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

İle repmat(...,1,2^n/2)bu tekrarlamak 2^(n-1)süreleri ve get

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

Bundan, sadece gereksiz sütunları sileriz A(:,n+1:n:end)=[];


8
20k için tebrikler !!
Luis Mendo,

Teşekkür ederim !
flawr

9

Kömür , 14 bayt

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

Çevrimiçi deneyin!

açıklama

Nλiçine bir tamsayı girer λ. P^Bir yönlü baskı (SE ve SW) 'dir ×λo(dize çarpımı λile o). Daha sonra F⁻λ¹for döngüsü λ - 1süreleri boyunca çalışır , ki bu ‖O→da üst üste binme ile her şeyi sağa yansıtır.


" P^çok yönlü bir baskıdır (SE ve SW) " Harika, programlama dillerinde çok sık görmediğiniz bir şey!
Kevin Cruijssen


7

Python 2 , 87 bayt

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

Çevrimiçi deneyin!

(i,j)Daire içeren koordinatlar için bir formül kullanır , daha sonra ızgaraya katılır ve yazdırır. Golf koku Burada bir sürü var - ''.join, iç içe geçmiş iki aralıkları forüzerinde exec, bu nedenle iyileştirmeler olması muhtemeldir var.


7

Python 2, 83 81 bayt

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

Çevrimiçi deneyin!


3
PPCG'ye Hoşgeldiniz! Güzel ilk mesaj!
17:33

3
Bu bir tür yetersizlik; Python'daki xnor'ı aşmak küçük bir başarı değildir. Gelişme için biraz yer görüyorum. Bir süre döngü bir byte kaydetmeli ve hile birkaç tane daha kaydedebilirsiniz. exec
Dennis

5

Befunge, 98 91 bayt

Bu, ,yerine kullanılır o, çünkü birkaç bayttan tasarruf etmemize izin verir.

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

Çevrimiçi deneyin!

açıklama

Aşama numarası göz önüne alındığında, n , modelin aşağıdaki üç parametresini hesaplayarak başlarız:

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

Jump_len bir evre 1 kanguru ile için sıfır olmamak için normalize edilir:

jump_len += !jumplen    

Daha sonra atlama desenini , çıktı alanının x ve y koordinatları üzerinde yineleyerek ve her konum için çıktı için uygun karakteri hesaplayarak çıkarabiliriz . Y aşağı sayar koordinat n - 1 0 ve x aşağı sayar koordinat genişliği - 1 0 için biz, bir nokta ihtiyaçları aşağıdaki formülle gösterilir belirlemek:

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

Show_dot boolean her konumda bir çıkış ile fiili karakterini belirlemek için bir tablo endeksi olarak kullanılır. Yerden kazanmak için, son kaynak satırının başlangıcını bu tablo olarak kullanıyoruz, bu yüzden okarakterimiz bir ,.


5

J , 28 25 bayt

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

@ Conor O'Brien sayesinde 3 byte kurtarıldı .

Bu @ muddyfish'in çözümünden elde edilen palindrome numarası üzerine kuruludur .

Çevrimiçi deneyin!

açıklama

' 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 için alternatif bir yaklaşım bayt: ' o'{~3 :'(}."1,.~|."1)^:y=i.y'. Keşke bu açık fiili kaldırmak için bir yol bulabilseydim ... Kahretsin ^:.
Conor O'Brien,

@ ConorO'Brien Teşekkürler, bu yardımcı olur, zımni olursa daha kısa olacağını düşünüyorum
miller

@ ConorO'Brien Yapışkanlık yaptım, gerçekten daha kısa!
miller

Müthiş! Bu oldukça harika. Ben - oldukça u&vzarif diyaliz kullanımını unutmaya devam ediyorum .
Conor O'Brien

4

Pyke, 11 bayt

XFd*\o+Q^Vs

Burada dene!

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

4

Haskell , 100 bayt

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

Çevrimiçi deneyin! Kullanımı: k 3.

Açıklama:

Bir satır Verilen rbir sütun cve m = 2(n-1)bir oayarda olduğunu c mod meşittir rya m-r. En dış liste anlama aralığını belirler rgelen n-1için 0sonraki bir setleri, aralık cgelen 0kadar m*2^(n-1)ve en iç dönen koşullu olarak hareket 'o'Yukarıdaki formül yerine ve eğer ' 'başka türlü. Bu, dizge ile ayrılmış tek bir yeni satır haline getirilen bir dizge listesi verir unlines. İçin n=1bu durum, birinci hat açık olarak işlenir ve işlevsel bir bölümü bazında sıfır hata üretir.


Parçayı gerçekten beğendim ['o'|mod c m`elem`[m-r,r]]!
kusur,

4

C #, 180, 173 171 bayt

Bunu kazanamayacak, diğer C # yarışmacılarına yenebilecekleri bir şey göndermiş olacaksınız.

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

tam program:

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

düzenleme: -7 bytes teşekkürler @KevinCruijssen

düzenleme: -2 bayt, eğer basitleştirilmiş


1
+1 Golfe atılacak bazı şeyler: Girişler for döngüsünün içine yerleştirilebilir, ayrıca ekleyebilirsiniz ,i; if-check sonrası iyerine yeniden kullanabilirsiniz n-1; ||olabilir |; j++kaldırılabilir ve ++eklenebilir j. Toplamda: (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 Güzel yakalamak! İşten döndüğümde güncelleme yapacağım.
CSharpie

@KevinCruijssen Ben zaten golf oynadım ||ve &&sonra tüm programda tuttu.
CSharpie

3

Pyth , 30 bayt

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

Bir tamsayı girişi alan ve sonucu basan bir program. Bir tırnak işareti kullanır "yerine o.

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

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

Çevrimiçi deneyin!

Kullanma range(-n+1,n-1)alt arasındaki boşlukların mutlak sayısı oluşturmak ve oüretmek için

  o
 o
o
 o

ve sonra daha fazla kopya ekleyerek, herşeyi 90º döndürerek ve en son osağa ekleyerek


3

J , 58 47 bayt

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

@ Flawr'ın çözümünden kimlik matrisi fikrini kullanarak 11 bayt kurtardı .

Çevrimiçi deneyin!

Tanımın basit bir uygulaması.

açıklama

Çünkü n = 3, n'in kimlik matrisini yaratır .

1 0 0
0 1 0
0 0 1

Sonra onu aynaya yansıt

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

Bu 2 n -1 kez tekrarlayın ve her satırın başını kopyalara bırakın.

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

[' ', 'o']2d karakterli bir dizinin çıktısını almak için bu değerleri karakter dizisinin indeksleri olarak kullanın.

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

3

JavaScript (ES6), 83 bayt

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

Jöle , 11 bayt

ŒḄ¡ḶUz1Ṛa⁶Y

TryItOnline!

Nasıl?

Kullanılan yazdırılabilir karakter 0.

Dennis'in kanguru konusunda önceki sorusuna vereceği yanıtın yöntemine dayanıyor .

ŒḄ¡Ḷ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
Güzel. Bu benim referans çözümümle bağlantılı ŒḄ¡Ṭ€z0o⁶ṚY.
Dennis


2

Python 3 , 177 bayt

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')

Çevrimiçi deneyin!


2

Perl 6 , 104 93 88 bayt

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

o2B diziye ekler ve ardından yazdırır.


2

05AB1E , 16 bayt

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

Çevrimiçi deneyin!

Neden ve nasıl?

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

golfed:

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

Ungolfed:

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

}

Program çıktısı:

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 bayt

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

Ungolfed:

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

}

Her yerini alabilir 'o'ile 1ve her ''ile 0. Ayrıca, çalışan Umut, boşluk ile değiştirilebilir Oveya 9. Önemli olan kurallara göre kalıptır. Ama önce doğrulayın
Ismael Miguel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.