¡Feliz cumpleaños, comamos pastel!

12

Es el cumpleaños de mi amigo pronto y como él es un programador y amante del arte ASCII, ¡pensé en hacerle un pastel ASCII!

Lamentablemente, sigo olvidando su edad actual, por lo que me gustaría tener un programa para mi horno ASCII, que hornea un pastel con un número específico de velas, por lo que no tengo que hacerlo yo mismo si me equivoco con su años.

Los hornos ASCII solo tienen memoria y capacidad de almacenamiento limitadas, por lo que deben usar la menor cantidad de bytes posible .


Tu tarea:

Escriba un programa que envíe un pastel de cumpleaños a la consola, con tantas velas como lo especifique la entrada.

Los requisitos de pastel son:

  • Tiene que tener un borde, formado por líneas horizontales -y verticales |, y vértices +.
  • Al menos 5 caracteres de ancho (incluido el borde del pastel |)
  • Al menos 5 caracteres de altura (incluido el borde del pastel -)
  • Tiene que haber un espacio en blanco entre el borde del pastel y la primera base de vela (no la llama), en cada lado, excepto si hay una llama en ese espacio. Una llama o una base de vela no deberían poder solapar los bordes del pastel.
  • El ancho máximo del pastel es de 9 caracteres, por lo que hay un máximo de 5 velas por fila.
  • Como no queremos que nuestro pastel sea bidimensional, tiene que tener 2 filas adicionales de alto, para darle algo de volumen. Agregue otro borde en la parte inferior y conecte los vértices con los de arriba, nuevamente utilizando los caracteres ASCII de arriba ( -, |y +).

Los requisitos de velas son:

  • Consiste en la base |y la llama *, con la llama apilada en la parte superior de la base.
  • Las velas no pueden estar directamente adyacentes entre sí, excepto en diagonal.
  • Las velas se colocan de izquierda a derecha, luego de arriba a abajo, con 5 en una línea como máximo.
    (Nota: si hubiera 5 velas en la fila anterior, la siguiente fila no puede tener 5 también, ya que serían adyacentes).

Notas adicionales:

  • El ancho del pastel depende del número de velas en la primera fila, pero debe tener un mínimo de 5 caracteres y un máximo de 9 caracteres de ancho.
  • Las velas se llenan comenzando en la fila superior, de izquierda a derecha. Una vez que una fila está llena, la siguiente debe comenzar en la fila debajo de la primera.

Entrada:

Puede aceptar un número en el formato (razonable) que desee.

Para este desafío, puede suponer que el número está entre 0 y 2 31 (sin incluir 0), aunque no reconozco a alguien que es tan viejo.

Salida:

Puede devolver una cadena o escribir directamente el pastel resultante en la consola de salida.

Reglas:

  • Las lagunas estándar están prohibidas.
  • Este es el , por lo que gana el código más corto en bytes, en cualquier idioma.

Ejemplos:

Entrada: 8

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

Entrada: 2

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

Entrada: 12

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

¡Buena suerte!

Ian H.
fuente
¿Puede haber múltiples soluciones válidas para una entrada?
officialaimm
1
@officialaimm Debido a que existen especificaciones para el pedido de velas y el tamaño de la torta, no debería ser posible.
Ian H.
2
Hecho inútil: si celebras tu cumpleaños cada segundo en lugar de cada año, entonces 2 ^ 31 ~ = 68 años. Pero eso hace muchos pasteles todos los días y puede volverse tedioso después de un tiempo.
Arnauld
1
@Arnauld Pero el 99% de las veces no es tu cumpleaños :( ... excepto si estás celebrando el hecho general de que naciste.
Ian H.
3
@IanH. Digamos que estás celebrando tu marca de tiempo de inicio, entonces. :-)
Arnauld

Respuestas:

10

Carbón , 76 71 70 66 46 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Editar: guardado 1 byte gracias a @ASCII_Only. Ahorró 20 bytes masivos al descubrir una forma ordenada de dibujar las velas. Explicación:

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

Calcule el tamaño de todo el pastel, incluido el volumen adicional y solo la parte superior del pastel para que puedan dibujarse. (( == ASCII 61) = ( += ASCII 43) + 9 * 2 para el volumen extra.)

↘↘Fθ«

Mueva el cursor a la primera fila de 5 velas. Pase por cada vela.

↑|*¶¶

Imprima una vela y mueva a la derecha dos caracteres para la siguiente vela.

¿‹⁶﹪⁺ιι⁹«

Sin embargo, después de las velas (indexadas a cero) 4, 8, 13, 17, 22, etc. (que están al final de una fila),

M⁹←↓

mueva el cursor a la primera vela en la siguiente fila. ¡Esto funciona tanto en filas pares como impares!

Neil
fuente
1
Su solución coloca una fila adicional (no deseada) para el número de entrada menor que 6. :)
Ian H.
@IanH. Lo siento, pensé que esa era la altura mínima por alguna razón. ¡La reparación que realmente me ahorró 4 bytes!
Neil
Todavía se muestra mal en TIO: /
Ian H.
1
@IanH. Pruébalo en línea! me da una salida idéntica a su ejemplo ...
Neil
1
@Neil recuerda que no necesitas el al principio: P (por cierto, gracias por encontrar otro caso de golfista (no tan))
Solo ASCII
3

Jalea , 67 bytes

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

Un enlace monádico que toma un número y devuelve una lista de caracteres o un programa completo que imprime la salida.

Pruébalo en línea!

¿Cómo?

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
fuente
1
Holy what +1 por vencer a Charcoal
solo ASCII
@ Solo ASCII Lo siento, encontré un ahorro de 4 bytes ...
Neil
@Neil, bueno, eso también es bueno, se supone que el carbón es bueno en el arte ASCII (mejor que la gelatina) después de todo: P
Solo ASCII
1

Japt , 94 bytes

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

Pruébalo en línea!

Justin Mariner
fuente