Joyeux anniversaire, prenons un gâteau!

12

C'est bientôt l'anniversaire de mon ami et comme il est programmeur et amateur d'art ASCII, j'ai pensé lui faire du gâteau ASCII!

Malheureusement, je continue d'oublier son âge actuel, donc j'aimerais avoir un programme pour mon four ASCII, qui prépare un gâteau avec un nombre spécifié de bougies, donc je n'ai pas à le refaire moi-même si je me trompe avec son âge.

Les fours ASCII n'ont qu'une capacité de mémoire et de stockage limitée, ils doivent donc utiliser le moins d'octets possible .


Ta tâche:

Écrivez un programme qui génère un gâteau d'anniversaire sur la console, avec autant de bougies que l'entrée spécifie.

Les exigences de gâteau sont:

  • Il doit avoir une bordure, constituée de lignes horizontales -et verticales |et de sommets +.
  • Au moins 5 caractères de large (y compris la bordure du gâteau |)
  • Au moins 5 caractères de haut (y compris la bordure du gâteau -)
  • Il doit y avoir un espace blanc entre la bordure du gâteau et la première base de bougie (pas la flamme), de chaque côté, sauf s'il y a une flamme dans cet espace. Une flamme ou une base de bougie ne doit pas pouvoir chevaucher les bords du gâteau.
  • La largeur maximale du gâteau est de 9 caractères, il y a donc un maximum de 5 bougies par ligne.
  • Puisque nous ne voulons pas que notre gâteau soit à 2 dimensions, il doit être de 2 rangées de plus pour lui donner du volume. Ajoutez une autre bordure en bas et connectez les sommets avec ceux au-dessus d'eux, en utilisant à nouveau les caractères ASCII d'en haut ( -, |et +).

Les exigences relatives aux bougies sont les suivantes:

  • Se compose de la base |et de la flamme *, la flamme étant empilée sur le dessus de la base.
  • Les bougies ne doivent pas être directement adjacentes, sauf en diagonale.
  • Les bougies sont placées de gauche à droite, puis de haut en bas, avec 5 sur une ligne au maximum.
    (Remarque: s'il y avait 5 bougies dans la ligne précédente, la ligne suivante ne peut pas avoir 5 également, car alors elles seraient adjacentes.)

Notes complémentaires:

  • La largeur du gâteau dépend du nombre de bougies dans la première rangée, mais elle doit être d'un minimum de 5 caractères et d'un maximum de 9 caractères de large.
  • Les bougies sont remplies en commençant dans la rangée la plus haute, de gauche à droite. Une fois une ligne remplie, la suivante doit commencer dans la ligne en dessous de la première.

Contribution:

Vous pouvez accepter un nombre dans le format (raisonnable) que vous aimez.

Pour ce défi, vous pouvez supposer que le nombre est compris entre 0 et 2 31 (non compris 0), même si je ne reconnais pas quelqu'un qui est aussi vieux.

Production:

Vous pouvez soit renvoyer une chaîne ou écrire directement le gâteau résultant dans la console de sortie.

Règles:

  • Les failles standard sont interdites.
  • C'est le , donc le code le plus court en octets, dans n'importe quelle langue, gagne.

Exemples:

Contribution: 8

+-----------+
| * * * * * |
| |*|*|*| | |
|  | | |    |
|           |
+-----------+
|           |
+-----------+

Contribution: 2

+-----+
| * * |
| | | |
|     |
+-----+
|     |
+-----+

Contribution: 12

+-----------+
| * * * * * |
| |*|*|*|*| |
| *|*|*| |  |
| | | |     |
|           |
+-----------+
|           |
+-----------+

Bonne chance!

Ian H.
la source
Peut-il y avoir plusieurs solutions valides pour une entrée?
officialaimm
1
@officialaimm Comme il existe des spécifications pour la commande des bougies et le dimensionnement des gâteaux, cela ne devrait pas être possible.
Ian H.
2
Fait inutile: si vous fêtez votre anniversaire chaque seconde au lieu de chaque année, alors 2 ^ 31 ~ = 68 ans. Mais cela fait beaucoup de gâteaux chaque jour et pourrait devenir fastidieux après un certain temps.
Arnauld
1
@Arnauld Mais alors 99% du temps, ce n'est pas votre anniversaire :( ... sauf si vous célébrez le fait général que vous êtes né.
Ian H.
3
@IanH. Disons que vous célébrez votre horodatage de création, alors. :-)
Arnauld

Réponses:

10

Charbon de bois , 76 71 70 66 46 octets

NθF=+B⁺³⌊⟦χ⁺θθ⟧÷⁺℅ι⁺θθ⁹↘↘Fθ«↑|*¶¶¿‹⁶﹪⁺ιι⁹«M⁹←↓

Essayez-le en ligne! Le lien est vers la version détaillée du code. Edit: 1 octet enregistré grâce à @ASCII_Only. Vous avez économisé un énorme 20 octets en découvrant une façon soignée de dessiner les bougies. Explication:

NθF=+B⁺³⌊⟦χ⁺θθ⟧÷⁺℅ι⁺θθ⁹

