跨越袋鼠


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,活动模式由高度为n2 n-1个 V形跳跃组成。

例如,对于阶段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作为输入并打印或返回阶段n袋鼠活动模式的ASCII艺术表现形式。

只要模式看起来与上面描述的完全一样,就可以使用周围的空格和ANSI转义码。

如果选择返回输出的函数,则它必须返回单个字符串或字符数组,该字符串或字符数组在打印时将显示正确的输出。不允许返回字符串数组。

您可以使用任何可打印的非空格字符代替o,只要它在活动模式中和答案中所有模式中都一致即可。

这是;以字节为单位的最短答案可能会获胜!


我需要澄清一下。您说可以使用任何字符来表示o。您还可以使用任何字符来表示空格吗(只要它们不同?)?
科多斯·约翰逊,

1
空格必须为空白。您可以使用实际的空格,也可以使用控制代码来移动光标,但是不能使用可打印的非空格字符。
丹尼斯

Answers:


8

05AB1E12 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
有趣,比zip聪明。
魔术章鱼缸

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


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中超越xnor并非易事。我确实看到了一些改进的空间。while循环应该节省一个字节,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    

然后,我们可以通过对输出区域的xy坐标进行迭代,并计算要输出到每个位置的适当字符来输出跳转模式。所述ÿ坐标计数从向下Ñ - 1为0,以及X坐标递减计数从宽度 - 1 0。我们确定是否与下式所示的点的需要:

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

所述show_dot布尔值被用作表格索引来确定在每个位置处实际的字符输出。为了节省空间,我们将源代码的最后一行的开头用作该表,这就是为什么我们的o字符最终成为a的原因,


5

J28 25字节

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

由于@ Conor O'Brien节省了3个字节。

这是基于@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'。希望我能找到一种方法删除该显式动词... Darn ^:
科纳·奥布莱恩

@ ConorO'Brien谢谢,这确实有帮助,如果默认的话,它会更短
英里

@ ConorO'Brien我已默认,确实较短!
英里

太棒了!太棒了 我一直忘了u&v--quite nice 的二分用法。
科纳·奥布莱恩

4

Pyke,11个字节

XFd*\o+Q^Vs

在这里尝试!

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

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,如果等于或,则设置一列cm = 2(n-1)一个。最外面的列表解析设定的范围从到的,下一个组的范围从到和最内作为条件返回如果将上述公式满足和其他。这将产生一个字符串列表,该列表将转换为单个换行符,并用分隔字符串。由于该函数会产生零除错误,因此在第一行中明确处理了这种情况。oc mod mrm-rrn-10c0m*2^(n-1)'o'' 'unlinesn=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需要打高尔夫的东西:整数可以放在for循环内,也可以添加,i;您可以重用i而不是n-1在if-check之后;||可以|; 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个字节
凯文Cruijssen

@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

J58 47字节

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

使用@flawr 解决方案中的单位矩阵思想节省了11个字节。

在线尝试!

定义的直接应用。

说明

对于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

Python 3,177字节

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

在线尝试!


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数组中,然后进行打印。


2

05AB1E,16个字节

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

在线尝试!

为什么以及如何?

                 # 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字节

打高尔夫球:

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。根据规则,重要的是模式。但是,验证第一
伊斯梅尔·米格尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.