나무의 숲을 볼 수 없습니다


29

나무를 그리면서 숲을 만드는 프로그램이나 함수를 작성하십시오.

나무는 피라미드를 쌓는 것처럼 그려집니다. 첫 번째 (위) 행이 포함 1트리를 다음 행 아래로 포함 2(총 3, 다음은 포함) 3(총 6등). 전체 행을 완성하기에 나무가 충분하지 않은 경우 왼쪽에 채우고 오른쪽의 반점을 비워 두십시오. 또한 하위 트리는 배치로 인해 상위 트리와 약간 겹칩니다.

이것은 크기의 숲입니다 1

  /\
 //\\
///\\\
  ||
  ||

이것은 크기의 숲입니다 2

      /\
     //\\
  /\///\\\
 //\\ ||
///\\\||
  ||
  ||

이것은 크기의 숲입니다 3

      /\
     //\\
  /\///\\\/\
 //\\ || //\\
///\\\||///\\\
  ||      ||
  ||      ||

이것은 크기의 숲입니다 4

          /\
         //\\
      /\///\\\/\
     //\\ || //\\
  /\///\\\||///\\\
 //\\ ||      ||
///\\\||      ||
  ||
  ||

이것은 크기가 큰 숲입니다 5(5 번째 나무의 상단이 첫 번째 나무의 줄기를 덮고 있음에 유의하십시오)

          /\
         //\\
      /\///\\\/\
     //\\ || //\\
  /\///\\\/\///\\\
 //\\ || //\\ ||
///\\\||///\\\||
  ||      ||
  ||      ||

(일부 건너 뛰기)
이것은 크기가 큰 숲입니다 8(패턴 확장).

              /\
             //\\
          /\///\\\/\
         //\\ || //\\
      /\///\\\/\///\\\/\
     //\\ || //\\ || //\\
  /\///\\\/\///\\\||///\\\
 //\\ || //\\ ||      ||
///\\\||///\\\||      ||
  ||      ||
  ||      ||

등등.

입력

하나의 양의 정수 편리한 형식으로 , n > 0.

산출

위 규칙에 따라 포리스트의 ASCII 아트 표현입니다. 나무가 모두 적절하게 정렬되어있는 경우 선행 / 후행 개행 또는 기타 공백은 선택 사항입니다.

규칙

  • 전체 프로그램 또는 기능이 허용됩니다. 함수 인 경우 출력하지 않고 출력을 반환 할 수 있습니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

나무가 그려지는 순서와 관련하여 패턴이 무엇인지 잘 모르겠습니다. 즉 n, 나무의 위치는 무엇입니까?
Luis Mendo

@LuisMendo 내가 이해하는 것처럼, 그들은 읽기 순서로 채워져 있습니다. 따라서 각 행이 차례로 채워지고 전체 행에 충분한 나무가 없으면 나머지는 해당 행에서 가능한 한 왼쪽에 배치됩니다.
xnor

@LuisMendo xnor가 옳습니다. 더 명확하게하기 위해 다시 단어를 쓸 수 있으면 채팅에 나를 핑하십시오.
AdmBorkBork

@ xnor 고마워, 그것은 지금 나에게 완전히 분명하다
Luis Mendo

@Adm 실제로 그것은 도전에 바로 쓰여졌습니다. 분명히 읽을 수 없습니다 :-)
Luis Mendo

답변:


5

하스켈 310 바이트

w i=putStr$unlines$reverse$b i 0 0[][]
b 0 _ _ w r=e w r
b c l 0 w r=b c(l+1)l(e w r)[]
b c l p w r=b(c-1)l(p-1)w(n(++)["  ||    ","  ||    ","///\\\\\\  "," //\\\\   ","  /\\    "]r)
e w r=t++n(n d)(map(\t->"    "++t)w)c where(t,c)=splitAt 2 r
n f(a:c)(b:d)=f a b:n f c d
n _ a[]=a
n _ _ a=a
d d ' '=d
d _ d=d

w 5예를 들어로 호출하십시오 .

압축되지 않은 코드는 다음과 같습니다.

-- TreeTree
-- by Gerhard
-- 12 February 2017

module TreeTree (wood,test) where

type Tree = [String]

-- Test cases
test = do
 wood 0
 wood 1
 wood 2
 wood 3
 wood 4
 wood 5

-- build wood
wood :: Int -> IO ()
wood i = printTree $ buildWood i 0 0 [] []

-- Prints the trees
printTree :: Tree -> IO ()
printTree = putStr . unlines . reverse

-- build wood
buildWood :: Int -> Int -> Int -> Tree -> Tree -> Tree
buildWood 0 _ _ w r = concatTree w r 
buildWood c l 0 w r = buildWood c (l+1) l (concatTree w r) []
buildWood c l p w r = buildWood (c-1) l (p-1) w (addTree r)

-- indent definition
space :: String
space = "    "

-- tree definition
tree :: Tree
tree = reverse [
 "  /\\    ",
 " //\\\\   ",
 "///\\\\\\  ",
 "  ||    ",
 "  ||    "]

-- Add a Tree on the left side
addTree :: Tree -> Tree
addTree = match (++) tree

-- add tree row at the bottom of the wood
concatTree :: Tree -> Tree -> Tree
concatTree w r = trunk ++ matched
 where
  wood = grow w
  (trunk, crown) = splitAt 2 r 
  matched = matchTree wood crown

