Скачуть кенгуру


36

Попередня історія

Відмова від відповідальності: Може містити складену інформацію про кенгуру.

Кенгуру проходять кілька стадій розвитку. Коли вони дорослішають і сильніші, вони можуть стрибати вище і довше, і вони можуть більше стрибати, перш ніж голодувати.

У першій стадії кенгуру дуже мало і зовсім не може стрибати. Незважаючи на це, постійно потребує харчування. Ми можемо представити зразок діяльності кенгуру на етапі 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 схема активності складається з 2 n-1 V-подібних стрибків висотою n .

Наприклад, для 4 етапу є 8 стрибків висотою 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 як вхід і друкує або повертає ASCII художнє зображення сценічної дії кенгуру n .

Доступні оточуючі пробіли та коди відхилення ANSI до тих пір, поки візерунок виглядатиме так, як зображено вище.

Якщо ви вибрали функцію, яка повертає результат, вона повинна повернути один рядок або масив символів, який відображає належний вихід при друкуванні. Повернення масиву рядків не дозволено.

Ви можете використовувати будь-який символ для друку, непробільний простір замість нього o, якщо він є узгодженим у межах дії та в усіх шаблонах вашої відповіді.

Це ; може виграти найкоротша відповідь у байтах!


Мені потрібно певне уточнення. Ви сказали, що можете використовувати будь-який символ для представлення o. Чи можете ви також використовувати будь-який символ для представлення пробілів (якщо вони різні?)?
Кодос Джонсон

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
Цікавіше, розумніше за блискавку.
Чарівний восьминіг Урна

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]отримаємо (для 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 !!
Луїс Мендо

Дякую !
flawr

9

Вугілля деревне , 14 байт

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

Спробуйте в Інтернеті!

Пояснення

Nλвводить ціле число в λ. P^є різноспрямованою друку (SE і SW) з ×λo(рядок множення λз o). Потім F⁻λ¹запускає цикл a для циклу λ - 1, в якому ‖O→відображається вся справа праворуч із перекриттям.


" P^- це багатонаправлений друк (SE та SW) " Класно, це те, що ви не дуже часто бачите в мовах програмування!
Кевін Кройсейсен


7

Python 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

Python 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
Це якесь заниження; перевиконання кнора в Python - це не маленький подвиг. Я бачу місце для вдосконалення. Через деякий час цикл повинен зберегти байти і трюк може заощадити трохи більше. exec
Денніс

5

Befunge, 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 кенгуру з:

jump_len += !jumplen    

Потім ми можемо вивести схему стрибків, повторивши координати x і y вихідної області та обчисливши відповідний характер для виведення для кожного місця. Координата 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.

Збережено 3 байти завдяки @ Conor O'Brien .

Це засновано на паліндром трик @ 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'. Я б хотів, щоб я міг знайти спосіб видалити це явне дієслово ... Дарн ^:.
Conor O'Brien

@ ConorO'Brien Дякую, що це допомагає, я думаю, що це буде коротше, якщо мовчати
миль

@ ConorO'Brien Я зробив це негласно, це справді коротше!
миль

Дивовижно! Це досить приголомшливо. Я постійно забуваю про u&vдіадичне використання - досить приємно.
Conor O'Brien


4

Haskell , 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, стовпець cі m = 2(n-1)а oвстановлюється, якщо c mod mдорівнює rабо m-r. Зовнішнє розуміння списку встановлює діапазон rвід n-1до 0, наступне встановлює діапазон cвід 0до, m*2^(n-1)а найпотужніше виступає як умовне повернення, 'o'якщо вищезгадана формула виконується та ' 'інше. Це дає список рядків, який перетворюється на один рядок, відокремлений новим рядком unlines. Для n=1функції створюється помилка поділу на нуль, тому цей випадок обробляється явно в першому рядку.


Мені дуже подобається ['o'|mod c m`elem`[m-r,r]]частина!
невдача

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

редагувати: -7 байт завдяки @KevinCruijssen

редагувати: -2 байти, спрощено, якщо


1
+1 Деякі речі для гольфу: вставки можна помістити всередину фор-петлі, а також можна додати ,i; ви можете повторно використовувати iзамість n-1цього, якщо перевірка if; ||може бути |; 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 байти )
Кевін Кройсейсен

@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

Python 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.

Збережені 11 байт , використовуючи одиничну матрицю ідею від @ flawr - х рішень .

Спробуйте в Інтернеті!

Безпосереднє застосування визначення.

Пояснення

Для 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

JavaScript (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

СпробуйтеItOnline!

Як?

Використовуваний символ для друку є 0.

Спирається на метод відповіді Денніса на його попереднє запитання про кенгуру.

ŒḄ¡Ḷ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

Perl 6 , 104 93 88 байт

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

Вставляє oв 2D масив, а потім друкує його.



1

Java 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. Важливим є шаблон, згідно з правилами. Але перевірте спочатку
Ісмаель Мігель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.