Fantasmi e zucche


15

Ecco una zucca ASCII scolpita in una Jack-o-Lantern. Non è carino?

((^v^))

Ecco un fantasma ASCII. Guarda com'è spaventoso!

\{O.O}/

Ovviamente, le zucche devono essere a terra, con uno spazio tra loro in modo che non marciscano.

I fantasmi, tuttavia, amano stare in cima alle zucche, quindi sono ancora più spaventosi . Tuttavia, devono stare su due zucche, altrimenti il ​​loro peso spettrale schiaccerà la zucca sotto di loro. Ma, a causa di come funziona la loro magia spettrale , più fantasmi possono impilare e condividere zucche, a condizione che i fantasmi siano divisi equamente sulle zucche inferiori o sui fantasmi inferiori. In altre parole, formando una forma simile a una piramide umana . Nota che i fantasmi non possono accumularsi sui fantasmi a meno che non ci sia una zucca sotto (è così che funziona la magia).

Dati due numeri interi non negativi ge p, che rappresentano il numero di ghost e pumpkin, producono la formazione più a sinistra più compatta possibile, seguendo le regole di sovrapposizione della piramide sopra. Le zucche e i fantasmi rimanenti (cioè quelli che non formano la piramide) vanno a terra a destra.

Per chiarimenti, queste formazioni sono OK (newline vuoto separato) e servono come I / O di esempio:

0p 1g
\{O.O}/

1p 0g
((^v^))

1p 1g
((^v^)) \{O.O}/

2p 1g
    \{O.O}/
((^v^)) ((^v^))

2p 2g
    \{O.O}/
((^v^)) ((^v^)) \{O.O}/

3p 1g
    \{O.O}/
((^v^)) ((^v^)) ((^v^))

3p 2g
    \{O.O}/ \{O.O}/
((^v^)) ((^v^)) ((^v^))

3p 3g
        \{O.O}/
    \{O.O}/ \{O.O}/
((^v^)) ((^v^)) ((^v^))

