วาดยอดเขา


33

เขียนโปรแกรมหรือฟังก์ชั่นที่วาดเทือกเขาซึ่งแต่ละยอดเขาที่ใหญ่กว่านั้นคือ "ด้านหลัง" ด้านหน้าและสลับด้านที่มองเห็นได้

นี่คือขนาดของภูเขา 1

/\

นี่คือขนาดของภูเขา 2

 /\
/\ \

นี่คือขนาดของภูเขา 3

  /\
 / /\
/ /\ \

นี่คือขนาดของภูเขา 4

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

นี่คือขนาดของภูเขา 5

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

และอื่น ๆ

อินพุต

เป็นจำนวนเต็มบวกเดียวในรูปแบบที่สะดวกใด ๆn > 0 ,

เอาท์พุต

การแสดงศิลปะ ASCII ของเทือกเขาตามกฎข้างต้น ขึ้นบรรทัดใหม่ / นำขึ้นบรรทัดใหม่หรือช่องว่างอื่น ๆ เป็นทางเลือกโดยมีเงื่อนไขว่ายอดเขาเข้าแถวอย่างเหมาะสม

กฎระเบียบ

  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการตีกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

คำตอบ:


14

ถ่าน 16 ไบต์

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

ลองออนไลน์!

อย่างไร?

Nλλปัจจัยการผลิตขนาดใหญ่ที่สุดของภูเขาลงใน Fλ«วิ่งห่วงมากกว่าค่าของιจากผ่าน0 λ-1(การปิด»โดยนัยในตอนท้ายของโปรแกรม)

ภายในลูปP↘⁻λιคำนวณλ-ιและวาดโดยไม่เลื่อนเคอร์เซอร์หลังจากนั้นบรรทัดที่มีความยาวนั้นไปทางตะวันออกเฉียงใต้ ขึ้นอยู่กับทิศทางของมันบรรทัดนี้จะประกอบด้วย\ตัวละคร ย้ายหนึ่งก้าวไปทางทิศตะวันตกและ↙¹ลากเส้นที่มีความยาว 1 ไปทางตะวันตกเฉียงใต้ (ทำจาก/) สุดท้าย‖T→ในแนวนอนสะท้อนให้เห็นถึงการวาดภาพ, เปลี่ยนอักขระตามความเหมาะสม\จะกลายเป็น/และจะกลายเป็น/\

การเพิ่มคำสั่งดัมพ์ที่จุดเริ่มต้นของลูป ( ลองใช้ ) ช่วยให้เราเห็นความก้าวหน้า:

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

2
ฉันเดาว่านี่เป็นภาษาที่เหมาะสำหรับความท้าทาย :-)
ETHproductions

@ETHproductions ภาษานี้สร้างขึ้นสำหรับ ASCII art โดยเฉพาะ นอกจากนี้ยังมีเพจรหัสของตัวเอง
Erik the Outgolfer

@EriktheGolfer ฉันมีของตัวเอง (unimplemented) ภาษาศิลปะ ASCII ของฉันเรียกว่าดินสอสี เอกสารหายไปในขณะนี้เพราะฉันกำลังเคลื่อนไหวอยู่ แต่คุณสามารถเห็นพวกเขาส่วนใหญ่ได้ที่นี่ที่นี่ฉันสงสัยว่าโปรแกรม Crayon สั้นเพียงใดเมื่อเทียบกับ Charcoal ...
ETHproductions

@ETHproductions คุณจะนำไปใช้เมื่อใด มีห้องแชทหรือจะสร้างห้อง (เรียกว่า "Crayon Implementation") ได้ไหม?
Erik the Outgolfer

@EriktheGolfer แต่น่าเสียดายที่ฉันไม่รู้ว่าฉันจะใช้เวลาเมื่อไร แต่คุณสามารถสร้างห้องแชทได้หากคุณต้องการ ;-)
ETHproductions

7

JavaScript (ES6), 75 ไบต์

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

