Ağaçlar için ormanı göremiyorum


29

Bir ağaç ağacı çizen, böylece bir orman inşa eden bir program veya işlev yazın.

Ağaçlar bir piramit istifliyor gibi çekiliyor. İlk (üst) satır 1ağaç içerir , bir sonraki satır aşağı 2(toplam için 3), sonraki sayfa 3(toplam için 6) vb. İçerir. Tam bir sırayı tamamlamak için yeterli ağaç yoksa, sola doldurun ve lekeleri sağdaki boş bırakın. Ek olarak, alt seviyeli ağaçlar yerleştirilmeleri nedeniyle üst seviyedeki ağaçlara biraz üst üste gelir.

Bu büyüklükte bir orman 1

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

Bu büyüklükte bir orman 2

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

Bu büyüklükte bir orman 3

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

Bu büyüklükte bir orman 4

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

Bu büyüklükte bir ormandır 5(beşinci ağacın tepesinin ilk ağacın gövdesini kapladığını unutmayın)

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

(birkaçını atla)
Bu büyüklükte bir ormandır 8(deseni genişletme)

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

ve bunun gibi.

Giriş

Tek bir pozitif tam sayı , herhangi bir uygun biçimde , n > 0.

Çıktı

Yukarıdaki kuralları izleyerek ormanın ASCII-sanat temsili. Lider / izleyen yeni hatlar veya diğer boşluklar, ağaçların uygun şekilde sıralanması şartıyla isteğe bağlıdır.

kurallar

  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine geri gönderebilirsiniz.
  • Standart boşluklar yasaktır.
  • Bu olduğundan, tüm normal golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Ağaçların çizildiği sıraya göre modelin ne olduğundan emin değilim. Bu, verilen nağaçların konumu nedir?
Luis Mendo

@LuisMendo Anladığım kadarıyla, okuma sırasına göre doldurulur. Böylece, her sıra sırayla doldurulur ve tüm sıra için yeterli ağaç yoksa, kalan kısım o sıraya mümkün olduğunca uzağa yerleştirilir.
xnor

@LuisMendo xnor doğru. Bunu daha net hale getirmek için yeniden kelimelendirebilirsem, lütfen sohbete beni at.
AdmBorkBork

@xnor Teşekkürler, şimdi bana tamamen açık
Luis Mendo

@Adm Aslında orada meydan okumaya yazıldı. Görünüşe göre ben okuyamıyorum :-)
Luis Mendo

Yanıtlar:


5

Haskell 310 bayt

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Örneğin, onu arayın .

İşte sıkıştırılmamış kod:

-- 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'ye Hoşgeldiniz!
AdmBorkBork

4

JavaScript (ES6), 357 297 276 bayt

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>

Düzenleme: @KritixiLithos sayesinde 21 bayt kaydedildi.


İlk için repeat, değiştirebileceğiniz blah.repeat(val)için blah[w="repeat"](val) ve sonra sonraki tekrarlarını değiştirebilir repeatlazım [w](val)yerine bayt tasarrufu için
Kritixi Lithos

@KritixiLithos Bunu bir şey yapamam çünkü ilki döngü repeatiçindedir forve çalışmayacak n=1, ancak yine de 21 bayt kaydedebildim.
Neil

4

C ++ (Windows'ta), 330 312 308 304 303 bayt

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

İle ara:

int main()
{
    f(8);
}

0

C (Windows'ta), 297 295 294 bayt

#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 ++ cevabına benzer şekilde, ancak bunu C içinde biraz daha kısa olduğu için gönderdim


@Dosc. C. #importbir (kullanımdan kaldırılmış) GCC uzantısıdır. Yine de golf oynamak için uygun.
Steadybox

Huh, ilginç. Şimdi bunun için bir ipucu olduğunu görüyorum . Cevabında bundan bahsedebilirsin.
DLosc

@DLosc Belki, ama sanırım golf oynamakta, diğer bazı GCC'lerle (GCC ile sınırlı olmasa da) <stdio.h>, küresel bir değişkeni atlamak ve otomatik olarak varsaymak intya da bir işlev olarak kabul etmek gibi uzantıları kullanmak oldukça yaygın olarak kullanılıyor int.
Steadybox

0

Javascript 418 377 bayt

39 byte kapalı golf oynamaya yardımcı olan @Kritixi Lithos için teşekkürler

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

Çevrimiçi Deneyin


2
İlk için repeat, değiştirebileceğiniz blah.repeat(val)için blah[w="repeat"](val)ve sonra sonraki tekrarlarını değiştirebilir repeatlazım [w](val)yerine bayt tasarrufu için
Kritixi Lithos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.