Робот Hokey Pokey


25

Робот Hokey Pokey

Завдання

Напишіть програму чи функцію для створення арт-анімації ASCII із зображенням ліній роботів, які танцюють під тексти пісень Hokey Pokey (або Cokey, якщо вам зручніше) у стилі номера Busby Berkeley!

Приклад Вихід

введіть тут опис зображення

Вхідні дані

Приймає три аргументи (вважається дійсними):

N = кількість роботів у рядку (Min = 6)

B = тривалість одного "удару" в мілісекундах (Min = 10)

D = затримка в мс між послідовними роботами (Min = 0)

(У наведеному вище прикладі: N = 8, B = 380, C = 75)

Технічні умови

  1. N роботів не відображаються послідовно на сцені.

  2. Один рядок тексту з "вірша" відображається за часом під сценою (з центром до 1 символу та укладений у лапки.)

  3. Роботи виконують дії для кожного рядка так, як це показано, поки вірш не повториться 5 разів.

  4. Дія виконується шляхом зображення робота з використанням набору символів ASCII та очікування визначеної тривалості перед виконанням наступної дії. Тривалість дії вимірюється "ударами". Тривалість 1 такту є числом мілісекунд, В .

  5. Перший робот починає виконувати дії для кожного рядка вірша негайно, коли відображається текст рядка.

  6. Кожен наступний робот затримує починати свої дії до того моменту, коли певний час ( D ) після того, як робот праворуч (зліва!) Розпочне свої дії.

  7. Зображення роботів різняться залежно від символів ASCII, які представляють "антену" робота, з яких існує 5 можливих типів, розподілених випадковим чином кожного разу, коли програма запускається.

  8. Кожен тип антени повинен використовувати щонайменше один робот, але той самий тип не повинен з’являтися на жодних роботах, розділених менше ніж на 3 інших роботах. Кількість антен двох типів може відрізнятися не більше ніж на 1 (наприклад, 1xType_4 та 3xType_5's заборонено, оскільки 3-1> 1)

Вірш і дії

Весь вірш повторюється 5 разів, по одному рядку за один раз ...

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

За кожне повторення (R) вірша, підставити? і ?? ...

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

Дії та шаблони ASCII

Кожна мічена дія представлена ​​5 рядками з 8 символів ASCII.
Представлення кожної дії полягає в наступному ...

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

У рядку 1 замініть "1-4" відповідним символом для кожного типу антени ...

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

Вихідні дані

Вся сцена повинна бути відображена хоча б раз негайно, коли зміст сцени будь-яким чином змінюється. (Тобто, якщо затримка між діями роботів становить> 0, вихід може бути наданий не менше N разів за дію.)

В ідеалі для анімації очищається консоль або еквівалентна область виводу перед кожним оновленням. Для забезпечення мов, які не можуть очистити консоль, висновок також може бути наданий у безперервному потоці, за умови тієї ж вимоги, що описана вище.

Оцінка балів

Переможці - це найкоротші програми з кожної мови, а також найкоротші загальні.

Виняток 1 Оскільки для очищення консолі кожен рендер є кращим, хоча і не вимагається, байти, що використовуються виключно для цієї розкішної мети, не враховуються до загальних байтів. Сюди входять команди очищення консолі та виведення пустих рядків для прокручування вмісту консолі з виду.

Виняток 2 CSS або фактично подібні засоби, що використовуються виключно для стилізації виходу за межі мінімальних вимог, не враховуються до загальних байтів. Напр. *{color:blue;text-align:center;}, Налічується лише 32-10 = 22 байти, оскільки color:blue;він не служить для задоволення жодних специфікацій, тоді як текст в центрі вказаний.

Мета

Натхненний (показуючи свій вік) TRS-80 Dancing Demon , Android Nim , і звичайно Busby Berkeley (та ні, я не такий уже й старий).


Чудово ... останнє, що мені потрібно до того, як я вже втомився, - це завдання привернути мою увагу. Чи потрібні теги вгорі?
Метт

@Matt, ну весь виклик не є строго "необхідним", але я видалив повторювані теги. ;-)
Бурхливий

Я видалив максимальну межу для вхідного параметра "D". Це було "D <B / N", щоб переконатися, що кожен робот вниз по лінії принаймні розпочав дію, коли перший робот все ще виконував це (щоб уникнути зайвого хаосу), але помилково мій власний приклад порушив це правило, і, здається, все одно добре, тому я зняв максимальну межу затримки. Вибачте за цю пізню зміну.
Бурхливий

