Buzzby Berkeley Roboter Hokey Pokey

25

Buzzby Berkeley Roboter Hokey Pokey

Aufgabe

Schreiben Sie ein Programm oder eine Funktion, um eine ASCII-Kunstanimation zu erstellen, die eine Reihe von Robotern zeigt, die zu den Texten des Hokey Pokey (oder Cokey, wenn Sie es vorziehen) im Stil einer Busby Berkeley-Zahl tanzen!

Beispielausgabe

Bildbeschreibung hier eingeben

Eingang

Akzeptiert drei Argumente (die als gültig angenommen werden):

N = Anzahl der Roboter in der Linie (Min = 6)

B = Dauer eines "Schlags" in Millisekunden (Min = 10)

D = Verzögerung in ms zwischen aufeinanderfolgenden Robotern (Min = 0)

(In der obigen Beispielausgabe: N = 8, B = 380, C = 75)

Spezifikationen

  1. N Roboter werden nacheinander auf einer Bühne gezeigt.

  2. Unterhalb der Bühne wird jeweils eine Textzeile aus "dem Vers" angezeigt (auf 1 Zeichen zentriert und in Anführungszeichen eingeschlossen).

  3. Die Roboter führen die Aktionen für jede Zeile wie gezeigt aus, bis der Vers 5 Mal wiederholt wurde.

  4. Eine Aktion wird ausgeführt, indem ein Roboter mit einer Reihe von ASCII-Zeichen dargestellt wird und eine bestimmte Zeitspanne gewartet wird, bevor die nächste Aktion ausgeführt wird. Die Dauer einer Aktion wird in "Beats" gemessen. Die Dauer von 1 Takt ist eine Anzahl von Millisekunden, B .

  5. Der erste Roboter führt die Aktionen für jede Verszeile sofort aus, wenn der Text der Zeile angezeigt wird.

  6. Jeder nachfolgende Roboter verzögert den Beginn seiner Aktionen, bis eine bestimmte Zeit ( D ) nach dem Beginn seiner Aktionen durch den Roboter rechts (links von Ihnen!) Verstrichen ist.

  7. Die Darstellungen der Roboter unterscheiden sich durch die ASCII-Zeichen, die die "Antenne" eines Roboters darstellen, von denen es 5 mögliche Typen gibt, die bei jedem Programmlauf zufällig verteilt werden.

  8. Jeder Antennentyp muss von mindestens einem Roboter verwendet werden, derselbe Antennentyp darf jedoch nicht auf Robotern vorkommen, die von weniger als 3 anderen Robotern getrennt sind. Die Mengen von zwei beliebigen Antennentypen dürfen sich um nicht mehr als 1 unterscheiden (z. B. 1xType_4 und 3xType_5 sind ungültig, da 3-1> 1).

Vers und Handlungen

Der ganze Vers wird fünfmal wiederholt, jeweils eine Zeile ...

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

Ersetzen Sie für jede Wiederholung (R) des Verses? und ??...

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

Aktionen und ASCII-Muster

Jede gekennzeichnete Aktion wird durch 5 Zeilen mit 8 ASCII-Symbolen dargestellt.
Die Darstellung jeder Aktion ist wie folgt ...

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

Ersetzen Sie in Zeile 1 "1-4" durch das entsprechende Symbol für jeden Antennentyp ...

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

Ausgabe

Die gesamte Szene muss mindestens einmal sofort gerendert werden, wenn sich der Inhalt der Szene in irgendeiner Weise ändert. (Unter der Annahme, dass die Verzögerung zwischen den Aktionen der Roboter> 0 ist, kann die Ausgabe mindestens N- mal pro Aktion gerendert werden .)

Im Idealfall wird für eine Animation die Konsole oder der entsprechende Ausgabebereich gelöscht, bevor jedes Update gerendert wird. Um Sprachen zur Verfügung zu stellen, die die Konsole nicht löschen können, kann die Ausgabe auch in einem kontinuierlichen Stream wiedergegeben werden, vorbehaltlich derselben oben beschriebenen Anforderung.

