Buzzby Berkeley Robot Hokey Pokey


25

Buzzby Berkeley Robot Hokey Pokey

Tâche

Écrivez un programme ou une fonction pour produire une animation artistique ASCII représentant une ligne de robots dansant sur les paroles du Hokey Pokey (ou Cokey, si vous préférez) dans le style d'un numéro de Busby Berkeley!

Exemple de sortie

entrez la description de l'image ici

Contribution

Accepte trois arguments (supposés valides):

N = nombre de robots dans la ligne (Min = 6)

B = durée d'un "battement" en millisecondes (Min = 10)

D = retard en ms entre les robots successifs (Min = 0)

(Dans l'exemple de sortie ci-dessus: N = 8, B = 380, C = 75)

Caractéristiques

  1. N robots s'affichent sur une scène.

  2. Une ligne de texte du "verset" est affichée à la fois sous la scène (centrée sur 1 caractère et entourée de guillemets.)

  3. Les robots effectuent les actions pour chaque ligne comme indiqué jusqu'à ce que le verset ait été répété 5 fois.

  4. Une action est exécutée en représentant un robot à l'aide d'un ensemble de caractères ASCII et en attendant une durée spécifiée avant d'effectuer l'action suivante. La durée d'une action est mesurée en "battements". La durée de 1 battement est un nombre de millisecondes, B .

  5. Le premier robot commence à exécuter les actions pour chaque ligne de verset immédiatement lorsque le texte de la ligne est affiché.

  6. Chaque robot suivant retarde le démarrage de ses actions jusqu'à un moment précis ( D ) après que le robot à sa droite (votre gauche!) A commencé ses actions.

  7. Les représentations des robots varient selon les caractères ASCII qui représentent «l'antenne» d'un robot, dont il existe 5 types possibles, répartis de manière aléatoire à chaque exécution du programme.

  8. Chaque type d'antenne doit être utilisé par au moins un robot, mais le même type ne doit apparaître sur aucun robot séparé par moins de 3 autres robots. Les quantités de deux types d'antennes quelconques peuvent différer d'au plus 1 (par exemple, 1xType_4 et 3xType_5 est illégal depuis 3-1> 1)

Verset et actions

Le verset entier est répété 5 fois, 1 ligne à la fois ...

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

Pour chaque répétition (R) du verset, remplacer? et ??...

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

Actions et modèles ASCII

Chaque action étiquetée est représentée par 5 lignes de 8 symboles ASCII.
La représentation de chaque action est la suivante ...

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__/

À la ligne 1, remplacez "1-4" par le symbole correspondant pour chaque type d'antenne ...

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

Sortie

La scène entière doit être rendue au moins une fois immédiatement chaque fois que le contenu de la scène change de quelque façon que ce soit. (En supposant que le délai entre les actions des robots est> 0, la sortie peut être rendue pas moins de N fois par action.)

Idéalement, pour une animation, la console ou la zone de sortie équivalente est effacée avant le rendu de chaque mise à jour. Pour fournir des langues incapables d'effacer la console, la sortie peut également être rendue dans un flux continu, sous réserve des mêmes exigences décrites ci-dessus.

Notation

Les gagnants sont les programmes les plus courts dans chaque langue, ainsi que le plus court dans l'ensemble.

Exception 1 Étant donné que l'effacement de la console, chaque rendu est préférable mais non requis, les octets utilisés exclusivement à cette fin luxueuse ne comptent pas dans le total des octets. Cela inclut des commandes pour effacer la console et un remplissage de sortie avec des lignes vides pour faire défiler le contenu de la console hors de la vue.

Exception 2 CSS ou des moyens effectivement similaires utilisés exclusivement dans le but de styliser la sortie au-delà des exigences minimales ne sont pas pris en compte dans le nombre total d'octets. Par exemple, il ne *{color:blue;text-align:center;}compte que 32-10 = 22 octets car color:blue;il ne sert à satisfaire aucune spécification, tandis que le texte centré est spécifié.

Meta

Inspiré par (montrant mon âge) le TRS-80 Dancing Demon , Android Nim et bien sûr Busby Berkeley (et non, je ne suis pas si vieux).


Génial ... la dernière chose dont j'ai besoin avant d'être déjà fatigué est un défi pour attirer mon attention. Les étiquettes en haut sont-elles nécessaires?
Matt

@Matt, tout le défi n'est pas strictement "nécessaire", mais j'ai supprimé les balises en double. ;-)
Bumpy

J'ai supprimé la limite maximale pour le paramètre d'entrée «D». Il était « D <B / N » pour vous assurer que chaque robot la ligne avait au moins commencé l'action alors que le premier robot exécutait encore (pour éviter trop de chaos), mais par erreur, mon exemple a brisé cette règle, et cela semble correct de toute façon, j'ai donc supprimé la limite de retard maximale. Toutes mes excuses pour ce changement tardif.
Bumpy

