Buon compleanno, facciamo un po 'di torta!


12

È presto il compleanno del mio amico e dato che è un programmatore e amante dell'arte ASCII, ho pensato di fargli un po 'di torta ASCII!

Purtroppo, continuo a dimenticare la sua età attuale, quindi vorrei avere un programma per il mio forno ASCII, che cuoce una torta con un determinato numero di candele, quindi non devo rifarlo da solo se sbaglio con il suo età.

I forni ASCII hanno solo capacità di memoria e archiviazione limitate, quindi dovrebbero usare il minor numero di byte possibile .


Il tuo compito:

Scrivi un programma che genera una torta di compleanno sulla console, con tutte le candele specificate dall'input.

I requisiti della torta sono:

  • Deve avere un bordo, costituito da linee orizzontali -e verticali |e vertici +.
  • Almeno 5 caratteri (incluso il bordo della torta |)
  • Almeno 5 caratteri (incluso il bordo della torta -)
  • Ci deve essere un carattere di spazio tra il bordo della torta e la prima base di candela (non la fiamma), su ciascun lato, tranne se c'è una fiamma in quello spazio. Una fiamma o una base di candela non dovrebbe essere in grado di sovrapporre i bordi della torta.
  • La larghezza massima della torta è di 9 caratteri, quindi ci sono un massimo di 5 candele per riga.
  • Dal momento che non vogliamo che la nostra torta sia bidimensionale, deve essere alta 2 file in più, per dargli un po 'di volume. Aggiungi un altro bordo in basso e collega i vertici con quelli sopra di loro, usando nuovamente i caratteri ASCII dall'alto ( -, |e +).

I requisiti della candela sono:

  • È costituito dalla base |e dalla fiamma *, con la fiamma accatastata sopra la base.
  • Le candele non possono essere direttamente adiacenti l'una all'altra, tranne in diagonale.
  • Le candele vengono posizionate da sinistra a destra, quindi dall'alto verso il basso, con un massimo di 5 in una riga.
    (Nota: se ci fossero 5 candele nella riga precedente, la riga successiva non può avere anche 5 candele, da allora sarebbero adiacenti.)

Note aggiuntive:

  • La larghezza della torta dipende dal numero di candele nella prima riga, ma deve contenere almeno 5 caratteri e una larghezza massima di 9 caratteri.
  • Le candele vengono riempite a partire dalla riga più in alto, andando da sinistra a destra. Una volta una riga, se piena, la successiva dovrebbe iniziare nella riga sotto la prima.

Ingresso:

Puoi accettare un numero nel formato (ragionevole) che ti piace.

Per questa sfida puoi supporre che il numero sia compreso tra 0 e 2 31 (escluso 0), anche se non riconosco qualcuno che è così vecchio.

Produzione:

È possibile restituire una stringa o scrivere direttamente la torta risultante nella console di output.

Regole:

  • Sono vietate le scappatoie standard .
  • Questo è , quindi vince il codice più breve in byte, in qualsiasi lingua.

Esempi:

Ingresso: 8

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

Ingresso: 2

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

Ingresso: 12

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

In bocca al lupo!


Possono esserci più soluzioni valide per un input?
officialaimm,

1
@officialaimm Dato che ci sono specifiche per ordinare le candele e dimensionare le torte, non dovrebbe essere possibile.
Ian H.

2
Fatto inutile: se festeggi il tuo compleanno ogni secondo anziché ogni anno, quindi 2 ^ 31 ~ = 68 anni. Ma questo rende molte torte ogni giorno e potrebbe diventare noioso dopo un po 'di tempo.
Arnauld

1
@Arnauld Ma poi il 99% delle volte non è il tuo compleanno :( ... tranne se stai celebrando il fatto generale che sei nato.
Ian H.

3
@IanH. Diciamo che stai celebrando il timestamp del tuo inizio, quindi. :-)
Arnauld

Risposte:


10

Carbone , 76 71 70 66 46 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Modifica: 1 byte salvato grazie a @ASCII_Only. Risparmiato un enorme 20 byte scoprendo un modo pulito di disegnare le candele. Spiegazione:

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

Calcola le dimensioni dell'intera torta incluso il volume extra e solo la parte superiore della torta in modo che possano essere disegnate. (( == ASCII 61) = ( += ASCII 43) + 9 * 2 per il volume extra.)

↘↘Fθ«

Sposta il cursore sulla prima riga di 5 candele. Passa attraverso ogni candela.

↑|*¶¶

Stampa una candela e sposta a destra di due caratteri per la candela successiva.

¿‹⁶﹪⁺ιι⁹«

Tuttavia dopo le candele (indicizzate a zero) 4 °, 8 °, 13 °, 17 °, 22 ° ecc. (Che si trovano alla fine di una riga),

M⁹←↓

sposta il cursore sulla prima candela sulla riga successiva. Funziona su righe dispari e pari!


1
La tua soluzione inserisce una riga extra (indesiderata) per un numero di input inferiore a 6. :)
Ian H.

@IanH. Scusa, ho pensato che fosse l'altezza minima per qualche motivo. Risolto il problema che in realtà mi ha salvato 4 byte!
Neil

Visualizza ancora errato su TIO: /
Ian H.

1
@IanH. Provalo online! mi dà un risultato identico al tuo esempio ...
Neil

1
@Neil ricorda che non ti serve all'inizio: P (a proposito grazie per aver trovato un altro golfista (non così) caso limite)
ASCII

3

Gelatina , 67 byte

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

Un collegamento monadico che prende un numero e restituisce un elenco di caratteri o un programma completo che stampa l'output.

Provalo online!

Come?

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
Santo quale +1 per battere Carbone
ASCII il

@ Solo ASCII Siamo spiacenti, ho trovato un salvataggio di 4 byte ...
Neil

@Neil va bene, anche il carbone dovrebbe essere buono nell'arte ASCII (meglio della gelatina) dopo tutto: P
ASCII

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.