Desenhe alguns picos de montanha

33

Escreva um programa ou função que desenhe uma cadeia de montanhas, onde cada pico de montanha maior subsequente está "atrás" dos da frente e alterna qual lado é visível.

Esta é uma cordilheira de tamanho 1

/\

Esta é uma cordilheira de tamanho 2

 /\
/\ \

Esta é uma cordilheira de tamanho 3

  /\
 / /\
/ /\ \

Esta é uma cordilheira de tamanho 4

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

Esta é uma cordilheira de tamanho 5

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

E assim por diante.

Entrada

Um número inteiro positivo único em qualquer formato conveniente , n > 0.

Saída

Uma representação em arte ASCII da cordilheira, seguindo as regras acima. Novas linhas à esquerda / à direita ou outro espaço em branco são opcionais, desde que os picos sejam alinhados adequadamente.

Regras

  • Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
  • As brechas padrão são proibidas.
  • Isso é portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
AdmBorkBork
fonte

Respostas:

14

Carvão , 16 bytes

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

Experimente online!

Quão?

Nλinsere o tamanho da maior montanha em λ. Fλ«executa um loop sobre os valores de ιfrom 0through λ-1. (O fechamento »está implícito no final do programa.)

Dentro do loop, P↘⁻λιcalcula λ-ιe desenha, sem mover o cursor depois, uma linha desse comprimento indo para sudeste. Com base em sua direção, essa linha será composta por \caracteres. move um passo para o oeste e ↙¹desenha uma linha de comprimento 1 indo para sudoeste (composta de /). Finalmente, ‖T→reflete horizontalmente o desenho, transformando os caracteres conforme apropriado: \torna - se /e /torna - se \.

A adição da instrução dump no início do loop ( tente ) nos permite ver a progressão:

    /\
   /  
  /   
 /    
/     
    /\    
   /\ \   
  /    \  
 /      \ 
/        \
    /\    
   / /\   
  / /\ \  
 / /    \ 
/ /      \
    /\    
   /\ \   
  / /\ \  
 / /\ \ \ 
/ /    \ \
    /\    
   / /\   
  / /\ \  
 / / /\ \ 
/ / /\ \ \
DLosc
fonte
2
Eu acho que essa é a linguagem ideal para o desafio :-)
ETHproductions
@ETHproductions Este idioma foi criado especificamente para a arte ASCII. Ele também tem sua própria página de códigos.
Erik the Outgolfer 4/16
@EriktheGolfer Eu tenho minha própria linguagem artística ASCII (não implementada), chamada Crayon . Os documentos estão meio que perdidos no momento porque estou no meio de movê-los, mas você pode ver a maioria deles aqui . Eu me pergunto como curto um programa Crayon para isso seria em comparação com carvão ...
ETHproductions
@ETHproductions Quando você vai implementá-lo? Existe uma sala de bate-papo ou posso fazer uma (chamada "Implementação de lápis de cor")?
Erik the Outgolfer 4/16
@EriktheGolfer Infelizmente, não sei quando terei tempo para implementá-lo. Mas você pode criar uma sala de chat, se quiser ;-)
ETHproductions
7

JavaScript (ES6), 75 bytes

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

Atualmente, o programa completo é um pouco mais curto que a função recursiva:

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

Python 2, 67 bytes

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

Imprime linha por linha, acumulando a sequência sadicionando alternadamente uma barra à esquerda ou à direita com base na paridade atual de n. Prefixos com nespaços.

Uma maneira alternativa de atualizar era do mesmo tamanho:

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

Um método recursivo era mais longo (70 bytes).

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

Haskell, 77 bytes

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

Uso:

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

Imprime linha por linha, acumulando a sequência s adicionando alternadamente uma barra à esquerda ou à direita com base na paridade atual de n. Prefixos com n-1 espaços.

xnor
fonte
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%

Recebe a entrada como um parâmetro da linha de comando. Passa para executar o último loop.

Neil
fonte
@ TimmyD Desculpe, eu digitei enquanto jogava golfe. Corrigido agora.
Neil
5

Ruby, 61 bytes

Uma porta bastante direta da resposta JavaScript da ETHproductions .

->n{s="/\\"
(puts" "*n+s
s=n%2>0?s+" \\":"/ "+s)until 0>n-=1}

Veja em repl.it: https://repl.it/EPU5/1

Ungolfed

->n{
  s = "/\\"
  ( puts " "*n+s
    s = n%2 > 0 ? s+" \\" : "/ "+s
  ) until 0 > n -= 1
}
Jordânia
fonte
5

Haskell, 117 107 105 97 90 bytes

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

Experimente em Ideone. Editar: salvou 8 bytes com uma idéia de Neil.

Versão não destruída:

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)

Abordagem recursiva. A forma de né gerada adicionando um espaço na frente de cada linha da n-1forma e pegando a última linha de n-1e adicionando "/ "antes se nfor ímpar ou " \"depois se nfor par ... ou então pensei antes de perceber que esse último passo é revertido para todas as etapas recursivas quando a final né ímpar. Portanto, bé passada uma bandeira que alterna cada chamada recursiva e determina se a próxima parte da montanha é adicionada à esquerda ou à direita.

Laikoni
fonte
1
Em vez de comparar ba odd ncada vez, você não pode simplesmente passar uma bandeira no início e colocá-la em todas as chamadas recursivas? Algo como f n = unlines(p 0 n)e let m = p (1-b) (n-1).
Neil
Virar para -boutro char off.
Xnor
@xnor Obrigado pela dica, mas eu encontrei outra maneira de jogar ainda mais, que precisa bser 0ou 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;}

Ungolfed

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

}
Numberknot
fonte
Boa resposta, +1. Você pode jogá-lo em 2 bytes: n%2para n--%2e ambos --npara n. EDIT: E mais 1 adicionando ,x=s+"\n"e alterando ambos s+"\n"para x. (Assim, no 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 (função)

Função: -

#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: a função _getch()pode ter diferentes nomes de protótipos em diferentes compiladores.

Mukul Kumar
fonte