Wertung

Gewinner sind die kürzesten Programme in jeder Sprache sowie die kürzesten insgesamt.

Ausnahme 1 Da das Löschen der Konsole für jedes Rendering vorzuziehen, jedoch nicht erforderlich ist, zählen ausschließlich für diesen luxuriösen Zweck verwendete Bytes nicht zu den Gesamtbytes. Dies umfasst Befehle zum Löschen der Konsole und zum Auffüllen der Ausgabe mit Leerzeilen, um den Inhalt der Konsole nicht mehr anzuzeigen.

Ausnahme 2 CSS oder effektiv ähnliche Mittel, die ausschließlich zum Zweck der Gestaltung der Ausgabe über die Mindestanforderungen hinaus verwendet werden, zählen nicht für die Gesamtzahl der Bytes. ZB *{color:blue;text-align:center;}zählt nur 32-10 = 22 Bytes, da color:blue;dies keiner Spezifikation entspricht, wohingegen zentrierter Text angegeben wird.

Meta

Inspiriert von (zeigt mein Alter) dem TRS-80 Dancing Demon , Android Nim und natürlich Busby Berkeley (und nein, ich bin nicht so alt).

Holperig
quelle
Toll ... das Letzte, was ich brauche, bevor ich schon müde bin, ist eine Herausforderung, meine Aufmerksamkeit zu erregen. Sind die Tags oben notwendig?
Matt
@Matt, nun, die ganze Herausforderung ist nicht unbedingt "notwendig", aber ich habe die doppelten Tags entfernt. ;-)
Holpriger
Ich habe die maximale Grenze für den Eingabeparameter 'D' entfernt. Es war "D <B / N", um sicherzustellen, dass jeder Roboter auf der ganzen Linie mindestens die Aktion gestartet hatte, während der erste Roboter sie noch ausführte (um zu viel Chaos zu vermeiden), aber durch einen Fehler hat mein eigenes Beispiel diese Regel gebrochen. und es scheint sowieso in Ordnung zu sein, also habe ich die maximale Verzögerungsgrenze entfernt. Entschuldigung für die späte Änderung.
Holpriger
Ich habe den Abschnitt über das Bewerten von CSS und dergleichen aktualisiert.
Holpriger
3
Das ist das Entzückendste, was ich je gesehen habe.
Wossname

Antworten:

13

Sehr geehrte Damen und Herren, bitte begrüßen Sie unseren lieben

Volle Frontend-Stack-Tanzgruppe, 1.320 1.378 1.425 1.495 Bytes

JavaScript: 1.195 Byte | CSS: 103 Bytes | HTML: 22 Bytes


Dies ist eine nette Herausforderung. Es hat auch viele Sonderfälle. Oh Mann, so viele Sonderfälle. Und diese Antennen ...

Es läuft immer und neu starten , nachdem alle Aktionen ( left foot, right footetc.) abgeschlossen sind.

Sie können es auf jsFiddle oder mit dem folgenden Code-Snippet-Ding versuchen :

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>


Getestet in Chrome und Firefox unter MacOS, Windows 10 und Ubuntu


Bearbeitungen

  • Gespeichert 70 Bytes durch den zusätzlichen Behälter zu entfernen , die Antennen zu halten. Vielen Dank an Bumpy . Habe auch noch ein paar Whitespaces gefunden, das nun unnötige Caching createElemententfernt und den langen Zugriff auf entfernt .firstChild.
  • 47 Bytes gespart - habe gerade gemerkt, dass ich eigentlich nicht anrufen muss getElementById. Dies macht auch das Zwischenspeichern documentunnötig.
  • 4 Bytes durch Ersetzen von ||und &&durch bitweise &und gespart| . Vielen Dank an TheLethalCoder .
  • 54 Bytes gespart durch Vereinfachung vieler kleiner Dinge und durch Optimierung des CSS.
