Buzzby Berkeley Robot Hokey Pokey

25

Buzzby Berkeley Robot Hokey Pokey

Tugas

Tulis program atau fungsi untuk menghasilkan animasi seni ASCII yang menggambarkan sederet robot menari dengan lirik Hokey Pokey (atau Cokey, jika Anda mau) dalam gaya nomor Busby Berkeley!

Contoh Output

masukkan deskripsi gambar di sini

Memasukkan

Terima tiga argumen (dianggap valid):

N = jumlah robot dalam garis (Min = 6)

B = durasi satu "ketukan" dalam milidetik (Min = 10)

D = keterlambatan dalam ms antara robot yang berurutan (Min = 0)

(Pada contoh output di atas: N = 8, B = 380, C = 75)

Spesifikasi

  1. N robot ditampilkan secara berurutan di atas panggung.

  2. Satu baris teks dari "ayat" ditampilkan pada waktu di bawah panggung (berpusat pada 1 karakter, dan diapit dengan tanda kutip.)

  3. Robot melakukan tindakan untuk setiap baris seperti yang ditunjukkan sampai ayat telah diulang 5 kali.

  4. Suatu tindakan dilakukan dengan menggambarkan robot menggunakan serangkaian karakter ASCII dan menunggu durasi yang ditentukan sebelum melakukan tindakan selanjutnya. Durasi suatu tindakan diukur dalam "ketukan". Durasi 1 beat adalah jumlah milidetik, B .

  5. Robot pertama mulai melakukan tindakan untuk setiap baris ayat segera ketika teks baris ditampilkan.

  6. Setiap robot berikutnya menunda memulai aksinya hingga waktu tertentu ( D ) setelah robot ke kanan (kiri Anda!) Memulai aksinya.

  7. Penggambaran robot bervariasi oleh karakter ASCII yang mewakili "antena" robot, yang ada 5 jenis yang mungkin, didistribusikan secara acak setiap kali program dijalankan.

  8. Setiap jenis antena harus digunakan oleh setidaknya satu robot, tetapi jenis yang sama tidak boleh muncul pada robot yang dipisahkan oleh kurang dari 3 robot lainnya. Jumlah kedua jenis antena dapat berbeda tidak lebih dari 1 (mis. 1xType_4 dan 3xType_5's ilegal sejak 3-1> 1)

Ayat dan Tindakan

Seluruh ayat diulangi 5 kali, 1 baris sekaligus ...

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

Untuk setiap pengulangan (R) dari ayat tersebut, gantikan? dan ?? ...

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

Tindakan dan pola ASCII

Setiap tindakan berlabel diwakili oleh 5 baris 8 simbol ASCII.
Representasi dari setiap tindakan adalah sebagai berikut ...

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

Di baris 1, ganti "1-4" dengan simbol yang sesuai untuk setiap jenis antena ...

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

Keluaran

Seluruh adegan harus diberikan setidaknya sekali segera setiap kali konten adegan berubah dengan cara apa pun. (Yaitu dengan asumsi keterlambatan antara tindakan robot adalah> 0, output dapat diberikan tidak kurang dari N kali per tindakan.)

Idealnya, untuk animasi konsol atau area output yang setara dihapus sebelum setiap pembaruan diberikan. Untuk menyediakan bahasa yang tidak dapat menghapus konsol, output juga dapat dirender dalam aliran berkelanjutan, tunduk pada persyaratan yang sama yang dijelaskan di atas.

Mencetak gol

Pemenang adalah program terpendek dalam setiap bahasa, serta keseluruhan terpendek.

Pengecualian 1 Karena membersihkan konsol setiap render lebih disukai meskipun tidak diperlukan, byte yang digunakan khusus untuk tujuan mewah ini tidak diperhitungkan terhadap total byte. Ini termasuk perintah untuk menghapus konsol, dan padding output dengan garis kosong untuk menggulir konten konsol keluar dari pandangan.

Pengecualian 2 CSS atau sarana yang secara efektif serupa digunakan secara eksklusif untuk tujuan menata keluaran di luar persyaratan minimum tidak diperhitungkan terhadap total byte. Misalnya *{color:blue;text-align:center;}dihitung hanya 32-10 = 22 byte karena color:blue;tidak berfungsi untuk memenuhi spesifikasi apa pun, sedangkan teks terpusat ditentukan.

Meta

Terinspirasi oleh (menunjukkan usia saya) TRS-80 Dancing Siluman , Android Nim , dan tentu saja Busby Berkeley (dan tidak, aku tidak yang lama).

Bergelombang
sumber
Hebat ... hal terakhir yang saya butuhkan sebelum saya lelah adalah tantangan untuk menarik perhatian saya. Apakah tag di bagian atas diperlukan?
Matt
@ Matt, well seluruh tantangan tidak sepenuhnya "perlu", tapi saya sudah menghapus tag duplikat. ;-)
Bumpy
Saya telah menghapus batas maksimum untuk parameter input 'D'. Itu adalah "D <B / N" untuk memastikan setiap robot di telepon setidaknya telah memulai aksi sementara robot pertama masih melakukan itu (untuk menghindari terlalu banyak kekacauan), tetapi karena kesalahan, contoh saya sendiri melanggar aturan itu, dan sepertinya tetap terlihat oke jadi saya telah menghapus batas keterlambatan maks. Permintaan maaf atas perubahan yang terlambat itu.
Bumpy
Saya telah memperbarui bagian tentang mencetak CSS dan sejenisnya.
Bumpy
3
Itu adalah hal yang paling menggemaskan yang pernah saya lihat.
Wossname

