Прыгающие кенгуру


36

Предыстория

Отказ от ответственности: может содержать вымышленную информацию о кенгуру.

Кенгуру пересекают несколько этапов развития. Когда они становятся старше и сильнее, они могут прыгать выше и дольше, и они могут прыгать больше раз, прежде чем проголодаться.

На стадии 1 , кенгуру очень мало и не может прыгать на всех. Несмотря на это, постоянно требует питания. Мы можем представить образец активности кенгуру на стадии 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 шаблона активности кенгуру stage n .

Допускается окружающий пробел и escape-коды ANSI, если шаблон выглядит точно так, как показано выше.

Если вы выбираете функцию, которая возвращает выходные данные, она должна возвращать одну строку или массив символов, который отображает правильный вывод при печати. Возвращение массива строк не допускается.

Вместо этого вы можете использовать любой печатный символ без пробелов o, если он согласован с шаблоном действия и со всеми шаблонами в вашем ответе.

Это ; пусть победит самый короткий ответ в байтах!


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

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
Поздравляю с 20к !!
Луис Мендо

Спасибо !
flawr

9

Древесный уголь , 14 байтов

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

Попробуйте онлайн!

объяснение

Nλвводит целое число в λ. P^является разнонаправленной печатью (SE и SW) из ×λo(умножение строки на λс o). Затем F⁻λ¹запускается цикл for λ - 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
Это своего рода преуменьшение; превзойти xnor в 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 области вывода и вычисляя соответствующий характер для вывода для каждого местоположения. У координат отсчет от п - 1 до 0, и х координат отсчета от ширины - от 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 байта благодаря @ Конор О'Брайен .

Это основано на уловке палиндрома от @ muddyfish's растворе .

Попробуйте онлайн!

объяснение

' 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'. Хотел бы я найти способ удалить этот явный глагол ... Черт ^:.
Конор О'Брайен

@ ConorO'Brien Спасибо, что действительно помогает, я думаю , что это будет короче , если неявные
мили

@ ConorO'Brien Я сделал это молчаливым, это действительно короче!
мили

Потрясающе! Это довольно круто. Я постоянно забываю о диадическом использовании - u&vдовольно приятно.
Конор О'Брайен


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)an 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]]часть!
flawr

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 Я уже играл в гольф ||и &&продолжал в полной программе.
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 решений .

Попробуйте онлайн!

Прямое применение определения.

объяснение

For 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

TryItOnline!

Как?

Печатаемый символ используется 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 байта

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

}

Выход программы:

o

 o o
o o o


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


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

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

}

Вы можете заменить каждый 'o'с 1и каждый ''с 0. Надеюсь, что это работает, Кроме того, пробелы могут быть заменены Oили 9. Важным является шаблон, согласно правилам. Но сначала проверьте
Исмаэль Мигель
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.