З днем ​​народження, давайте трохи торта!


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% випадків це не твій день народження :( ... за винятком випадків, коли ти святкуєш загальний факт, що ти народився.
Ian H.

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-го, 22-го тощо) свічок (які знаходяться в кінці ряду),

M⁹←↓

перемістіть курсор на першу свічку в наступному ряду. Це працює як на непарних, так і на парних рядках!


1
У вашому рішенні додається (небажаний) додатковий рядок для номера входу менше 6. :)
Ян Х.

@IanH. Вибачте, я думав, що це була мінімальна висота чомусь. Виправлення, що насправді врятувало мені 4 байти!
Ніл

Все ще відображається неправильно в TIO: /
Ian H.

1
@IanH. Спробуйте в Інтернеті! дає мені ідентичний результат для вашого прикладу ...
Ніл

1
@Neil пам’ятайте, що вам не потрібно на початку: P (btw спасибі за те, що знайшли ще один гольфіст (не дуже) край справа)
тільки 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 Вибачте, я знайшов 4-байтну економію ...
Ніл

@Neil добре, що теж добре, вугілля повинно бути хорошим в мистецтві ASCII (краще, ніж желе) зрештою: P
лише ASCII

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.