ขณะนี้โปรแกรมเต็มรูปแบบนั้นสั้นกว่าฟังก์ชั่นวนซ้ำเล็กน้อย:

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

6

Python 2, 67 ไบต์

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

พิมพ์ทีละบรรทัดสะสมสตริงโดยสลับกันเพิ่มเฉือนไปทางซ้ายหรือขวาบนพื้นฐานของความเท่าเทียมกันในปัจจุบันของs nคำนำหน้ามีnช่องว่าง

อีกวิธีหนึ่งในการอัปเดตคือความยาวเท่ากัน:

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

วิธีการเรียกซ้ำมีความยาวมากกว่า (70 ไบต์)

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

6

Haskell, 77 ไบต์

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

การใช้งาน:

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

พิมพ์ทีละบรรทัดโดยการสะสมสตริง s โดยการเพิ่มเครื่องหมายสแลชไปทางซ้ายหรือขวาตามพาริตี้ปัจจุบันของ n คำนำหน้าด้วยช่องว่าง n-1


5

แบตช์, 202 ไบต์

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

รับอินพุตเป็นพารามิเตอร์บรรทัดคำสั่ง เลื่อนผ่านเพื่อดำเนินการลูปสุดท้าย


@ TimmyD ขออภัยฉันพิมพ์ผิดขณะเล่นกอล์ฟ แก้ไขแล้ว
Neil


5

Haskell, 117 107 105 97 90 ไบต์

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

ลองใช้กับ Ideone แก้ไข: บันทึก 8 ไบต์ด้วยแนวคิดจาก Neil

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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)

วิธีการแบบเรียกซ้ำ รูปร่างสำหรับnถูกสร้างขึ้นโดยการเพิ่มช่องว่างด้านหน้าของแต่ละบรรทัดของn-1รูปร่างและนำบรรทัดสุดท้ายของn-1และเพิ่ม"/ "ก่อนว่าnเป็นคี่หรือ" \"หลังจากถ้าnเป็นแม้กระทั่ง ... หรือดังนั้นฉันคิดว่าก่อนที่จะสังเกตเห็นว่าขั้นตอนสุดท้ายนี้ตรงกันข้าม ขั้นตอนแบบเรียกซ้ำทั้งหมดเมื่อสุดท้ายnคือคี่ ดังนั้นการตั้งค่าสถานะbจะถูกส่งผ่านซึ่งการโทรซ้ำแต่ละครั้งและกำหนดว่าส่วนต่อไปของภูเขาจะถูกเพิ่มไปทางซ้ายหรือขวา


1
แทนที่จะเปรียบเทียบbกับodd nแต่ละครั้งคุณสามารถไม่เพียงแค่ตั้งค่าสถานะในตอนเริ่มต้นและพลิกมันในการโทรซ้ำทุกครั้งหรือไม่ สิ่งที่ต้องการและf n = unlines(p 0 n) let m = p (1-b) (n-1)
Neil

การพลิกไป-bเป็นตัวละครอื่น
xnor

@xnor ขอบคุณสำหรับคำแนะนำ แต่ผมพบว่าวิธีการกอล์ฟมันต่อไปซึ่งความต้องการbที่จะเป็นหรือ0 1
Laikoni

2

Java 7,130 ไบต์

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

}

คำตอบที่ดี +1 คุณสามารถกอล์ฟได้โดย 2 ไบต์แม้ว่า: n%2ไปn--%2และทั้งสองไป--n nแก้ไข: 1 และอื่น ๆ อีกมากมายโดยการเพิ่ม,x=s+"\n"และการเปลี่ยนแปลงทั้งสองไปs+"\n" x(รวมเป็นทั้งหมด: 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 (ฟังก์ชัน)

ฟังก์ชั่น: -

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

โปรแกรมเต็มรูปแบบ: -

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

หมายเหตุ: ฟังก์ชั่น_getch()อาจมีชื่อต้นแบบที่แตกต่างกันในคอมไพเลอร์ที่แตกต่างกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.