มองไม่เห็นป่าสำหรับต้นไม้


29

เขียนโปรแกรมหรือฟังก์ชั่นที่ดึงต้นไม้ต้นไม้ขึ้นมาเพื่อสร้างป่า

ต้นไม้ถูกดึงเหมือนกองปิรามิด แถวแรก (บนสุด) มี1ต้นไม้แถวถัดไปมี2(สำหรับผลรวม3), แถวถัดไปมี3(สำหรับจำนวนทั้งหมด6) และอื่น ๆ หากไม่มีต้นไม้มากพอที่จะเติมเต็มแถวให้กรอกทางด้านซ้ายแล้วปล่อยให้จุดนั้นว่างเปล่าทางด้านขวา นอกจากนี้ต้นไม้ระดับล่างจะทับซ้อนต้นไม้ระดับบนเล็กน้อยเนื่องจากการจัดวาง

นี่คือป่าขนาด 1

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

นี่คือป่าขนาด 2

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

นี่คือป่าขนาด 3

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

นี่คือป่าขนาด 4

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

นี่คือป่าขนาด5(โปรดสังเกตด้านบนของต้นไม้ที่ห้าครอบคลุมลำต้นของต้นไม้ต้น)

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

(ข้ามไปสองสามครั้ง)
นี่คือป่าขนาด8(ขยายรูปแบบ)

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

และอื่น ๆ

อินพุต

เป็นจำนวนเต็มบวกเดียวในรูปแบบที่สะดวกใด ๆn > 0 ,

เอาท์พุต

การแทนค่า ASCII-art ของฟอเรสต์ทำตามกฎข้างต้น ขึ้นบรรทัดใหม่ / ต่อท้ายหรือช่องว่างอื่น ๆ เป็นตัวเลือกโดยมีเงื่อนไขว่าต้นไม้ทั้งหมดเข้าแถวกันอย่างเหมาะสม

กฎระเบียบ

  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการตีกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

ฉันไม่แน่ใจว่ารูปแบบเกี่ยวกับลำดับการวาดต้นไม้ นั่นคือnตำแหน่งของต้นไม้คืออะไร?
Luis Mendo

@ LuisMendo อย่างที่ฉันเข้าใจพวกมันเต็มไปด้วยลำดับการอ่าน ดังนั้นแต่ละแถวจะถูกเติมเต็มและถ้าไม่มีต้นไม้มากพอสำหรับแถวทั้งหมดส่วนที่เหลือจะถูกวางให้ไกลที่สุดเท่าที่จะทำได้ในแถวนั้น
xnor

@LuisMendo xnor มีสิทธิ์ หากฉันสามารถพูดอีกครั้งเพื่อให้ชัดเจนยิ่งขึ้นโปรด ping ฉันในการแชท
AdmBorkBork

@xnor ขอบคุณตอนนี้มันชัดเจนสำหรับฉันแล้ว
Luis Mendo

@Adm จริงๆแล้วมันถูกเขียนที่นั่นในความท้าทาย เห็นได้ชัดว่าฉันอ่านไม่ออก :-)
Luis Mendo

คำตอบ:


5

Haskell 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

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

แก้ไข: บันทึกแล้ว 21 ไบต์ขอบคุณ @KritixiLithos


สำหรับครั้งแรกrepeatคุณสามารถเปลี่ยนblah.repeat(val)เป็นblah[w="repeat"](val) และจากนั้นคุณสามารถเปลี่ยนเหตุการณ์ที่ตามมาของrepeatเป็นเพียง[w](val)เพื่อบันทึกเป็นไบต์
Kritixi Lithos

@KritixiLithos ฉันไม่สามารถทำเช่นนั้นได้เพราะตัวแรกrepeatอยู่ในforลูปและจะไม่วิ่งn=1แต่ฉันก็ยังสามารถบันทึกได้ 21 ไบต์
Neil

4

C ++ (บน Windows), 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 It's C. #importเป็นส่วนขยาย GCC (คัดค้าน) เหมาะสำหรับเล่นกอล์ฟ
Steadybox

ฮืมน่าสนใจ ตอนนี้ฉันเห็นแล้วว่ามีเคล็ดลับสำหรับสิ่งนั้น คุณอาจพูดถึงสิ่งนั้นในคำตอบของคุณ
DLosc

@DLosc บางที แต่ฉันคิดว่ามันค่อนข้างใช้กันอย่างแพร่หลายในการเล่นกอล์ฟพร้อมกับบาง GCC อื่น ๆ ( แต่ไม่ จำกัด เฉพาะ GCC) ส่วนขยายเช่นถนัด<stdio.h>โดยอัตโนมัติและสมมติตัวแปรทั่วโลกที่จะเป็นหรือฟังก์ชั่นที่จะกลับมาint int
Steadybox

0

จาวาสคริ 418 377 ไบต์

ขอบคุณ @Kritixi Lithos ที่ช่วยตีกอล์ฟออก 39 ไบต์

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.