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!


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


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!


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


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
}  

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

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.


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

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);}}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.