다양한 산맥을 그립니다.


16

피보나치 도미노 타일링 에서 영감을 얻은 이 문제는 다른 유명한 조합 시퀀스를 나타내는 ASCII 아트를 생성하는 것입니다.

N 단계 산도 정확하게 사용 산맥의 도면 N '/'와 N 자 절대 초기 "고도"아래 딥없는 연속적인 곡선을 그려 지도록, '\'캐릭터. 예를 들어

   /\/\
/\/    \

   /\
/\/  \/\

모두 4 단계 산 다이어그램이지만

/\  /\/\
  \/

아니다.

입력

프로그램은 stdin 의 정수 n 또는 함수의 매개 변수로 정수 n 을 승인해야 합니다.

산출

모든 n 단계 산 다이어그램을 stdout에 인쇄하십시오 . 다이어그램은 순서에 관계없이 사용할 수 있지만 일종의 공백으로 구분해야합니다. 다른 다이어그램을 가로, 세로 등으로 출력할지 여부를 결정할 수 있습니다.

도미노 타일링 문제에서와 같이 원하는 공백을 사용할 수 있습니다. 여기에는 인쇄 출력 전후에 추가 줄 바꿈이 포함됩니다.

n = 3에 대한 일부 샘플 유효 출력 :

유효한 출력 A :

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

유효한 출력 B :

   /\
/\/  \

 /\/\
/    \

/\/\/\   

  /\
 /  \
/    \

 /\
/  \/\

유효한 출력 C :

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

이것은 코드 골프입니다. 가장 짧은 프로그램 (바이트)이 이깁니다.


"다른 다이어그램이 수평, 수직 등으로 출력 될지 여부를 결정할 수 있습니다"라고 말하면 산맥 자체가 옆에있을 수 있습니까?
xnor

산맥 자체는 옆으로해서는 안됩니다. 피크 사이의 빈 하늘이 도전에 추가된다고 생각합니다.
Matt Noonan

일부 범위가 두 번 이상 나타날 수 있습니까?
자랑스런 Haskeller

@MattNoonan 당신이 맞습니다. 산맥을 가로로 인쇄하는 것은 확실히 까다로 웠습니다.
xnor

@ proud-haskeller 그것은 각각 한 번씩되어야합니다.
매트 누난

답변:


10

파이썬 2 : 151 자

N=2*input()
for i in range(2**N):
 L=[];c=1;exec"b=i%2;c+=2*b-1;L+=[[' ']*N];L[-1][b-c]='\/'[b];i=i/2*(c>0);"*N
 for x in(c==1)*zip(*L):print"".join(x)

#Output for n=3:




  /\  
 /  \ 
/    \




 /\/\ 
/    \




   /\ 
/\/  \




 /\   
/  \/\





/\/\/\

와우, 이것은 엉망이다.

첫 번째 아이디어는 숫자를 사용하여 0 to 2**N-1모든 N상향 이동 및 하향 이동 시퀀스를 비트로 인코딩하는 것입니다. 우리는이 비트를 반복하여 하나 하나를 읽어 %2/2,에서 반복 exec루프.

우리는 실행되는 산맥을 옆으로 바꾼 문자열 목록에 저장합니다 L. 우리는 새로운 행을 생성 할 때마다 새로운 행의 한 공간이 위로 이동 또는 아래로 이동했는지 여부에 따라 /또는 새 행 \으로 바뀝니다.

해당 공간의 색인은 c끝에서부터의 공간 c이며, 실행 높이입니다. 앞에서 그것을하는 것은 산을 거꾸로 만들 것입니다. 우리는 더 나아가서 b상하로 움직이며 점점 더 움직 [b-c]입니다. c0이 아닌 1에서 시작 하면 한 번에 하나씩 오류가 수정됩니다.

경우에 제거하기 c시작 값 이하로 강하는 1,이 경우, 우리는 설정 i0있어 모든 추가 이동 아래로 일으키는을 c하게 더 음을. 그런 다음에 c종료 여부를 확인할 때 아래로 떨어지는 1지 확인합니다 c. 우리는 print경우 산맥 c입니다 1.

