Сделай мне перевернутую елку!


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
Из заголовка: «Хорошо, теперь ты перевернутая новогодняя елка».
Дкудрявцев

Ответы:


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

Хорошо , это легко превосходит мои 250 байтов + решение Python. Хорошая работа! +1
Кристиан Дин

o-i+2-i%2*3сохраняет два байта.
Линн

@ Линн Хорошее место, обновлено.
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 на a, <чтобы скорректировать длину строки. Третий этап затем копирует ветвь, но немного короче каждый раз, пока ветвь не может быть сокращена дальше. Заключительный этап добавляет базу и звезду.


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
Вы можете 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. Этот диапазон закачивается в цикл.

Каждую итерацию мы начинаем с установки вспомогательной переменной $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массив ветвей (т. Е. Строк). Вне цикла мы теперь строим наше дерево "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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.