Зробіть мені перевернуту ялинку!


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, а 7-2 = 5, тому дерево має закінчитися миттєво (я знаю, що ви маєте на увазі, але воно потребує перефразовування)
FlipTack

@FlipTack Я не зовсім впевнений, що ти маєш на увазі. Якщо непарне число - 7мінімальний вхід, ви спершу створите три рядки дерева (під кроки .1.1, .1.2, .1.3), потім віднімаєте 2від непарного числа і перевіряєте, чи дорівнює 5. Інструкція перевірити, чи "непарне число мінус 2 дорівнює 5" в кінці, інші три кроки слід виконати першими. Але відповісти на ваш перший коментар, це було б добре.
Крістіан Дін

1
@FlipTack Я думаю, що він запитує, чи потрібно приймати 7як вхід, чи ви можете прийняти 4, як у четвертому непарному номері (або, 3якщо це 0-індексований).
DonielF

4
З назви: "Гаразд, ти зараз перевернута ялинка".
dkudriavtsev

Відповіді:


10

Python 3 , 127 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), що визначається кількість тире, що має бути на лінії. Решта відповіді - просто перетворити це на потрібне ASCII-мистецтво.

Велике спасибі містеру Xcoder за те, що голили 6 байт і обговорювали зі мною гольфи у чаті.

Дякуємо також Лінні за те, що помітили, що це 3*(i%2)може бути на i%2*32 байти коротше!



2
Щоразу, коли я публікую відповідь Python, незалежно від часу доби чи його поточного місця розташування, @ Mr.Xcoder має гольф подарувати :)
FlipTack

Welp , це легко перемагає мої 250 байт + рішення Python. Хороша робота! +1
Крістіан Дін

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}

Версія 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)),

165 байт ES6 (від мого друга)

Версія для гольфу:

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
буквені

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.

Кожна ітерація, ми почнемо з установкою змінного помічника , $jщоб бути результатом ifзаяви 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масив гілок (тобто рядків). Поза межами циклу ми тепер будуємо наше дерево "вершиною" з відповідною кількістю збережених пробілів $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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.