36
\$\begingroup\$

My wife is very, let's say, particular when it comes to putting ornaments on our Christmas tree. Let's get her some code to help her in this trying time.

Input

Given an input 2 < n < 10 the height of the tree and 0 < k < n the distinct number of ornaments.

Task

Decorate the tree starting with 1 and increment to k as we wrap the ornaments around the tree. If we reach k and we have more branches to decorate then start back at 1.

It is okay if there are not the same number of each ornament on the tree, as long as the pattern is satisfied.

The ornaments should appear above each branch ^ except for the top row.

The tree is structured by starting with one branch then the next level has + 1 branches with a space between each, staggered from the top like:

 ^
^ ^

For a third row you would add one more branch and stagger them again such that no branch is on the same column (if you think of it like a grid).

  ^
 ^ ^
^ ^ ^

Output

Output your decorated tree.

Examples

1.

n = 3, k = 2

  ^      //Height is 3
 ^ ^
^ ^ ^

Now we decorate each branch starting with 1 and increment to k:

  ^
 1 2
 ^ ^
1 2 1
^ ^ ^

2.

n = 6, k = 5

     ^    //Non-Decorated
    ^ ^
   ^ ^ ^
  ^ ^ ^ ^
 ^ ^ ^ ^ ^
^ ^ ^ ^ ^ ^

     ^    //Decorated
    1 2
    ^ ^
   3 4 5
   ^ ^ ^
  1 2 3 4
  ^ ^ ^ ^
 5 1 2 3 4
 ^ ^ ^ ^ ^
5 1 2 3 4 5
^ ^ ^ ^ ^ ^

3.

n = 5, k = 1

    ^
   ^ ^
  ^ ^ ^
 ^ ^ ^ ^
^ ^ ^ ^ ^

    ^
   1 1
   ^ ^
  1 1 1
  ^ ^ ^
 1 1 1 1
 ^ ^ ^ ^
1 1 1 1 1
^ ^ ^ ^ ^

This is so the shortest code wins! Have fun and good luck!

\$\endgroup\$
  • \$\begingroup\$ spaces after each line acceptable ? \$\endgroup\$ – Mukul Kumar Dec 6 '16 at 13:44
  • 1
    \$\begingroup\$ @MukulKumar no It should maintain the structure above. \$\endgroup\$ – jacksonecac Dec 6 '16 at 13:47
  • \$\begingroup\$ Can we assume k less than 10? Or else, how to align the numbers? \$\endgroup\$ – Luis Mendo Dec 6 '16 at 15:28
  • 2
    \$\begingroup\$ @LuisMendo Yes assume < 10 good point \$\endgroup\$ – jacksonecac Dec 6 '16 at 15:43
47
\$\begingroup\$

C# 226 221 Bytes

Saved 5 Bytes thanks to @Mukul Kumar and @aloisdg

Golfed:

string C(int n,int k){string o="",x;int j=1,i=1,m;for(;i<=n;i++){o+=string.Concat(Enumerable.Repeat("^ ",i)).PadLeft(n+i)+"\n";m=0;x="";if(i<n){while(m<i+1){if(j>k)j=1;x+=j+++" ";m++;}o+=x.PadLeft(n+i+1)+"\n";}}return o;}

Ungolfed:

public string C(int n, int k, WifeMode wifeMode = WifeMode.Maniacal)
{
  string o = "",x;
  int j = 1,i=1,m;

  for (; i <= n; i++)
  {
    o += string.Concat(Enumerable.Repeat("^ ", i)).PadLeft(n+i) + "\n";

    m = 0;
    x = "";

    if (i < n)
    {
      while (m < i + 1)
      {
        if (j > k) j = 1;
        x += j++ + " ";
        m++;
      }

      o += x.PadLeft(n + i + 1) + "\n";
    }
  }

  return o;
}

Testing:

Console.Write(new ChristmasTreeDecorating().C(20, 9));

                   ^ 
                  1 2 
                  ^ ^ 
                 3 4 5 
                 ^ ^ ^ 
                6 7 8 9 
                ^ ^ ^ ^ 
               1 2 3 4 5 
               ^ ^ ^ ^ ^ 
              6 7 8 9 1 2 
              ^ ^ ^ ^ ^ ^ 
             3 4 5 6 7 8 9 
             ^ ^ ^ ^ ^ ^ ^ 
            1 2 3 4 5 6 7 8 
            ^ ^ ^ ^ ^ ^ ^ ^ 
           9 1 2 3 4 5 6 7 8 
           ^ ^ ^ ^ ^ ^ ^ ^ ^ 
          9 1 2 3 4 5 6 7 8 9 
          ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
         1 2 3 4 5 6 7 8 9 1 2 
         ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
        3 4 5 6 7 8 9 1 2 3 4 5 
        ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
       6 7 8 9 1 2 3 4 5 6 7 8 9 
       ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
      1 2 3 4 5 6 7 8 9 1 2 3 4 5 
      ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
     6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 
     ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
    3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 
    ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
   1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 
   ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
  9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 
  ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 
 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

