Tidak bisa melihat hutan untuk pohon-pohon

29

Tulis program atau fungsi yang menggambar pohon pohon, sehingga membangun hutan.

Pohon-pohon digambar seperti menumpuk piramida. Baris pertama (atas) berisi 1pohon, baris berikutnya ke bawah berisi 2(untuk total 3), baris berikutnya berisi 3(untuk total 6), dan seterusnya. Jika tidak ada cukup pohon untuk menyelesaikan satu baris penuh, isilah ke kiri dan kosongkan tempat di sebelah kanan. Selain itu, pohon tingkat bawah sedikit tumpang tindih dengan pohon tingkat atas karena penempatannya.

Ini adalah hutan ukuran 1

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

Ini adalah hutan ukuran 2

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

Ini adalah hutan ukuran 3

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

Ini adalah hutan ukuran 4

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

Ini adalah hutan ukuran 5(perhatikan puncak pohon kelima menutupi batang pohon pertama)

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

(lewati beberapa)
Ini adalah hutan ukuran 8(memperluas pola)

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

dan seterusnya.

Memasukkan

Sebuah bilangan bulat positif dalam format yang nyaman , n > 0.

Keluaran

Representasi seni ASCII tentang hutan, mengikuti aturan di atas. Leading / trailing newlines atau spasi putih lainnya adalah opsional, asalkan semua pohon berbaris dengan tepat.

Aturan

  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
AdmBorkBork
sumber
Saya tidak yakin apa polanya mengenai urutan di mana pohon-pohon itu digambar. Artinya, mengingat n, apa posisi pohon-pohon itu?
Luis Mendo
@LuisMendo Seperti yang saya mengerti, mereka diisi dengan urutan membaca. Jadi, setiap baris diisi secara bergantian, dan jika tidak ada cukup pohon untuk seluruh baris, sisanya ditempatkan sejauh mungkin di baris itu.
xnor
@LuisMendo xnor benar. Jika saya dapat mengatakannya kembali agar lebih jelas, silakan ping saya di obrolan.
AdmBorkBork
@ xnor Terima kasih, sekarang sangat jelas bagi saya
Luis Mendo
@ Adm Sebenarnya itu ditulis di sana di tantangan. Rupanya saya tidak bisa membaca :-)
Luis Mendo

Jawaban:

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

Sebut saja dengan w 5, misalnya.

Berikut kode terkompresi:

-- 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
Gerhard
sumber
Selamat datang di 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>

Sunting: Disimpan 21 byte berkat @KritixiLithos.

Neil
sumber
Untuk yang pertama repeat, Anda dapat mengubah blah.repeat(val)ke blah[w="repeat"](val) dan kemudian Anda dapat mengubah kejadian berikutnya repeatuntuk hanya [w](val)menghemat byte
Kritixi Lithos
@ KritixiLithos Saya tidak bisa melakukan itu karena yang pertama repeatada di dalam forloop dan tidak akan berjalan n=1, tapi saya masih bisa menyimpan 21 byte.
Neil
4

C ++ (pada Windows), 330 312 308 304 303 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;}}

Telepon dengan:

int main()
{
    f(8);
}
Steadybox
sumber
0

C (pada 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);}}

Mirip dengan jawaban C ++ saya, tapi saya memposting ini karena agak pendek di C.

Steadybox
sumber
@DLosc Ini C. #importadalah ekstensi GCC (usang). Cocok untuk bermain golf.
Steadybox
Hah, menarik. Sekarang saya melihat bahwa ada tip untuk itu. Anda mungkin menyebutkan itu dalam jawaban Anda.
DLosc
@DLosc Mungkin, tapi saya pikir ini cukup banyak digunakan dalam bermain golf, bersama dengan beberapa ekstensi GCC lainnya (walaupun tidak terbatas pada GCC) seperti menghilangkan <stdio.h>dan secara otomatis mengasumsikan variabel global menjadi intatau fungsi untuk mengembalikan int.
Steadybox
0

Javascript 418 377 byte

Terima kasih kepada @Kritixi Lithos untuk membantu golf dari 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):''}

Cobalah secara Online

fəˈnɛtɪk
sumber
2
Untuk yang pertama repeat, Anda dapat mengubah blah.repeat(val)ke blah[w="repeat"](val)dan kemudian Anda dapat mengubah kejadian berikutnya dari repeathanya [w](val)untuk menghemat byte
Kritixi Lithos