ASCII Triangle Ripple

12

D'accord, ma première question sur le golf. S'il vous plaît soyez doux :) Je sais qu'il y a beaucoup trop de puzzles ascii: P mais c'est parti.

La tâche est simple, utilisez votre langage de programmation préféré pour imprimer une ondulation triangulaire. L'entrée doit être de la taille de l'ondulation.

Chaque triangle est régulièrement espacé. Fondamentalement, vous continuez à ajouter les triangles jusqu'à ce qu'il n'y ait pas assez d'espace pour le plus petit triangle.

Vous avez droit à des espaces blancs où vous voulez tant que les ondulations sont identiques à celles de l'exemple avec la bonne taille.

Exemple

q)g 1
__
\/
q)g 2
____
\  /
 \/
q)g 3
______
\    /
 \  /
  \/
q)g 4
________
\  __  /
 \ \/ /
  \  /
   \/
q)g 5
__________
\  ____  /
 \ \  / /
  \ \/ /
   \  /
    \/
q)g 6
____________
\  ______  /
 \ \    / /
  \ \  / /
   \ \/ /
    \  /
     \/
q)g 7
______________
\  ________  /
 \ \  __  / /
  \ \ \/ / /
   \ \  / /
    \ \/ /
     \  /
      \/
q)g 8
________________
\  __________  /
 \ \  ____  / /
  \ \ \  / / /
   \ \ \/ / /
    \ \  / /
     \ \/ /
      \  /
       \/

Comme d'habitude, le code le plus court gagne :)

WooiKent Lee
la source
2
Bien qu'il ne s'agisse pas d'un double exact de Draw Concentric ASCII Hexagons , je ne suis pas sûr que cela ajoute beaucoup plus que l'autre.
Geobits
4
@Geobits IMO est assez différent - la spécification d'entrée est assez différente, la méthode pour déterminer le nombre de formes à dessiner est différente et les triangles! = Hexagones ;-)
Digital Trauma
@WooiKent Je doute maintenant d'avoir bien compris la question. Qu'est-ce qu'une ondulation? Est-ce un ensemble concentrique de triangles, ou autre chose?
Digital Trauma
2
belle question, mais elle est sous-spécifiée. (1) En lisant le texte littéralement, lorsque l'entrée est 1,2 ou 3, nous devons toujours produire trois triangles. (2) Je considérerais comme acquis que chaque ensemble de triangles doit être concentrique, et (3) il semble qu'ils devraient également avoir leurs coins inférieurs sur la même ligne. (4) La séparation horizontale doit-elle être exactement un espace comme indiqué, ou d'autres séparations sont-elles autorisées? (5) Les espaces blancs inutiles sont-ils autorisés à (a, b, c, d) à gauche, à droite, au-dessus, en-dessous?
Level River St
Je pense que c'est plutôt clair, mais pas explicite. Vous dessinez toujours un triangle de la taille donnée, avec des triangles imbriqués de taille n-3, n-6, n-9, etc.
Sparr

Réponses:

5

Pyth, 31 octets

VhQ+J<t+++*Nd*N"\ "d*Q\_Q_XJ"\/

Manifestation.

Explication:

VhQ+J<t+++*Nd*N"\ "d*Q\_Q_XJ"\/
                                   Implicit: Q = eval(input()), d = ' '
VhQ                                for N in range(Q + 1):
                                   Concatenate:
          *Nd                      N spaces
         +   *N"\ "                N of the string "\ "
        +          d               another space
       +            *Q\_           Q of the string "_"
                                   If N = 2 and Q = 7, the string so far is:
                                   "  \ \  _______" and we want
                                   " \ \  _" as the left half.
      t                            Remove the first character.
     <                  Q          Take the first Q characters remaining.
                                   This is the left half of the triangle ripple.
    J                              Store it in J.
                          XJ"\/    Translate \ to / in J.
                         _         Reverse it.
   +                               Concatenate the left and right halves and print.
isaacg
la source
7

GNU sed -nr, 210

Un début:

s/1/__/g
p
s#_(.*)_#\\\1/#
s#\\__#\\  #
s#__/#  /#
ta
:a
p
s#(.*) _{6}(_*) # \1\\  \2  /#;ta
s#(.*)  (  )# \1\2#;
s#(.*) _(_*)_ # \1\\\2/#
y/_/ /
Tc
:b
p
:c
s#(.*)((\\)  ( *)(/)|()()()\\/)# \1\3\4\5#;tb

L'entrée est un entier unaire positif via STDIN, selon cette méta-question .

Production:

$ for i in 1 11 111 1111 11111 111111 1111111; do sed -rnf triripple.sed <<< $i; done
__
\/

____
\  /
 \/

______
\    /
 \  /
  \/

________
\  __  /
 \ \/ /
  \  /
   \/

__________
\  ____  /
 \ \  / /
  \ \/ /
   \  /
    \/

____________
\  ______  /
 \ \    / /
  \ \  / /
   \ \/ /
    \  /
     \/

______________
\  ________  /
 \ \  __  / /
  \ \ \/ / /
   \ \  / /
    \ \/ /
     \  /
      \/

$ 
Traumatisme numérique
la source
5

C, 165 octets

n,x,y,b,c;main(c,v)char**v;{for(n=atoi(v[1]);y<=n;++y){for(x=-n;x<n;++x){b=2*n-abs(2*x+1);c=b-2*y+2;b-=6*y;putchar(b>0?95:b<-4&c>0&c%4==1?"/\\"[x<0]:32);}puts("");}}

Avant les étapes de golf qui détruisent la lisibilité:

#include <stdio.h>
#include <stdlib.h>

int main(int c, char** v) {
    int n = atoi(v[1]);
    for (int y = 0; y <= n; ++y) {
        for (int x = -n; x < n; ++x) {
            int b = 2 * n - abs(2 * x + 1);
            int c = b - 2 * y + 2;
            b -= 6 * y;
            putchar(b > 0 ? 95 : 
                    b < -4 && c > 0 && c % 4 == 1 ? "/\\"[x<0] : 32);
        }
        puts("");
    }
}

Cela fait une boucle sur tous les caractères du rectangle contenant la figure et évalue les équations de ligne qui séparent l'intérieur du triangle de l'extérieur, ainsi que celles qui séparent les différentes parties du triangle.

Reto Koradi
la source
Beau travail avec les mathématiques. Vous devriez essayer celui-ci: codegolf.stackexchange.com/q/51396/21348
edc65
156:n,x,y,b,c;main(c,v)char**v;{for(n=atoi(v[1]);y<=n;++y)for(x=-n;x<=n;putchar(x++-n?b>6*y?95:b<6*y-4&c>0&c%4==1?"/\\"[x<1]:32:10))c=(b=2*n-abs(2*x+1))-2*y+2;}
edc65
4

Rétine , 182 octets