Edit: I had a play casting int to ConsoleColor... Tis the season :)

enter image description here

MerryChristmas.gif

enter image description here

\$\endgroup\$
  • 3
    \$\begingroup\$ You can give i=1 in the int declaration and remove it from your for loop... \$\endgroup\$ – Mukul Kumar Dec 7 '16 at 1:58
  • 1
    \$\begingroup\$ You can replace "\r\n" with "\n". It will run fine with core and mono. \$\endgroup\$ – aloisdg says Reinstate Monica Dec 7 '16 at 9:22
  • 8
    \$\begingroup\$ Good to see a C# answer getting some love. \$\endgroup\$ – Michael McGriff Dec 7 '16 at 15:23
  • \$\begingroup\$ @aloisdg Thanks :) \$\endgroup\$ – Pete Arden Dec 9 '16 at 20:45
  • 1
    \$\begingroup\$ @jacksonecac Glad you enjoyed it. Couldn't resist once the idea came into my head :) \$\endgroup\$ – Pete Arden Dec 9 '16 at 20:46
14
\$\begingroup\$

05AB1E, 29 27 24 bytes

Saved three bytes thanks to Adnan!

>GN„^ ×NÝNLO<+²%>ðý}\».c

>G                       For N in [1, ..., input[0]]
  N„^ ×                  Push a string of "^ " N times
       NÝ                Push [0, ..., N]
         NLO<            Compute the decoration offset, sum([1, ..., N])-1
             +           Add the offset value to each array cell
              ²%         Modulo input[1]
                >        Add 1 so that it is in range [1, k] instead of [0, k-1]
                 ðý      Join with spaces, now we have a string with the full decoration for the current layer
                   }     End for
                    \    Remove the last decoration
                     »   Join everything with newlines
                      .c Center all and implicitly display

Try it online!

\$\endgroup\$
  • 2
    \$\begingroup\$ I think you can replace NN>*; by NLO. \$\endgroup\$ – Adnan Dec 7 '16 at 10:20
  • \$\begingroup\$ Of course! That's funny because I actually used N*(N+1)/2 intentionally to get the sum of consecutive integers starting from 1, but I completely forgot that 05AB1E had built-ins for that. Thanks! \$\endgroup\$ – Osable Dec 7 '16 at 10:36
  • 2
    \$\begingroup\$ Also, do you need the ï part now :p? \$\endgroup\$ – Adnan Dec 7 '16 at 10:50
  • 1
    \$\begingroup\$ I don't think so ^^ . \$\endgroup\$ – Osable Dec 7 '16 at 10:51
12
\$\begingroup\$

JavaScript (ES6), 97 bytes

It seems like your wife really is maniacal, so this doesn't include any leading or trailing newline, nor any leading or trailing space. :-)

f=(n,k,x,s=`^
`)=>n--?(p=' '.repeat(n)+s,x?p.replace(/\^/g,_=>x++%k+1)+p:p)+f(n,k,x||k,'^ '+s):''

Demo

f=(n,k,x,s=`^
`)=>n--?(p=' '.repeat(n)+s,x?p.replace(/\^/g,_=>x++%k+1)+p:p)+f(n,k,x||k,'^ '+s):''

console.log(f(6, 5))

\$\endgroup\$
8
\$\begingroup\$

C++ 214 - 13 - 3 - 1 -1 - 10 = 186 bytes

golfed

#define s std::cout<<
int f(int n,int k){int N=++n,K=0,i=0,I;for(;i<n;i++,N--){for(I=N;I--;)s' ';for(I=0;I++<i&&i-1;)s' '<<(K++%k)+1;s'\n';for(I=N;I--;)s' ';for(I=0;I++<i;)s" ^";s'\n';}}  

Thanks @ cyoce for saving 1 byte.
Thanks @ conor for chopping it down to 186!

Ungolfed + copy&compile

#include<iostream>
#include<conio.h>

#define s(a) std::cout<<a;

