Kangourous bondissant

36

Histoire

Avertissement: Peut contenir des informations inventées sur les kangourous.

Les kangourous traversent plusieurs étapes de développement. En vieillissant et en force, ils peuvent sauter plus haut et plus longtemps, et ils peuvent sauter plus de fois avant d'avoir faim.

Au stade 1 , le kangourou est très petit et ne peut pas sauter du tout. Malgré cela, il a constamment besoin de nourriture. Nous pouvons représenter le modèle d'activité d' un kangourou de stade 1 comme celui-ci.

o

À l'étape 2 , le kangourou peut faire de petits sauts, mais pas plus de 2 avant d'avoir faim. Nous pouvons représenter le modèle d'activité d' un kangourou de stade 2 comme celui-ci.

 o o
o o o

Après la phase 2, le kangourou s’améliore rapidement. À chaque étape suivante, le kangourou peut sauter un peu plus haut (1 unité dans la représentation graphique) et deux fois plus souvent. Par exemple, le modèle d'activité d' un kangourou de stade 3 ressemble à ceci.

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

Pour l'étape n , le modèle d'activité consiste en 2 n-1 sauts en V de hauteur n .

Par exemple, pour l'étape 4 , il y a 8 sauts de hauteur 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

Tâche

Écrivez un programme complet ou une fonction prenant un entier positif n en entrée et imprimant ou renvoyant la représentation artistique ASCII du modèle d'activité d'un kangourou d' étape n .

Les espaces blancs environnants et les codes d'échappement ANSI sont autorisés, à condition que le motif ressemble exactement à l'illustration ci-dessus.

Si vous choisissez une fonction qui renvoie la sortie, elle doit renvoyer une chaîne unique ou un tableau de caractères affichant la sortie correcte à l'impression. Le retour d'un tableau de chaînes n'est pas autorisé.

Vous pouvez utiliser n'importe quel caractère imprimable, sans espace, au lieu de o, tant qu'il est cohérent dans le modèle d'activité et dans tous les modèles de votre réponse.

C'est du ; que la réponse la plus courte en octets soit gagnante!

Dennis
la source
J'ai besoin de clarification. Vous avez dit que vous pouvez utiliser n'importe quel caractère pour représenter o. Pouvez-vous également utiliser n'importe quel caractère pour représenter les espaces (tant qu'ils sont différents?)?
Kodos Johnson
1
Les espaces doivent être vides. Vous pouvez utiliser des espaces réels ou des codes de contrôle pour déplacer le curseur, mais vous ne pouvez pas utiliser de caractères imprimables autres que des espaces.
Dennis
1
codegolf.stackexchange.com/questions/96379/… - Connexes.
Urne Magique Octopus

Réponses:

8

05AB1E , 12 à 10 octets

Îj¹FÐvû},À

Explication:

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

Utilise le codage CP-1252 . Essayez-le en ligne!

Adnan
la source
1
Intéressant, plus intelligent que zip.
Magic Octopus Urn
14

MATLAB, 92 90 86 84 octets

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

Essayez-le en ligne!

eyecrée une matrice d'identité. Si nous le retournons et concaténons l'original, [fliplr(p),p]nous obtenons (pour n=3):

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

Avec repmat(...,1,2^n/2)nous répétons cette 2^(n-1)fois et obtenons

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

De cela, nous supprimons simplement les colonnes inutiles, avec A(:,n+1:n:end)=[];

flawr
la source
8
Félicitations pour 20k !!
Luis Mendo
Merci !
flawr
9

Charbon de bois , 14 octets

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

Essayez-le en ligne!

Explication

Nλentre un entier dans λ. P^est une impression multidirectionnelle (SE et SW) de ×λo(multiplication de chaîne de λavec o). Puis F⁻λ¹exécute un temps de boucle for λ - 1, qui ‖O→reflète le tout à droite avec chevauchement.

DLosc
la source
" P^est une impression multidirectionnelle (SE et SW) " Cool, c'est quelque chose que vous ne voyez pas très souvent dans les langages de programmation!
Kevin Cruijssen le
Je viens de laisser ça ici
Bassdrop Cumberwubwubwub
7

Python 2 , 87 octets

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

Essayez-le en ligne!

Utilise une formule pour les coordonnées (i,j)contenant un cercle, puis joint et imprime la grille. Il y a beaucoup d'odeur de golf ici - ''.join, deux plages imbriquées, forterminée exec, donc il y aura probablement des améliorations.

Xnor
la source
7

Python 2, 83 81 octets

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

Essayez-le en ligne!

infmagic2047
la source
3
Bienvenue chez PPCG! Nice premier post!
Rɪᴋᴇʀ
3
C'est un peu un euphémisme; outgolfing xnor en Python n'est pas un mince exploit. Je vois des améliorations à apporter. Une boucle while devrait sauver un octet et l' execastuce peut économiser un peu plus.
Dennis
5

Befunge, 98 91 octets

Ceci utilise a ,à la place de o, car cela nous permet de sauvegarder quelques octets.

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

Essayez-le en ligne!

Explication

Étant donné le numéro d'étape n , nous commençons par calculer les trois paramètres suivants du motif:

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

Le jump_len est normalisée pour éviter qu'il soit zéro pour un kangourou étape 1 avec:

jump_len += !jumplen    

Nous pouvons ensuite sortir le motif de saut en itérant sur les coordonnées x et y de la zone de sortie et en calculant le caractère approprié à afficher pour chaque emplacement. La coordonnée y compte à rebours de n - 1 à 0 et la coordonnée x à la largeur - 1 à 0. Nous déterminons si un point doit être affiché avec la formule suivante:

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

