Gambarkan beberapa puncak gunung

33

Tulis sebuah program atau fungsi yang menarik suatu jajaran gunung, di mana setiap puncak gunung yang lebih besar berikutnya adalah "di belakang" yang ada di depan, dan bergantian sisi mana yang terlihat.

Ini adalah pegunungan dengan berbagai ukuran 1

/\

Ini adalah pegunungan dengan berbagai ukuran 2

 /\
/\ \

Ini adalah pegunungan dengan berbagai ukuran 3

  /\
 / /\
/ /\ \

Ini adalah pegunungan dengan berbagai ukuran 4

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

Ini adalah pegunungan dengan berbagai ukuran 5

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

Dan seterusnya.

Memasukkan

Sebuah bilangan bulat positif dalam format yang nyaman , n > 0.

Keluaran

Representasi seni ASCII dari pegunungan, mengikuti aturan di atas. Leading / trailing newlines atau spasi putih lainnya adalah opsional, asalkan puncak berbaris dengan tepat.

Aturan

  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
AdmBorkBork
sumber

Jawaban:

14

Arang , 16 byte

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

Cobalah online!

Bagaimana?

Nλmasukan ukuran gunung terbesar ke dalam λ. Fλ«menjalankan perulangan nilai ιdari 0melaluiλ-1 . (Penutupan »tersirat di akhir program.)

Di dalam lingkaran, P↘⁻λιhitung λ-ιdan gambar, tanpa menggerakkan kursor sesudahnya, garis sepanjang itu menuju tenggara. Berdasarkan arahnya, baris ini akan terdiri dari \karakter. bergerak satu langkah ke barat, dan ↙¹menggambar garis panjang 1 menuju barat daya (terbuat dari /). Akhirnya, ‖T→secara horizontal mencerminkan gambar, mengubah karakter yang sesuai: \menjadi /dan/ menjadi \.

Menambahkan instruksi dump di awal loop ( coba ) memungkinkan kita untuk melihat perkembangan:

    /\
   /  
  /   
 /    
/     
    /\    
   /\ \   
  /    \  
 /      \ 
/        \
    /\    
   / /\   
  / /\ \  
 / /    \ 
/ /      \
    /\    
   /\ \   
  / /\ \  
 / /\ \ \ 
/ /    \ \
    /\    
   / /\   
  / /\ \  
 / / /\ \ 
/ / /\ \ \
DLosc
sumber
2
Saya kira ini adalah bahasa yang ideal untuk tantangan :-)
ETHproduk
@ ETHproductions Bahasa ini dibuat khusus untuk seni ASCII. Ini juga memiliki codepage sendiri.
Erik the Outgolfer
@EriktheGolfer Saya memiliki bahasa seni ASCII (tidak diterapkan) saya sendiri, yang disebut Crayon . Dokumen agak hilang saat ini karena saya sedang memindahkannya, tetapi Anda dapat melihat sebagian besar di sini . Saya ingin tahu seberapa pendek program Crayon untuk ini dibandingkan dengan Charcoal ...
ETHproduk
@ ETHproductions Kapan Anda akan mengimplementasikannya? Apakah ada ruang obrolan untuk itu atau bisakah saya membuatnya (disebut "Implementasi Krayon")?
Erik the Outgolfer
@EriktheGolfer Sayangnya, saya tidak tahu kapan saya akan punya waktu untuk mengimplementasikannya. Tetapi Anda dapat membuat ruang obrolan jika Anda ingin ;-)
ETHproduk
7

JavaScript (ES6), 75 byte

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

Program lengkap saat ini sedikit lebih pendek daripada fungsi rekursif:

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

Python 2, 67 byte

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

Mencetak baris demi baris, mengakumulasi string sdengan menambahkan garis miring ke kiri atau kanan berdasarkan pada paritas saat ini n. Awalan dengan nspasi.

Cara alternatif untuk memperbarui adalah sama:

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

Metode rekursif lebih panjang (70 byte).

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

Haskell, 77 byte

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

Pemakaian:

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

Mencetak baris demi baris, mengakumulasi string dengan menambahkan slash ke kiri atau kanan secara bergantian berdasarkan paritas n saat ini. Awalan dengan spasi n-1.

Tidak
sumber
5

Batch, 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%

Mengambil input sebagai parameter baris perintah. Jatuh untuk menjalankan loop terakhir.

Neil
sumber
@TimmyD Maaf, saya salah ketik saat bermain golf. Diperbaiki sekarang
Neil
5

Ruby, 61 byte

Port jawaban JavaScript ETHproduk yang cukup mudah .

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

Lihat di repl.it: https://repl.it/EPU5/1

Tidak disatukan

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

Haskell, 117 107 105 97 90 byte

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

Cobalah di Ideone. Sunting: Disimpan 8 byte dengan sebuah ide dari Neil.

Versi tidak disatukan:

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)

Pendekatan rekursif. Bentuk untuk ndihasilkan dengan menambahkan spasi di depan setiap baris n-1bentuk dan mengambil baris terakhir n-1dan menambahkan "/ "sebelum jika nganjil atau " \"setelah jika nbahkan ... atau jadi saya pikir sebelum memperhatikan bahwa langkah terakhir ini terbalik untuk semua langkah rekursif ketika final nganjil. Oleh karena itu bendera bdilewati yang bergantian setiap panggilan rekursif dan menentukan apakah bagian gunung berikutnya ditambahkan ke kiri atau kanan.

Laikoni
sumber
1
Daripada membandingkan buntuk odd nsetiap kali, Anda tidak hanya lulus bendera di pada awal dan flip itu pada setiap panggilan rekursif? Sesuatu seperti f n = unlines(p 0 n)dan let m = p (1-b) (n-1).
Neil
Membalik ke -badalah karakter lain.
xnor
@xnor Terima kasih atas petunjuk, tapi saya menemukan cara lain untuk golf lebih lanjut yang perlu bmenjadi 0atau 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;}

Tidak disatukan

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
sumber
Jawaban yang bagus, +1. Anda dapat golf dengan 2 byte meskipun: n%2untuk n--%2, dan kedua --nuntuk n. Sunting: Dan 1 lagi dengan menambahkan ,x=s+"\n"dan mengubah keduanya s+"\n"menjadi x. (Jadi 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 byte )
Kevin Cruijssen
0

C ++ 138 (fungsi)

Fungsi: -

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

Program lengkap: -

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

CATATAN: fungsi tersebut _getch()mungkin memiliki nama prototipe berbeda di berbagai kompiler.

Mukul Kumar
sumber