Không thể nhìn thấy rừng cây


29

Viết chương trình hoặc hàm vẽ cây, do đó, xây dựng một khu rừng.

Những cái cây được vẽ giống như xếp chồng một kim tự tháp. Hàng đầu tiên (trên cùng) chứa 1cây, hàng tiếp theo xuống chứa 2(với tổng số 3), hàng tiếp theo chứa 3(cho tổng số 6), v.v. Nếu không có đủ cây để hoàn thành một hàng đầy đủ, hãy điền nó vào bên trái và để trống các điểm bên phải. Ngoài ra, các cây cấp thấp hơn chồng lên các cây cấp trên một chút do vị trí của chúng.

Đây là một khu rừng có kích thước 1

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

Đây là một khu rừng có kích thước 2

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

Đây là một khu rừng có kích thước 3

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

Đây là một khu rừng có kích thước 4

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

Đây là một khu rừng có kích thước 5(lưu ý ngọn cây thứ năm đang che thân cây thứ nhất)

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

(bỏ qua một vài)
Đây là một khu rừng có kích thước 8(mở rộng mẫu)

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

vân vân

Đầ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 rừng, 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 cây đều 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.

Tôi không chắc mô hình liên quan đến thứ tự các cây được vẽ. Đó là, được đưa ra n, vị trí của cây là gì?
Luis Mendo

@LuisMendo Theo tôi hiểu, chúng được điền theo thứ tự đọc. Vì vậy, mỗi hàng được điền lần lượt và nếu không có đủ cây cho toàn bộ hàng, phần còn lại được đặt càng xa càng tốt trong hàng đó.
xnor

@LuisMendo xnor có quyền. Nếu tôi có thể diễn đạt lại từ đó để làm cho rõ ràng hơn, vui lòng ping tôi trong trò chuyện.
admBorkBork

@xnor Cảm ơn, bây giờ tôi hoàn toàn rõ ràng
Luis Mendo

@Adm Thật ra nó đã được viết ngay trong thử thách. Rõ ràng tôi không thể đọc :-)
Luis Mendo

Câu trả lời:


5

Haskell 310 byte

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

Gọi nó với w 5, ví dụ.

Đây là mã không nén:

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

Chào mừng đến với PPCG!
admBorkBork

4

JavaScript (ES6), 357 297 276 byte

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>

Chỉnh sửa: Đã lưu 21 byte nhờ @KritixiLithos.


Đối với lần đầu tiên repeat, bạn có thể thay đổi blah.repeat(val)thành blah[w="repeat"](val) và sau đó bạn có thể thay đổi các lần xuất hiện tiếp theo repeatthành chỉ [w](val)để lưu byte
Kritixi Lithos

@KritixiLithos Tôi không thể làm điều đó vì đầu tiên repeatlà trong forvòng lặp và sẽ không chạy n=1, nhưng tôi vẫn có thể lưu 21 byte.
Neil

4

C ++ (trên Windows), 330 312 308 304 304 byte

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

Gọi với:

int main()
{
    f(8);
}

0

C (trên Windows), 297 295 294 byte

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

Tương tự như câu trả lời C ++ của tôi, nhưng tôi đã đăng bài này vì nó có phần ngắn hơn trong C.


@DLosc Đó là C. #importlà một phần mở rộng GCC (không dùng nữa). Phù hợp cho chơi golf, mặc dù.
Steadybox

Hừ, thú vị. Bây giờ tôi thấy rằng có một mẹo cho điều đó. Bạn có thể đề cập đến điều đó trong câu trả lời của bạn.
DLosc

@DLosc Có lẽ, nhưng tôi nghĩ rằng nó được sử dụng khá rộng rãi trong việc chơi golf, cùng với một số tiện ích mở rộng GCC khác (mặc dù không giới hạn ở GCC) như bỏ qua <stdio.h>và tự động giả sử biến toàn cục trở thành inthoặc là hàm trả về int.
Steadybox

0

Javascript 418 377 byte

Cảm ơn @Kritixi Lithos đã giúp chơi golf 39 byte

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):''}

Dùng thử trực tuyến


2
Đối với lần đầu tiên repeat, bạn có thể thay đổi blah.repeat(val)thành blah[w="repeat"](val)và sau đó bạn có thể thay đổi các lần xuất hiện tiếp theo repeatđể [w](val)thay vào đó để lưu byte
Kritixi Lithos
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.