Disegna alcune vette


33

Scrivi un programma o una funzione che disegna una catena montuosa, in cui ogni successiva vetta più grande è "dietro" quelle davanti e alterna quale lato è visibile.

Questa è una catena montuosa di dimensioni 1

/\

Questa è una catena montuosa di dimensioni 2

 /\
/\ \

Questa è una catena montuosa di dimensioni 3

  /\
 / /\
/ /\ \

Questa è una catena montuosa di dimensioni 4

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

Questa è una catena montuosa di dimensioni 5

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

E così via.

Ingresso

Un unico intero positivo in qualsiasi formato conveniente , n > 0.

Produzione

Una rappresentazione in arte ASCII della catena montuosa, seguendo le regole di cui sopra. Le linee guida iniziali / finali o altri spazi bianchi sono opzionali, a condizione che i picchi si allineino adeguatamente.

Regole

  • È accettabile un programma completo o una funzione. Se una funzione, è possibile restituire l'output anziché stamparlo.
  • Sono vietate le scappatoie standard .
  • Si tratta di quindi si applicano tutte le normali regole del golf e vince il codice più breve (in byte).

Risposte:


14

Carbone , 16 byte

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

Provalo online!

Come?

Nλinserisce la dimensione della montagna più grande in λ. Fλ«esegue un loop su valori di ιfrom 0through λ-1. (La chiusura »è implicita alla fine del programma.)

All'interno del ciclo, P↘⁻λιcalcola λ-ιe disegna, senza spostare successivamente il cursore, una linea di quella lunghezza che va a sud-est. In base alla sua direzione, questa linea sarà composta da \personaggi. si sposta di un passo verso ovest e ↙¹traccia una linea di lunghezza 1 in direzione sud-ovest (fatta di /). Infine, ‖T→riflette orizzontalmente il disegno, trasformando i caratteri come appropriato: \diventa /e /diventa \.

L'aggiunta dell'istruzione dump all'inizio del loop ( provalo ) ci consente di vedere la progressione:

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

2
Immagino che questo sia il linguaggio ideale per la sfida :-)
ETHproductions

@ETHproductions Questa lingua è stata creata appositamente per l'arte ASCII. Ha anche una sua codepage.
Erik the Outgolfer,

@EriktheGolfer Ho il mio linguaggio artistico ASCII (non implementato), chiamato Crayon . I documenti al momento sono un po 'persi perché sono nel mezzo di spostarli, ma puoi vederli quasi tutti qui . Mi chiedo quanto sarebbe breve un programma Crayon per questo rispetto a Charcoal ...
ETHproductions

@ETHproductions Quando lo implementerai? Esiste una chat room o posso crearne una (chiamata "Crayon Implementation")?
Erik the Outgolfer,

@EriktheGolfer Sfortunatamente, non so quando avrò il tempo di implementarlo. Ma puoi creare una chat se vuoi ;-)
ETHproductions

7

JavaScript (ES6), 75 byte

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

Il programma completo è attualmente leggermente più breve della funzione ricorsiva:

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

6

Python 2, 67 byte

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

Stampa riga per riga, accumulando la stringa saggiungendo alternativamente una barra a sinistra oa destra in base alla parità corrente di n. Prefissi con nspazi.

Un modo alternativo per aggiornare era della stessa lunghezza:

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

Un metodo ricorsivo era più lungo (70 byte).

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

6

Haskell, 77 byte

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

Uso:

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

Stampa riga per riga, accumulando la stringa s aggiungendo alternativamente una barra a sinistra oa destra in base alla parità corrente di n. Prefissi con spazi n-1.


5

Lotto, 202 byte

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

Accetta l'input come parametro della riga di comando. Cade attraverso per eseguire l'ultimo loop.


@TimmyD Mi dispiace, ho digitato durante il golf. Riparato ora.
Neil,


5

Haskell, 117 107 105 97 90 byte

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

Provalo su Ideone. Modifica: salvato 8 byte con un'idea di Neil.

Versione non golfata:

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)

Approccio ricorsivo La forma per nviene generata aggiungendo uno spazio davanti a ciascuna linea della n-1forma e prendendo l'ultima linea di n-1e aggiungendo "/ "prima se nè dispari o " \"dopo se nè pari ... o così ho pensato prima di notare che quest'ultimo passaggio è invertito per tutti i passaggi ricorsivi quando il finale nè dispari. Pertanto bviene passato un flag che alterna ogni chiamata ricorsiva e determina se la parte di montagna successiva viene aggiunta a sinistra oa destra.


1
Piuttosto che il confronto bdi odd nvolta in volta, si può non solo passare una bandiera nella all'inizio e capovolgere su ogni chiamata ricorsiva? Qualcosa di simile f n = unlines(p 0 n)e let m = p (1-b) (n-1).
Neil,

Lanciare -bè un altro carattere fuori.
xnor

@xnor Grazie per il suggerimento, ma ho trovato un altro modo per giocare a golf che deve bessere 0o 1.
Laikoni,

2

Java 7.130 byte

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

}

Bella risposta, +1. Puoi giocare a golf di 2 byte: n%2a n--%2, ed entrambi --na n. EDIT: E 1 altro aggiungendo ,x=s+"\n"e modificando entrambi s+"\n"a x. (Quindi in totale: 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 byte )
Kevin Cruijssen

0

C ++ 138 (funzione)

Funzione :-

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

Programma 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 funzione _getch()può avere nomi di prototipi diversi tra compilatori diversi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.