让我倒置一棵圣诞树!


15

挑战

我们都知道普通的圣诞树-但是倒挂的圣诞树呢!这是一个相当容易的圣诞节主题挑战。挑战的目的是使我成为一棵ASCII颠倒的圣诞树。以下是此挑战的规则:

  1. 接受一个奇数正整数。您可以假设它始终在7和之间51
  2. 树的底部将由以下字符组成:

    ___
    \ /
     |
    
  3. 树的顶部(星星)将由一个组成*

  4. 树的每一行都将使用<?>其中?任意数量-s 的格式构造。例如,如果制作一条长度5为的线,则该线应为<--->。或者,如果要画一条长度的线,那条8线应该是<------>

  5. 这是树体的构造方法:

    1. n给定的奇数为输入,并创建长度为该树的线。

    2. 减去4n并创建一个行树长度。

    3. 减去2n并创建一个行树长度。

    4. 递减n2。此后,除非n等于5,否则返回步骤2。

  6. 底数(请参阅步骤2),星形(请参阅步骤3)和树的每一行(请参阅步骤4和5.)均应以原始奇数输入(请参阅步骤1)为中心。宽度。

示例/测试用例

odd number inputed: 7
  ___
  \ /
   |
<----->      line length -> 7
  <->        line length -> 7 - 4 = 3
 <--->       line length -> 7 - 2 = 5
   *


odd number inputed: 13
     ___
     \ /
      |
<----------->      line length -> 13
  <------->        line length -> 13 - 4 = 9
 <--------->       line length -> 13 - 2 = 11
   <----->         line length -> 11 - 4 = 7
  <------->        line length -> 11 - 2 = 9
    <--->          line length -> 9 - 4 = 5
   <----->         line length -> 9 - 2 = 7
     <->           line length -> 7 - 4 = 3 
    <--->          line length -> 7 - 2 = 5
      *


odd number inputed: 9
   ___
   \ /
    |
<------->      line length -> 9
  <--->        line length -> 9 - 4 = 5
 <----->       line length -> 9 - 2 = 7
   <->         line length -> 7 - 4 = 3
  <--->        line length -> 7 - 2 = 5
    *


odd number inputed: 17
       ___
       \ /
        |
<--------------->      line length -> 17
  <----------->        line length -> 17 - 4 = 13
 <------------->       line length -> 17 - 2 = 15
   <--------->         line length -> 15 - 4 = 11
  <----------->        line length -> 15 - 2 = 13
    <------->          line length -> 13 - 4 = 9
   <--------->         line length -> 13 - 2 = 11
     <----->           line length -> 11 - 4 = 7
    <------->          line length -> 11 - 2 = 9
      <--->            line length -> 9 - 4 = 5
     <----->           line length -> 9 - 2 = 7
       <->             line length -> 7 - 4 = 3
      <--->            line length -> 7 - 2 = 5
        *    

规则


3
鉴于输入保证为奇数,我们可以按奇数序列取其索引吗?
FlipTack

另外- repeat the above steps until the odd number minus 2 equals 5在第一个输入中,奇数是7,并且7-2 = 5,因此树应该立即结束(我知道你的意思,但是它需要改写)
FlipTack

@FlipTack我不确定您的意思。如果7最小输入为奇数,则首先创建三行树(子步骤.1.1,.1.2,.1.3),然后2从奇数中减去并测试其是否相等5。最后检查“奇数减2等于5”的指令应首先执行其他三个步骤。但是要回答您的第一个评论,那很好。
基督教教务长

1
@FlipTack我想他是在问您是否必须接受7输入或是否可以接受4,如第四个奇数(或3它是否为0索引)。
DonielF '17

4
来自标题:“好吧,您现在是一棵倒挂的圣诞树。”
dkudriavtsev

Answers:


10

Python 3中127个 121 105 103 100 98字节

这是一个未命名的lambda函数,它返回行列表:

lambda o:[s.center(o)for s in['___','\ /','|',*[f'<{"-"*(o-i+2-i%2*3)}>'for i in range(4,o)],'*']]

