Buzzby Berkeley Robot Hokey Pokey

25

Buzzby Berkeley Robot Hokey Pokey

Zadanie

Napisz program lub funkcję do stworzenia animacji artystycznej ASCII przedstawiającej linię robotów tańczących do tekstów Hokey Pokey (lub Cokey, jeśli wolisz) w stylu numeru Busby'ego Berkeleya!

Przykładowy wynik

wprowadź opis zdjęcia tutaj

Wkład

Akceptuje trzy argumenty (zakładane jako poprawne):

N = liczba robotów w linii (Min = 6)

B = czas trwania jednego „uderzenia” w milisekundach (min = 10)

D = opóźnienie w ms między kolejnymi robotami (Min = 0)

(W powyższym przykładzie wyjście: N = 8, B = 380, C = 75)

Dane techniczne

  1. N robotów pokazano na scenie w rzędzie.

  2. Jeden wiersz tekstu z „wersetu” jest wyświetlany naraz pod sceną (wyśrodkowany w obrębie 1 znaku i ujęty w cudzysłów).

  3. Roboty wykonują akcje dla każdej linii, tak jak pokazano, aż wiersz zostanie powtórzony 5 razy.

  4. Akcja jest wykonywana przez zobrazowanie robota przy użyciu zestawu znaków ASCII i odczekanie określonego czasu przed wykonaniem następnej akcji. Czas trwania akcji mierzony jest w „uderzeniach”. Czas trwania 1 bicie to liczba milisekund, B .

  5. Pierwszy robot rozpoczyna wykonywanie akcji dla każdego wiersza wiersza natychmiast po wyświetleniu tekstu wiersza.

  6. Każdy kolejny robot opóźnia rozpoczęcie swoich działań, aż określony czas ( D ) po tym, jak robot po swojej prawej stronie (po lewej stronie!) Rozpocznie swoje działania.

  7. Przedstawienia robotów różnią się w zależności od znaków ASCII, które reprezentują „antenę” robota, której jest 5 możliwych typów, rozmieszczonych losowo przy każdym uruchomieniu programu.

  8. Każdy typ anteny musi być używany przez co najmniej jednego robota, ale ten sam typ nie może pojawić się na żadnym z robotów oddzielonych mniej niż 3 innymi robotami. Ilości dowolnych dwóch rodzajów anten mogą różnić się nie więcej niż o 1 (np. 1xType_4 i 3xType_5 są nielegalne, ponieważ 3-1> 1)

Wiersz i działania

Cały wiersz powtarza się 5 razy, po jednym wierszu na raz ...

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

Zastąpić dla każdego powtórzenia (R) wersetu? i ??...

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

Akcje i wzorce ASCII

Każde oznaczone działanie jest reprezentowane przez 5 linii 8 symboli ASCII.
Reprezentacja każdej akcji jest następująca ...

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

W wierszu 1 zastąp „1-4” odpowiednim symbolem dla każdego typu anteny ...

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

Wydajność

Cała scena musi być renderowana co najmniej raz natychmiast, ilekroć zawartość sceny zmienia się w jakikolwiek sposób. (Tzn. Zakładając, że opóźnienie między działaniami robotów wynosi> 0, wynik może być renderowany nie mniej niż N razy na akcję.)

W przypadku animacji najlepiej jest wyczyścić konsolę lub równoważny obszar wyjściowy przed renderowaniem każdej aktualizacji. Aby zapewnić obsługę języków niezdolnych do wyczyszczenia konsoli, dane wyjściowe mogą być również renderowane w ciągłym strumieniu, z zastrzeżeniem tych samych wymagań opisanych powyżej.

Punktacja

Zwycięzcy to najkrótsze programy w każdym języku, a także najkrótsze ogólnie.

Wyjątek 1 Ponieważ wyczyszczenie konsoli każdego renderowania jest preferowane, choć nie jest wymagane, bajty używane wyłącznie do tego luksusowego celu nie liczą się do całkowitej liczby bajtów. Obejmuje to polecenia wyczyszczenia konsoli i wypełnianie danych wyjściowych pustymi liniami do przewijania zawartości konsoli poza zasięgiem wzroku.

Wyjątek 2 CSS lub efektywnie podobne środki stosowane wyłącznie w celu nadania stylu wynikom wykraczającym poza minimalne wymagania nie liczą się do całkowitej liczby bajtów. Np. *{color:blue;text-align:center;}Liczy się tylko jako 32-10 = 22 bajtów, ponieważ color:blue;nie spełnia żadnej specyfikacji, podczas gdy tekst wyśrodkowany jest określony.

Meta

Zainspirowany (pokazując mój wiek) TRS-80 Dancing Demon , Android Nim i oczywiście Busby Berkeley (i nie, nie jestem aż tak stary).

Nierówny
źródło
Świetnie ... ostatnią rzeczą, której potrzebuję, zanim już jestem zmęczony, jest wyzwanie, aby zwrócić moją uwagę. Czy tagi na górze są konieczne?
Matt
@Matt, całe wyzwanie nie jest absolutnie „konieczne”, ale usunąłem zduplikowane tagi. ;-)
Wyboisty
Usunąłem maksymalny limit parametru wejściowego „D”. To było „D <B / N”, aby upewnić się, że każdy robot na linii przynajmniej zaczął akcję, podczas gdy pierwszy robot wciąż ją wykonywał (aby uniknąć zbyt dużego chaosu), ale mój błąd przez przypadek złamał tę zasadę, i wydaje się, że i tak wygląda dobrze, więc usunąłem maksymalny limit opóźnienia. Przepraszamy za tę późną zmianę.
Wyboisty
Zaktualizowałem sekcję dotyczącą oceniania CSS i tym podobnych.
Wyboisty
3
To najbardziej urocza rzecz, jaką kiedykolwiek widziałem.
Wossname

