Narysuj kilka górskich szczytów

33

Napisz program lub funkcję, która rysuje pasmo górskie, w którym każdy kolejny większy szczyt jest „za” tymi z przodu i naprzemiennie, która strona jest widoczna.

Jest to pasmo górskie wielkości 1

/\

Jest to pasmo górskie wielkości 2

 /\
/\ \

Jest to pasmo górskie wielkości 3

  /\
 / /\
/ /\ \

Jest to pasmo górskie wielkości 4

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

Jest to pasmo górskie wielkości 5

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

I tak dalej.

Wkład

Pojedyncza dodatnia w dowolnym, wygodnym formacie , n > 0.

Wydajność

Reprezentacja ASCII pasma górskiego zgodnie z powyższymi zasadami. Wiodące / końcowe znaki nowej linii lub inne białe znaki są opcjonalne, pod warunkiem, że piki odpowiednio się wyrównują.

Zasady

  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
AdmBorkBork
źródło

Odpowiedzi:

14

Węgiel drzewny , 16 bajtów

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

Wypróbuj online!

W jaki sposób?

Nλwprowadza wielkość największej góry do λ. Fλ«uruchamia pętlę nad wartościami ιod 0do λ-1. (Zamknięcie »jest sugerowane na końcu programu.)

Wewnątrz pętli P↘⁻λιoblicza λ-ιi rysuje, bez przesuwania kursora, linię o tej długości idącą na południowy wschód. W zależności od kierunku linia ta będzie się składać ze \znaków. przesuwa się o krok na zachód i ↙¹rysuje linię o długości 1 idącą na południowy zachód (wykonaną z /). Wreszcie ‖T→poziomo odzwierciedla rysunek, przekształcając odpowiednio znaki: \staje się /i /staje \.

Dodanie instrukcji zrzutu na początku pętli ( spróbuj ) pozwala zobaczyć postęp:

    /\
   /  
  /   
 /    
/     
    /\    
   /\ \   
  /    \  
 /      \ 
/        \
    /\    
   / /\   
  / /\ \  
 / /    \ 
/ /      \
    /\    
   /\ \   
  / /\ \  
 / /\ \ \ 
/ /    \ \
    /\    
   / /\   
  / /\ \  
 / / /\ \ 
/ / /\ \ \
DLosc
źródło
2
Wydaje
@ETHproductions Ten język został stworzony specjalnie dla sztuki ASCII. Ma także własną stronę kodową.
Erik the Outgolfer
@EriktheGolfer Mam swój własny (niewdrożony) język artystyczny ASCII, zwany Crayon . Dokumenty są w tej chwili trochę zagubione, ponieważ jestem w trakcie ich przenoszenia, ale większość z nich można zobaczyć tutaj . Zastanawiam się, jak krótki byłby dla tego program
kredkowy
@ETHproductions Kiedy zamierzasz go wdrożyć? Czy jest do tego pokój czatowy, czy mogę go stworzyć (zwany „wdrożeniem kredki”)?
Erik the Outgolfer
@EriktheGolfer Niestety nie wiem, kiedy będę miał czas na jego wdrożenie. Ale możesz stworzyć pokój
rozmów,
7

JavaScript (ES6), 75 bajtów

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

Pełny program jest obecnie nieco krótszy niż funkcja rekurencyjna:

f=n=>n?" ".repeat(--n)+`/\\
`+f(n).replace(/\S.+/g,x=>n%2?x+" \\":"/ "+x):""
ETHprodukcje
źródło
6

Python 2, 67 bajtów

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

Drukuje wiersz po wierszu, akumulując ciąg sprzez naprzemienne dodawanie ukośnika w lewo lub w prawo w oparciu o bieżący parzystość n. Przedrostki ze nspacjami.

Alternatywnym sposobem aktualizacji była ta sama długość:

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

Metoda rekurencyjna była dłuższa (70 bajtów).

f=lambda n,s='/\\':n*'_'and' '*~-n+s+'\n'+f(n-1,[s+' \\','/ '+s][n%2])
xnor
źródło
6

Haskell, 77 bajtów

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

Stosowanie:

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

Drukuje wiersz po wierszu, kumulując ciąg s, naprzemiennie dodając ukośnik w lewo lub w prawo na podstawie bieżącej parzystości n. Przedrostki ze spacjami n-1.

xnor
źródło
5

Partia, 202 bajty

@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%

Pobiera dane wejściowe jako parametr wiersza polecenia. Wpada, aby wykonać ostatnią pętlę.

Neil
źródło
@TimmyD Przepraszamy, pisałem na maszynie podczas gry w golfa. Naprawiono teraz.
Neil,
5

Rubin, 61 bajtów

Dość prosty port odpowiedzi JavaScript ETHproductions .

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

Zobacz na repl.it: https://repl.it/EPU5/1

Bez golfa

->n{
  s = "/\\"
  ( puts " "*n+s
    s = n%2 > 0 ? s+" \\" : "/ "+s
  ) until 0 > n -= 1
}
Jordania
źródło
5

Haskell, 117 107 105 97 90 bajtów

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

Wypróbuj na Ideone. Edycja: Zapisano 8 bajtów dzięki pomysłowi Neila.

Wersja bez golfa:

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)

Podejście rekurencyjne. Kształt dla njest generowany przez dodanie spacji przed każdą linią n-1kształtu i pobranie ostatniego wiersza n-1i dodanie "/ "przed, jeśli njest nieparzyste lub " \"po, jeśli njest parzyste ... tak przynajmniej pomyślałem, zanim zauważyłem, że ten ostatni krok jest odwrócony dla wszystkie rekurencyjne kroki, gdy finał njest nieparzysty. Dlatego bprzekazywana jest flaga, która naprzemiennie wywołuje rekurencję i określa, czy następna część góry zostanie dodana w lewo czy w prawo.

Laikoni
źródło
1
Czy zamiast porównywać bza odd nkażdym razem, nie możesz po prostu przekazać flagi na początku i odwrócić ją przy każdym rekurencyjnym połączeniu? Coś jak f n = unlines(p 0 n)i let m = p (1-b) (n-1).
Neil,
Odwrócenie do -bjest kolejnym char-offem.
xnor
@xnor Dzięki za podpowiedź, ale znalazłem inny sposób na grę w golfa, który musi bbyć 0lub 1.
Laikoni,
2

Java 7130 bajtów

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

Bez golfa

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
źródło
Dobra odpowiedź, +1. Możesz zagrać w golfa o 2 bajty: n%2do n--%2i oba --ndo n. EDYCJA: I jeszcze 1, dodając ,x=s+"\n"i zmieniając oba s+"\n"na x. (Więc w sumie: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 bajtów )
Kevin Cruijssen
0

C ++ 138 (funkcja)

Funkcja: -

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

Pełny program: -

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

UWAGA: funkcja _getch()może mieć różne nazwy prototypów w różnych kompilatorach.

Mukul Kumar
źródło