인쇄하려면 zip(*L)범위를 세로에서 가로로 바꾸고 결합 된 각 문자열을 인쇄합니다. 이 답변에서 많은 문제는 파이썬이 문자열을 불변으로 취급하므로 문자 목록으로 작업하고 인쇄를 위해 문자열로 결합했습니다.

도움과 개선을 위해 @flornquake에게 감사드립니다.


을 사용 하여 반복 하려면 ' '대신 대신 사용해야 합니다 . :) Btw, 백 슬래시를 벗어날 필요가 없습니다. " "exec
flornquake

@flornquake 나는 쓰는 것을 잊었다. 나는 ' '문자열을 따옴표로 바꾸고 변수로 바꾸려고 시도했다. 이것은 여전히 ​​범위를 벗어난 색인을 제공했습니다.for _ in[0]*N:exec("b=i%2;c+=2*b-1;L+=[[" "]*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")
xnor

난 당신이 쓰기에 필요한 것을 의미 exec("b=i%2;c+=2*b-1;L+=[[' ']*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")내부 따옴표 바깥과 다를 수 있습니다 즉,.
flornquake

@flornquake 와우, 어리석은 느낌이 들지만 한 쌍의 따옴표를 바꾸었지만 다른 쪽을 바꾸지 않았습니다. 감사!
xnor

7

APL (88)

{{⍉↑'\/'[1+⍵=1]/⍨¨¯1+2×K=⊂⌽⍳⌈/K←(⍵≠1)++\⍵}¨Z/⍨{(0=+/⍵)∧∧/0≤+\⍵}¨Z←↓⍉¯1+2×(N/2)⊤⍳2*N←2×⍵}

에 대한 출력 n=3:

      {{⍉↑'\/'[1+⍵=1]/⍨¨¯1+2×K=⊂⌽⍳⌈/K←(⍵≠1)++\⍵}¨Z/⍨{(0=+/⍵)∧∧/0≤+\⍵}¨Z←↓⍉¯1+2×(N/2)⊤⍳2*N←2×⍵}3
 /\/\/\     /\    /\      /\/\     /\   
         /\/  \  /  \/\  /    \   /  \  
                                 /    \ 

설명:

  • (N/2)⊤⍳2*N←2×⍵: 각 번호에 대한 비트 필드 수 0에를 2^⍵.
  • Z←↓⍉¯1+2×: 곱하기 2로와주는 일을 빼기 1위를 위해 -1아래에. 에 벡터의 벡터를 저장합니다. 각 벡터는에 하나의 숫자에 대한 표현을 포함합니다 Z.
  • {... }¨Z:의 각 요소에 대해 Z:
    • ∧/0≤+\⍵: 누계가 절대로 아래로 0떨어지지 않는지 확인 합니다 (지면 아래로 내려 가지 않음).
    • (0=+/⍵): 총합이 0지면 수준으로 돌아갑니다.
  • {... }¨Z/⍨: 해당 요소를 선택하십시오 Z. 그들 각각에 대해 :
    • K←(⍵≠1)++\⍵: 각 문자의 높이를 찾고에 저장하십시오 K. s \/올바르게 정렬되도록 각각 하나씩 올리십시오 . 이것은 지상 높이를 만듭니다 1.
    • ¯1+2×K=⊂⌽⍳⌈/K: 각 열에 대해 목록 [1..max(K)]을 작성하고 해당 열에서 문자의 위치를로 표시 1하고 나머지는로 표시하십시오 -1. -1로 복제하면 해당 위치가 공백으로 채워집니다.
    • '\/'[1+⍵=1]/⍨¨: 각 열의 올바른 문자를 찾아 해당 열의 목록으로 복제하십시오.
    • ⍉↑: 결과를 행렬로 바꾸고 오른쪽을 위로

좋아, 가로 하나!
Matt Noonan

2

