산봉우리 그리기


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 아트를 위해 특별히 만들어졌습니다. 또한 자체 코드 페이지가 있습니다.
Outgolfer Erik

@EriktheGolfer Crayon 이라는 ASCII 아트 언어가 있습니다 . 내가 문서를 옮기는 중이기 때문에 문서는 현재 잃어 버렸지 만 대부분을 볼 수 있습니다 . 나는 이것을위한 Crayon 프로그램이 Charcoal에 비해 얼마나 짧은 지 궁금합니다.
ETHproductions

@ETHproductions 언제 구현할 예정입니까? 대화방이 있습니까 아니면 대화방을 만들 수 있습니까 ( "Crayon Implementation"이라고 함)?
Outgolfer Erik

@EriktheGolfer 불행히도, 언제 구현해야할지 모르겠습니다. ;-)를 원한다면 대화방을 만들 수 있습니다.
ETHproductions

7

자바 스크립트 (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

파이썬 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

하스켈, 77 바이트

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

용법:

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

현재 패리티 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 죄송합니다. 골프를 타면서 오타가있었습니다. 지금 수정했습니다.


5

하스켈, 117107105 97 90 바이트

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

Ideone에서 사용해보십시오. 편집 : Neil의 아이디어로 8 바이트를 저장했습니다.

언 골프 버전 :

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짝수 ... 정도는 I이 마지막 단계에 대해 반전되어 몰래 전에 생각 파이널 n이 홀수 일 때 모든 재귀 단계 . 따라서 플래그 b가 전달되어 각 재귀 호출을 번갈아 가며 다음 산 부분이 왼쪽 또는 오른쪽에 추가되는지 여부를 결정합니다.


1
매번 비교 b하는 대신 odd n처음에 플래그를 전달하고 모든 재귀 호출에서 뒤집을 수는 없습니까? 같은 뭔가 f n = unlines(p 0 n)하고 let m = p (1-b) (n-1).

뒤집기 -b는 또 다른 문자입니다.
xnor

@xnor 덕분에 힌트에 대한,하지만 난 그게 더 필요로 골프에 다른 방법을 찾을 b0또는 1.
Laikoni

2

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

언 골프

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, 모두 --nn. 편집 : 그리고 하나 추가하여 더 ,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 바이트 )
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.