カンガルーの跳躍


36

バックストーリー

免責事項:カンガルーに関する情報が含まれている場合があります。

カンガルーはいくつかの開発段階を通過します。彼らは年をとって強くなるにつれて、より高く、より長くジャンプすることができ、空腹になる前に何度もジャンプすることができます。

ステージ1では、カンガルーは非常に小さく、まったくジャンプできません。これにもかかわらず、常に栄養が必要です。このようにステージ1のカンガルーの活動パターンを表すことができます。

o

ステージ2では、カンガルーは小さなジャンプをすることができますが、空腹になる前に2つを超えることはできません。このようにステージ2のカンガルーの活動パターンを表すことができます。

 o o
o o o

ステージ2の後、カンガルーはすぐに改善します。その後の各段階で、カンガルーは少し高く(グラフィック表示では1単位)、2倍にジャンプできます。たとえば、ステージ3のカンガルーの活動パターンは次のようになります。

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

ステージnの場合、アクティビティパターンは、高さn2 n-1個の V字型ジャンプで構成されます。

たとえば、ステージ4の場合、高さ4のジャンプが8回あります。

   o     o     o     o     o     o     o     o
  o o   o o   o o   o o   o o   o o   o o   o o
 o   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
スペースは空白にする必要があります。実際のスペースを使用するか、制御コードを使用してカーソルを移動できますが、印刷可能なスペース以外の文字は使用できません。
デニス

回答:


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
面白い、ジッパーよりも賢い。
魔法のタコUr

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)回と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

これから、不要な列を削除します。 A(:,n+1:n:end)=[];


8
20kおめでとうございます!!
ルイスメンドー

``ありがとう ''ありがとうございました ``あなたに感謝します!
flawr

9

、14バイト

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

オンラインでお試しください!

説明

Nλに整数を入力しλます。P^多方向印刷の(SE及びSW)である×λo(列乗算λとはo)。次にF⁻λ¹、forループλ - 1時間を実行します。このループで‖O→は、すべてが重複して右側に反映されます。


P^多方向印刷(SEおよびSW)」クール、それはプログラミング言語ではあまり見られないものです!
ケビンCruijssen


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、2つのネストされた範囲、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でのoutgolfing xnorは小さな偉業です。改善の余地があります。whileループは1バイトを節約するはずで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を指定すると、パターンの次の3つのパラメーターを計算することから始めます。

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は 0に1、および- Xは、からカウントダウン座標:我々は、ドットは、以下の式で示される必要があるかどうかを決定する0と1 -

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

show_dotのブール値は、各場所で出力するように実際の文字を決定するために、テーブルインデックスとして使用されます。スペースを節約するために、ソースの最後の行の先頭をそのテーブルとして使用します。これが、oキャラクターがである理由,です。


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'。その明示的な動詞を削除する方法を見つけられたらいいのに…ダーン^:
コナーオブライエン

@ ConorO'Brienありがとう、それは助けになります、暗黙の場合は短くなると思います
マイル

@ ConorO'Brien私はそれを暗黙のうちにした、それは確かに短いです!
マイル

驚くばかり!これはすごいです。u&v--quite niceの二項的な使用法を忘れてしまいます。
コナーオブライエン


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 oc mod m等しいrか等しい場合に設定されm-rます。最も外側のリスト内包の範囲セットrからn-10の次のセット、範囲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();
    }
}

編集: @KevinCruijssenのおかげで-7バイト

編集: -2バイト、単純化された場合


1
ゴルフに関する+1:intはforループ内に配置でき、追加することもでき,iます。if-checkの後ではiなく再利用できn-1ます。||することができます|; 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私は出回って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

パイソン2115の 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

Perlの6104の 93 88バイト

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

o2D配列に挿入してから印刷します。


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。重要なのは、ルールに従ったパターンです。しかし、最初に確認してください
イスマエル・ミゲル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.