Odpowiedzi:

13

Szanowni Państwo, proszę powitać naszą kochaną

Pełna grupa taneczna Frontend-Stack, 1 320 1 378 1 425 1 495 bajtów

JavaScript: 1,195 bajtów | CSS: 103 bajty | HTML: 22 bajty


To słodkie wyzwanie. Ma również wiele specjalnych przypadków. Och chłopcze, tyle specjalnych przypadków. A te anteny…

Będzie ona trwać wiecznie i ponownie po wykonaniu wszystkich czynności ( left foot, right footetc.) są zakończone.

Możesz go wypróbować na jsFiddle lub za pomocą krótkiego fragmentu kodu:

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>


Testowane w Chrome i Firefox na macOS, Windows 10 i Ubuntu


Edycje

  • Zaoszczędzono 70 bajtów , usuwając dodatkowy pojemnik na anteny. Dzięki Bumpy . Znalazłem też więcej białych znaków, usunąłem niepotrzebne buforowanie createElementi usunąłem długi dostęp do .firstChild.
  • Zapisano 47 bajtów - właśnie zdałem sobie sprawę, że tak naprawdę nie muszę dzwonić getElementById. To powoduje, że buforowanie staje się documentniepotrzebne.
  • Zaoszczędzono 4 bajty , zastępując ||i &&bitowe &i |. Dzięki TheLethalCoder .
  • Zaoszczędź 54 bajty , upraszczając wiele drobiazgów i optymalizując CSS.
wstawić nazwę tutaj
źródło
Brawo!!! Grupa taneczna Full Frontend-Stack to hit !! Przepraszamy za liczbę przypadków specjalnych; Wybrałem kombinacje anten specjalnie po to, by sfrustrować, ale reszta symboli służyła animacji - nie planowałem, żeby była tak wybredna. Teraz czuję się pochopnie krytykujący tak genialny występ, ale myślę, że podkreślenia / antena są nieco nie do zniesienia, kiedy się odwracają (może 1 postać za daleko w lewo? Być może?) Ale cokolwiek - to świetnie! Dzięki za podjęcie mojego wyzwania!
Bumpy
@Bumpy Thanks. Masz rację, pomieszałem kilka magicznych liczb. Anteny są teraz idealnie w porządku. Udało mi się również uzyskać taką samą wysokość linii dla wszystkich liczb. Naprawdę fajne wyzwanie.
inserttusernamehere
1
Zabawiasz się tańczącymi robotami o godzinie drugiej? Cudownie, bwahaha!
Wyboisty
1
||i &&do |i &?
TheLethalCoder
1
@TheLethalCoder Absolutnie. Twoja sugestia jest już w źródle i odzwierciedlona w zmianach. Wielkie dzięki.
inserttusernamehere
5

C #, 1188 1376 1382 bajtów po wyjątkach

Zagęszczony:

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

Nieco ładniejsze formatowanie i zapakowane w program wykonywalny:

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
}

Wypróbuj online!

  1. Odwiedź ten link: tutorialspoint.com
  2. Na karcie Domyślny termin u dołu ekranu wpisz:
    mono main.exe 8 400 40

Edytuj 1

Zastąpione string.Format(i,j)z i.Replace("?",j)oszczędności 6 bajtów ogólnej.

Edytuj 2

Całkowicie odnowiony z sugestiami z komentarzy.

Hand-E-Food
źródło
Tak! Czy istnieje prosty sposób, aby uruchomić go gdzieś online?
Wyboisty
@Bumpy, dodał link w odpowiedzi!
Hand-E-Food
1
@insertusernamehere Kompilując się do anonimowej funkcji i pomniejszego golfa, mam mniej niż 1300.
TheLethalCoder
1
@insertusernamehere gotowe! Twoja kolej! :-D
Hand-E-Food
1
@TheLethalCoder, dzięki za to! Pozbyłem csię małej oszczędności. Wiedziałem, że zapomniałem lepszego sposobu niż new string(c,n). Jednak teraz, kiedy już alias S=String, new S(c,n)jest jeszcze krótszy.
Hand-E-Food
0

JavaScript, 948 bajtów

Prawdopodobnie kiepska forma na odpowiedź na twoje pytanie, ale w każdym razie ...

Próbowałem różnych sposobów kompresji tekstu, ale większość zakończyła się dłużej niż oryginał z dołączonym algorytmem klucz +. Jestem pewien, że jest jeszcze bardziej optymalny sposób na skompresowanie tego wszystkiego, ale muszę gdzieś wytyczyć granicę.

Co ciekawe, wyszukiwanie przyniosło jeden lub dwa pomysły na inne wyzwania, które mogę udoskonalić i opublikować później.

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

( Uwaga: zawiera niektóre postacie z zakresu 1-31, których reprezentacje są nieco dziwne, gdy zamieszczono tutaj)

Obejrzyj pełny psychodeliczny cykl taneczny na CodePen !

Nierówny
źródło