1
_
^
#$_
((`#([^#]*?)( ?)_(_*)_( ?)([^#]*?)$
$0# $1\$3/$5
+)`\\( ?)_(_*)_( ?)/(?=[^#]*$)
\ $1$2$3 /
#( *(\\ )*\\ *)  ( *(/ )*/)$
$0# $1$3
)`#( *(\\ )*)\\/(( /)*)$
$0# $1$3
# 
#
^#
<empty line>

Prend l'entrée comme unaire.

Chaque ligne doit aller dans son propre fichier et #doit être remplacée par un retour à la ligne dans les fichiers. Ceci n'est pas pratique, mais vous pouvez exécuter le code tel quel comme un fichier avec l' -sindicateur, en conservant les #marqueurs. #Si vous le souhaitez, vous pouvez changer les 's en sauts de ligne dans la sortie pour plus de lisibilité. Par exemple:

> echo -n 1111|retina -s triangle|tr # '\n'
________
\  __  /
 \ \/ /
  \  /
   \/

Le code n'est pas trop bien joué (pour l'instant).

randomra
la source
2

C - 206 octets

i,j,m,k,a,b;main(i,v)char**v;{m=atoi(v[1])*2;while(k<m*(m/2+1)){i=k/m;j=k%m;a=i*3,b=(i+j)%2;putchar("_\\/ "[j>=a&&j<m-a?0:j>i-2&&b&&j<i*3-1&&j<m/2?1:j<=m-i&&!b&&j>m-a&&j>=m/2?2:3]);if(j==m-1)puts("");k++;};}

 x,m,i,j,a,b;
int main(x,v)char**v;{
    m=atoi(v[1])*2;
    for(i=0;i<m/2+1;i++){
        for(j=0;j<m;j++){
            a=i*3,b=(i+j)%2;
            j>=a&&j<m-a?a=0:j>=i-1&&b&&j<i*3-1&&j<m/2?a=1:j<=m-i&&!b&&j>m-a&&j>=m/2?a=2:(a=3);putchar("_\\/ \n"[a]);
        }
        puts("");
    }
}

Exemple de sortie

Pauls-iMac:ppcg pvons$ for i in $(seq 1 7); do ./a.out $i; done
__
\/
____
\  /
 \/ 
______
\    /
 \  / 
  \/  
________
\  __  /
 \ \/ / 
  \  /  
   \/   
__________
\  ____  /
 \ \  / / 
  \ \/ /  
   \  /   
    \/    
____________
\  ______  /
 \ \    / / 
  \ \  / /  
   \ \/ /   
    \  /    
     \/     
______________
\  ________  /
 \ \  __  / / 
  \ \ \/ / /  
   \ \  / /   
    \ \/ /    
     \  /     
      \/      
paulvs
la source
1
Vous pouvez réduire cela un peu. Profitant de l'ancien style C, vous pouvez déclarer des variables sans type si elles le sont int. De plus, si vous les déclarez à la portée globale, ils sont automatiquement initialisés à 0. Au lieu d'avoir un tas d' putchar()appels dans différentes branches, vous pouvez utiliser un seul appel et remplacer les ifinstructions par des opérateurs ternaires. Bien sûr, cela devient difficile à lire de cette façon, mais c'est complètement dans l'esprit de ce site d'écrire du code laid s'il est plus court. :)
Reto Koradi
Merci @RetoKoradi, je l'ai réduit de 279 à 214 en mettant en œuvre vos suggestions :) Je pense que je devrais améliorer mon algorithme pour obtenir d'autres améliorations.
paulvs
Oui, une fois que vous avez dépassé la mécanique, la clé est de trouver des règles qui simplifient au maximum la logique. Si vous regardez ma solution, qui est fondamentalement très similaire, j'ai trouvé que la logique s'est un peu simplifiée en plaçant l'origine de la coordonnée horizontale au centre du triangle. De cette façon, je pourrais profiter de la symétrie. Et d'autres ont probablement trouvé des approches encore meilleures. Il est vraiment intéressant de voir ce qui peut être fait sur un problème qui semble si simple.
Reto Koradi
1

JavaScript ( ES6 ) 165 180 204

Exécutez l'extrait dans Firefox pour tester. Si le retour de la chaîne n'est pas suffisant, l'utilisation d'alerte pour la sortie représente 2 caractères de plus.

// 165 - return the string
F=n=>
  (i=>{
    for(r='__'[R='repeat'](m=n);i<n;)
      r+=`\n`+' '[R](i)
       +('\\ '[R](t=-~(m>3?i:~-n/3))+' ').slice(0,n-i)
       +'__'[R](m>3?m-=3:0)
       +(' '+' /'[R](t)).slice(i++-n)
  })(0)||r


// 167 - output the string
A=n=>{
  for(i=0,r='__'[R='repeat'](m=n);i<n;)
    r+=`\n`+' '[R](i)
     +('\\ '[R](t=-~(m>3?i:~-n/3))+' ').slice(0,n-i)
     +'__'[R](m>3?m-=3:0)
     +(' '+' /'[R](t)).slice(i++-n);
  alert(r)
}

// TEST
out=x=>O.innerHTML += x+'\n' 

for(k=1;k<13;k++)out(k+'\n'+F(k))
<pre id=O></pre>

edc65
la source