Skaczące kangury

36

Historia

Oświadczenie: Może zawierać wymyślone informacje o kangurach.

Kangury przemierzają kilka etapów rozwoju. Gdy dorastają i stają się silniejsze, mogą skakać coraz wyżej i dłużej i mogą skakać więcej razy, zanim poczują głód.

Na etapie 1 kangur jest bardzo mały i nie może w ogóle skakać. Mimo to stale wymaga pożywienia. Możemy przedstawić wzór aktywności kangura z etapu 1 w ten sposób.

o

Na etapie 2 kangur może wykonywać małe skoki, ale nie więcej niż 2, zanim stanie się głodny. Możemy przedstawić taki wzór aktywności kangura 2. stopnia .

 o o
o o o

Po etapie 2 kangur szybko się poprawia. Na każdym kolejnym etapie kangur może skoczyć nieco wyżej (1 jednostka w graficznej reprezentacji) i dwa razy więcej. Na przykład wzór aktywności kangura trzeciego stopnia wygląda tak.

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

Na etapie n wzorzec aktywności składa się z 2 skoków w kształcie litery V o wysokości n n-1 .

Na przykład na etapie 4 jest 8 skoków o wysokości 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

Zadanie

Napisz pełny program lub funkcję, która przyjmuje na wejściu dodatnią liczbę całkowitą n i wypisuje lub zwraca artystyczną reprezentację ASCII wzorca aktywności kangura stage n .

Dozwolone są otaczające spacje i kody specjalne ANSI, o ile wzór wygląda dokładnie tak, jak pokazano powyżej.

Jeśli wybierzesz funkcję, która zwraca dane wyjściowe, musi zwrócić pojedynczy ciąg lub tablicę znaków, która wyświetla prawidłowe dane wyjściowe po wydrukowaniu. Zwracanie tablicy ciągów jest niedozwolone.

Zamiast tego możesz użyć dowolnego drukowalnego znaku, który nie jest spacją o, o ile jest on spójny z wzorcem aktywności i we wszystkich wzorcach w odpowiedzi.

To jest ; niech wygra najkrótsza odpowiedź w bajtach!

Dennis
źródło
Potrzebuję wyjaśnienia. Powiedziałeś, że możesz użyć dowolnej postaci do reprezentowania o. Czy możesz również użyć dowolnej postaci do przedstawienia spacji (o ile są one różne?)?
Kodos Johnson
1
Miejsca muszą być puste. Można używać rzeczywistych spacji lub kodów sterujących, aby przesuwać kursor, ale nie można używać znaków spacji do wydrukowania.
Dennis
1
codegolf.stackexchange.com/questions/96379/… - Powiązane.
Magic Octopus Urn

Odpowiedzi:

8

05AB1E , 12 10 bajtów

Îj¹FÐvû},À

Wyjaśnienie:

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

Wykorzystuje kodowanie CP-1252 . Wypróbuj online!

Adnan
źródło
1
Ciekawe, inteligentniejsze niż zip.
Magic Octopus Urn
14

MATLAB, 92 90 86 84 bajtów

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

Wypróbuj online!

eyetworzy matrycę tożsamości. Jeśli odwrócimy go i [fliplr(p),p]połączymy oryginał, tzn. Otrzymamy (za n=3):

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

Z repmat(...,1,2^n/2)powtarzamy te 2^(n-1)czasy i otrzymujemy

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

Z tego po prostu usuwamy niepotrzebne kolumny, za pomocą A(:,n+1:n:end)=[];

wada
źródło
8
Gratulacje na 20k !!
Luis Mendo
Dziękuję !
flawr
9

Węgiel drzewny , 14 bajtów

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

Wypróbuj online!

Wyjaśnienie

Nλwprowadza liczbę całkowitą do λ. P^Druk jest wielokierunkowa (SE i SW) z ×λo(string mnożenie λz o). Następnie F⁻λ¹uruchamia λ - 1czasy pętli for , w których ‖O→z zachodzeniem na siebie odzwierciedla całość po prawej stronie.

