Wszystkiego najlepszego, zjedzmy ciasto!

12

Wkrótce są urodziny mojego przyjaciela, a ponieważ jest programistą i miłośnikiem sztuki ASCII, pomyślałem, że zrobię mu ciasto ASCII!

Niestety, ciągle zapominam o jego obecnym wieku, dlatego chciałbym mieć program dla mojego piekarnika ASCII, który piecze ciasto z określoną liczbą świec, więc nie muszę tego robić sam, jeśli się mylę wiek.

Piece ASCII mają tylko ograniczoną pamięć i pojemność, więc powinny wykorzystywać jak najmniej bajtów .


Twoje zadanie:

Napisz program, który wysyła na konsolę tort urodzinowy z tyloma świecami, ile określa wejście.

Wymagania dotyczące ciasta to:

  • Musi mieć granicę zbudowaną z poziomych -i pionowych |linii oraz wierzchołków +.
  • Co najmniej 5 znaków (w tym obramowanie ciasta |)
  • Co najmniej 5 znaków (w tym obramowanie ciasta -)
  • Po każdej stronie musi znajdować się biała spacja między ramką ciasta a pierwszą podstawą świecy (nie płomieniem), chyba że w tej przestrzeni znajduje się płomień. Płomień lub podstawa świecy nie powinny nakładać się na brzegi ciasta.
  • Maksymalna szerokość ciasta wynosi 9 znaków, więc w rzędzie jest maksymalnie 5 świec.
  • Ponieważ nie chcemy, aby nasze ciasto było dwuwymiarowe, musi mieć dodatkowe 2 rzędy wysokości, aby nadać mu trochę objętości. Dodaj kolejną ramkę na dole i połącz wierzchołki z tymi nad nimi, ponownie używając znaków ASCII z góry ( -, |i +).

Wymagania dotyczące świec:

  • Składa się z podstawy |i płomienia *, z płomieniem ułożonym na górze podstawy.
  • Świece nie mogą bezpośrednio przylegać do siebie, z wyjątkiem ukośnych.
  • Świece umieszcza się od lewej do prawej, a następnie od góry do dołu, maksymalnie 5 w jednej linii.
    (Uwaga: Gdyby w poprzednim rzędzie było 5 świec, następny rząd nie mógłby mieć również 5 świec, ponieważ odtąd byłyby przyległe).

Dodatkowe uwagi:

  • Szerokość ciasta zależy od liczby świec w pierwszym rzędzie, ale musi mieć co najmniej 5 znaków i maksymalnie 9 znaków szerokości.
  • Świece są napełniane, zaczynając od najwyższego rzędu, od lewej do prawej. Raz jeden wiersz, jeśli jest pełny, następny powinien zacząć się w rzędzie poniżej pierwszego.

Wejście:

Możesz zaakceptować dowolną liczbę w (rozsądnym) formacie.

W przypadku tego wyzwania możesz założyć, że liczba zawiera się w przedziale od 0 do 2 31 (bez 0), nawet jeśli nie potwierdzam, że ktoś jest tak stary.

Wynik:

Możesz albo zwrócić ciąg, albo bezpośrednio zapisać wynikowy tort w konsoli wyjściowej.

Zasady:

  • Standardowe luki są zabronione.
  • To jest , więc wygrywa najkrótszy kod w bajtach, w dowolnym języku.

Przykłady:

Wejście: 8

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

Wejście: 2

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

Wejście: 12

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

Powodzenia!

Ian H.
źródło
Czy istnieje wiele poprawnych rozwiązań dla danych wejściowych?
officialaimm
1
@officialaimm Ponieważ istnieją specyfikacje dotyczące zamawiania świec i wielkości ciasta, nie powinno być to możliwe.
Ian H.
2
Bezużyteczny fakt: jeśli świętujesz urodziny co sekundę zamiast co roku, to 2 ^ 31 ~ = 68 lat. Ale to sprawia, że ​​codziennie powstaje dużo ciastek i po pewnym czasie mogą stać się nudne.
Arnauld
1
@Arnauld Ale w 99% przypadków to nie są twoje urodziny :( ... chyba że świętujesz ogólny fakt, że się urodziłeś.
Ian H.
3
@IanH. Powiedzmy, że świętujesz swój znacznik czasu początkowego. :-)
Arnauld

Odpowiedzi:

10

Węgiel drzewny , 76 71 70 66 46 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Edycja: Zapisano 1 bajt dzięki @ASCII_Only. Zaoszczędź masę 20 bajtów, odkrywając zgrabny sposób rysowania świec. Wyjaśnienie:

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

Oblicz rozmiar zarówno całego ciasta, w tym dodatkowej objętości, jak i samej wierzchu ciasta, aby można je było narysować. (( == ASCII 61) = ( += ASCII 43) + 9 * 2 dla dodatkowego woluminu.)

↘↘Fθ«

Przesuń kursor do pierwszego rzędu 5 świec. Pętlę przez każdą świecę.

↑|*¶¶

Wydrukuj świecę i przesuń dwie postacie w prawo o następną świecę.

¿‹⁶﹪⁺ιι⁹«

Jednak po (zerowanym) 4, 8, 13, 17, 22 itd. Świecach (które są na końcu rzędu),

M⁹←↓

przesuń kursor do pierwszej świecy w następnym rzędzie. Działa to zarówno na nieparzystych, jak i parzystych wierszach!

Neil
źródło
1
Twoje rozwiązanie stawia (niechciany) dodatkowy wiersz dla liczby wejściowej mniejszej niż 6. :)
Ian H.
@IanH. Przepraszam, z jakiegoś powodu pomyślałem, że to minimalna wysokość. Naprawianie, które faktycznie zaoszczędziło mi 4 bajty!
Neil
Nadal wyświetla nieprawidłowe na TIO: /
Ian H.
1
@IanH. Wypróbuj online! daje mi identyczny wynik jak w twoim przykładzie ...
Neil
1
@Neil pamiętaj, że na początku nie potrzebujesz : P (btw dzięki za znalezienie innego przypadku golfisty (nie tak bardzo) edge)
tylko ASCII
3

Galaretka , 67 bajtów

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

Monadyczny link pobierający liczbę i zwracający listę znaków lub pełny program wypisujący wynik.

Wypróbuj online!

W jaki sposób?

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
źródło
1
Święte, co +1 za pokonanie Węgla
tylko ASCII
@ Tylko ASCII Niestety, znalazłem 4-bajtowe zapisywanie ...
Neil
@ No cóż, to też dobrze, węgiel drzewny powinien być dobry w sztuce ASCII (lepiej niż galaretka) w końcu: P
tylko ASCII
1

Japt , 94 bajty

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

Wypróbuj online!

Justin Mariner
źródło