Vẽ một số đỉnh núi


33

Viết chương trình hoặc chức năng vẽ một dãy núi, trong đó mỗi đỉnh núi lớn hơn tiếp theo là "phía sau" những cái phía trước, và xen kẽ bên nào có thể nhìn thấy.

Đây là một dãy núi có kích thước 1

/\

Đây là một dãy núi có kích thước 2

 /\
/\ \

Đây là một dãy núi có kích thước 3

  /\
 / /\
/ /\ \

Đây là một dãy núi có kích thước 4

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

Đây là một dãy núi có kích thước 5

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

Và như vậy.

Đầu vào

Một số nguyên dương duy nhất trong bất kỳ định dạng thuận tiện , n > 0.

Đầu ra

Một đại diện nghệ thuật ASCII của dãy núi, tuân theo các quy tắc trên. Các dòng mới hàng đầu / dấu hoặc khoảng trắng khác là tùy chọn, miễn là các đỉnh xếp hàng một cách thích hợp.

Quy tắc

  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Câu trả lời:


14

Than , 16 byte

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

Hãy thử trực tuyến!

Làm sao?

Nλđầu vào kích thước của ngọn núi lớn nhất vào λ. Fλ«chạy một vòng lặp trên các giá trị ιtừ 0thông qua λ-1. (Việc kết thúc »được ngụ ý vào cuối chương trình.)

Bên trong vòng lặp, P↘⁻λιtính toán λ-ιvà vẽ, mà không di chuyển con trỏ sau đó, một dòng có chiều dài đó đi về phía đông nam. Dựa trên hướng của nó, dòng này sẽ bao gồm các \ký tự. di chuyển một bước về phía tây và ↙¹vẽ một đường dài 1 đi về phía tây nam (làm bằng /). Cuối cùng, ‖T→phản ánh theo chiều ngang của bản vẽ, biến đổi các ký tự khi thích hợp: \trở thành //trở thành \.

Thêm hướng dẫn kết xuất ở đầu vòng lặp ( thử nó ) cho phép chúng ta thấy sự tiến triển:

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

2
Tôi đoán đây là ngôn ngữ lý tưởng cho thử thách :-)
ETHproductions

@ETHproductions Ngôn ngữ này được tạo riêng cho nghệ thuật ASCII. Nó cũng có codepage riêng.
Erik the Outgolfer 4/11/2016

@EriktheGolfer Tôi có ngôn ngữ nghệ thuật ASCII (chưa thực hiện) của riêng tôi, được gọi là Crayon . Các tài liệu bị mất vào lúc này bởi vì tôi đang di chuyển chúng, nhưng bạn có thể thấy hầu hết chúng ở đây . Tôi tự hỏi một chương trình Crayon ngắn như thế nào so với
Char

@ETHproductions Khi nào bạn sẽ thực hiện nó? Có một phòng chat cho nó hay tôi có thể tạo một cái (gọi là "Thực hiện Crayon") không?
Erik các Outgolfer

@EriktheGolfer Thật không may, tôi không biết khi nào tôi sẽ có thời gian để thực hiện nó. Nhưng bạn có thể tạo một phòng chat nếu bạn muốn ;-)
ETHproductions 04/11/2016

7

JavaScript (ES6), 75 byte

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

Chương trình đầy đủ hiện ngắn hơn một chút so với chức năng đệ quy:

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]

In từng dòng, tích lũy chuỗi sbằng cách xen kẽ một dấu gạch chéo sang trái hoặc phải dựa trên tính chẵn lẻ hiện tại của n. Tiền tố có ndấu cách.

Một cách khác để cập nhật là cùng độ dài:

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

Một phương thức đệ quy dài hơn (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)
(%"/\\")

Sử dụng:

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

In từng dòng, tích lũy chuỗi s bằng cách xen kẽ một dấu gạch chéo sang trái hoặc phải dựa trên tính chẵn lẻ hiện tại của n. Tiền tố với khoảng trắng n-1.


5

Hàng loạt, 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%

Lấy đầu vào là một tham số dòng lệnh. Ngã qua để thực hiện vòng lặp cuối cùng.


@TimmyD Xin lỗi, tôi đánh máy khi chơi golf. Đã sửa bây giờ.
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!))

Hãy thử nó trên Ideone. Chỉnh sửa: Đã lưu 8 byte với một ý tưởng từ Neil.

Phiên bản bị đánh cắp:

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)

Phương pháp đệ quy. Hình dạng cho nđược tạo bằng cách thêm một khoảng trắng ở trước mỗi dòng của n-1hình và lấy dòng cuối cùng n-1và thêm "/ "trước nếu nlà số lẻ hoặc " \"sau nếu nlà chẵn ... hoặc vì vậy tôi nghĩ trước khi nhận thấy bước cuối cùng này bị đảo ngược cho tất cả các bước đệ quy khi trận chung kết nlà số lẻ. Do đó, một lá cờ bđược thông qua xen kẽ mỗi cuộc gọi đệ quy và xác định xem phần núi tiếp theo được thêm trái hay phải.


1
Thay vì so sánh bvới odd ntừng thời điểm, bạn có thể không chỉ truyền cờ vào đầu và lật nó trên mỗi cuộc gọi đệ quy không? Một cái gì đó như f n = unlines(p 0 n)let m = p (1-b) (n-1).
Neil

Lật tới -blà một char khác.
xnor

@xnor Cảm ơn bạn đã gợi ý, nhưng tôi đã tìm thấy một cách khác để chơi gôn hơn nữa cần bphải 0hoặc 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;}

Bị đánh cắp

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

}

Câu trả lời hay, +1. Bạn có thể chơi golf nó bằng 2 byte mặc dù: n%2đến n--%2, và cả hai --nđến n. EDIT: Và thêm 1 bằng cách thêm ,x=s+"\n"và thay đổi cả s+"\n"đến x. (Tổng cộng là: 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 (chức năng)

Chức năng :-

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

Chương trình đầy đủ: -

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

LƯU Ý: hàm _getch()có thể có các tên nguyên mẫu khác nhau trên các trình biên dịch khác nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.