파이썬, 261 241 236 자

import itertools as I
n=input()
S={}
for q in I.permutations((-1,1)*n):
 s=0;B=[[' ']*n*2 for _ in range(n+2)];o=0
 for i in q:
    B[n-s+(i==-1)][o]=' /\\'[i];s+=i;o+=1
    if s<0:break
 else:
    for l in (B,[])[q in S]:print''.join(l)
 S[q]=1

오랜 시간이 걸리기 시작 n=5합니다 ...

$ echo 1 | py mountrange.py

/\



Laxori@Laxori-PC /cygdrive/c/Programmin
$ echo 2 | py mountrange.py


/\/\



 /\
/  \



Laxori@Laxori-PC /cygdrive/c/Programmin
$ echo 3 | py mountrange.py



/\/\/\




   /\
/\/  \




 /\
/  \/\




 /\/\
/    \



  /\
 /  \
/    \



Laxori@Laxori-PC /cygdrive/c/Programmin
$ echo 4 | py mountrange.py




/\/\/\/\





     /\
/\/\/  \





   /\
/\/  \/\





   /\/\
/\/    \




    /\
   /  \
/\/    \





 /\
/  \/\/\





 /\  /\
/  \/  \





 /\/\
/    \/\





 /\/\/\
/      \




    /\
 /\/  \
/      \




  /\
 /  \
/    \/\




  /\
 /  \/\
/      \




  /\/\
 /    \
/      \



   /\
  /  \
 /    \
/      \

2

자바 스크립트 (ES6) 159 163

Fibonacci Domino Tiling에 대한 내 대답과 마찬가지로 n + n 비트의 모든 시퀀스를 검사합니다 .1은 '/'로 표시하고 0은 '\'로 표시합니다 (출력의 경우 '2'는 나중에 줄 바꿈을 표시하기 위해 추가됩니다) . ascii 패턴을 만드는 동안 나는 0과 1의 같은 수로 균형을 확인하고 시작 기준선 아래로 떨어지지 않습니다-규칙을 준수하는 것을 출력합니다.

'경고'로 수행 된 출력은 JS codegolf의 표준이지만 상당히 성가 시며 어쩌면 규칙에 위배됩니다. console.log를 사용하면 문자 수는 165가됩니다.

F=n=>{
  for(i=0;++i<1<<n+n;l||alert((o+'').replace(/,\d?/g,r=>'\\/\n '[r[1]||3])))
    for(p=l=o=[],j=i;l+1&&p++-n-n;j/=2)
      b=j&1,
      l-=1-b-b,
      (o[k=b+n-l]=o[k]||[2])[p]=b;
}

덜 골프

F=n=>{
  m = n+n
  outer:
  for (i=1; i < 1<<m; i+=2)
  {
    o=[]
    l=0;
    p=1;
    for (j = 1; j <1<<m; j+=j,p++)
    {
      if (i&j)
      {
        q=o[n-l]||[]
        q[p]=1;
        o[n-l]=q
        ++l;
      }
      else
      {
        --l;
        if (l<0) continue outer;
        q=o[n-l]||[]
        q[p]=0;
        o[n-l]=q
      }
    }
    if (l==0) console.log(o.join('\n').replace(/,\d?/g,r=>'\\/'[r[1]]||' '));
  }
}

FireFox / FireBug 콘솔에서 테스트하십시오 .

F(4)

산출

   /\
  /  \
 /    \
/      \ 

  /\/\
 /    \
/      \ 

    /\
 /\/  \
/      \ 

    /\
   /  \
/\/    \ 

  /\
 /  \/\
/      \ 

 /\/\/\
/      \ 

   /\/\
/\/    \ 

 /\  /\
/  \/  \ 

     /\
/\/\/  \ 

  /\
 /  \
/    \/\ 

 /\/\
/    \/\ 

   /\
/\/  \/\ 

 /\
/  \/\/\ 

/\/\/\/\ 

특정 당신이 쓰는 이유가 있는지 궁금 -b-b하고 -n-n대신 -2*b?
Steve Bennett

