Aide ma femme maniaque à décorer notre sapin de Noël

36

Ma femme est très, disons, particulièrement attentive lorsqu'il s'agit de mettre des ornements sur notre sapin de Noël. Donnons-lui du code pour l'aider en cette période difficile.

Contribution

Étant donné l'entrée, 2 < n < 10la hauteur de l'arbre et 0 < k < nle nombre distinct d'ornements.

Tâche

Décorez l'arbre en commençant 1et en augmentant jusqu'à ce kque nous enroulions les ornements autour de l'arbre. Si nous atteignons ket que nous avons plus de branches à décorer, recommencez à 1.

Ce n'est pas grave s'il n'y a pas le même nombre de chaque ornement sur l'arbre, tant que le motif est satisfait.

Les ornements doivent apparaître au-dessus de chaque branche, à l' ^exception de la rangée du haut.

L'arbre est structuré en commençant par une branche, puis le niveau suivant a + 1 branche avec un espace entre chacune, décalée du haut, comme suit:

 ^
^ ^

Pour une troisième ligne, vous ajouteriez une branche supplémentaire et les décaleriez à nouveau de sorte qu'aucune branche ne se trouve sur la même colonne (si vous la considérez comme une grille).

  ^
 ^ ^
^ ^ ^

Sortie

Sortez votre arbre décoré.

Exemples

1.

n = 3, k = 2

  ^      //Height is 3
 ^ ^
^ ^ ^

Maintenant, nous décorons chaque branche en commençant par 1 et augmentons à 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
^ ^ ^ ^ ^

C'est du donc le code le plus court gagne! Amuse-toi bien et bonne chance!

Jacksonecac
la source
espaces après chaque ligne acceptable?
Mukul Kumar
1
@MukulKumar no Il devrait maintenir la structure ci-dessus.
jacksonecac
Pouvons-nous supposer k inférieur à 10? Ou encore, comment aligner les chiffres?
Luis Mendo
2
@LuisMendo Oui supposer <10 bon point
jacksonecac

Réponses:

47

C # 226 221 octets

5 octets sauvés grâce à @Mukul Kumar et @aloisdg

Golfé:

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

Ungolfed:

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

Essai:

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

Edit: J'ai eu un casting de jeu intpour ConsoleColor... C'est la saison :)

entrez la description de l'image ici

JoyeuxChristmas.gif

entrez la description de l'image ici

Pete Arden
la source
3
Vous pouvez donner i=1dans la déclaration int et l'enlever de votre forboucle ...
Mukul Kumar
1
Vous pouvez remplacer "\ r \ n" par "\ n". Il fonctionnera bien avec core et mono.
aloisdg dit: Réintégrer Monica
8
C'est bien de voir une C#réponse recevoir de l'amour.
Michael McGriff
@aloisdg Merci :)
Pete Arden
1
@ jacksonecac Heureux de l'avoir apprécié. Je n'ai pas pu résister une fois que l'idée m'est venue :)
Pete Arden
14

05AB1E ,29 27 24 octets

Trois octets sauvés grâce à Adnan!

>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

Essayez-le en ligne!

Osable
la source
2
Je pense que vous pouvez remplacer NN>*;par NLO.
Adnan
Bien sûr! C'est drôle parce que j'ai utilisé N*(N+1)/2intentionnellement la somme d'entiers consécutifs à partir de 1, mais j'ai complètement oublié que 05AB1E avait des fonctions intégrées pour cela. Merci!
Osable
2
Aussi, avez-vous besoin de la ïpartie maintenant: p?
Adnan
1
Je ne le pense pas ^^.
Osable
12

JavaScript (ES6), 97 octets

Il semble que votre femme soit vraiment maniaque, donc cela n'inclut pas de nouvelle ligne principale ou inférieure, ni aucun espace principal ou inférieur. :-)

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):''

Démo

Arnauld
la source
8

C ++ 214 - 13 - 3 - 1 -1 - 10 = 186 octets

joué au golf

#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';}}  

Merci @ cyoce pour la sauvegarde de 1 octet.
Merci @ conor pour couper vers le bas à 186!

Ungolfed + copier et compiler

#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
}  
Mukul Kumar
la source
enfin <200 ...
Mukul Kumar
1
Pouvez-vous supprimer l'espace après #define s(a)?
Cyoce
@Cyoce merci! Je n'en savais rien !!!
Mukul Kumar
2
186 octets en changeant le définir #define s std::cout<<et en faisant des ajustements.
Conor O'Brien
Woaa..that nice .. ne m'a jamais traversé l'esprit: p
Mukul Kumar
3

Python 2, 133 octets

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
TFeld
la source
2

Clojure, 223 octets

Mon premier départ au golf avec 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")))))))

Lorsque appelé comme (println (str "\n" (d 6 5)))une nouvelle ligne, il est plus agréable sur REPL:

     ^
    1 2
    ^ ^
   3 4 5
   ^ ^ ^
  1 2 3 4
  ^ ^ ^ ^
 5 1 2 3 4
 ^ ^ ^ ^ ^
5 1 2 3 4 5
^ ^ ^ ^ ^ ^

Non-golfé:

(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))))))

J'ai eu quelques problèmes avec les séquences paresseuses et les listes imbriquées, mais j'ai pu enregistrer certains caractères en ne répétant pas repeat;) et en utilisant des \^caractères plutôt que des "^"chaînes. Je pourrais aussi laisser étonnamment de nombreux espaces.

NikoNyrh
la source
Bonne première réponse, bienvenue sur le site!
DJMcMayhem
1

Ruby 107 octets

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

Appelé comme ça

t.call(5,4)

Sortie:

    ^
   1 2
   ^ ^
  3 4 1
  ^ ^ ^
 2 3 4 1
 ^ ^ ^ ^
2 3 4 1 2
^ ^ ^ ^ ^
Neil Slater
la source
1

C, 170 octets

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

Appeler avec:

int main()
{
   t(5,4);
}

En bonus, voici une version binaire 4 bits:

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);}}
Steadybox
la source