J'ai mis à jour la section sur la notation CSS et autres.
Bumpy

3
C'est la chose la plus adorable que j'aie jamais vue.
Wossname

Réponses:


13

Mesdames et messieurs, veuillez accueillir notre belle

Full Frontend-Stack Dance Group, 1 320 1 378 1 425 1 495 octets

JavaScript: 1 195 octets | CSS: 103 octets | HTML: 22 octets


C'est un joli défi. Il a également beaucoup de cas spéciaux. Oh mon garçon, tant de cas spéciaux. Et ces antennes…

Il s'exécutera indéfiniment et redémarrera une fois toutes les actions ( left foot, right footetc.) terminées.

Vous pouvez l' essayer sur jsFiddle ou en utilisant l'extrait de code ci-dessous:

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>


Testé dans Chrome et Firefox sur macOS, Windows 10 et Ubuntu


Modifications

  • Économisez 70 octets en retirant le conteneur supplémentaire pour contenir les antennes. Merci à Bumpy . A également trouvé quelques espaces supplémentaires, supprimé la mise en cache désormais inutile createElementet supprimé le long accès à .firstChild.
  • 47 octets enregistrés - je viens de réaliser que je n'ai pas besoin d'appeler getElementById. Cela rend également la mise en cache documentinutile.
  • Enregistré 4 octets en remplaçant ||et &&par bit &et et |. Merci à TheLethalCoder .
  • 54 octets enregistrés en simplifiant beaucoup de petites choses et en optimisant le CSS.

Bravo!!! Le groupe Full Frontend-Stack Dance est un succès !! Toutes mes excuses pour le nombre de cas spéciaux; J'ai choisi les combinaisons d'antennes spécifiquement pour frustrer, mais les autres symboles étaient tous au service de l'animation - je n'avais pas prévu que ce soit si compliqué. Maintenant, je me sens mal à l'aise de critiquer une performance aussi brillante, mais je pense que les traits de soulignement / antenne sont légèrement hors de contrôle lorsqu'ils se retournent (1 caractère trop à gauche, peut-être?) Mais peu importe - c'est génial! Merci d'avoir relevé mon défi!
Bumpy

@Bumpy Merci. Tu as raison, j'ai mélangé des nombres magiques. Les antennes sont maintenant parfaitement en ordre. J'ai également réussi à obtenir la même hauteur de ligne pour toutes les figures. Vraiment un défi amusant.
insertusernamehere

1
Tu joues avec des robots danseurs à 2 heures tu dis? Merveilleux, bwahaha!
Bumpy

1
||et &&à |et &?
TheLethalCoder du

1
@TheLethalCoder Absolument. Votre suggestion est déjà dans la source et reflétée dans les modifications. Merci beaucoup.
insertusernamehere

5

C #, 1188 1376 1382 octets après exceptions

Compacté:

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);}}}

Formatage légèrement plus agréable et enveloppé dans un programme exécutable:

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
}

Essayez-le en ligne!

  1. Visitez ce lien: tutorialspoint.com
  2. Dans l' onglet Terme par défaut en bas de l'écran, tapez:
    mono main.exe 8 400 40

Modifier 1

Remplacé string.Format(i,j)par une i.Replace("?",j)économie globale de 6 octets.

Modifier 2

Refonte complète avec suggestions des commentaires.


Yay! Existe-t-il un moyen simple de l'exécuter en ligne quelque part?
Bumpy

@Bumpy, a ajouté un lien dans la réponse!
Hand-E-Food

1
@insertusernamehere En compilant une fonction anonyme et un peu de golf mineur, je suis arrivé à moins de 1300.
TheLethalCoder

1
@insertusernamehere, c'est fait! À ton tour! :-D
Hand-E-Food

1
@TheLethalCoder, merci pour ça! Je me suis débarrassé de moi cpour une petite économie. Je savais que j'avais oublié un meilleur moyen que new string(c,n). Cependant, maintenant que j'ai aliasé S=String, new S(c,n)c'est encore plus court.
Hand-E-Food

0

JavaScript, 948 octets

Forme probablement médiocre pour répondre à votre propre question, mais de toute façon ...

J'ai essayé toutes sortes de façons de compresser le texte, mais la plupart ont fini plus longtemps que l'original avec l'algorithme clé + inclus. Je suis certain qu'il existe toujours un moyen plus optimal de tout compresser, mais je dois tracer la ligne quelque part.

Fait intéressant, la recherche a donné une ou deux idées pour d'autres défis que je pourrais affiner et publier plus tard.

<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: contient certains caractères dans la plage 1-31 dont les représentations sont un peu bizarres lorsqu'elles sont affichées ici)

Regardez le cycle complet de danse psychédélique sur CodePen !

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.