Calculez la taille du gâteau entier, y compris le volume supplémentaire et juste le haut du gâteau afin qu'ils puissent être dessinés. (( == ASCII 61) = ( += ASCII 43) + 9 * 2 pour le volume supplémentaire.)

↘↘Fθ«

Déplacez le curseur sur la première rangée de 5 bougies. Faites une boucle à travers chaque bougie.

↑|*¶¶

Imprimez une bougie et déplacez à droite deux caractères pour la bougie suivante.

¿‹⁶﹪⁺ιι⁹«

Cependant, après les bougies (indexées zéro) 4e, 8e, 13e, 17e, 22e, etc. (qui sont à la fin d'une rangée),

M⁹←↓

placez le curseur sur la première bougie de la rangée suivante. Cela fonctionne sur les lignes paires et impaires!

Neil
la source
1
Votre solution place une ligne supplémentaire (indésirable) pour un nombre d'entrée inférieur à 6. :)
Ian H.
@IanH. Désolé, je pensais que c'était la hauteur minimale pour une raison quelconque. La correction m'a fait économiser 4 octets!
Neil
Affiche toujours faux sur TIO: /
Ian H.
1
@IanH. Essayez-le en ligne! me donne une sortie identique à votre exemple ...
Neil
1
@Neil rappelez-vous que vous n'avez pas besoin du au début: P (btw merci d'avoir trouvé un autre cas de bord de golfeur (pas si))
ASCII uniquement
3

Gelée , 67 octets

s9s€5Ẏa;⁶;⁶z⁶Z
ç”|ṙ-ż"ç”*$U⁸RḤ’¤¦Ẏ€j@€“| “|”Zj@€⁾--Z”+®¦€0,1©¦;ṫ¥-Y

Un lien monadique prenant un nombre et renvoyant une liste de caractères ou un programme complet imprimant la sortie.

Essayez-le en ligne!

Comment?

s9s€5Ẏa;⁶;⁶z⁶Z - Link 1, make some candle parts & topping: number, age; character, part
s9             - split (implicit range(age)) into chunks of 9 (or remainder)
  s€5          - split each chunk of 9 into chunks of 5 (a 5 and a 4 or remainder)
     Ẏ         - tighten (to a list of lists of length 5, 4, 5, 4, ..., remainder)
      a        - logical and with the part character (either | or * here)
       ;⁶      - concatenate a space (we all still want topping when no candles)
         ;⁶    - ...and another (we also want some extra topping below the last row)
           z⁶  - transpose with filler space (fill the top with topping!)
             Z - transpose (put it back around the right way again chef)

ç”|ṙ-ż"ç”*$U⁸RḤ’¤¦Ẏ€j@€“| “|”Zj@€⁾--Z”+®¦€0,1©¦;ṫ¥-Y - Main link: number, age
ç”|                                                  - call last link (1) as a dyad with '|'
   ṙ-                                                - rotate left by -1
          $                                          - last two links as a monad:
       ç”*                                           -   call (1) as a dyad with '*'
      "                                              - zip with the dyadic operation:
     ż                                               -   zip (interleave each)
                 ¦                                   - sparse application:
           U                                         - ...of: upend (reverse each)
                ¤                                    - ...to indexes: nilad+links as a nilad:
            ⁸                                        -   chain's left argument, age
             R                                       -   range
              Ḥ                                      -   double (vectorises)
               ’                                     -   increment
                  Ẏ€                                 - tighten €ach (from '|*' or '*|' pairs)
                       “| “|”                        - literal ["| ", "|"]
                    j@€                              - join (swap arguments) for €ach (add a little extra topping to the left, and add piping to the sides)
                             Z                       - transpose
                                 ⁾--                 - literal "--"
                              j@€                    - join (swap arguments) for €ach (add piping to the top and bottom edges)
                                    Z                - transpose (time to invest in a potters wheel!)
                                              ¦      - sparse application:
                                          0,1        - ...to indexes: [0,1] (both ends)
                                             ©       -   (copy that to the register)
                                         €           - ...of: for each:
                                        ¦            -   sparse application:
                                     ”+              -   ...of: '+' character
                                       ®             -   ...to indexes: recall from register (both ends)
                                                  -  - literal -1
                                                 ¥   - last two links as a dyad
                                                ṫ    -   tail from index (gets last two rows)
                                               ;     -   concatenate (repeats them underneath)
                                                   Y - join with newlines
                                                     - as a full program: implicit print
Jonathan Allan
la source
1
Holy what +1 pour avoir battu Charcoal
ASCII uniquement
@ ASCII uniquement Désolé, j'ai trouvé une sauvegarde de 4 octets ...
Neil
@Neil bien c'est bien aussi, le fusain est censé être bon en art ASCII (mieux que la gelée) après tout: P
ASCII uniquement
1

Japt , 94 octets

/4½ c ÆYu ç +Um5-Yu)ÇV°<U?Q:Sø+(1+Yu)ç
"| {Ug ç}|"
Vd"|+ -"
[W¡"| {X}|"ÃVVWVW]c ·y rQ+S"*|" y

Essayez-le en ligne!

Justin Mariner
la source