Buzzby Berkeley Robot Hokey Pokey


25

Buzzby Berkeley Robot Hokey Pokey

Compito

Scrivi un programma o una funzione per produrre un'animazione artistica ASCII che raffigura una linea di robot che danzano sul testo di Hokey Pokey (o Cokey, se preferisci) nello stile di un numero di Busby Berkeley!

Esempio di output

inserisci qui la descrizione dell'immagine

Ingresso

Accetta tre argomenti (considerati validi):

N = numero di robot nella linea (Min = 6)

B = durata di un "battito" in millisecondi (Min = 10)

D = ritardo in ms tra i robot successivi (Min = 0)

(Nell'esempio sopra riportato: N = 8, B = 380, C = 75)

specificazioni

  1. N robot sono mostrati in fila su un palco.

  2. Una riga di testo da "il verso" è mostrata alla volta sotto il palcoscenico (centrata all'interno di 1 carattere e racchiusa tra virgolette).

  3. I robot eseguono le azioni per ciascuna riga come mostrato fino a quando il verso non è stato ripetuto 5 volte.

  4. Un'azione viene eseguita raffigurando un robot che utilizza un set di caratteri ASCII e attende una durata specificata prima di eseguire l'azione successiva. La durata di un'azione è misurata in "battiti". La durata di 1 battuta è un numero di millisecondi, B .

  5. Il primo robot inizia a eseguire le azioni per ciascuna riga del verso immediatamente quando viene visualizzato il testo della riga.

  6. Ogni robot successivo ritarda l'avvio delle sue azioni fino a un tempo specifico ( D ) dopo che il robot alla sua destra (la tua sinistra!) Inizia le sue azioni.

  7. Le rappresentazioni dei robot variano in base ai caratteri ASCII che rappresentano l '"antenna" di un robot, di cui esistono 5 tipi possibili, distribuiti casualmente ogni volta che il programma viene eseguito.

  8. Ogni tipo di antenna deve essere utilizzato da almeno un robot, ma lo stesso tipo non deve apparire su alcun robot separato da meno di 3 altri robot. Le quantità di due tipi di antenne non possono differire di non più di 1 (ad es. 1xType_4 e 3xType_5 sono illegali dal 3-1> 1)

Verso e azioni

L'intero verso è ripetuto 5 volte, 1 riga alla volta ...

Line  Text                            Action/Beats, 
----  -----------------------------   ------------------------------------
1     You put your ? in               ??/4
2     You take your ? out             AA/4
3     You put your ? in               ??/4
4     And you shake it all about      AA/1, ??/1, AA/1, ??/1
5     You do the Hokey Pokey and...   
      ...you turn yourself around     AA/1, H[1-7]/1
6     That's what it's all about!     AA/4, ZZ/4

Per ogni ripetizione (R) del verso, sostituire? e ??...

R   ?=           ??=
--  -----------  ---
1.  right foot   RF 
2.  left foot    LF
3.  right hand   RH
4.  left hand    LH
5.  whole self   WS

Modelli di azioni e ASCII

Ogni azione etichettata è rappresentata da 5 linee di 8 simboli ASCII.
La rappresentazione di ogni azione è la seguente ...

1 |   12     12        12    12        12     12      12   
2 |  ['']   ['']      ['']  ['']      ['']   ['']   \[*-] 
3 | └[__]┘ └[__]┘    └[__]┘┌[__]┘    └[__]┐ ┌[__]┐   [__]\ 
4 |   ||     /<        >\    <\        />    /  \     /|
5 |--------------------------------------------------------
  |\__AA__/\__RF__/\__LF__/\__RH__/\__LH__/\__WS__/\__ZZ__/ 

1 |   12     12_     34_      34      _34     _12     12    
2 |  ['']    [" ]    [ _]    [__]    [_ ]    [ "]    ['']
3 | >[__]<   [_<]    [<.]   <[..]>   [.>]    [>_]   <[__]>
4 |   ||      |\      ||      /|      ||      |\      ||
5 |--------------------------------------------------------
  |\__H1__/\__H2__/\__H3__/\__H4__/\__H5__/\__H6__/\__H7__/

Nella riga 1, sostituire "1-4" con il simbolo corrispondente per ciascun tipo di antenna ...

1 | 1234 1234 1234 1234 1234 
  | \/\/ |┌┐| )||( |||| ┐/\┌ <-- Symbols 1-4 for...
  | 1    2    3    4    5    <-- ...antenna types 1-5

Produzione

L'intera scena deve essere riprodotta almeno una volta immediatamente ogni volta che il contenuto della scena cambia in alcun modo. (Supponendo che il ritardo tra le azioni dei robot sia> 0, l'output può essere renderizzato non meno di N volte per azione.)

Idealmente, per un'animazione la console o l'area di output equivalente viene cancellata prima del rendering di ogni aggiornamento. Per garantire che le lingue non siano in grado di cancellare la console, l'output può anche essere riprodotto in un flusso continuo, soggetto agli stessi requisiti sopra descritti.

punteggio

I vincitori sono i programmi più brevi in ​​ogni lingua, nonché i più brevi in ​​assoluto.

Eccezione 1 Poiché la cancellazione della console per ogni rendering è preferibile, sebbene non richiesta, i byte utilizzati esclusivamente per questo lussuoso scopo non contano per i byte totali. Ciò include i comandi per cancellare la console e l'output di riempimento con righe vuote per scorrere i contenuti della console fuori dalla vista.

I CSS di eccezione 2 o mezzi effettivamente simili utilizzati esclusivamente allo scopo di definire lo stile dell'output oltre i requisiti minimi non contano ai byte totali. Ad esempio, *{color:blue;text-align:center;}conta solo 32-10 = 22 byte poiché color:blue;non serve a soddisfare alcuna specifica, mentre viene specificato il testo centrato.

Meta

Ispirato da (mostrando la mia età) il Demone Danza TRS-80 , Android Nim e ovviamente Busby Berkeley (e no, non sono così vecchio).


Fantastico ... l'ultima cosa di cui ho bisogno prima di essere già stanco è una sfida per attirare la mia attenzione. I tag in alto sono necessari?
Matt,

@Matt, bene l'intera sfida non è strettamente "necessaria", ma ho rimosso i tag duplicati. ;-)
Bumpy

Ho rimosso il limite massimo per il parametro di input 'D'. E ' stato "D <B / N" per assicurarsi che ogni robot lungo la linea era almeno iniziato l'azione mentre il primo robot è stato ancora eseguendo esso (per evitare troppo caos), ma per errore, il mio esempio ha rotto questa regola, e sembra che vada bene comunque, quindi ho rimosso il limite massimo di ritardo. Ci scusiamo per quel cambiamento tardivo.
Bumpy

Ho aggiornato la sezione sul punteggio CSS e simili.
Bumpy

3
Questa è la cosa più adorabile che abbia mai visto.
Wossname

Risposte:


13

Signore e signori, vi preghiamo di dare il benvenuto al nostro adorabile

Gruppo di danza full-end-stack, 1.320 1.378 1.425 1.495 byte

JavaScript: 1,195 byte | CSS: 103 byte | HTML: 22 byte


Questa è una bella sfida. Ha anche molti casi speciali. Oh ragazzo, tanti casi speciali. E quelle antenne ...

Funzionerà per sempre e si riavvierà dopo che tutte le azioni ( left foot, right footecc.) Saranno completate.

Puoi provarlo su jsFiddle o usando lo snippet di codice che segue:

t=setTimeout
c=l=a=i=0
_=(x,y,z)=>{if(!i)for(;++i<=x;q=~~(Math.random()*10))s.append(document.createElement('pre'))
for(i=l=0,c=a+1;i<33;)(i=>{t($=>{if(4==i){c=0
l=1}if(8==i){c=a+1
l=0}if(12==i|14==i){c=0
l=2}if(13==i|15==i)c=a+1
if(16==i){c=0
l=3}if(16<i&24>i)c=i-10
if(24==i){c=0
l=4}if(28==i)c=6
if(31<i){a=++a%5
_(x,y,z)}for(j=0;j<x;)(j=>{t($=>s.childNodes[j][h]=(-1<[1,3,8,9].indexOf(c)?'  ':2==c||4==c?'    ' :'   ')+(11==c||12==c?'_':'')+['\\/\\/','|┌┐|',')||(','||||','┐/\\┌'][(q+j)%4].substring($=8<c&12>c?2:0,$+2)+(8==c||9==c?'_':'')+'\n'+[`  ['']			   
 └[__]┘ 
   ||`,` ['']  
└[__]┘  
  /<`,`   ['']
  └[__]┘
    >\\`,` ['']
┌[__]┘
  <\\`,`   ['']
  └[__]┐
    />`,`  ['']
 ┌[__]┐
  /  \\`,` \\[*-]
  [__]\\
   <\\`,`  ['']
 >[__]<
   ||`,`  [" ]
  [_<]
   |\\`,`  [ _]
  [<.]
   ||`,`  [__]
 <[..]>
   /|`,`  [_ ]
  [.>]
   ||`,`  [ "]
  [>_]
   |\\`,`  ['']
 <[__]>
   ||`][c]+'\n-------',j*z)})(j++)
p[h='innerText']='"'+["You put your $ in","You take your $ out","And you shake it all about","You do the Hokey Pokey and you turn yourself around","That's what it's all about!"][l].replace('$',['right foot','left foot','right hand','left hand','whole self'][a])+'"'},i*y)})(i++)}

// let's dance (not included in the byte count – as if it would make any difference)
_(8, 400, 50)
*{text-align:center}x pre{display:inline-block;width:55px;text-align:left}pre{line-height:16px;margin:0
<x id=s></x><pre id=p>


Testato su Chrome e Firefox su macOS, Windows 10 e Ubuntu


Le modifiche

  • Salvataggio di 70 byte rimuovendo il contenitore aggiuntivo per contenere le antenne. Grazie a Bumpy . Inoltre ho trovato alcuni spazi bianchi, rimosso la cache ora non necessaria di createElemente rimosso il lungo accesso a .firstChild.
  • Ho salvato 47 byte - ho appena realizzato che in realtà non ho bisogno di chiamare getElementById. Ciò rende inoltre documentsuperflua la memorizzazione nella cache .
  • Salvato 4 byte sostituendo ||e &&con bit a bit &e |. Grazie a TheLethalCoder .
  • Hai salvato 54 byte semplificando molte piccole cose e ottimizzando il CSS.

Bravo!!! The Full Frontend-Stack Dance Group è un successo !! Ci scusiamo per la quantità di casi speciali; Ho scelto le combinazioni di antenne specificatamente per frustrare, ma il resto dei simboli erano tutti al servizio dell'animazione - non pensavo che fosse così complicato. Ora, mi sento ridicolo criticare una performance così brillante, ma penso che i trattini bassi / l'antenna siano leggermente fuori gioco quando si girano (1 personaggio troppo a sinistra, forse?) Ma comunque - è fantastico! Grazie per aver accettato la mia sfida!
Bumpy

@Bumpy Grazie. Hai ragione, ho confuso alcuni numeri magici. Le antenne sono ora perfettamente in ordine. Sono anche riuscito a ottenere la stessa altezza di linea per tutte le figure. Davvero una sfida divertente.
insertusernamehere

1
Armeggiare con robot danzanti alle 2 in punto, dite? Meraviglioso, bwahaha!
Bumpy

1
||e &&a |e &?
TheLethalCoder

1
@TheLethalCoder Assolutamente. Il tuo suggerimento è già nella fonte e si riflette nelle modifiche. Molte grazie.
inserireusernamehere il

5

C #, 1188 1376 1382 byte dopo le eccezioni

Compatto:

namespace System.Threading{using S=String;void H(int n,int b,int d){Console.CursorVisible=false;int t,u=0,v=5,w,x,y,z;S[]i=",That's what it's all about!,,You do the Hokey Pokey and you turn yourself around,And you shake it all about,,You take? out,You put? in".Split(',');i[0]=i[1];i[2]=i[3];i[5]=i[7];for(b=b<d*n?0:b-d*n;v-->0;)for(w=32;w-->0;Thread.Sleep(b))for(t=u,z=0;z++<n;Thread.Sleep(d)){S s="",r=i[w/4].Replace("?"," your "+(v<1?"whole self":(v%2<1?"right ":"left ")+(v/3<1?"hand":"foot")));u="88880000765432109090999900009999"[w];u=u>56?9+v:u-48;for(y=4;y-->0;s+="\n")for(x=0;x<n;x++)s+=S.Format(@"{0}{0}   |\   {0}   /|   {0}   |\   {0}   /|{4} /  \{4}  />{4}<\{4}{4}>\{4}/<{4} └{1}┘  >{1}<   [_<]{4}[<.]   <[..]>   [.>]{4}[>_]   <{1}>   {1}\  ┌{1}┐   └{1}┐┌{1}┘{4}└{1}┘└{1}┘   {2}  {2}   ["" ]{4}[ _]{4}{1}{4}[_ ]{4}[ ""]   {2}  \[*-]   {2}   {2}{2}{4}{2}{2}  {3}{3}  12_{4} 34_{4}  34{4}  _34{4} _12  {3}{3}{3} {3} 12{4} {3} 12{4}", "   ||   ","[__]"," [''] ","   12   ","    ").Substring(y*14+(x<z?u:t)<<3,8).Replace("12",@"\/|┌)|||┐/".Substring(x%5*2,2)).Replace("34",@"\/┐||(||\┌".Substring(x%5*2,2));Console.Clear();Console.Write(s+new S('-',n*8)+"\n"+new S(' ',n*4-r.Length/2)+r);}}}

Formattazione leggermente più gradevole e racchiusa in un programma eseguibile:

namespace System.Threading{
    using S=String;

    //** Not counted towards score: execution wrapper
    class P{
        static void Main(S[]a){
            new P().H(int.Parse(a[0]),int.Parse(a[1]),int.Parse(a[2]));
        }
    //** End not counted towards score

        void H(int n,int b,int d){
            Console.CursorVisible=false;  // Not counted under exception 2
            int t,u=0,v=5,w,x,y,z;
            S[]i=",That's what it's all about!,,You do the Hokey Pokey and you turn yourself around,And you shake it all about,,You take? out,You put? in".Split(',');
            i[0]=i[1];
            i[2]=i[3];
            i[5]=i[7];
            for(b=b<d*n?0:b-d*n;v-->0;)
                for(w=32;w-->0;Thread.Sleep(b))
                    for(t=u,z=0;z++<n;Thread.Sleep(d)){
                        S s="",r=i[w/4].Replace("?"," your "+(v<1?"whole self":(v%2<1?"right ":"left ")+(v/3<1?"hand":"foot")));
                        u="88880000765432109090999900009999"[w];
                        u=u>56?9+v:u-48;
                        for(y=4;y-->0;s+="\n")
                            for(x=0;x<n;x++)
                                s+=S.Format(@"{0}{0}   |\   {0}   /|   {0}   |\   {0}   /|{4} /  \{4}  />{4}<\{4}{4}>\{4}/<{4} └{1}┘  >{1}<   [_<]{4}[<.]   <[..]>   [.>]{4}[>_]   <{1}>   {1}\  ┌{1}┐   └{1}┐┌{1}┘{4}└{1}┘└{1}┘   {2}  {2}   ["" ]{4}[ _]{4}{1}{4}[_ ]{4}[ ""]   {2}  \[*-]   {2}   {2}{2}{4}{2}{2}  {3}{3}  12_{4} 34_{4}  34{4}  _34{4} _12  {3}{3}{3} {3} 12{4} {3} 12{4}", "   ||   ","[__]"," [''] ","   12   ","    ").Substring(y*14+(x<z?u:t)<<3,8).Replace("12",@"\/|┌)|||┐/".Substring(x%5*2,2)).Replace("34",@"\/┐||(||\┌".Substring(x%5*2,2));
                        Console.Clear(); // Not counted under exception 1
                        Console.Write(s+new S('-',n*8)+"\n"+new S(' ',n*4-r.Length/2)+r);
                    }
        }
    } // Not counted towards score: end class
}

Provalo online!

  1. Visita questo link: tutorialspoint.com
  2. Nella scheda Termine predefinito nella parte inferiore dello schermo, digitare:
    mono main.exe 8 400 40

Modifica 1

Sostituito string.Format(i,j)con un i.Replace("?",j)risparmio complessivo di 6 byte.

Modifica 2

Rinnovo completo con suggerimenti dai commenti.


Sìì! C'è un modo semplice per eseguirlo online da qualche parte?
Bumpy

@Bumpy, aggiunto un link nella risposta!
Hand-E-Food,

1
@inserireusernamehere Compilando in una funzione anonima e in alcuni campi da golf minori ce l'ho fatta a meno di 1300.
TheLethalCoder

1
@insertusernamehere, fatto! Il tuo turno! :-D
Hand-E-Food

1
@TheLethalCoder, grazie per quello! Mi sono liberato cper un piccolo risparmio. Sapevo di aver dimenticato un modo migliore di new string(c,n). Tuttavia, ora che ho le alias S=String, new S(c,n)è ancora più breve.
Hand-E-Food,

0

JavaScript, 948 byte

Probabilmente forma scadente per rispondere alla tua domanda, ma comunque ...

Ho provato tutti i modi per comprimere il testo, ma la maggior parte è finita più a lungo dell'originale con l'algoritmo chiave + incluso. Sono certo che c'è ancora un modo più ottimale per comprimerlo, ma devo tracciare la linea da qualche parte.

È interessante notare che la ricerca ha prodotto una o due idee per alcune altre sfide che potrei affinare e pubblicare in seguito.

<pre id=O/>

f=(N,B,D)=>{Q=c=>(K={},k='~',[...c].map(v=>v<k?K[k=v]='':K[k]+=K[v]||v),K[k])
x=``,A=`//,||,)||(,,/`.split(',').sort(new Date)
r=new Array(N).fill(0),t=i=v=0,n=`\n`,T=setTimeout
C=_=>(w=Q(`ouhand t t's ake Y y all abtokey righlefwhole fooself ,${v+1},,1yr ${x[v*2]+x[v*2+1]}puintt,,Ashi,do the HPaturn yrarnd,,7,8,90123,Twi!,,6,`).split(',')[i++])<'A'?(r.map((_,m)=>T((a,b)=>R(r[N-a]=b),m*D,m,w)),i>22?(v++,i=0):0,v<3?T(C,B*(i<7||i>21?4:1)):0):C(t=w),R=_=>{for(o='',m=4;m--;o+=n){for(w=N;w--;)o+=Q(`┌┐└┘\\/||/${A[w%5]}   [__] [''] ||] _ __ _  [*-][" ][ _][_ ][ "] ┐ ┐><[_<] [<.]<[..]>[.>] [>_]<> /<></>/ //`).substr(r[w]*8+(3-m)*112,8)}
O.innerHTML=o+'-'.repeat(N*8)+' '.repeat(((N*8)-t.length)/2)+t}
C()}

( NB: contiene alcuni caratteri nell'intervallo 1-31 le cui rappresentazioni sono un po 'strane se pubblicate qui)

Guarda il pieno ciclo di danza psichedelica su CodePen !

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.