Допоможіть моїй маніякальній дружині прикрасити нашу ялинку


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

Це тому найкоротший код виграє! Весело та удачі!


пробіли після кожного рядка прийнятні?
Мукул Кумар

1
@MukulKumar ні Він не повинен підтримувати структуру вище.
jacksonecac

Чи можна вважати k менше 10? Або ще, як вирівняти числа?
Луїс Мендо

2
@LuisMendo Так припустимо, <10 хороший момент
jacksonecac

Відповіді:


47

C # 226 221 байт

Збережено 5 байт завдяки @Mukul Kumar та @aloisdg

Гольф:

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

Редагувати: У мене був спектакль intна ConsoleColor... Це сезон :)

введіть тут опис зображення

Веселого Різдва.gif

введіть тут опис зображення


3
Ви можете дати i=1int-декларацію та зняти її зі своєї forпетлі ...
Mukul Kumar

1
Ви можете замінити "\ r \ n" на "\ n". Це буде добре працювати з core і mono.
aloisdg каже: Відновити Моніку

8
Приємно бачити C#відповідь, яка отримує любов.
Майкл Макгріф

@aloisdg Спасибі :)
Піт Арден

1
@jacksonecac Радий, що вам сподобалось. Не втримався, як тільки ідея мені в голову прийшла :)
Піт Арден

14

05AB1E ,29 27 24 байти

Збережено три байти завдяки Аднану!

>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 для цього вбудовував. Спасибі!
Доступний

2
Також вам потрібна ïчастина зараз: p?
Аднан

1
Я так не думаю ^^.
Доступний

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 ++ 214 - 13 - 3 - 1 -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 байти.
Дякуємо @ conor, що порізав його до 186!

Ungolfed + копіювати та компілювати

#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 ...
Мукул Кумар

1
Чи можете ви видалити пробіл після #define s(a)?
Кіос

@Cyoce спасибі! Я про це не знав !!!
Мукул Кумар

2
186 байт , змінивши визначити на #define s std::cout<<та внести відповідно до налаштувань.
Conor O'Brien

Woaa..це приємно .. ніколи не передумав: 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

Рубін 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);}}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.