Buzzby Berkeley Robot Hokey Pokey

25

Buzzby Berkeley Robot Hokey Pokey

Tarea

¡Escriba un programa o función para producir una animación artística ASCII que represente una línea de robots bailando con la letra de Hokey Pokey (o Cokey, si lo prefiere) al estilo de un número de Busby Berkeley!

Salida de ejemplo

ingrese la descripción de la imagen aquí

Entrada

Acepta tres argumentos (se supone que son válidos):

norte = número de robots en la línea (Min = 6)

si = duración de un "latido" en milisegundos (Min = 10)

re = retraso en ms entre robots sucesivos (Min = 0)

(En el ejemplo de salida anterior: N = 8, B = 380, C = 75)

Presupuesto

  1. N robots se muestran en una fila sobre un escenario.

  2. Se muestra una línea de texto de "el verso" a la vez debajo del escenario (centrada dentro de 1 carácter y entre comillas).

  3. Los robots realizan las acciones para cada línea como se muestra hasta que el verso se repite 5 veces.

  4. Una acción se realiza representando un robot usando un conjunto de caracteres ASCII y esperando una duración específica antes de realizar la siguiente acción. La duración de una acción se mide en "latidos". La duración de 1 latido es un número de milisegundos, B .

  5. El primer robot comienza a realizar las acciones para cada línea del verso inmediatamente cuando se muestra el texto de la línea.

  6. Cada robot posterior retrasa el inicio de sus acciones hasta un momento específico ( D ) después de que el robot a su derecha (¡su izquierda!) Comience sus acciones.

  7. Las representaciones de los robots varían según los caracteres ASCII que representan la "antena" de un robot, de los cuales hay 5 tipos posibles, distribuidos aleatoriamente cada vez que se ejecuta el programa.

  8. Cada tipo de antena debe ser utilizado por al menos un robot, pero el mismo tipo no debe aparecer en ningún robot separado por menos de otros 3 robots. Las cantidades de dos tipos de antenas pueden diferir en no más de 1 (por ejemplo, 1xType_4 y 3xType_5 es ilegal ya que 3-1> 1)

Verso y acciones

Todo el verso se repite 5 veces, 1 línea a la vez ...

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

Para cada repetición (R) del verso, ¿sustituir? y ?? ...

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

Acciones y patrones ASCII

Cada acción etiquetada está representada por 5 líneas de 8 símbolos ASCII.
La representación de cada acción es la siguiente ...

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

En la fila 1, reemplace "1-4" con el símbolo correspondiente para cada tipo de antena ...

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

Salida

La escena completa debe representarse al menos una vez inmediatamente cuando el contenido de la escena cambie de alguna manera. (Es decir, suponiendo que el retraso entre las acciones de los robots es> 0, la salida se puede representar no menos de N veces por acción).

Idealmente, para una animación, la consola o el área de salida equivalente se borra antes de que se presente cada actualización. Para proporcionar idiomas que no pueden borrar la consola, la salida también se puede representar en un flujo continuo, sujeto al mismo requisito descrito anteriormente.

Tanteo

Los ganadores son los programas más cortos en cada idioma, así como los más cortos en general.

Excepción 1 Debido a que es preferible borrar la consola de cada render, aunque no es obligatorio, los bytes utilizados exclusivamente para este lujoso propósito no cuentan para el total de bytes. Esto incluye comandos para borrar la consola y resultados de relleno con líneas en blanco para desplazar el contenido de la consola fuera de la vista.

La excepción 2 CSS o medios similares efectivamente utilizados exclusivamente con el propósito de diseñar la salida más allá de los requisitos mínimos no cuentan para el total de bytes. Por ejemplo, *{color:blue;text-align:center;}cuenta como solo 32-10 = 22 bytes ya color:blue;que no sirve para satisfacer ninguna especificación, mientras que se especifica el texto centrado.

Meta

Inspirado por (mostrando mi edad) el Demonio Bailar TRS-80 , Android Nim , y por supuesto Busby Berkeley (y no, no estoy de que edad).

Desigual
fuente
Genial ... lo último que necesito antes de que ya esté cansado es un desafío para llamar mi atención. ¿Son necesarias las etiquetas en la parte superior?
Matt
@ Matt, bueno, todo el desafío no es estrictamente "necesario", pero he eliminado las etiquetas duplicadas. ;-)
Bumpy
He eliminado el límite máximo para el parámetro de entrada 'D'. Que era "D <B / N" para asegurarse de que cada robot en la línea había al menos iniciado la acción, mientras que el primer robot todavía estaba realizando él (para evitar demasiado caos), pero por error, mi propio ejemplo rompió esa regla, y parece estar bien de todos modos, así que he eliminado el límite máximo de retraso. Disculpas por ese cambio tardío.
Bumpy
He actualizado la sección sobre puntuación de CSS y similares.
Bumpy
3
Esa es la cosa más adorable que he visto.
Wossname

