หุ่นยนต์ของ Buzzby Berkeley Hokey Pokey


25

หุ่นยนต์ของ Buzzby Berkeley Hokey Pokey

งาน

เขียนโปรแกรมหรือฟังก์ชั่นเพื่อสร้างแอนิเมชั่นศิลปะ ASCII ที่แสดงหุ่นยนต์เต้นรำไปตามเนื้อเพลงของ Hokey Pokey (หรือ Cokey หากคุณต้องการ) ในรูปแบบของหมายเลข Busby Berkeley!

ตัวอย่างผลลัพธ์

ป้อนคำอธิบายรูปภาพที่นี่

อินพุต

ยอมรับสามข้อโต้แย้ง (สันนิษฐานว่าถูกต้อง):

N = จำนวนหุ่นยนต์ในบรรทัด (ต่ำสุด = 6)

B = ระยะเวลาหนึ่ง "จังหวะ" เป็นมิลลิวินาที (ขั้นต่ำ = 10)

D = หน่วงเวลาเป็น ms ระหว่างโรบอตต่อเนื่อง (Min = 0)

(ในตัวอย่างผลลัพธ์ด้านบน: N = 8, B = 380, C = 75)

ข้อมูลจำเพาะ

  1. หุ่นยนต์Nตัวแสดงขึ้นเป็นแถวบนเวที

  2. ข้อความหนึ่งบรรทัดจาก "บทกวี" ปรากฏขึ้นในแต่ละครั้งภายใต้สเตจ (กึ่งกลางจนถึงภายใน 1 ตัวอักษรและอยู่ในเครื่องหมายคำพูด)

  3. หุ่นยนต์ทำการกระทำสำหรับแต่ละบรรทัดตามที่ปรากฏจนกระทั่งข้อซ้ำ 5 ครั้ง

  4. การดำเนินการจะดำเนินการโดยแสดงหุ่นยนต์โดยใช้ชุดอักขระ ASCII และรอช่วงเวลาที่ระบุก่อนดำเนินการกระทำต่อไป ระยะเวลาของการดำเนินการวัดเป็น "จังหวะ" ระยะเวลาของการตี 1 เป็นจำนวนมิลลิวินาที, B

  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

การดำเนินการที่มีป้ายกำกับแต่ละรายการจะมีสัญลักษณ์ 8 ASCII 5 บรรทัด
การเป็นตัวแทนของแต่ละการกระทำมีดังนี้ ...

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;ไม่รองรับข้อกำหนดใด ๆ ในขณะที่มีการระบุข้อความกึ่งกลาง

Meta

แรงบันดาลใจจาก (แสดงอายุของฉัน) TRS-80 เต้นรำปีศาจ , Android นิ่มและแน่นอนเหมาะเบิร์กลีย์ (และไม่ฉันไม่ว่าเก่า)


เยี่ยมมากสิ่งสุดท้ายที่ฉันต้องการก่อนที่ฉันจะเหนื่อยอยู่แล้วเป็นความท้าทายที่จะดึงดูดความสนใจของฉัน แท็กอยู่ด้านบนจำเป็นหรือไม่
Matt

@ แมทความท้าทายทั้งหมดนั้นไม่จำเป็น "เข้มงวด" แต่ฉันได้ลบแท็กที่ซ้ำกันออกไป ;-)
Bumpy

ฉันได้ลบขีด จำกัด สูงสุดสำหรับพารามิเตอร์อินพุต 'D' แล้ว มันคือ "D <B / N" เพื่อให้แน่ใจว่าหุ่นยนต์แต่ละตัวที่ลงมานั้นได้เริ่มต้นการกระทำอย่างน้อยในขณะที่หุ่นยนต์ตัวแรกยังคงทำงานอยู่ (เพื่อหลีกเลี่ยงความโกลาหลมากเกินไป) แต่ด้วยความผิดพลาด และดูเหมือนว่าจะโอเคอยู่แล้วดังนั้นฉันจึงลบขีด จำกัด การหน่วงเวลาสูงสุดออก ขออภัยในความเปลี่ยนแปลงที่ล่าช้า
Bumpy

ฉันได้อัปเดตหัวข้อการให้คะแนน CSS และไม่ชอบ
Bumpy

3
นั่นคือสิ่งที่น่ารักที่สุดที่ฉันเคยเห็น
Wossname

คำตอบ:


13

ท่านสุภาพบุรุษและสุภาพสตรีขอต้อนรับท่านผู้น่ารัก

กลุ่มการเต้นรำส่วนหน้า - สแต็กแบบเต็ม, 1,320 1,378 1,425 1,495ไบต์

JavaScript: 1,195 bytes | 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

ไชโย !!! Full Frontend-Stack Dance Group ได้รับความนิยมมาก !! ขอโทษสำหรับจำนวนคดีพิเศษ; ฉันเลือกชุดเสาอากาศโดยเฉพาะเพื่อกำจัด แต่สัญลักษณ์ที่เหลืออยู่ในการให้บริการของภาพเคลื่อนไหว - ฉันไม่ได้วางแผนที่จะยุ่งเหยิง ตอนนี้ฉันรู้สึกหยาบคายวิพากษ์วิจารณ์การแสดงที่ยอดเยี่ยม แต่ฉันคิดว่าขีดล่าง / เสาอากาศออกมาเล็กน้อยเมื่อพวกเขาหันหลังกลับ (ประมาณ 1 ตัวอักษรไปทางซ้ายอาจเป็นไปได้) แต่อะไรก็ตาม - มันยอดเยี่ยม! ขอบคุณที่สละความท้าทายของฉัน!
Bumpy

@ Bumpy ขอบคุณ ถูกต้องฉันผสมเลขอาคมไว้ เสาอากาศอยู่ในสภาพสมบูรณ์เรียบร้อยแล้ว ฉันจัดการเพื่อให้ได้ความสูงของเส้นเดียวกันสำหรับตัวเลขทั้งหมด เป็นความท้าทายที่สนุกจริงๆ
insertusername ที่นี่

1
เล่นซอกับหุ่นยนต์เต้นรำเวลา 2 นาฬิกาคุณพูดเหรอ? ยอดเยี่ยม bwahaha!
Bumpy

1
||และ&&ถึง|และ&?
TheLethalCoder

1
@TheLethalCoder แน่นอน คำแนะนำของคุณอยู่ในแหล่งที่มาแล้วและสะท้อนให้เห็นในการแก้ไข ขอบคุณมาก.
insertusername ที่นี่

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

การจัดรูปแบบ nicer เล็กน้อยและห่อในโปรแกรมปฏิบัติการ:

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. ในแท็บDefault Termที่ด้านล่างของหน้าจอให้พิมพ์:
    mono main.exe 8 400 40

แก้ไข 1

แทนที่string.Format(i,j)ด้วยi.Replace("?",j)การบันทึก 6 ไบต์โดยรวม

แก้ไข 2

ทำการปรับปรุงใหม่พร้อมคำแนะนำจากความคิดเห็น


เย้! มีวิธีง่าย ๆ ในการเรียกใช้แบบออนไลน์ที่ไหนสักแห่ง
Bumpy

@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

จาวาสคริปต์, 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 !

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.