0p 4g
\{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/

3p 0g
((^v^)) ((^v^)) ((^v^))

7p 6g
            \{O.O}/
        \{O.O}/ \{O.O}/
    \{O.O}/ \{O.O}/ \{O.O}/
((^v^)) ((^v^)) ((^v^)) ((^v^)) ((^v^)) ((^v^)) ((^v^))

Queste formazioni non sono OK

\{O.O}/
((^v^))

    \{O.O}/
((^v^))

((^v^)) ((^v^)) \{O.O}/

    \{O.O}/
    \{O.O}/
((^v^)) ((^v^))

            \{O.O}/
\{O.O}/ ((^v^)) ((^v^))

    ((^v^))
((^v^)) ((^v^))

      \{O.O}/
((^v^)) ((^v^))

Ingresso

Due numeri interi non negativi in qualsiasi formato conveniente . Almeno uno dei numeri sarà diverso da zero. Puoi prendere gli input in entrambi gli ordini (ad esempio, negli esempi in cui avevo prima le zucche) - specifica come prendi input nella tua risposta.

Produzione

Una rappresentazione in arte ASCII di fantasmi e zucche, seguendo le regole di cui sopra. Le nuove linee guida / finali o altri spazi bianchi sono opzionali, a condizione che i fantasmi e le zucche si allineino adeguatamente.

Regole

  • È accettabile un programma completo o una funzione. Se una funzione, è possibile restituire l'output anziché stamparlo.
  • Sono vietate le scappatoie standard .
  • Si tratta di quindi si applicano tutte le normali regole del golf e vince il codice più breve (in byte).

Qual è la formazione corretta per 7 zucche e 6 fantasmi?
Neil,

@Neil Dato che le regole richiedono l'output più a sinistra più compatto, quella sarebbe una piramide di 6 fantasmi in cima a 4 zucche, con altre 3 zucche a destra. Lo aggiungerò come esempio.
AdmBorkBork,

Bene, il tuo uso di compact mi ha confuso: potrei mettere tutti i fantasmi sulla stessa fila, quindi è più compatto in verticale!
Neil,

Le zucche saranno sempre fornite prima dei fantasmi?
Gabriel Benamy,

2
Mi piace che i fantasmi e le zucche stiano creando una piramide umana
MayorMonty,

Risposte:


5

JavaScript (ES7), 166 164 159 byte

5 byte salvati grazie a Neil

f=(p,g,j=(g*2)**.5+.5|0,G=j>p-1?p?p-1:0:j,P=`
`,i=~j?g-G*++G/2:G,n=i>0?i>g?g:i:0)=>p|g?f(0,g-n,-1,G-1,P+'    ')+P+'((^v^)) '.repeat(p)+'\\{O.O}/ '.repeat(n):''

Formattato e commentato

f = (                                    // given:
  p,                                     // - p = number of pumpkins
  g,                                     // - g = number of ghosts
  j = (g * 2) ** .5 + .5 | 0,            // - j = ceil(triangular root of g)
  G = j > p - 1 ? p ? p - 1 : 0 : j,     // - G = max(0, min(p - 1, j))
  P = '\n',                              // - P = padding string (+ line-break)
  i = ~j ?                               // - i =
    g - G * ++G / 2                      //   first iteration: g - G * (G + 1) / 2
  : G,                                   //   next iterations: G
  n = i > 0 ? i > g ? g : i : 0          // - n = max(0, min(i, g)) = number of
) =>                                     //   ghosts to print at this iteration
p | g ?                                  // if there's still something to print:
  f(                                     //   do a recursive call with:
    0,                                   //   - no pumpkin anymore
    g - n,                               //   - the updated number of ghosts
    -1,                                  //   - j = -1 (so that ~j == 0)
    G - 1,                               //   - one less ghost on the pyramid row
    P + '    '                           //   - updated padding string
  ) +                                    //   
  P +                                    //   append padding string
  '((^v^)) '.repeat(p) +                 //   append pumpkins
  '\\{O.O}/ '.repeat(n)                  //   append ghosts
: ''                                     // else: stop

Matematica sottostante

La parte difficile è scoprire la larghezza ottimale Gdella piramide fantasma.

Il numero di fantasmi gin una tale piramide è dato da:

g = 1 + 2 + 3 + ... + G = G(G + 1) / 2

Reciprocamente, la larghezza di una piramide contenente gfantasmi è la vera radice dell'equazione quadratica risultante:

G² + G - 2g = 0

Δ = 1² - 4(-2g)
Δ = 8g + 1

G = (-1 ± √Δ) / 2

Il che porta alla seguente radice reale (nota anche come radice triangolare ):

G = (√(8g + 1) - 1) / 2

Tuttavia, la larghezza della piramide è anche limitata dal numero di zucche: non possiamo avere altro che p-1fantasmi sulle pzucche. Da qui la formula finale utilizzata nel codice:

j = ⌈(√(8g + 1) - 1) / 2⌉
G = max(0, min(p - 1, j))

Versione ES6, 173 171 166 byte

f=(p,g,j=Math.pow(g*2,.5)+.5|0,G=j>p-1?p?p-1:0:j,P=`
`,i=~j?g-G*++G/2:G,n=i>0?i>g?g:i:0)=>p|g?f(0,g-n,-1,G-1,P+'    ')+P+'((^v^)) '.repeat(p)+'\\{O.O}/ '.repeat(n):''

Casi di test (ES6)


1
Penso che j=(g+g)**.5+.5|0dovrebbe funzionare.
Neil,

Bella spiegazione!
AdmBorkBork,

@Neil Questo è più breve e più affidabile. (Il mio metodo aveva alcuni valori non validi, a partire da g = 5051.) Grazie.
Arnauld,

3

Perl, 246 byte (le nuove righe non fanno parte del codice e sono fornite esclusivamente per la leggibilità)

($c,$d)=<>=~/(\d+)/g;
$p="((^v^)) ";$g="\\{O.O}/ ";
for($f[0]=$c;$d>0;$d--){$f[$b+1]+1<$f[$b]?$f[++$b]++:$f[$b]++;$f[0]+=$d,$d=0 if$b==$c-1;$f[$b]==1?$b=0:1}
$h[0]=($p x$c).$g x($f[0]-$c);$h[$_].=$"x(4*$_).$g x$f[$_]for(1..$#f);
say join$/,reverse@h;

Accetta due numeri: prima le zucche, seguite dai fantasmi. Input di esempio:

5 20

Uscita campione:

                \{O.O}/ 
            \{O.O}/ \{O.O}/ 
        \{O.O}/ \{O.O}/ \{O.O}/ 
    \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ 
((^v^)) ((^v^)) ((^v^)) ((^v^)) ((^v^)) \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ 

Oh, hai letto le mie parole un po 'diverse da come intendevo: i fantasmi possono impilarsi sopra ai fantasmi solo se c'è una zucca sotto, altrimenti devono andare nel giusto file singolo. Ecco perché il 0p 4gtest case ha tutti i fantasmi in una linea, piuttosto che in pila.
AdmBorkBork,

@TimmyD Va bene, l'ho risolto ora. Dovrò fare un po 'di golf per ridurlo però.
Gabriel Benamy,
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.