Bazı dağ zirveleri çizin


33

Bir dağ silsilesi çizen bir program veya işlev yazın; burada daha sonraki her büyük dağ tepe noktası öndeki alanların "arkasında" olur ve hangi tarafın göründüğünü değiştirir.

Bu bir dağ boyutu 1

/\

Bu bir dağ boyutu 2

 /\
/\ \

Bu bir dağ boyutu 3

  /\
 / /\
/ /\ \

Bu bir dağ boyutu 4

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

Bu bir dağ boyutu 5

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

Ve bunun gibi.

Giriş

Herhangi bir uygun formatta tek bir pozitif tamsayı ,n > 0 .

Çıktı

Yukarıdaki kurallara uyarak dağın bir ASCII-sanat temsili. Lider / izleyen yeni hatlar veya diğer boşluklar, dorukların uygun şekilde sıralanması şartıyla isteğe bağlıdır.

kurallar

  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine geri gönderebilirsiniz.
  • Standart boşluklar yasaktır.
  • Bu olduğundan, tüm normal golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Yanıtlar:


14

Kömür , 16 bayt

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

Çevrimiçi deneyin!

Nasıl?

Nλen büyük dağın boyutunu girer λ. Fλ«değerleri üzerinde bir döngü çalışır ιdan 0aracılığıyla λ-1. ( »Program sonunda kapanış yapılır.)

Döngünün içinde, imleci daha sonra hareket ettirmeden, bu uzunluktaki bir çizgiyi güneydoğuya doğru ilerletmeden P↘⁻λιhesaplar λ-ιve çizer. Yönüne bağlı olarak, bu satır \karakterlerden oluşacaktır . bir adım batıya doğru hareket eder ve ↙¹güneybatıya (1 /) yapılmış uzunluktaki bir çizgi çizer . Son olarak, ‖T→çizimleri yatay olarak yansıtır, karakterleri uygun şekilde dönüştürür: \olur /ve /olur\ .

Döküm komutunu döngünün başlangıcına eklemek ( deneyin ) ilerlemeyi görmemize izin verir:

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

2
Sanırım bu meydan okuma için ideal dil :-)
ETHproductions

@ETHproductions Bu dil özellikle ASCII sanatı için yaratılmıştır. Ayrıca kendi kod sayfasına sahiptir.
Outgolfer Erik

@EriktheGolfer Crayon adında kendi (uygulanmamış) ASCII sanat dilimine sahibim . Şu anda doktorlar kayboldu çünkü onları taşımanın tam ortasındayım, ama çoğunu burada görebilirsiniz . Bunun için bir Crayon programının Kömür ile karşılaştırıldığında ne kadar kısa olacağını merak ediyorum ...
ETHproductions

@ETHproductions Ne zaman uygulayacaksın? Bunun için bir sohbet odası var mı yoksa bir tane yapabilir miyim ("Crayon Uygulaması" olarak adlandırılır)?
Outgolfer Erik

@EriktheGolfer Maalesef, ne zaman uygulamak için zamanım olacak bilmiyorum. Ama isterseniz bir sohbet odası oluşturabilirsiniz ;-)
ETHproductions

7

JavaScript (ES6), 75 bayt

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

Tam program şu anda özyinelemeli işlevden biraz daha kısadır:

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

6

Python 2,67 bayt

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

Satır satır yazdırır, dize ssırayla geçerli paritesine bağlı olarak sola veya sağa eğik çizgi ekleyerek sırayla yazdırılır n. Boşluklu önekler n.

Güncellemenin alternatif bir yolu aynı uzunluktaydı:

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

Özyinelemeli bir yöntem daha uzundu (70 byte).

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

6

Haskell, 77 bayt

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

Kullanımı:

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

Satır satır yazdırır, dize dizgesini dönüşümlü olarak n'nin geçerli paritesine göre sola veya sağa eğik çizgi ekleyerek biriktirir. N-1 boşluklu önekleri.


5

Toplu iş, 202 bayt

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

Komut satırı parametresi olarak girdi alır. Son döngüyü uygulamak için düşer.


@TimmyD Üzgünüm, golf oynarken yazdım. Şimdi düzeltildi.
Neil


5

Haskell, 117 107 105 97 90 bayt

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

Ideone'da dene. Düzenleme: Neil'dan bir fikirle 8 bayt kaydedildi.

Ungolfed versiyonu:

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)

Özyinelemeli yaklaşım. Şekil n, n-1şeklin her satırının önüne bir boşluk ekleyerek ve son çizgiyi alıp önce tuhaf mı yoksa sonra mı eklenmişse n-1ekleyerek oluşturulur ... ... bu yüzden bu son adımın tersine çevrildiğini fark etmeden önce düşündüm. final tek olduğunda tüm özyinelemeli adımlar . Bu nedenle , her özyinelemeli çağrıyı değiştiren ve bir sonraki dağ kısmının sola mı sağa mı ekleneceğini belirleyen bir bayrak geçilir."/ "n" \"nnb


1
Aksine karşılaştırmaktan daha bkarşı odd nher zaman, sen yalnızca en başta değil bir bayrak geçebilir ve her özyinelemeli çağrı üzerine ters çevirip? Böyle bir şey f n = unlines(p 0 n)ve let m = p (1-b) (n-1).
Neil

Çevirme -bbaşka bir karakter kapalı.
xnor 0

@xnor İpucu için teşekkürler, ancak bolması gereken 0veya daha fazla golf oynamak için başka bir yol buldum 1.
Laikoni

2

Java 7.130 bayt

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

}

Güzel cevap, +1. Olsa da 2 byte ile golf yapabilirsiniz: n%2için n--%2ve her ikisi --niçin de n. DÜZENLEME: Ve 1 ekleyerek daha fazla ,x=s+"\n"ve her iki değişen s+"\n"için x. (Toplamda: 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 bayt )
Kevin Cruijssen

0

C ++ 138 (işlev)

İşlev: -

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

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

NOT: İşlev _getch(), farklı derleyiciler arasında farklı prototip adlarına sahip olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.