Onda triangular ASCII

12

Ok, mi primera pregunta de golf. Por favor, sé gentil :) Sé que hay demasiados acertijos ascii: P, pero aquí vamos.

La tarea es simple, use su lenguaje de programación favorito para imprimir una onda triangular. La entrada debe ser del tamaño de la onda.

Cada triángulo está espaciado uniformemente. Básicamente, sigues agregando los triángulos hasta que no haya suficiente espacio para el triángulo más pequeño.

Se le permiten espacios en blanco en cualquier lugar que desee siempre que las ondas sean las mismas que en el ejemplo con el tamaño correcto.

Ejemplo

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

Como de costumbre, el código más corto gana :)

WooiKent Lee
fuente
2
Si bien no es un duplicado exacto de Dibujar hexágonos ASCII concéntricos , no estoy seguro de que agregue mucho sobre el otro.
Geobits
44
@Geobits IMO es lo suficientemente diferente: la especificación de entrada es bastante diferente, el método para calcular cuántas formas dibujar es diferente, y los triángulos! = Hexágonos ;-)
Digital Trauma
@WooiKent Ahora dudo si entendí la pregunta correctamente. ¿Qué es una onda? ¿Es un conjunto concéntrico de triángulos, o algo más?
Trauma digital
2
Buena pregunta, pero está poco especificada. (1) Leyendo el texto literalmente, cuando la entrada es 1,2 o 3, siempre debemos generar tres triángulos. (2) Supongo que cada conjunto de triángulos debe ser concéntrico, y (3) parece que también deben tener sus esquinas inferiores en la misma línea. (4) ¿La separación horizontal tiene que ser exactamente un espacio como se muestra, o se permiten otras separaciones? (5) ¿Se permite un espacio en blanco innecesario a (a, b, c, d) izquierda, derecha, arriba, abajo?
Level River St
Creo que es bastante claro, aunque no explícito. Siempre dibuja un triángulo del tamaño dado, con triángulos anidados de tamaño n-3, n-6, n-9, etc.
Sparr

Respuestas:

5

Pyth, 31 bytes

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

Demostración.

Explicación:

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

GNU sed -nr, 210

Un inicio:

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

La entrada es un entero unario positivo a través de STDIN, según esta metapregunta .

Salida:

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

____
\  /
 \/

______
\    /
 \  /
  \/

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

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

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

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

$ 
Trauma digital
fuente
5

C, 165 bytes

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

Antes de los pasos de golf que destruyen la legibilidad:

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

Esto recorre todos los caracteres del rectángulo que contiene la figura y evalúa las ecuaciones de línea que separan el interior del triángulo del exterior, así como las que separan las diferentes partes del triángulo.

Reto Koradi
fuente
Buen trabajo con las matemáticas. Deberías probar este: 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

Retina , 182 bytes

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

Toma la entrada como unario.

Cada línea debe ir a su propio archivo y #debe cambiarse a nueva línea en los archivos. Esto no es práctico, pero puede ejecutar el código tal como está en un archivo con la -sbandera, manteniendo los #marcadores. Puede cambiar los #'s a nuevas líneas en la salida para facilitar la lectura si lo desea. P.ej:

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

El código no está muy bien desarrollado (todavía).

randomra
fuente
2

C - 206 bytes

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

Salida de ejemplo

Pauls-iMac:ppcg pvons$ for i in $(seq 1 7); do ./a.out $i; done
__
\/
____
\  /
 \/ 
______
\    /
 \  / 
  \/  
________
\  __  /
 \ \/ / 
  \  /  
   \/   
__________
\  ____  /
 \ \  / / 
  \ \/ /  
   \  /   
    \/    
____________
\  ______  /
 \ \    / / 
  \ \  / /  
   \ \/ /   
    \  /    
     \/     
______________
\  ________  /
 \ \  __  / / 
  \ \ \/ / /  
   \ \  / /   
    \ \/ /    
     \  /     
      \/      
paulvs
fuente
1
Puedes recortar esto bastante. Aprovechando el viejo estilo C, puede declarar variables sin un tipo si lo son int. Además, si los declara en el ámbito global, se inicializan automáticamente a 0. En lugar de tener un montón de putchar()llamadas en diferentes ramas, puede usar una sola llamada y reemplazar las ifdeclaraciones con operadores ternarios. Por supuesto, se vuelve difícil de leer de esa manera, pero está completamente en el espíritu de este sitio escribir código feo si es más corto. :)
Reto Koradi
Gracias @RetoKoradi, lo reduje de 279 a 214 al implementar sus sugerencias :) Creo que necesitaría mejorar mi algoritmo para obtener más mejoras.
paulvs
Sí, una vez que superas la mecánica, la clave es encontrar reglas que simplifiquen la lógica tanto como sea posible. Si miras mi solución, que es fundamentalmente muy similar, descubrí que la lógica se simplificó bastante al colocar el origen de la coordenada horizontal en el centro del triángulo. De esa manera, podría aprovechar la simetría. Y otros probablemente encontraron enfoques aún mejores. Es realmente interesante cuánto se puede hacer en un problema que parece tan engañosamente simple.
Reto Koradi
1

JavaScript ( ES6 ) 165 180 204

Ejecute el fragmento en Firefox para probar. Si devolver la cadena no es suficiente, usar la alerta para la salida es 2 caracteres más.

// 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
fuente