DLosc
źródło
P^to druk wielokierunkowy (SE i SW) „ Fajnie, tego nie często widuje się w językach programowania!
Kevin Cruijssen
Po prostu zostawiam to tutaj
Bassdrop Cumberwubwubwub
7

Python 2 , 87 bajtów

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

Wypróbuj online!

Używa wzoru na współrzędne (i,j)zawierające okrąg, a następnie łączy i drukuje siatkę. Jest wiele węchu golfowego tutaj - ''.joindwa zakresy zagnieżdżonych, fornad exec, więc nie może być poprawa.

xnor
źródło
7

Python 2, 83 81 bajtów

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

Wypróbuj online!

infmagic2047
źródło
3
Witamy w PPCG! Miły pierwszy post!
Rɪᴋᴇʀ
3
To rodzaj niedopowiedzenia; outgolfing xnor w Pythonie to nie lada wyczyn. Widzę trochę miejsca na poprawę. Jakiś czas pętla powinna zapisać bajt i sztuczka może uratować kilka. exec
Dennis
5

Befunge, 98 91 bajtów

Wykorzystuje to ,zamiast o, ponieważ pozwala nam to zaoszczędzić kilka bajtów.

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

Wypróbuj online!

Wyjaśnienie

Biorąc pod uwagę numer etapu, n , zaczynamy od obliczenia następujących trzech parametrów wzorca:

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

Jump_len normalizuje się uniknąć przy czym zero dla etapu 1 kangura z:

jump_len += !jumplen    

Możemy wtedy wyjście wzór skok przez iteracji nad x i y współrzędne obszaru wyjściowego i obliczeniem odpowiedniej charater do wyjścia dla każdej lokalizacji. Y współrzędnych odlicza z n - 1 0, a x współrzędnych odlicza od szerokości - 1 do 0. określenia, czy wymaga kropki wykazać za pomocą następującego wzoru:

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

Wartość logiczna show_dot jest używana jako indeks tabeli w celu ustalenia rzeczywistego znaku, który ma zostać wyprowadzony w każdej lokalizacji. Aby zaoszczędzić miejsce, używamy początku ostatniego wiersza źródła jako tej tabeli, dlatego nasza opostać kończy się na ,.

James Holderness
źródło
5

J , 28 25 bajtów

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

Zaoszczędź 3 bajty dzięki @ Conor O'Brien .

Jest to oparte na sztuczce palindrom z rozwiązania @ muddyfish .

Wypróbuj online!

Wyjaśnienie