int main()
{
    int n,N,k,K=0,i,I;
    std::cin>>n>>k;
    N=++n;
    for(i=0;i<n;i++,N--)
    {
        for(I=N;I--;)

            s(' ')

        for(I=0;I<i&&i-1;I++)

            s(' '<<(K++%k)+1)

        s('\n')

        for(I=N;I;I--)

            s(' ')

        for(I=0;I<i;I++)

            s(" ^")

        s('\n')

    }
    getch();//or any func to pause the console
}  
\$\endgroup\$
  • \$\begingroup\$ finally < 200... \$\endgroup\$ – Mukul Kumar Dec 6 '16 at 14:58
  • 1
    \$\begingroup\$ Can you remove the space after #define s(a)? \$\endgroup\$ – Cyoce Dec 7 '16 at 0:19
  • \$\begingroup\$ @Cyoce thanks! I did not know about that!!! \$\endgroup\$ – Mukul Kumar Dec 7 '16 at 4:54
  • 2
    \$\begingroup\$ 186 bytes by changing the define to #define s std::cout<< and making according adjustments. \$\endgroup\$ – Conor O'Brien Dec 7 '16 at 22:20
  • \$\begingroup\$ Woaa..thats nice.. never crossed my mind:p \$\endgroup\$ – Mukul Kumar Dec 8 '16 at 4:09
3
\$\begingroup\$

Python 2, 133 bytes

n,k=input()
d=-1
j=' '.join
for i in range(1,n+1):s=' '*(n-i);print(['',s+j(`x%k+1`for x in range(d,d+i))+'\n'][i>1]+s+j('^'*i));d+=i
\$\endgroup\$
2
\$\begingroup\$

Clojure, 223 bytes

My first go at golfing with Clojure:

(let[r repeat](defn d[n k](apply str(concat(r(dec n)\ )"^\n"(flatten(for[i(range 2(inc n))m[nil true]](concat(r(- n i)\ )(butlast(interleave(if m(r\^)(rest(iterate #(inc(mod % k))(dec(/(* i(dec i))2)))))(r i\ )))"\n")))))))

When called like (println (str "\n" (d 6 5))) a newline makes it nicer on REPL:

     ^
    1 2
    ^ ^
   3 4 5
   ^ ^ ^
  1 2 3 4
  ^ ^ ^ ^
 5 1 2 3 4
 ^ ^ ^ ^ ^
5 1 2 3 4 5
^ ^ ^ ^ ^ ^

Un-golfed:

(defn tree-row [n k index mode]
  (concat
    (repeat (- n index) \ ) ; Left padding
    (butlast ; Removing trailing space
      (interleave
        ; Either printing carets or numbers...
        (if mode
          (repeat \^)
          ; Using "rest" as the iteration starts from a large value
          ; from which the modulo has not been calculated yet.
          (rest (iterate #(inc (mod % k)) (dec (/ (* index (dec index)) 2)))))
        ; ...and interleaved with spaces
        (repeat index \ )))
    "\n"))

(defn decorate [n k]
  (apply str (concat
               (repeat (dec n) \ ) "^\n"
               (flatten (for [index (range 2 (inc n)) mode [nil true]]
                          (tree-row n k index mode))))))

I had some issues with lazy sequences and nested lists but I was able to save some characters by not repeating repeat ;) and using \^ characters instead of "^" strings. I could also leave out surprisingly many spaces.

\$\endgroup\$
  • \$\begingroup\$ Nice first answer, welcome to the site! \$\endgroup\$ – DJMcMayhem Dec 8 '16 at 20:32
1
\$\begingroup\$

Ruby 107 bytes

t=->(n,k){d=[*1..k]*n*n;o=0;(1..n).each{|b|s=' '*(n-b);b>1&&(puts(s+d[o,b].join(' '));o+=b);puts s+'^ '*b}}

Called like this

t.call(5,4)

Output:

    ^
   1 2
   ^ ^
  3 4 1
  ^ ^ ^
 2 3 4 1
 ^ ^ ^ ^
2 3 4 1 2
^ ^ ^ ^ ^
\$\endgroup\$
1
\$\begingroup\$

C, 170 bytes

i=0;d,j,l;t(n,k){char s[20],r[20];d=k-2;l=n;for(;i++<n;){for(j=0;j<l;++j)s[j]=r[j]=32;for(j=n-i;j<l;j+=2){s[j]=94;r[j]=(++d%k)+49;}s[l]=r[l++]=0;if(i-1)puts(r);puts(s);}}

Call with:

int main()
{
   t(5,4);
}

As a bonus, here's a 4-bit binary version:

m=0;b(n,k){char*a="000100100011010001010110011110001001";char s[20],r[20];d=k*4-2;l=n;for(;m++<n;){for(j=0;j<l;++j)s[j]=r[j]=32;for(j=n-m;j<l;j+=2){s[j]=94;r[j]=a[++d%(k*4)];}s[l]=r[l++]=0;if(m-1)puts(r);puts(s);}}
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.