Я оновив розділ про зарахування CSS тощо.
Бурхливий

3
Це найчарівніша річ, яку я коли-небудь бачив.
Wossname

Відповіді:


13

Пані та панове, ласкаво просимо до наших милих

Повна танцювальна група Frontend-Stack, 1320 1,378 1,425 1,495 байт

JavaScript: 1195 байт | CSS: 103 байти | HTML: 22 байти


Це милий виклик. У ньому також багато особливих випадків. О, хлопче, так багато особливих випадків. І ті антени ...

Він буде працювати вічно , і після перезавантаження всі дії ( left foot, і right footт.д.) будуть завершені.

Ви можете спробувати його на jsFiddle або скориставшись фрагментом коду нижче:

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>


Тестується в Chrome і Firefox на macOS, Windows 10 та Ubuntu


Правки

  • Збережено 70 байт , видаливши додатковий контейнер для утримання антен. Завдяки Bumpy . Також знайшли ще кілька пробілів, видалили тепер непотрібне кешування createElementта видалили довгий доступ до нього .firstChild.
  • Збережено 47 байт - щойно зрозумів, що мені насправді не потрібно дзвонити getElementById. Це також робить кешування documentзайвим.
  • Збережені 4 байта , замінивши ||і &&з побітовим &і |. Завдяки TheLethalCoder .
  • Збережено 54 байти шляхом спрощення безлічі дрібних речей та оптимізації CSS.

Браво !!! Повна танцювальна група Frontend-Stack - хіт !! Вибачення за кількість особливих справ; Я вибрав комбінації антен саме для того, щоб зірвати, але решта символів були усі в обслуговуванні анімації - я не планував, щоб це було так хитро. Зараз я відчуваю, як критично критикують таке блискуче виконання, але я думаю, що підкреслення / антена трохи не збиті, коли вони обертаються (1 символ занадто далеко вліво, можливо?) Але що б там не було - це чудово! Дякуємо, що прийняли мій виклик!
Бурхливий

@ Bumpy Спасибі Ти маєш рацію, я змішав кілька магічних цифр. Зараз антени повністю в порядку. Мені також вдалося отримати однакову висоту лінії для всіх фігур. Дійсно цікавий виклик.
insertusernamehere

1
Ви гаворіть з танцюючими роботами о 2 годині, скажете ви? Чудовий, бвахаха!
Бурхливий

1
||і &&до |і &?
TheLethalCoder

1
@TheLethalCoder Абсолютно. Ваша пропозиція вже в джерелі та відображена в редакціях. Дуже дякую.
insertusernamehere

5

C #, 1188 1376 1382 байт після виключень

Ущільнено:

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

Трохи приємніше форматування та загорнуте у виконувану програму:

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
}

Спробуйте в Інтернеті!

  1. Перейдіть за цим посиланням: tutorialspoint.com
  2. На вкладці " Термін за замовчуванням " внизу екрана введіть:
    mono main.exe 8 400 40

Редагуйте 1

Замінено string.Format(i,j)з i.Replace("?",j)економією 6 байт в цілому.

Редагувати 2

Повне оновлення з пропозиціями з коментарів.


Так! Чи є простий спосіб запустити його десь в Інтернеті?
Бурхливий

@Bumpy, додав посилання у відповідь!
Hand-E-Food

1
@insertusernamehere За допомогою анонімної функції та незначного гольфу я отримав це під 1300.
TheLethalCoder

1
@insertusernameту, зробили! Твоя черга! :-D
Hand-E-Food

1
@TheLethalCoder, дякую за це! Я позбувсяc невеликої економії. Я знав, що забув кращий шлях ніж new string(c,n). Однак тепер, коли я псевдонім S=String, new S(c,n)ще коротше.
Hand-E-Food

0

JavaScript, 948 байт

Напевно, погана форма для відповіді на ваше власне питання, але все одно ...

Випробували всілякі способи стиснення тексту, але більшість закінчилася довше оригіналу із включеним ключем + алгоритмом. Я впевнений, що все-таки є більш оптимальний спосіб стиснути все це, але мені треба десь намалювати лінію.

Цікаво, що пошук дав одну-дві ідеї для деяких інших проблем, які я міг би уточнити та опублікувати пізніше.

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

( Примітка. Містить деякі символи в діапазоні 1-31, представлення яких трохи незвичайні, коли розміщені тут)

Дивіться повний психоделічний танцювальний цикл на CodePen !

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.