Alles Gute zum Geburtstag, lass uns einen Kuchen haben!

12

Bald hat mein Freund Geburtstag und da er Programmierer und ASCII-Kunstliebhaber ist, dachte ich, ich würde ihm ASCII-Kuchen machen!

Leider vergesse ich immer wieder sein aktuelles Alter, daher hätte ich gerne ein Programm für meinen ASCII-Ofen, das einen Kuchen mit einer bestimmten Anzahl von Kerzen backt, damit ich es nicht noch einmal selbst machen muss, wenn ich mich mit seinem irre Alter.

Da ASCII-Öfen nur über begrenzten Speicher und Speicherkapazität verfügen, sollten möglichst wenige Bytes verwendet werden .


Deine Aufgabe:

Schreiben Sie ein Programm, das eine Geburtstagstorte mit so vielen Kerzen an die Konsole ausgibt, wie die Eingabe angibt.

Kuchenanforderungen sind:

  • Es muss einen Rand haben, der aus horizontalen -und vertikalen |Linien und Eckpunkten besteht +.
  • Mindestens 5 Zeichen breit (einschließlich Kuchenrand |)
  • Mindestens 5 Zeichen hoch (einschließlich Tortenrand -)
  • Zwischen dem Rand des Kuchens und dem ersten Kerzenboden (nicht der Flamme) muss auf jeder Seite ein Leerzeichen stehen , es sei denn, in diesem Bereich befindet sich eine Flamme. Eine Flamme oder ein Kerzenboden sollte nicht in der Lage sein, die Kuchenränder zu überlappen.
  • Die maximale Breite des Kuchens beträgt 9 Zeichen, daher sind maximal 5 Kerzen pro Reihe zulässig.
  • Da wir nicht möchten, dass unser Kuchen zweidimensional ist, muss er zusätzliche 2 Reihen hoch sein, um ihm etwas Volumen zu verleihen. Fügen Sie am unteren Rand einen weiteren Rand hinzu und verbinden Sie die Scheitelpunkte mit den darüber liegenden, wobei Sie ebenfalls die ASCII-Zeichen von oben ( -, |und +) verwenden.

Kerzenanforderungen sind:

  • Besteht aus der Basis |und der Flamme *, wobei die Flamme oben auf der Basis gestapelt ist.
  • Kerzen dürfen nicht direkt nebeneinander stehen, außer diagonal.
  • Die Kerzen werden von links nach rechts und dann von oben nach unten mit maximal 5 in einer Zeile platziert.
    (Hinweis: Wenn sich in der vorherigen Reihe 5 Kerzen befänden, kann die nächste Reihe möglicherweise nicht auch 5 Kerzen enthalten, da diese dann benachbart wären.)

Zusätzliche Bemerkungen:

  • Die Kuchenbreite hängt von der Anzahl der Kerzen in der ersten Reihe ab, muss jedoch mindestens 5 Zeichen und höchstens 9 Zeichen breit sein.
  • Die Kerzen werden beginnend in der obersten Reihe von links nach rechts gefüllt. Sobald eine Reihe voll ist, sollte die nächste in der Reihe unter der ersten beginnen.

Eingang:

Sie können eine Nummer in einem (angemessenen) Format akzeptieren, das Sie möchten.

Bei dieser Herausforderung können Sie davon ausgehen, dass die Zahl zwischen 0 und 2 31 (ohne 0) liegt, obwohl ich jemanden, der so alt ist, nicht anerkenne.

Ausgabe:

Sie können entweder eine Zeichenfolge zurückgeben oder den resultierenden Kuchen direkt in die Ausgabekonsole schreiben.

Regeln:

  • Standard Lücken sind verboten.
  • Das ist , also gewinnt der kürzeste Code in Bytes in jeder Sprache.

Beispiele:

Eingang: 8

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

Eingang: 2

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

Eingang: 12

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

Viel Glück!

Ian H.
quelle
Kann es mehrere gültige Lösungen für eine Eingabe geben?
offiziell
1
@officialaimm Da es Spezifikationen für das Bestellen von Kerzen und das Sortieren von Kuchen gibt, sollte dies nicht möglich sein.
Ian H.
2
Unnütze Tatsache: Wenn Sie Ihren Geburtstag jede Sekunde statt jedes Jahres feiern, dann 2 ^ 31 ~ = 68 Jahre alt. Aber das macht jeden Tag eine Menge Kuchen und könnte nach einiger Zeit langweilig werden.
Arnauld
1
@ Arnauld Aber dann ist es 99% der Zeit nicht dein Geburtstag :( ... außer wenn du die allgemeine Tatsache feierst, dass du geboren wurdest.
Ian H.
3
@ IanH. Nehmen wir an, Sie feiern Ihren Anfangszeitstempel. :-)
Arnauld

Antworten:

10

Charcoal , 76 71 70 66 46 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Bearbeiten: 1 Byte dank @ASCII_Only gespeichert. Durch das Auffinden einer sauberen Art, die Kerzen zu zeichnen, konnten 20 Bytes eingespart werden. Erläuterung:

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

Berechnen Sie die Größe sowohl des gesamten Kuchens einschließlich des zusätzlichen Volumens als auch der Oberseite des Kuchens, damit sie gezeichnet werden können. (( == ASCII 61) = ( += ASCII 43) + 9 * 2 für die zusätzliche Lautstärke.)

↘↘Fθ«

Bewegen Sie den Cursor auf die erste Reihe von 5 Kerzen. Schleife durch jede Kerze.

↑|*¶¶

Drucken Sie eine Kerze und bewegen Sie zwei Zeichen nach rechts für die nächste Kerze.

¿‹⁶﹪⁺ιι⁹«

Nach der (mit Nullen versehenen) 4., 8., 13., 17., 22. usw. Kerze (die sich am Ende einer Reihe befindet)

M⁹←↓

Bewegen Sie den Cursor zur ersten Kerze in der nächsten Zeile. Dies funktioniert sowohl für gerade als auch für ungerade Zeilen!

Neil
quelle
1
Ihre Lösung enthält eine (unerwünschte) zusätzliche Zeile für die Eingabenummer kleiner als 6. :)
Ian H.
@ IanH. Entschuldigung, ich dachte, das wäre aus irgendeinem Grund die Mindestgröße. Durch das Reparieren habe ich tatsächlich 4 Bytes gespart!
Neil
Zeigt immer noch falsch auf TIO: /
Ian H.
1
@ IanH. Probieren Sie es online! gibt mir die identische Ausgabe zu Ihrem Beispiel ...
Neil
1
@Neil daran erinnern, dass Sie nicht am Anfang brauchen : P (übrigens danke für das Finden eines anderen Golfers (nicht so-) Rand Fall)
Nur ASCII
3

Jelly , 67 Bytes

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

Eine monadische Verknüpfung, die eine Zahl aufnimmt und eine Liste von Zeichen zurückgibt, oder ein vollständiges Programm, das die Ausgabe druckt.

Probieren Sie es online!

Wie?

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
quelle
1
Heilig was +1 für das Schlagen von Holzkohle
ASCII
@ Nur ASCII Entschuldigung, ich habe eine 4-Byte-Speicherung gefunden ...
Neil
@Neil gut, das ist auch gut, Charcoal soll doch gut in ASCII-Kunst sein (besser als Gelee): P
Nur 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

Probieren Sie es online!

Justin Mariner
quelle