Dibuja algunos picos de montaña

33

Escriba un programa o función que dibuje una cadena montañosa, donde cada pico de montaña más grande posterior esté "detrás" de los que están al frente, y alterna qué lado es visible.

Esta es una cordillera de tamaño 1

/\

Esta es una cordillera de tamaño 2

 /\
/\ \

Esta es una cordillera de tamaño 3

  /\
 / /\
/ /\ \

Esta es una cordillera de tamaño 4

   /\
  /\ \
 / /\ \
/ /\ \ \

Esta es una cordillera de tamaño 5

    /\
   / /\
  / /\ \
 / / /\ \
/ / /\ \ \

Y así.

Entrada

Un número entero positivo solo en cualquier formato conveniente , n > 0.

Salida

Una representación ASCII-art de la cordillera, siguiendo las reglas anteriores. Las nuevas líneas iniciales / finales u otros espacios en blanco son opcionales, siempre que los picos se alineen adecuadamente.

Reglas

  • Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
  • Las lagunas estándar están prohibidas.
  • Este es el por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).
AdmBorkBork
fuente

Respuestas:

14

Carbón , 16 bytes

NλFλ«P↘⁻λι←↙¹‖T→

Pruébalo en línea!

¿Cómo?

Nλintroduce el tamaño de la montaña más grande en λ. Fλ«ejecuta un bucle sobre valores de ιa 0través λ-1. (El cierre» está implícito al final del programa).

Dentro del bucle, P↘⁻λιcalcula λ-ιy dibuja, sin mover el cursor después, una línea de esa longitud que va hacia el sureste. Según su dirección, esta línea constará de \caracteres. se mueve un paso hacia el oeste y ↙¹dibuja una línea de longitud 1 que va hacia el suroeste (hecha de /). Finalmente, ‖T→refleja horizontalmente el dibujo, transformando los personajes según corresponda: se \convierte /y se /convierte en\ .

Agregar la instrucción de volcado al comienzo del ciclo ( pruébelo ) nos permite ver la progresión:

    /\
   /  
  /   
 /    
/     
    /\    
   /\ \   
  /    \  
 /      \ 
/        \
    /\    
   / /\   
  / /\ \  
 / /    \ 
/ /      \
    /\    
   /\ \   
  / /\ \  
 / /\ \ \ 
/ /    \ \
    /\    
   / /\   
  / /\ \  
 / / /\ \ 
/ / /\ \ \
DLosc
fuente
2
Creo que este es el lenguaje ideal para el desafío :-)
ETHproductions
@ETHproductions Este lenguaje está creado específicamente para el arte ASCII. También tiene su propia página de códigos.
Erik the Outgolfer el
@EriktheGolfer Tengo mi propio lenguaje de arte ASCII (no implementado), llamado Crayon . Los documentos están un poco perdidos en este momento porque estoy en medio de moverlos, pero puedes ver la mayoría de ellos aquí . Me pregunto qué tan corto sería un programa Crayon para esto en comparación con el carbón vegetal ...
ETHproductions
@ETHproductions ¿Cuándo lo va a implementar? ¿Hay una sala de chat para ello o puedo hacer una (llamada "Implementación de lápices de colores")?
Erik the Outgolfer
@EriktheGolfer Desafortunadamente, no sé cuándo tendré tiempo para implementarlo. Pero puede crear una sala de chat si lo desea ;-)
ETHproductions
7

JavaScript (ES6), 75 bytes

for(n=prompt(s="/\\");n--;s=n%2?s+' \\':'/ '+s)console.log(" ".repeat(n)+s)

El programa completo es actualmente un poco más corto que la función recursiva:

f=n=>n?" ".repeat(--n)+`/\\
`+f(n).replace(/\S.+/g,x=>n%2?x+" \\":"/ "+x):""
ETHproducciones
fuente
6

Python 2, 67 bytes

n=input()
s='/\\'
while n:n-=1;print' '*n+s;s=['/ '+s,s+' \\'][n%2]

Imprime línea por línea, acumulando la cadena sagregando alternativamente una barra diagonal a la izquierda o derecha según la paridad actual de n. Prefijos conn espacios.

Una forma alternativa de actualizar era la misma longitud:

s=n%2*'/ '+s+~n%2*' \\'
s=['/ '+s,s+' \\'][n%2]

Un método recursivo fue más largo (70 bytes).

f=lambda n,s='/\\':n*'_'and' '*~-n+s+'\n'+f(n-1,[s+' \\','/ '+s][n%2])
xnor
fuente
6

Haskell, 77 bytes

0%_=""
n%s=(' '<$[2..n])++s++'\n':(n-1)%(cycle[s++" \\","/ "++s]!!n)
(%"/\\")

Uso:

