私を逆さまのクリスマスツリーにしよう!


15

チャレンジ

私たちは皆、通常のクリスマスツリーについて知っていますが、逆さまのクリスマスツリーについてはどうでしょうか。これはかなり簡単な、クリスマスをテーマにした挑戦です。このチャレンジの目的は、私をASCIIの逆さまのクリスマスツリーにすることです。このチャレンジのルールは次のとおりです。

  1. 奇数の正の整数を受け入れます。常にとの間にある7と仮定でき51ます。
  2. ツリーのベースは、次の文字で構成されます。

    ___
    \ /
     |
    
  3. ツリーの上部(星)は、単一ので構成され*ます。

  4. ツリーの各ラインの形式使用して構築される任意の数であるSを。たとえば、長さの行を作成する場合、行はである必要があります。または、長さの行を作成する場合、行は。<?>?-5<--->8<------>

  5. 以下にツリーのボディを構築する方法を示します。

    1. n入力として与えられた奇数を取り、その長さの木の線を作成します。

    2. 減算4からn、その長さの木の行を作成します。

    3. 減算2からn、その長さの木の行を作成します。

    4. nによる減少2。その後、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、および= 5 7-2である(私はあなたが何を意味するか知っているが、それは言い換えが必要)
FlipTack

@FlipTackあなたが何を言っているのか正確にはわかりません。奇数7が最小入力の場合、最初に3本のツリーライン(サブステップ.1.1、.1.2、.1.3)を作成し、次に2奇数から減算して、等しいかどうかをテストし5ます。「奇数から2を引いた値が5に等しい」かどうかを確認する命令は最後にあります。他の3つのステップを最初に実行する必要があります。しかし、あなたの最初のコメントに答えるために、それは問題ないでしょう。
クリスチャンディーン

1
@FlipTack彼は、4番目の奇数のように(またはインデックスが0の場合)7入力として受け入れる必要があるかどうかを尋ねていると思います。43
ドニエル

4
タイトルから:「わかりました、あなたは今、逆さまのクリスマスツリーです。」
dkudriavtsev

回答:


10

Pythonの3127の 121 105 103 100 98バイト

これは、行のリストを返す名前のないラムダ関数です。

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)であり、1行に含めるダッシュの数を計算します。答えの残りは、単にこれを目的のASCIIアートに変換することです。

6バイトを削り、チャットでゴルフについて話し合ってくれたMr Xcoderに感謝します。

また、2バイト短くなることに気付いたLynnにも感謝します!3*(i%2)i%2*3



2
Pythonの回答を投稿するときはいつでも、@ Mr.Xcoderが時刻や彼の現在の場所に関係なく、与えるべきゴルフを持っています:)
FlipTack

Welp、これは250バイト以上のPythonソリューションを簡単に打ち負かします。良くやった!+1
クリスチャンディーン

o-i+2-i%2*32バイト節約します。
リン

@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 *

オンラインでお試しください!説明:最初のステージは、入力を単項に変換し、を追加し>ます。2番目の段階では、2つ-のをa <に置き換えて行の長さを修正します。次に、3番目のステージはブランチを複製しますが、ブランチをそれ以上短くできないまで、毎回少しずつ短くします。最終段階では、ベースとスターを追加します。


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}

Ungolfバージョン:

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

Ungolfバージョン:

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ます。

ヘルパー変数$i=2を設定$x<something>、に設定して、<something>入力からの範囲として開始$argsするように5、非常に簡単に始め17,16,15,...,6,5ます。その範囲はforループに送り込まれます。

繰り返しごとに、ヘルパー変数の設定から始めます $jifステートメントの結果にif($_%2){$i-2}else{($i++)}。奇数の場合$j=$i-2、それ以外の場合$j=($i++)。これ$i=2は、最初と相まって0, 2, 1, 3, 2, 4, 3, 5...、ツリーラインに追加する必要があるスペースの数に正確に対応するシーケンスを提供します。;-) ' 'それを取り出して、その数で文字列乗算します。

次に、ブランチが必要です。これは'<'プラスの中央部分'-'とプラスの終わりで行われ'>'ます。乗算は、入力番号に基づいてパターン-内の代替を認識することで行われるため、そのパターンに基づいて擬似3項から選択しています。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、ブランチの配列(つまり、文字列)に設定しました。ループの外側で、適切な数のスペースをに保存してツリー「トップ」を構築し$y、ブランチを表示します$xから、ツリーを「ボトム」で*ます。これらはそれぞれパイプラインに残され、出力はアイテム間の改行で暗黙的に行われます。


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での私の試み。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.