@SteveBennett 이유가 없습니다. 때때로이 패턴은 더 짧지 만 이번에는 그렇지 않습니다 (예 : 2*b+1-> b-~b)
edc65

1

CJam, 84 바이트

q~:Q{Q[XW]*mr1\{\_@+}%_{*}*{(\{_Q\-)S*@2$m0<" /""\\"?+QS*+Q)<\}%);z{N\++}*o}{;}?1}g

이 프로그램은 산을 무한 루프로 인쇄하므로 온라인 통역사가 도움을주지 않습니다. 명령 행에서 다음을 사용하여 호출하십시오.

java -jar cjam-0.6.2.jar mountain.cjam <<< 5

또는 온라인 사용을 시도

q~:Q{Q[XW]*mr1\{\_@+}%_{*}*{(\{_Q\-)S*@2$m0<" /""\\"?+QS*+Q)<\}%);z{N\++}*o}{;}?}fZ

실행 버튼을 여러 번 연속해서 누르고 출력이 연결되어 있다고 상상해보십시오.

기본 아이디어는 Q 크기의 산맥이 각각 위쪽 및 아래쪽 전환의 Q를 가짐을 알고 있다는 것입니다.

 Q[XW]*mr                                   #shuffled list of Q 1s and -1s
1        {\_@+}%                            #height map after each transition
                _{*}*                       #if it passes through 0 it's invalid

그런 다음 유효하면 인쇄하고 그렇지 않으면 스택에서 튀어 넘치지 않습니다.

인쇄 라우팅은 기본적으로 각 열을 Q-높이 공간, 기호 및 Q + 1 총 문자를 입력하기에 충분한 공간으로 빌드 한 다음 줄 사이에 줄 바꿈을 사용하여 줄을 바꾸어 인쇄합니다.

z{N\++}*o                                   #transpose, insert newlines, print

내가이 작업을하는 동안 산을 한 번 인쇄해야한다는 질문이 명확 해졌습니다. 다시 생각하고 더 많은 캐릭터가 필요할 것입니다 : /
paradigmsort

0

C, 179

불필요한 공백 제외.

edc65와 유사한 전략. = 1과 = 0을 n*2고려 하여 모든 -비트 이진 값을 실행합니다 ./\

n모든 n*3문자에 줄 바꿈이 포함 된 단일 문자열을 형식화합니다 . 쓰여진대로 문자열은 1000자를 포함하므로 보통 산 뒤에 많은 공백이 인쇄됩니다. (이것은 s[n*n*3]=0앞에 추가하여 수정할 수 있습니다 puts.) 어쨌든, 이것은 전체 산을 단일로 출력 할 수있게 합니다 .puts 는 규칙을 준수하는지 확인 후.

함수로 변환하고 for나중에 단일 루프로 축소하려고합니다 .

i,n,x,y,q,r;
main(){
  scanf("%d",&n);
  for(i=1<<n*2;i--;){                              //run though all n*2-digit binary numbers
    char s[]={[0 ...999]=32};                      //fill an array with spaces. This syntax is allowed by GCC
    y=n;                                           //start y one square below the grid (note: r is initialised to 0 by default.)
    for(x=n*2;x--;)                                //for each digit of i
      q=i>>x&1,
      y+=q+r-1,                                    //move up if the current and last digit are 0, down if they are 1, and stay on the same line if they are different.
      y<n?s[y*n*3]=10,s[y*n*3+x+1]=92-45*q:(x=0),  //if y is within the grid, put a newline (ASCII 10)at the beginning of the row and write \ or / (ASCII 92 or 47) to the correct square. Otherwise abort the x loop.
      r=q;                                         //store the current bit of i to r as it will be needed on the next iteration 
    n-1-y||puts(s);                                //if y is on the bottom row of the grid, output the mountain 
  }
}

출력 (오른쪽 공백의 엄청난 양에주의)

$ ./a
4

 /\