Respuestas:

13

Damas y caballeros, por favor den la bienvenida a nuestra encantadora

Grupo de baile completo de frontend-stack, 1.320 1.378 1.425 1.495 bytes

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


Este es un lindo desafío. También tiene muchos casos especiales. Oh chico, tantos casos especiales. Y esas antenas ...

Se ejecutará para siempre y se reiniciará después de que se completen todas las acciones ( left foot, right footetc.).

Puede probarlo en jsFiddle o utilizando el fragmento de código que se muestra a continuación:

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>


Probado en Chrome y Firefox en macOS, Windows 10 y Ubuntu


Ediciones

  • Ahorró 70 bytes al eliminar el contenedor adicional para contener las antenas. Gracias a Desigual . También se encontraron algunos espacios en blanco más, se eliminó el almacenamiento en caché ahora innecesario createElementy se eliminó el acceso largo a .firstChild.
  • Guardado 47 bytes : me acabo de dar cuenta de que en realidad no necesito llamar getElementById. Esto también hace documentinnecesario el almacenamiento en caché .
  • Salvado 4 bytes reemplazando ||y &&con bit a bit &y |. Gracias a TheLethalCoder .
  • Salvado 54 bytes al simplificar muchas cosas pequeñas y al optimizar el CSS.
insertusernamehere
fuente
¡¡¡Bravo!!! ¡El grupo de baile Full Frontend-Stack es un éxito! Disculpas por la cantidad de casos especiales; Elegí las combinaciones de antenas específicamente para frustrar, pero el resto de los símbolos estaban al servicio de la animación; no planeé que fuera TAN complicado. Ahora, me siento grosero criticando una actuación tan brillante, pero creo que los guiones bajos / antena están ligeramente fuera de control cuando giran (¿1 personaje demasiado a la izquierda, posiblemente?) Pero lo que sea, ¡es genial! ¡Gracias por aceptar mi desafío!
Bumpy
@Bumpy Gracias. Tienes razón, mezclé algunos números mágicos. Las antenas ahora están perfectamente en orden. También logré obtener la misma altura de línea para todas las figuras. Realmente un desafío divertido.
insertusernamehere
1
Jugueteando con robots de baile a las 2 en punto, ¿dices? Maravilloso, bwahaha!
Bumpy
1
||y &&para |y &?
TheLethalCoder
1
@TheLethalCoder Absolutamente. Su sugerencia ya está en la fuente y se refleja en las ediciones. Muchas gracias.
insertusernamehere
5

C #, 1188 1376 1382 bytes después de excepciones

Comprimido:

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

Formato ligeramente más agradable y envuelto en un programa ejecutable:

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
}

Pruébalo en línea!

  1. Visita este enlace: tutorialspoint.com
  2. En la pestaña Término predeterminado en la parte inferior de la pantalla, escriba:
    mono main.exe 8 400 40

Editar 1

Reemplazado string.Format(i,j)coni.Replace("?",j) ahorro de 6 bytes en general.

Editar 2

Renovación completa con sugerencias de los comentarios.

Hand-E-Food
fuente
¡Hurra! ¿Hay alguna manera fácil de ejecutarlo en línea en algún lugar?
Bumpy
@Bumpy, agregó un enlace en la respuesta!
Hand-E-Food
1
@insertusernamehere Compilando una función anónima y algunos juegos de golf menores, llegué a menos de 1300.
TheLethalCoder
1
@insertusernamehere, hecho! ¡Tu turno! :-D
Hand-E-Food
1
@TheLethalCoder, ¡gracias por eso! Me deshice cpor un pequeño ahorro. Sabía que había olvidado una mejor manera que new string(c,n). Sin embargo, ahora que he alias S=String, new S(c,n)es más corto aún.
Hand-E-Food
0

JavaScript, 948 bytes

Probablemente deficiente para responder su propia pregunta, pero de todos modos ...

Intenté todo tipo de formas de comprimir el texto, pero la mayoría terminó más tiempo que el original con la clave + algoritmo incluido. Estoy seguro de que todavía hay una forma más óptima de comprimirlo todo, pero tengo que dibujar la línea en alguna parte.

Curiosamente, la búsqueda arrojó una o dos ideas para algunos otros desafíos que podría refinar y publicar más tarde.

<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 algunos caracteres en el rango 1-31 cuyas representaciones son un poco extrañas cuando se publican aquí)

¡Mira el ciclo de baile psicodélico completo en CodePen !

Desigual
fuente