' 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
mile
źródło
Alternatywnym podejściem do 31 bajtów: ' o'{~3 :'(}."1,.~|."1)^:y=i.y'. Chciałbym znaleźć sposób na usunięcie tego wyraźnego czasownika ... Cholera ^:.
Conor O'Brien
@ ConorO'Brien Dzięki, to pomaga, myślę, że będzie krótszy, jeśli milczący
mile
@ ConorO'Brien Zrobiłem to milcząco, to jest rzeczywiście krótsze!
mile
Niesamowite! To jest niesamowite. Ciągle zapominam o u&vdyadycznym używaniu - całkiem fajnie.
Conor O'Brien
4

Pyke, 11 bajtów

XFd*\o+Q^Vs

Wypróbuj tutaj!

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

Haskell , 100 bajtów

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

Wypróbuj online! Zastosowanie: k 3.

Wyjaśnienie:

Biorąc pod uwagę wiersz r, ustawiana jest kolumna ci m = 2(n-1)an, ojeśli c mod mjest równe rlub m-r. Najbardziej zewnętrzne rozumienie listy ustawia zakres rod n-1do 0, następne ustawia zakres cod 0do, m*2^(n-1)a najbardziej wewnętrzny działa jako warunkowe zwracanie, 'o'jeśli powyższa formuła jest spełniona i ' 'inaczej. Daje to listę ciągów, które są przekształcane w pojedynczy ciąg oddzielony znakiem nowej linii unlines. Ponieważ n=1funkcja generuje błąd dzielenia przez zero, więc ten przypadek jest obsługiwany jawnie w pierwszym wierszu.

Laikoni
źródło
Naprawdę podoba mi się ta ['o'|mod c m`elem`[m-r,r]]część!
flawr
4

C #, 180, 173 171 bajtów

Nie wygrasz tego, zamieszczając post dla innych zawodników C # jako coś, co mogą pokonać.

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

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

edycja: -7 bajtów dzięki @KevinCruijssen

edycja: -2 bajty, uproszczone jeśli

CSharpie
źródło
1
+1 Niektóre rzeczy do gry w golfa: Ints można umieścić wewnątrz pętli for, a także można dodać ,i; możesz użyć ponownie izamiast n-1po sprawdzeniu stanu; ||może być |; j++można usunąć i ++dodać do j. Tak więc w sumie: (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 bajtów )
Kevin Cruijssen
@KevinCruijssen Nice catch! Zaktualizuję, gdy wrócę z pracy.
CSharpie
@KevinCruijssen I allready golfed się z ||a &&jednak przechowywane następnie w całym programie.
CSharpie
3

Pyth , 30 bajtów

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

Program, który pobiera liczbę całkowitą i wypisuje wynik. Używa znaku cudzysłowu "zamiast o.

Wypróbuj online!

Jak to działa

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
TheBikingViking
źródło
3

Python 2 , 115 113 108 98 bajtów

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

Wypróbuj online!

Używanie range(-n+1,n-1)do tworzenia bezwzględnej liczby spacji między dnem a ogenerowaniem

  o
 o
o
 o

a następnie dołączając kolejne kopie, obracając wszystko o 90º i dołączając ostatnią ow prawym dolnym rogu

Pręt
źródło
3

J , 58 47 bajtów

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

Zaoszczędzono 11 bajtów, korzystając z idei macierzy tożsamości z rozwiązania @ flawr .

Wypróbuj online!

Proste zastosowanie definicji.

Wyjaśnienie

Dla n = 3tworzy macierz tożsamości z rzędu n .

1 0 0
0 1 0
0 0 1

Następnie wykonaj kopię lustrzaną

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

Powtórz to 2 n -1 razy i upuść nagłówek każdego rzędu na duplikaty

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

Użyj tych wartości jako wskaźników do tablicy char, [' ', 'o']aby wygenerować tablicę 2d char

  o   o   o   o  
 o o o o o o o o 
o   o   o   o   o
mile
źródło
3

JavaScript (ES6), 83 bajty

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>

Neil
źródło
3

Galaretka , 11 bajtów

ŒḄ¡ḶUz1Ṛa⁶Y

TryItOnline!

W jaki sposób?

Używany znak do wydruku to 0.

Opiera się na metodzie odpowiedzi Dennisa na poprzednie pytanie dotyczące kangurów.

ŒḄ¡Ḷ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
Jonathan Allan
źródło
2
Miły. Te więzi z moim roztwór odniesienia ŒḄ¡Ṭ€z0o⁶ṚY.
Dennis
3

MATL, 27 bajtów

XyPt3LZ)2&Pht4LZ)lGqX"h48*c

Wypróbuj to w MATL Online

Suever
źródło
2

Python 3 , 177 bajtów

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

Wypróbuj online!

Henke
źródło
2

Perl 6 , 104 93 88 bajtów

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

Wstawia odo tablicy 2D, a następnie drukuje.

smls
źródło
2

05AB1E , 16 bajtów

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

Wypróbuj online!

Dlaczego i jak?

                 # 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.
Urna Magicznej Ośmiornicy
źródło
1

Java 8, 254 bajty

Gra w golfa:

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

Nie golfowany:

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

}

Wyjście programu:

o

 o o
o o o


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


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

źródło
0

PHP, 157 bajtów

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

Nie golfowany:

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

}
Kodos Johnson
źródło
Można zastąpić każdy 'o'z 1a każdy ''z 0. Mam nadzieję, że to działa, również spacje można zastąpić przez Olub 9. Ważny jest wzór, zgodnie z zasadami. Ale najpierw sprawdź
Ismael Miguel