Le booléen show_dot est utilisé comme index de table pour déterminer le caractère réel à afficher à chaque emplacement. Pour économiser de l'espace, nous utilisons le début de la dernière ligne de source comme cette table, c'est pourquoi notre opersonnage finit par être un ,.

James Holderness
la source
5

J , 28 25 octets

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

Sauvegardé de 3 octets grâce à @ Conor O'Brien .

Ceci est basé sur l'astuce palindrome de la solution de @ muddyfish .

Essayez-le en ligne!

Explication

' 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
milles
la source
Une autre approche pour 31 octets: ' o'{~3 :'(}."1,.~|."1)^:y=i.y'. J'aimerais pouvoir trouver un moyen de supprimer ce verbe explicite ... Darn ^:.
Conor O'Brien
@ ConorO'Brien Merci, ça aide, je pense que ce sera plus court si tacite
miles le
@ ConorO'Brien je l'ai fait tacite, c'est en effet plus court!
miles
Impressionnant! C'est vraiment génial. Je continue à oublier l'usage dyadique de - u&vtout à fait agréable.
Conor O'Brien
4

Pyke, 11 octets

XFd*\o+Q^Vs

Essayez-le ici!

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

Haskell , 100 octets

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

Essayez-le en ligne! Utilisation: k 3.

Explication:

Étant donné une ligne r, une colonne cet m = 2(n-1)un oest défini si c mod mest égal à rou m-r. La compréhension de la liste la plus externe définit la gamme de rpartir n-1pour 0les prochains jeux un de la gamme cde 0la m*2^(n-1)et la plus à l' intérieur agit comme condition de retour 'o'si la formule ci - dessus est remplie et ' 'autrement. Cela donne une liste de chaînes qui est transformée en une seule chaîne séparée par une nouvelle ligne unlines. Pour que n=1la fonction produise une erreur de division par zéro, ce cas est donc traité explicitement dans la première ligne.

Laikoni
la source
J'aime vraiment le ['o'|mod c m`elem`[m-r,r]]rôle!
mardi
4

C #, 180, 173 171 octets

Ne gagnerez pas ceci, en postant pour les autres candidats C # comme quelque chose qu’ils peuvent battre

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

programme complet:

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

edit: -7 octets grâce à @KevinCruijssen

edit: -2 octets, simplifié si

CSharpie
la source
1
+1 Quelques éléments pour jouer au golf: Les ints peuvent être placés à l'intérieur de la boucle, et vous pouvez également ajouter ,i; vous pouvez le réutiliser iau lieu d’ n-1après la vérification if; ||peut être |; j++peut être enlevé et ++peut être ajouté à j. Donc au total: (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 bytes )
Kevin Cruijssen le
@KevinCruijssen Belle prise! Je vous tiendrai au courant une fois de retour du travail.
CSharpie
Je @KevinCruijssen le allready joué au golf ||et &&mais gardé puis dans le programme complet.
CSharpie
3

Pyth , 30 octets

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

Un programme qui prend l'entrée d'un entier et imprime le résultat. Utilise un guillemet "au lieu de o.

Essayez-le en ligne!

Comment ça marche

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
la source
3

Python 2 , 115 113 108 98 octets

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

Essayez-le en ligne!

Utiliser range(-n+1,n-1)pour créer le nombre absolu d’espaces entre le bas et le opour générer

  o
 o
o
 o

puis en ajoutant d'autres copies, en faisant pivoter le tout à 90º et en ajoutant le dernier oen bas à droite

Barre
la source
3

J , 58 47 octets

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

Enregistrement de 11 octets en utilisant l'idée de matrice d'identité de la solution de @ flawr .

Essayez-le en ligne!

Une application simple de la définition.

Explication

Car n = 3, crée la matrice d'identité d'ordre n .

1 0 0
0 1 0
0 0 1

Puis le refléter pour faire

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

Répétez cela 2 n -1 fois et déposez la tête de chaque ligne sur les doublons

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

Utilisez ces valeurs comme indices dans le tableau de caractères [' ', 'o']pour générer un tableau de caractères 2d.

  o   o   o   o  
 o o o o o o o o 
o   o   o   o   o
milles
la source
3

JavaScript (ES6), 83 octets

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
la source
3

Gelée , 11 octets

ŒḄ¡ḶUz1Ṛa⁶Y

TryItOnline!

Comment?

Le caractère imprimable utilisé est 0.

S'appuie sur la méthode utilisée par Dennis pour répondre à sa question précédente au sujet des kangourous.

ŒḄ¡Ḷ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
la source
2
Agréable. Ce lien avec ma solution de référence, ŒḄ¡Ṭ€z0o⁶ṚY.
Dennis
3

MATL, 27 octets

XyPt3LZ)2&Pht4LZ)lGqX"h48*c

Essayez-le sur MATL Online

Suever
la source
2

Python 3 , 177 octets

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

Essayez-le en ligne!

Henke
la source
2

Perl 6 , 104 93 88 octets

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

Insère odans un tableau 2D, puis l’imprime.

smls
la source
2

05AB1E , 16 octets

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

Essayez-le en ligne!

Pourquoi et comment

                 # 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.
Urne Magique De Pieuvre
la source
1

Java 8, 254 octets

Golfé:

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

}

Sortie du programme:

o

 o o
o o o


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


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

la source
0

PHP, 157 octets

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

}
Kodos Johnson
la source
Vous pouvez remplacer chaque 'o'avec 1et chaque ''avec 0. Espérons que cela fonctionne, En outre, les espaces peuvent être remplacés par Oou 9. L'important est le motif, selon les règles. Mais vérifiez d'abord
Ismael Miguel