insertusernamehere
quelle
Bravo!!! Die Full Frontend-Stack Dance Group ist ein Hit !! Entschuldigung für die Menge der Sonderfälle; Ich habe die Antennenkombinationen speziell ausgewählt, um zu frustrieren, aber die restlichen Symbole dienten nur der Animation - ich hatte es nicht so fummelig geplant. Nun, ich fühle mich mürrisch, wenn ich solch eine brillante Aufführung kritisiere, aber ich denke, die Unterstriche / Antennen sind ein wenig verrückt, wenn sie sich umdrehen (1 Zeichen zu weit nach links, möglicherweise?). Aber was auch immer - es ist großartig! Vielen Dank, dass Sie sich meiner Herausforderung gestellt haben!
Holpriger
@ Holprigen Dank. Du hast recht, ich habe ein paar magische Zahlen verwechselt. Die Antennen sind jetzt perfekt in Ordnung. Ich habe es auch geschafft, für alle Figuren die gleiche Linienhöhe zu erreichen. Wirklich eine lustige Herausforderung.
insertusernamehere
1
Um 2 Uhr mit tanzenden Robotern spielen, sagst du? Wunderbar, bwahaha!
Holpriger
1
||und &&zu |und &?
TheLethalCoder
1
@TheLethalCoder Auf jeden Fall. Ihr Vorschlag ist bereits in der Quelle enthalten und spiegelt sich in den Änderungen wider. Vielen Dank.
insertusernamehere
5

C #, 1188 1376 1382 Bytes nach Ausnahmen

Verdichtet:

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

Etwas besser formatiert und in ein ausführbares Programm eingebunden:

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
}

Probieren Sie es online!

  1. Besuchen Sie diesen Link: tutorialspoint.com
  2. In der Standardbegriff Register am unteren Rand des Bildschirms, geben Sie :
    mono main.exe 8 400 40

Bearbeiten 1

Ersetzt string.Format(i,j)durchi.Replace("?",j) Gesamtersparnis von 6 Bytes.

Bearbeiten 2

Komplette Überarbeitung mit Vorschlägen aus den Kommentaren.

Hand-E-Food
quelle
Yay! Gibt es eine einfache Möglichkeit, es irgendwo online zu betreiben?
Holpriger
@Bumpy, hat einen Link in die Antwort eingefügt!
Hand-E-Food
1
@insertusernamehere Durch Kompilieren einer anonymen Funktion und ein bisschen Golf habe ich es unter 1300.
TheLethalCoder
1
@insertusernamehere, fertig! Du bist dran! :-D
Hand-E-Food
1
@TheLethalCoder, danke dafür! Ich wurde cfür eine kleine Ersparnis los . Ich wusste, dass ich einen besseren Weg vergessen hatte als new string(c,n). Jetzt, da ich eine Voreingenommenheit habe S=String, new S(c,n)ist sie jedoch noch kürzer.
Hand-E-Food
0

JavaScript, 948 Bytes

Wahrscheinlich schlechte Form, um Ihre eigene Frage zu beantworten, aber trotzdem ...

Versucht alle Arten von Möglichkeiten, um den Text zu komprimieren, aber die meisten endeten länger als das Original mit dem Schlüssel + Algorithmus enthalten. Ich bin mir sicher, dass es immer noch eine optimalere Möglichkeit gibt, alles zu komprimieren, aber ich muss die Grenze irgendwo ziehen.

Interessanterweise ergab die Suche ein oder zwei Ideen für einige andere Herausforderungen, die ich später verfeinern und veröffentlichen könnte.

<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: Enthält einige Zeichen im Bereich von 1 bis 31, deren Darstellungen hier etwas merkwürdig sind.)

Sehen Sie sich den gesamten psychedelischen Tanzzyklus auf CodePen an !

Holperig
quelle