Бузби Беркли Робот Хоки Поки

25

Бузби Беркли Робот Хоки Поки

задача

Напишите программу или функцию для создания художественной анимации ASCII, изображающей линию роботов, танцующих под слова Хоки-Поки (или, если хотите, Кокки) в стиле числа Басби-Беркли!

Пример вывода

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

вход

Принимает три аргумента (предполагается, что они действительны):

N = количество роботов в линии (мин = 6)

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

D = задержка в мс между последовательными роботами (мин = 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 недопустимы, поскольку 3-1> 1)

Стих и Действия

Весь стих повторяется 5 раз по 1 строчке за раз ...

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;не служит для удовлетворения какой-либо спецификации, в то время как указывается центрированный текст.

Мета

Вдохновленный (показывая свой возраст) Танцы Demon TRS-80 , Android Nim , и конечно Басби Беркли (и нет, я не буду не что старый).

неровный
источник
Отлично ... последнее, что мне нужно, прежде чем я уже устал, это вызов, чтобы привлечь мое внимание. Нужны ли метки сверху?
Мэтт
@Matt, ну, в общем, задача не является строго «необходимой», но я удалил дубликаты тегов. ;-)
Неровный
Я убрал максимальный предел для входного параметра «D». Это было «D <B / N», чтобы убедиться, что каждый робот в очереди, по крайней мере, начал действие, пока первый робот все еще выполнял его (чтобы избежать слишком большого хаоса), но по ошибке мой собственный пример нарушил это правило, и, похоже, все в порядке, так что я снял максимальный предел задержки. Извиняюсь за это позднее изменение.
Неровный
Я обновил раздел о скоринге CSS и тому подобное.
Неровный
3
Это самая восхитительная вещь, которую я когда-либо видел.
Wossname

Ответы:

13

Дамы и господа, пожалуйста, поприветствуйте наших любимых

Танцевальная группа Full Frontend-Stack, 1,320 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 байт , удалив дополнительный контейнер для хранения антенн. Спасибо Бэмпи . Также были найдены дополнительные пробелы, удалено ненужное кеширование createElementи удален длинный доступ .firstChild.
  • Сэкономил 47 байт - просто понял, что мне на самом деле не нужно звонить getElementById. Это также делает кеширование documentненужным.
  • Сохранено 4 байта путем замены ||и &&с побитовым &и |. Благодаря TheLethalCoder .
  • Экономия 54 байта за счет упрощения множества мелких вещей и оптимизации CSS.
insertusernamehere
источник
Браво!!! Full Frontend-Stack Dance Group - это хит! Извинения за количество особых случаев; Я выбрал комбинации антенн специально, чтобы расстраивать, но все остальные символы были на службе анимации - я не планировал, чтобы это было НАСТОЛЬКО непросто. Теперь я чувствую грубость, критикуя такое блестящее выступление, но я думаю, что подчеркивание / антенна слегка выходят из строя, когда они оборачиваются (возможно, на 1 символ слишком далеко влево?) Но что угодно - это здорово! Спасибо, что приняли мой вызов!
Неровный
@ Бампи Спасибо. Вы правы, я перепутал некоторые магические числа. Антенны сейчас в порядке. Мне также удалось получить одинаковую высоту строки для всех фигур. Действительно забавный вызов.
insertusername здесь
1
Вы говорите с танцующими роботами в 2 часа ночи? Замечательно, бвахаха!
Неровный
1
||а &&к |а &?
TheLethalCoder
1
@TheLethalCoder Абсолютно. Ваше предложение уже находится в источнике и отражено в изменениях. Большое спасибо.
имя пользователя здесь
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

Полная реконструкция с предложениями из комментариев.

Hand-E-Food
источник
Ура! Есть ли простой способ запустить его где-нибудь онлайн?
Неровный
@ Bumpy, добавил ссылку в ответ!
Hand-E-Food
1
@insertusernamehere Благодаря компиляции анонимной функции и некоторой незначительной игре в гольф я получил ее до 1300.
TheLethalCoder
1
@insertusernamehere, готово! Твой ход! :-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()}

( NB: Содержит некоторые символы в диапазоне 1-31, чьи представления немного странные, когда размещены здесь)

Смотрите полный цикл психоделического танца на CodePen !

неровный
источник