С Днем Рождения, давайте выпьем торта!


12

Скоро у моего друга день рождения, и так как он программист и любитель ASCII, я решил сделать ему торт ASCII!

К сожалению, я продолжаю забывать о его нынешнем возрасте, поэтому я хотел бы иметь программу для моей духовки ASCII, которая выпекает торт с указанным количеством свечей, поэтому мне не придется делать это самому, если я ошибаюсь с его возраст.

Печи ASCII имеют только ограниченную память и емкость, поэтому они должны использовать как можно меньше байтов .


Твое задание:

Напишите программу, которая выводит торт на день рождения на консоль с таким количеством свечей, которое указывает вход.

Требования к тортам:

  • Он должен иметь границу, состоящую из горизонтальных -и вертикальных |линий и вершин +.
  • По крайней мере 5 символов в ширину (включая границу торта |)
  • По крайней мере 5 символов высотой (включая границу торта -)
  • Должен быть символ пробела между границей торта и первой основой свечи (не пламенем) на каждой стороне, кроме случаев, когда в этом месте есть пламя. Пламя или основание свечи не должны перекрывать границы торта.
  • Максимальная ширина торта составляет 9 символов, поэтому в строке может быть не более 5 свечей.
  • Поскольку мы не хотим, чтобы наш торт был двухмерным, он должен иметь дополнительные 2 ряда в высоту, чтобы придать ему объем. Добавьте еще одну границу внизу и соедините вершины с вершинами над ними, снова используя символы ASCII сверху ( -, |и +).

Требования к свечам:

  • Состоит из основания |и пламени *, с пламенем, сложенным сверху основания.
  • Свечи не могут быть непосредственно примыкающими друг к другу, кроме как по диагонали.
  • Свечи располагаются слева направо, затем сверху вниз, максимум 5 в одной строке.
    (Примечание: если в предыдущем ряду было 5 свечей, то в следующем ряду не может быть 5, а с тех пор они будут смежными.)

Дополнительные замечания:

  • Ширина торта зависит от количества свечей в первом ряду, но она должна быть не менее 5 символов и не более 9 символов в ширину.
  • Свечи заполняются, начиная с самого верхнего ряда, слева направо. Одна строка, если она заполнена, должна начинаться со строки под первой.

Входные данные:

Вы можете принять число в (разумном) формате, который вам нравится.

Для этого испытания вы можете предположить, что число находится в диапазоне от 0 до 2 31 (не включая 0), хотя я не признаю кого-то, кто такой старый.

Выход:

Вы можете либо вернуть строку, либо напрямую записать полученный торт в консоль вывода.

Правила:

  • Стандартные лазейки запрещены.
  • Это , поэтому выигрывает самый короткий код в байтах на любом языке.

Примеры:

Входные данные: 8

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

Входные данные: 2

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

Входные данные: 12

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

Удачи!


Может ли быть несколько действительных решений для входа?
officialaimm

1
@officialaimm Поскольку существуют спецификации для заказа свечей и определения размера тортов, это не должно быть возможным.
Ян Х.

2
Бесполезный факт: если вы отмечаете свой день рождения каждую секунду, а не каждый год, то вам 2 ^ 31 ~ = 68 лет. Но это делает много пирожных каждый день и может стать утомительным через некоторое время.
Арно

1
@Arnauld Но в 99% случаев это не твой день рождения :( ... за исключением случаев, когда ты
Ян Х.

3
@IanH. Допустим, вы празднуете свою временную метку. :-)
Арно

Ответы:


10

Древесный уголь , 76 71 70 66 46 байт

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

Попробуйте онлайн! Ссылка на подробную версию кода. Редактировать: 1 байт сохранен благодаря @ASCII_Only. Сэкономили 20 байтов, открыв аккуратный способ рисования свечей. Объяснение:

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

Рассчитайте размер всего торта, включая дополнительный объем, и только верх торта, чтобы их можно было нарисовать. (( == ASCII 61) = ( += ASCII 43) + 9 * 2 для дополнительного тома.)

↘↘Fθ«

Переместите курсор на первый ряд из 5 свечей. Цикл каждой свечи.

↑|*¶¶

Распечатайте свечу и переместите два символа вправо для следующей свечи.

¿‹⁶﹪⁺ιι⁹«

Однако после (нумерованных) 4-й, 8-й, 13-й, 17-й, 22-й и т. Д. Свечей (которые находятся в конце ряда),

M⁹←↓

переместите курсор на первую свечу в следующей строке. Это работает как на нечетных, так и на четных строках!


1
Ваше решение помещает (нежелательную) дополнительную строку для номера входа меньше 6. :)
Ян Х.

@IanH. Извините, я думал, что это была минимальная высота по какой-то причине. Исправление, которое фактически спасло меня 4 байта!
Нил

По-прежнему отображается неправильно на TIO: /
Ян Х.

1
@IanH. Попробуйте онлайн! дает мне идентичный вывод в вашем примере ...
Нил

1
@Neil помните, что вам не нужно с самого начала: P (кстати, спасибо, что нашли еще один случай с
только ASCII

3

Желе , 67 байт

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

Монадическая ссылка, принимающая число и возвращающая список символов или полную программу, выводящую на печать.

Попробуйте онлайн!

Как?

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

1
Святой, что +1 за избиение древесного угля
только ASCII

@ ASCII-only Извините, я нашел 4-байтовое сохранение ...
Нил

@Neil, ну, это тоже хорошо, уголь должен быть хорош в искусстве ASCII (лучше, чем желе) в конце концов: P
только ASCII

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.