-- elnarge forrest on the left side to match next tree line
grow :: Tree -> Tree
grow = map (\t -> space ++ t)

-- match
match :: (a -> a -> a) -> [a] -> [a] -> [a]
match f (a:az) (b:bz) = f a b : match f az bz
match _ a [] = a
match _ _ a  = a

-- match trees
matchTree :: Tree -> Tree -> Tree
matchTree = match matchLine

-- match lines
matchLine :: String -> String -> String
matchLine = match matchChar

-- match chars
matchChar :: Char -> Char -> Char
matchChar c ' ' = c
matchChar _ c   = c

-- End

PPCG에 오신 것을 환영합니다!
AdmBorkBork

4

자바 스크립트 (ES6), 357 297 276 바이트

f=
n=>{a=`  /\\`;d=`///\\\\\\`;b=d+`/\\`;c=` //\\\\ ||`;d+=`||`;e=`
`;r=`repeat`;s=``;for(i=1;n>i;n-=i++)s=(s+a+b[r](i-1)+e+c[r](i)).replace(/^/gm,`    `)+e;return(s+a+b[r](n-1)+d[r](i-=n)+e+c[r](n)+(s=`      ||`[r](i))+e+d[r](n)+s+(s=e+`  ||    `[r](n))+s).replace(/\|.$/gm,``)}
<input type=number min=1 oninput=o.textContent=f(this.value)><pre id=o>

편집 : @KritixiLithos 덕분에 21 바이트가 절약되었습니다.


첫 번째의 경우 repeat, 당신은 변경할 수 blah.repeat(val)blah[w="repeat"](발) 그리고 당신의 후속 발행 수 변경할 수 있습니다 repeat단지에를 [w](val)대신 바이트에 저장하기
Kritixi LITHOS

@KritixiLithos 첫 번째 루프 repeat안에 있고 for실행되지 않기 때문에 그렇게 n=1할 수는 없지만 여전히 21 바이트를 절약 할 수있었습니다.
Neil

4

(윈도우)에 C ++, 330 312 308 304 303 바이트

#import<cstdio>
#import<windows.h>
#define P(x,y,s)SetConsoleCursorPosition(GetStdHandle(-11),{X+x,Y+y});puts(s);
int X,Y,R,r,c;t(){P(2,-2,"/\\")P(1,-1,"//\\\\")P(0,0,"///\\\\\\")P(2,1,"||")P(2,2,"||")}f(int n){for(c=R=r=1;c<n;c+=++R);for(;r;r++)for(c=0;++c<r+1;){X=(R-r-2)*4+c*8;Y=r*2;t();r=--n?r:-1;}}

전화 :

int main()
{
    f(8);
}

0

C (Windows), 297 295 294 바이트

#import<windows.h>
#define P(x,y,s)C.X=X+x;C.Y=Y+y;SetConsoleCursorPosition(GetStdHandle(-11),C);puts(s);
COORD C;X,Y,R,r,c;t(){P(2,-2,"/\\")P(1,-1,"//\\\\")P(0,0,"///\\\\\\")P(2,1,"||")P(2,2,"||")}f(n){for(c=R=r=1;c<n;c+=++R);for(;r;r++)for(c=0;++c<r+1;){X=(R-r-2)*4+c*8;Y=r*2;t(r=--n?r:-1);}}

내 C ++ 답변과 비슷하지만 C에서는 다소 짧아서 게시했습니다.


@DLosc C. #import는 (더 이상 사용되지 않는) GCC 확장입니다. 그래도 골프에 적합합니다.
Steadybox

허, 흥미 롭군 이제 이 있다는 것을 알았습니다 . 당신은 당신의 대답에 언급 할 수 있습니다.
DLosc

@DLosc 어쩌면 골프 클럽에서 GCC에만 국한되지는 않지만 <stdio.h>전역 변수를 생략 int하거나 반환하는 함수를 자동으로 가정하는 것과 같은 다른 GCC 확장과 함께 골프에서 꽤 널리 사용되는 것 같습니다 int.
Steadybox

0

자바 스크립트 418 377 바이트

39 바이트의 골프 오프를 도와 준 @Kritixi Lithos에게 감사합니다

x=>{s='';for(t=0;++t<x;x-=t);q='//\\\\';z="///\\\\\\";h="/\\";t--;for(i=0;i<t;i++){a=4*(t-i)+1;s+=" "[w="repeat"](a+1)+h+(z+h)[w](i)+`
`+" "[w](a)+q+(" || "+q)[w](i)+`
`}c=t-x+1>0?t-x+1:0;return x?s+"  "+(h+z)[w](--x)+h+(c?(z+"||")[w](c-1)+z:'')+`
 `+q+(" || "+q)[w](x)+" ||     "[w](c)+`
`+(z+"||")[w](x)+z+(c?"||"+"      ||"[w](c-1):'')+`
`+("  ||    "[w](x+1)+`
`)[w](2):''}

온라인으로 사용해보십시오


2
첫 번째의 경우 repeat, 당신은 변경할 수 있습니다 blah.repeat(val)blah[w="repeat"](val)그리고 당신의 후속 발행 수 변경할 수 있습니다 repeat단지에를 [w](val)대신 바이트에 저장하기
Kritixi LITHOS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.