Buzzby Berkeley机器人Hokey Pokey


25

Buzzby Berkeley机器人Hokey Pokey

任务

写一个程序或函数来产生ASCII艺术动画,描绘出一系列机器人以Busby Berkeley编号的风格随着Hokey Pokey(或Cokey,如果您愿意的话)的歌词跳舞!

示例输出

在此处输入图片说明

输入项

接受三个参数(假设是有效的):

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字符而异,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;,而指定了居中文本。

灵感来自于(展示我的年龄)TRS-80跳舞恶魔Android Nim,当然还有Busby Berkeley(不,我还不那么老)。


太好了...在我已经疲倦之前,我需要做的最后一件事就是吸引我的注意力。顶部的标签是否必要?
马特

@Matt,整个挑战并不是严格意义上的“必需”,但是我已经删除了重复的标签。;-)
Bumpy

我删除了输入参数“ D”的最大限制。这 “d <B / N”,以确保每一个机器人上下行已至少开始,而第一个机器人还在执行它(避免过于混乱)的作用,但由于错误,我自己的例子却是一个例外,而且看起来还是不错,因此我删除了最大延迟限制。抱歉为您的最新更改。
颠簸

我已经更新了对CSS等进行评分的部分。
颠簸的

3
那是我见过的最可爱的东西。
Wossname

Answers:


13

女士们,先生们,请欢迎我们的可爱

完整的前端堆栈舞蹈组,1,320 1,378 1,425 1,495字节

JavaScript:1,195个字节 | CSS:103个字节 | HTML:22个字节


这是一个可爱的挑战。它还有很多特殊情况。哦,男孩,有很多特殊情况。还有那些天线……

它会永远运行,所有操作(重启后left footright 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>


在macOS,Windows 10和Ubuntu上的Chrome和Firefox中进行了测试


编辑

  • 删除多余的容纳天线的容器,节省了70个字节。感谢Bumpy。还发现了更多的空格,删除了现在不必要的缓存,createElement并删除了对的长时间访问.firstChild
  • 保存了 47个字节 -刚刚意识到我实际上不需要调用getElementById。这也使得document不必要的缓存。
  • 用和分别按和节省了4个字节。感谢TheLethalCoder||&&&|
  • 通过简化许多小事情并优化CSS 节省了54个字节

太棒了!!! Full Frontend-Stack舞蹈组很受欢迎!对特殊情况的数量表示歉意;我选择天线组合特别是为了挫败,但是其余的符号全都在动画中使用-我并没有计划这么好玩。现在,我对这种出色的表现感到不屑一顾,但是我认为下划线/天线在转过身时有点不协调(可能是向左太远了1个字符?)但是,不管怎么说-太好了!感谢您接受我的挑战!
颠簸的

@笨拙的谢谢。没错,我混淆了一些魔术数字。天线现在完美无序。我还设法使所有数字的行高相同。真的是一个有趣的挑战。
insertusername此处,

1
你说两点钟摆着跳舞机器人吗?太棒了,哇!
颠簸的

1
||&&|&
TheLethalCoder

1
@TheLethalCoder绝对。您的建议已在源中并反映在编辑中。非常感谢。
insertusername此处,2013年

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上观看完整的迷幻舞蹈循环

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.