帮助我疯狂的妻子装饰我们的圣诞树


36

可以说,我的妻子非常特别,尤其是在圣诞树上放置装饰品的时候。让我们给她一些代码,以帮助她在这个艰难的时期。

输入值

给定输入2 < n < 10的树的高度和0 < k < n不同数量的装饰品。

任务

当我们将装饰物包裹在树上时,装饰树的起始位置为,1然后增加k为。如果我们到达k并且我们有更多分支要装饰,则从开始1

只要满足模式,树上每个装饰物的数量都可以不相同。

装饰品应显示在每个分支^的上方(顶行除外)。

树的结构是从一个分支开始,然后下一级有+ 1个分支,每个分支之间有一个间隔,从顶部开始交错排列,例如:

 ^
^ ^

对于第三行,您将再添加一个分支,然后再次交错它们,以使同一列上没有分支(如果您将其视为网格)。

  ^
 ^ ^
^ ^ ^

输出量

输出装饰的树。

例子

1。

n = 3, k = 2

  ^      //Height is 3
 ^ ^
^ ^ ^

现在我们装饰从1开始的每个分支,并递增到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
^ ^ ^ ^ ^

这是所以最短的代码获胜!玩得开心,祝你好运!


每行后的空格可以接受吗?
Mukul Kumar

1
@MukulKumar否应该保持上面的结构。
jacksonecac

我们可以假设k小于10吗?否则,如何对齐数字?
路易斯·门多

2
@ LuisMendo是的,假设<10个好点
jacksonecac

Answers:


47

C#226221字节

@Mukul Kumar和@aloisdg节省了5个字节

打高尔夫球:

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

取消高尔夫:

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

测试:

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

编辑:我有一个戏剧演员intConsoleColor...该季节:)

在此处输入图片说明

MerryChristmas.gif

在此处输入图片说明


3
您可以i=1输入int声明并将其从for循环中删除...
Mukul Kumar

1
您可以将“ \ r \ n”替换为“ \ n”。它将与core和mono一起正常运行。
aloisdg说恢复莫妮卡

8
很高兴看到C#答案得到一些爱。
Michael McGriff

@aloisdg谢谢:)
Pete Arden

1
@jacksonecac很高兴您喜欢它。这个想法进入我的脑海后,我无法抗拒:)
皮特·阿登

14

05AB1E29 27 24字节

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

在线尝试!


2
我想你可以替换NN>*;NLO
阿德南

当然!这很有趣,因为我实际上N*(N+1)/2有意使用了从1开始的连续整数之和,但是我完全忘记了05AB1E内置了该函数。谢谢!
2016年

2
另外,您ï现在是否需要:p吗?
阿德南

1
我不这么认为^^。
2016年

12

JavaScript(ES6),97个字节

您的妻子似乎真的疯了,所以这不包括任何前导或结尾的换行符,也不包括任何前导或结尾的空格。:-)

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

演示版


8

C ++ 2141-31-3-1 -10 = 186字节

打高尔夫球

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

感谢@ cyoce节省了1个字节。
感谢@康纳尔的了下去到186!

非高尔夫+复制和编译

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

最终<200 ...
Mukul Kumar

1
之后您可以删除空格#define s(a)吗?
Cyoce

@Cyoce谢谢!我不知道那个!!!
Mukul Kumar

2
通过将定义更改为186字节#define s std::cout<<并进行相应的调整。
科纳·奥布赖恩

哇,真是太好了..我从没想过:p
Mukul Kumar

3

Python 2,133字节

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

2

Clojure,223个字节

我第一次和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")))))))

当像(println (str "\n" (d 6 5)))换行符一样被调用时,它在REPL上变得更好:

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

未打高尔夫球:

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

我在使用惰性序列和嵌套列表时遇到了一些问题,但是我能够通过不重复repeat;)并使用\^字符而不是"^"字符串来保存一些字符。我也可以省去很多空白。


不错的第一答案,欢迎光临本站!
DJMcMayhem

1

Ruby 107字节

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

这样称呼

t.call(5,4)

输出:

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

1

C,170字节

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

致电:

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

作为奖励,这是4位二进制版本:

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);}}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.