在线尝试!

这个答案的主要部分是(o-i+2-i%2*3),它计算出一行上的破折号数量。剩下的答案只是将其转换为所需的ASCII艺术。

非常感谢Xcoder先生剃光了6个字节,并在聊天中与我讨论了高尔夫球。

也要感谢Lynn注意,3*(i%2)可以i%2*3缩短2个字节!



2
每当我发布Python答案时,无论一天中的时间或当前位置如何,@ Mr.Xcoder都会为他提供高尔夫:)
FlipTack

Welp,这轻松击败了我的250字节以上的Python解决方案。不错的工作!+1
Christian Dean

o-i+2-i%2*3保存两个字节。
林恩

@Lynn好地方,已更新。
FlipTack

7

C,163字节

#define P;printf(
i;g(l){P"%*c",1+i-l--/2,60);for(;--l P"-"))P">\n");}f(n){i=n/2 P"%*c__\n%*c /\n%*c|\n",i,95,i,92,i,32);for(g(n);n>5;g(n-=2))g(n-4)P" %*c",i,42);}

在线尝试!

展开:

#define P;printf(

i;
g(l)
{
    P"%*c", 1+i-l--/2, 60);
    for (; --l P"-"))
    P">\n");
}

f(n)
{
    i=n/2
    P"%*c__\n%*c /\n%*c|\n", i, 95, i, 92, i, 32);

    for(g(n); n>5; g(n-=2))
        g(n-4)

    P" %*c", i, 42);
}


5

木炭,28字节

__⸿ /⸿|F⮌…¹⊘N«⸿⊕ι>⸿⊖ι>»‖B← *

在线尝试!链接是详细版本的代码。说明:

__⸿ /⸿|

打印底座。

F⮌…¹⊘N«

从输入数字的一半向下循环到1。

⸿⊕ι>⸿⊖ι>»

打印两行,第一行-多于循环索引,第二行少一。

‖B←

镜像以完成树。

 *

放置星星。



3

视网膜,89字节

.+
$*->
^--
<
+`( *<)----(-+>)$
$&¶  $1$2¶ $1--$2
s`.*¶( +)<->.*
$1___¶$1\ /¶$1 |¶$&¶$1 *

在线尝试!说明:第一阶段将输入转换为一元并附加一个>。第二阶段-用a 替换两个s <以校正行长。然后,第三阶段复制分支,但每次都稍短一些,直到不能再进一步缩短分支为止。最后阶段添加基数和星号。


2

Javascript 506个字节

高尔夫版本:

function tree(i){const mid=(i+1)/2;const leg1=' '.repeat((mid-2))+`___
`;const leg2=' '.repeat((mid-2))+`\\ \/
`;const leg3=' '.repeat((mid-1))+`|
`;let xmasTree=leg1+leg2+leg3;for(let j=0;j<(i-4);j++){if(j%2===0){let v=j/2;let t=i-2*v-2;let body1=" ".repeat(j/2)+"<"+"-".repeat(t)+">"+`
`;xmasTree=xmasTree+body1}else{let k=1+Math.ceil(j/2);let h=i-2*k-2;let body2=' '.repeat(k)+'<'+'-'.repeat(h)+">"+`
`;xmasTree=xmasTree+body2}}
const head=' '.repeat((mid-1))+'*'
xmasTree=xmasTree+head;return xmasTree}

非高尔夫版本:

function tree(i){
  const mid = (i+1)/2;
  const leg1 = ' '.repeat((mid-2)) + `___
`;
  const leg2 = ' '.repeat((mid-2)) + `\\ \/
`;
  const leg3 = ' '.repeat((mid-1)) + `|
`;
  let xmasTree = leg1 + leg2 + leg3;
  for (let j = 0; j<(i-4); j++) {
    if (j%2===0) {
      let v = j/2;
      let t = i-2*v-2;
      let body1 = " ".repeat(j/2)+"<"+"-".repeat(t) +">"+`
`;
      xmasTree = xmasTree + body1;
    } else {
      let k = 1 + Math.ceil(j/2);
      let h = i-2*k-2;
      let body2 = ' '.repeat(k)+ '<'+ '-'.repeat(h) + ">"+`
`;
      xmasTree = xmasTree + body2;
    }
  }
  const head = ' '.repeat((mid-1)) + '*'
  xmasTree = xmasTree + head;
  return xmasTree;
}