/  \/\/\                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

   /\
/\/  \/\                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

 /\/\
/    \/\                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

  /\
 /  \
/    \/\                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

     /\
/\/\/  \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

 /\  /\
/  \/  \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

   /\/\
/\/    \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

 /\/\/\
/      \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

  /\
 /  \/\
/      \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

    /\
   /  \
/\/    \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

    /\
 /\/  \
/      \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

  /\/\
 /    \
/      \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

   /\
  /  \
 /    \
/      \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

0

하스켈, 140 바이트

몇 번의 시도가 골프를 치는 데 실패한 후,이 Haskell 구현으로 끝났습니다. APL 솔루션의 2 배 안에있는 것이 행복합니다!

골프 솔루션 :

e=' ':e
m=[[]]:[[('/':e):map(' ':)x++('\\':e):y|k<-[0..n],x<-m!!(n-k),y<-m!!k]|n<-[0..]]
f n=putStr$unlines[map(!!(n-k))a|a<-m!!n,k<-[1..n]]

Ungolfed 및 댓글 :

이 프로그램은 일련의 n- 단계 산 다이어그램을 재귀 적으로 만듭니다. 각 다이어그램은 무한 길이의 줄 목록으로 표시되며, 옆으로 그려진 산과 무한대로 확장되는 공간을 나타냅니다. 이렇게하면 모든 다이어그램의 높이가 같아 지므로 재귀가 더 쉬워집니다. 마운틴 프린터는 높이를 유한 값으로 자르는 매개 변수를 허용합니다.

import Data.List (transpose)

-- Elementary picture slices, extending to infinity.
empty = ' ' : empty
up    = '/' : empty
down  = '\\': empty

-- A function which draws a mountain picture to stdout, clipping
-- its height to n.
printMtn n = putStr . unlines . reverse . take n . transpose 

{-- Combine mountain pictures x and y by

              x
 x # y  ==   / \y

--}
x # y = up : raised x ++ down : y
    where raised = map (' ':)

-- Given two sets X,Y of mountain pictures, compute the set X <> Y of all
-- combined pictures x#y for x in X, y in Y.
xs <> ys = [ x # y | x <- xs, y <- ys ]

-- Compute the (++,<>)-convolution of a list with itself, e.g.:
--   autoConvolve [x0,x1,x2] == (x2 <> x0) ++ (x1 <> x1) ++ (x0 <> x2)
autoConvolve xs = concat $ zipWith (<>) (reverse xs) xs

{--
    mtns is a list whose nth entry is the list of all n-step mountain diagrams.
    It is defined recursively by:
        --  The only 0-step mountain diagram is empty.
        --  Each (n+1)-step diagram can be uniquely drawn as x#y for
            some k-step diagram x and (n-k)-step diagram y.
--}
mtns = [[]] : [autoConvolve (prefix n) | n <- [1..]]
    where prefix n = take n mtns

-- The driver function: apply the height n mountain printer to each
-- n-step mountain diagram.  Whitespace is guaranteed by the order
-- in which the diagrams appear.
test n = mapM_ (printMtn n) $ mtns!!n

샘플 사용법 :

$ ghci mtn3.hs
GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( mtn3.hs, interpreted )
Ok, modules loaded: Main.
λ> f 3
  /\  
 /  \ 
/    \

 /\/\ 
/    \

 /\   
/  \/\

   /\ 
/\/  \


/\/\/\
λ> 

0

GolfScript 103 ( 데모 )

2*:§2\?,{2base.,§\-[0]*\+:a 1\{.2*@(.@+@@+}%:l$)\;),-1%{a,,{.l=2$=\a=1$+*' \\/'= }%\;n+}%\1=*l$(\;0>*}/

이 프로그램은 정수 매개 변수를 사용하여 0에서 2 ^ (n-1)까지의 모든 이진 표현을 산으로 렌더링하려고합니다. 유효하지 않은 조합을 렌더링하지 않습니다 (예 : 레벨 0보다 낮은 조합).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.