putStrLn $ f 5
    /\
   / /\
  / /\ \
 / / /\ \
/ / /\ \ \

Imprime línea por línea, acumulando la cadena s agregando alternativamente una barra inclinada a la izquierda o derecha según la paridad actual de n. Prefijos con n-1 espacios.

xnor
fuente
5

Lote, 202 bytes

@echo off
set/af=%1^&1
set m=/\
set s=
for /l %%i in (2,1,%1)do call set s= %%s%%
for /l %%i in (2,1,%1)do call:l
:l
echo %s%%m%
set s=%s:~1%
set/af^^=1
if %f%==1 (set m=%m% \)else set m=/ %m%

Toma la entrada como un parámetro de línea de comando. Se cae para ejecutar el último bucle.

Neil
fuente
@TimmyD Lo siento, he escrito mientras jugaba al golf. Corregido ahora.
Neil
5

Haskell, 117107105 97 90 bytes

b!1=["/\\"]
b!n|m<-(1-b)!(n-1)=map(' ':)m++[[("/ "++),(++" \\")]!!b$last m]
(unlines.(1!))

Pruébalo en Ideone. Editar: guardado 8 bytes con una idea de Neil.

Versión sin golf:

p b 1 = ["/\\"]
p b n = let m = p (1-b) (n-1)
            k = last m
            r = map (' ':) m
        in if b == 1
           then r ++ [k ++ " \\"]
           else r ++ ["/ " ++ k]
f n = unlines(p 1 n)

Enfoque recursivo. La forma para nse genera al agregar un espacio en frente de cada línea de la n-1forma y tomar la última línea de n-1y agregar "/ "antes si nes impar o " \"después si nes par ... o eso pensé antes de notar que este último paso se invierte todos los pasos recursivos cuando el final nes impar. Por lo tanto, bse pasa una bandera que alterna cada llamada recursiva y determina si la siguiente parte de la montaña se agrega a la izquierda o la derecha.

Laikoni
fuente
1
En lugar de comparar ba odd ncada vez, es posible que no sólo tiene que pasar una bandera en al principio y al darle la vuelta en cada llamada recursiva? Algo así como f n = unlines(p 0 n)y let m = p (1-b) (n-1).
Neil
Voltear a -bes otro char off.
xnor
@xnor Gracias por la pista, pero encontré otra forma de jugar más al golf, que debe bser 0o 1.
Laikoni
2

Java 7.130 bytes

String f(int n,String s){String l="";for(int i=1;i++<n;l+=" ");return n>1?n%2<1?l+s+"\n"+f(--n,s+" \\"):l+s+"\n"+f(--n,"/ "+s):s;}

Sin golf

class Mountain {
 public static void main(String[] args) {
    System.out.println(f( 5 , "/\\" ) );
  }
 static String f(int n,String s){
    String l = "";
    for (int i = 1; i++ < n; l += " ") ;
      return n > 1? n % 2 < 1?l + s + "\n" + f(--n , s + " \\")
                           :l + s + "\n" + f(--n , "/ " + s)
                            :s;
    }

}
Nudo numérico
fuente
Buena respuesta, +1. Sin embargo, puede jugar golf por 2 bytes: n%2a n--%2, y ambos --na n. EDITAR: Y 1 más agregando ,x=s+"\n"y cambiando ambos s+"\n"a x. (Entonces, en total: String f(int n,String s){String l="",x=s+"\n";for(int i=1;i++<n;l+=" ");return n>1?n--%2<1?l+x+f(n,s+" \\"):l+x+f(n,"/ "+s):s;} 127 bytes )
Kevin Cruijssen
0

C ++ 138 (función)

Función: -

#define c(X) cout<<X;
#define L(X,Y) for(X=0;X<Y;X++)  

void M(int h){int l=1,r=1,j,H=h,i;L(i,h){for(j=H;j>0;j--)c(" ")L(j,l)c(" /")L(j, r)c("\\ ")c("\ n")(h%2)?(i%2)?r++:l++:(i%2)?l++:r++;H--;}  

Programa completo: -

#include<conio.h>
#include<iostream>

using namespace std;

#define c(X) cout<<X;
#define L(X,Y) for(X=0;X<Y;X++)

void M(int h)
{
    int l=1,r=1,j,H=h,i;

    L(i, h)
    {
        for (j = H;j > 0;j--)
            c(" ")
        L(j, l)
            c(" /")
        L(j, r)
            c("\\ ")
        c("\n")

        (h % 2) ? (i % 2) ? r++ : l++ :(i % 2) ? l++ : r++;
        H--;
    }
}

int main()
{
    int h;
    cin >> h;
    M(h);
    _getch();
    return 0;
}  

NOTA: la función _getch()puede tener diferentes nombres de prototipo en diferentes compiladores.

Mukul Kumar
fuente