用法: console.log(tree(13)), console.log(tree(17)),

ES6 165字节(来自我的朋友)

高尔夫版本:

p=n=>{l=_=>console.log(`${' '.repeat((n-_.length)/2)}${_}`);t=_=>_==1?'*':'<'+'-'.repeat(_-2)+'>';x=n;l('___');l('\\ /');l('|');for(;x!==3;){l(t(x));l(t(x-4));x-=2}}

非高尔夫版本:

p = n => {
  l = _ => console.log(`${' '.repeat((n-_.length)/2)}${_}`);
  t = _ => _ == 1 ? '*' : '<' + '-'.repeat(_-2)+'>';
  x = n;
  l('___');l('\\ /');l('|');
  for(;x!==3;) {
    l(t(x)); l(t(x-4));x-=2;
  }
}

用法: p(31); p(17);


1
您可以通过仅使用1个字母的变量名称,删除const关键字等来进行很多操作
FlipTack

1

PowerShell,131字节

$i=2;$x="$args"..5|%{' '*($j=if($_%2){$i-2}else{($i++)})+'<'+'-'*($_-(5,2)[$_%2])+'>'};($y=' '*++$j)+"___";"$y\ /";"$y |";$x;"$y *"

在线尝试!

好吧,这对任何不熟悉PowerShell的人来说都是一个正确的选择……所以,让我们看看我如何能很好地解释它的工作原理。

为了进行解释,我将使用input = 17

我们开始很简单,将helper变量$i=2设置$x<something>,将start 设置为<something>从输入$args到的范围5,因此17,16,15,...,6,5。该范围被泵入for循环。

每次迭代,我们首先将helper变量设置$jif语句的结果if($_%2){$i-2}else{($i++)}。如果很奇怪$j=$i-2,否则$j=($i++)。再加$i=2上开头,这给我们提供了一个序列0, 2, 1, 3, 2, 4, 3, 5...,恰好恰好对应于我们需要在树线之前添加多少空间。;-)我们' '将其乘以该数字并乘以该数字。

接下来,我们需要我们的分支机构。这是通过'<'将中间部分'-'相乘,最后加上来完成的'>'。乘法是通过基于输入数字识别-2, 5, 2, 5, 2...模式中的备用值而完成的$_,因此我们正在基于该模式从伪三元数中进行选择。

为了进一步说明,这是每个部分中的前几个术语:

$_ = 17 16 15 14 13 12 11 10
$j =  0  2  1  3  2  4  3  5
mid=  2  5  2  5  2  5  2  5
'-'= 15 11 13  9 11  7  9  5

因此,现在我们设置$x为一个分支数组(即字符串)。在循环之外,我们现在用适当数量的空间构建树“ top” $y,然后显示分支$x,然后显示树“ bottom” *。它们中的每一个都保留在管道上,输出在项目之间带有换行符,是隐式的。


1

的JavaScript(ES6),150个 147字节

N=>{for(s=' '[r='repeat'](N/2-1),s+=`___
${s}\\ /
${s} |
`,n=N,l=n=>' '[r](N/2-n/2)+(n-1?`<${'-'[r](n-2)}>
`:'*');n-3;n-=2)s+=l(n)+l(n-4)
return s}



0
N=>{for(s=' '[r='repeat'](N/2-1),s+=`___
${s}\\ /
${s} |
`,l=n=>' '[r](N/2-n/2)+n-1?`<${'-'[r](n-2)}>
`:'*');N-=2;s+=l(N)+l(N-4);return s}

我尝试使用JS ESGoogoltriplex。

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.