Jawaban:

13

Hadirin sekalian, silakan sambut kami yang cantik

Full Frontend-Stack Dance Group, 1.320 1.378 1.425 1.495 byte

JavaScript: 1,195 byte | CSS: 103 bytes | HTML: 22 byte


Ini tantangan yang lucu. Ini juga memiliki banyak kasus khusus. Oh nak, banyak sekali kasus khusus. Dan antena-antena itu ...

Ini akan berjalan selamanya dan memulai kembali setelah semua tindakan ( left foot, right footdll.) Selesai.

Anda dapat mencobanya di jsFiddle atau menggunakan potongan kode di bawah ini:

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>


Diuji di Chrome dan Firefox di macOS, Windows 10 dan Ubuntu


Suntingan

  • Menyimpan 70 byte dengan melepas wadah ekstra untuk memegang antena. Terima kasih untuk Bumpy . Juga menemukan beberapa spasi putih, menghapus caching yang sekarang tidak perlu createElementdan menghapus akses lama .firstChild.
  • Disimpan 47 byte - baru menyadari bahwa saya sebenarnya tidak perlu menelepon getElementById. Ini juga membuat caching yang documenttidak perlu.
  • Disimpan 4 byte dengan mengganti ||dan &&dengan bitwise &dan |. Terima kasih kepada TheLethalCoder .
  • Disimpan 54 byte dengan menyederhanakan banyak hal kecil dan dengan mengoptimalkan CSS.
masukkan nama pengguna di sini
sumber
Bravo !!! Grup Penari Full Frontend-Stack menjadi hit !! Permintaan maaf untuk jumlah kasus khusus; Saya memilih kombinasi antena khusus untuk membuat frustrasi, tetapi sisa simbol semua dalam pelayanan animasi - Saya tidak berencana untuk menjadi SO fiddly. Sekarang, saya merasa churlish mengkritik kinerja yang begitu cemerlang, tapi saya pikir garis bawah / antena sedikit rusak ketika mereka berbalik (mungkin 1 karakter terlalu jauh ke kiri, mungkin?) Tapi apa pun - itu hebat! Terima kasih telah menerima tantangan saya!
Bumpy
@Bumpy, terima kasih. Anda benar, saya mencampur beberapa angka ajaib. Antena sekarang dalam urutan sempurna. Saya juga berhasil mendapatkan ketinggian garis yang sama untuk semua angka. Benar-benar tantangan yang menyenangkan.
masukkan nama pengguna di sini
1
Mengotak-atik robot menari pada jam 2 katamu? Hebat, bwahaha!
Bumpy
1
||dan &&ke |dan &?
TheLethalCoder
1
@TheLethalCoder Benar-benar. Saran Anda sudah ada di sumber dan tercermin dalam suntingan. Terima kasih banyak.
masukkan nama pengguna di sini
5

C #, 1188 1376 1382 byte setelah pengecualian

Kompak:

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

Format yang sedikit lebih bagus dan dibungkus dengan program yang dapat dieksekusi:

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
}

Cobalah online!

  1. Kunjungi tautan ini: tutorialspoint.com
  2. Di tab Istilah Default di bagian bawah layar, ketik:
    mono main.exe 8 400 40

Edit 1

Digantikan string.Format(i,j)dengan i.Replace("?",j)penghematan 6 byte secara keseluruhan.

Edit 2

Lengkap perbaiki dengan saran dari komentar.

Makanan Tangan
sumber
Yay! Apakah ada cara mudah untuk menjalankannya secara online di suatu tempat?
Bumpy
@Bumpy, menambahkan tautan dalam jawabannya!
Hand-E-Food
1
@insertusernamehere Dengan mengkompilasi ke fungsi anonim dan beberapa bermain golf kecil saya mendapatkannya di bawah 1300.
TheLethalCoder
1
@insertusernamedi sini, selesai! Giliranmu! :-D
Hand-E-Food
1
@TheLethalCoder, terima kasih untuk itu! Saya menyingkirkan cuntuk penghematan kecil. Saya tahu saya lupa cara yang lebih baik daripada new string(c,n). Namun, sekarang saya sudah alias S=String, new S(c,n)masih lebih pendek.
Hand-E-Food
0

JavaScript, 948 bytes

Mungkin bentuk yang buruk untuk menjawab pertanyaan Anda sendiri, tetapi ...

Mencoba segala macam cara untuk mengompres teks, tetapi sebagian besar berakhir lebih lama dari aslinya dengan algoritma + kunci disertakan. Saya yakin masih ada cara yang lebih optimal untuk mengompres semuanya, tetapi saya harus menggambar garis di suatu tempat.

Menariknya, pencarian menghasilkan satu atau dua ide untuk beberapa tantangan lain yang mungkin saya saring dan posting nanti.

<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: Berisi beberapa karakter dalam kisaran 1-31 yang representasinya agak aneh ketika diposting di sini)

Tonton siklus tarian psikedelik penuh di CodePen !

Bergelombang
sumber