Buzzby Berkeley Robot Hokey Pokey


25

Buzzby Berkeley Robot Hokey Pokey

Görev

Bir Busby Berkeley numarası tarzında Hokey Pokey'in (ya da tercih ederseniz Cokey'nin) sözleriyle dans eden bir robot çizgisini gösteren bir ASCII sanat animasyonu üretmek için bir program ya da işlev yazın!

Örnek çıktı

görüntü tanımını buraya girin

Giriş

Üç argümanı kabul eder (geçerli olduğu varsayılır):

N = çizgideki robot sayısı (Min = 6)

B = milisaniye cinsinden bir "vuruş" süresi (Min = 10)

D = ardışık robotlar arasında ms cinsinden gecikme (Min = 0)

(Yukarıdaki örnek çıktıda: N = 8, B = 380, C = 75)

Özellikler

  1. N robotlar sahnede üst üste gösterilir.

  2. "Ayet" ten gelen bir metin satırı, sahnenin altındaki bir zamanda gösterilir (1 karakter içinde ortalanır ve tırnak işaretleri içine alınır).

  3. Robotlar, ayet 5 kez tekrarlanıncaya kadar her satır için eylemleri gerçekleştirir.

  4. Bir ASCII karakter kümesi kullanarak bir robotun gösterilmesi ve bir sonraki eylemi gerçekleştirmeden önce belirli bir süre beklenerek bir eylem gerçekleştirilir. Bir eylemin süresi "vuruş" olarak ölçülür. 1 atım süresi milisaniyelik bir sayıdır B .

  5. İlk robot, satırın metni görüntülendiğinde hemen her ayet çizgisi için eylemleri gerçekleştirmeye başlar.

  6. Her takip eden robot , robotun sağındaki (solunuz!) Hareketine başlayan belirli bir zamana ( D ) kadar eylemlerine başlamasını geciktirir .

  7. Robotların tasvirleri, programın her çalıştırılışında rastgele dağıtılan 5 olası türü bulunan bir robotun "antenini" temsil eden ASCII karakterlerine göre değişir.

  8. Her bir anten türü, en az bir robot tarafından kullanılmalıdır, ancak aynı tip, diğer 3 robottan daha az sayıda ayrılmış robotlarda görünmemelidir. İki tür antenin miktarı, 1'den fazla olmamalıdır (ör. 1xType_4 ve 3xType_5'ler 3-1> 1'den beri yasa dışıdır).

Ayet ve Eylemler

Tüm ayet bir defada 5 kez, bir satırda 1 tekrarlanır ...

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

Ayetin her tekrarı (R) yerine, yerine? ve ??...

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

Eylemler ve ASCII desenleri

Her etiketli eylem 5 satır 8 ASCII sembolüyle temsil edilir.
Her eylemin temsili aşağıdaki gibidir ...

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. satırda, "1-4" yerine her anten tipine karşılık gelen sembol koyun.

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

Çıktı

Sahnenin içeriği herhangi bir şekilde değiştiğinde, tüm sahne en az bir kere derhal gerçekleştirilmelidir. (Yani, robotların eylemleri arasındaki gecikmenin> 0 olduğunu varsayarsak, çıktı işlem başına N kereden daha az olamaz .)

İdeal olarak, bir animasyon için konsol veya eşdeğer çıktı alanı her güncelleme yapılmadan önce temizlenir. Konsolu temizleyemeyen dilleri sağlamak için, çıkış aynı zamanda yukarıda açıklanan gereksinime bağlı olarak sürekli bir akışta da yapılabilir.

puanlama

Kazananlar, her dilde en kısa programın yanı sıra en genel programlardır.

İstisna 1 Her konsolu temizlemek zorunlu olmasa da tercih edildiği için, bu lüks amaç için özel olarak kullanılan baytlar toplam baytlara sayılmaz. Bu, konsolu temizleme komutlarını ve konsol içeriğini görünüm dışına kaydırmak için boş satırlı doldurma çıkışını içerir.

İstisna 2 CSS veya sadece çıktının minimum gerekliliklerin ötesinde şekillendirilmesi amacıyla kullanılan etkili benzer araçlar, toplam bayt sayılmaz. Örneğin, *{color:blue;text-align:center;}sadece 32-10 = olarak sayılır 22 bayt yana color:blue;ortalanmış metin belirtilen ise, herhangi bir özelliği karşılamak için hizmet etmez.

Meta

TRS-80 Dans Demonu , Android Nim ve elbette Busby Berkeley'den (ve hayır, o kadar yaşlı değilim ) esinlendik .


Harika ... çoktan yorulmadan önce ihtiyacım olan son şey dikkatimi çekmek için bir zorluk. Üstteki etiketler gerekli mi?
Matt,

@Matt, iyi, tüm zorluk kesinlikle "gerekli" değil, ama yinelenen etiketleri kaldırdım. ;-)
İnişli çıkışlı

'D' giriş parametresi için maksimum limiti kaldırdım. O oldu , emin satır aşağı her robot en azından ilk robot hala (çok fazla kaos önlemek için) bunu gerçekleştirirken iken eylemi başlamıştı yapmak "D <B / N", ama yanılma ile kendi örnek bu kuralı bozdu ve yine de iyi görünüyor gibi görünüyor bu yüzden maksimum gecikme sınırını kaldırdım. Bu geç değişiklik için özür dilerim.
İnişli çıkışlı

CSS ve benzeri puanlama bölümünü güncelledik.
İnişli çıkışlı

3
Bu gördüğüm en sevimli şey.
Wossname,

Yanıtlar:


13

Bayanlar baylar, lütfen hoş geldiniz.

Tam Ön-Yığın Dans Grubu, 1.320 1.378 1.425 1.495 bayt

JavaScript: 1.195 bayt | CSS: 103 bayt | HTML: 22 bayt


Bu sevimli bir meydan okumadır. Aynı zamanda birçok özel durum var. Oh oğlum, pek çok özel durum. Ve bu antenler ...

Sonsuza dek çalışacak ve tüm işlemler ( left foot, right footvb.) Tamamlandıktan sonra yeniden başlatılacaktır .

Şunları yapabilirsiniz jsFiddle üzerinde denemek şeysi aşağıda pasajı veya kodunu kullanarak:

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 ve Ubuntu'da Chrome ve Firefox'ta test edildi


Düzenlemeler

  • Kaydedilen 70 bayt anten tutmak için ekstra konteyner kaldırarak. Bumpy'ye teşekkürler . Ayrıca biraz daha boşluk bulundu, şimdi gereksiz önbelleklemeyi kaldırdıkcreateElement ve uzun erişimi kaldırın .firstChild.
  • 47 bayt kurtarıldı - sadece aramam gerekmediğini farkettimgetElementById . Bu da documentgereksiz önbellekleme yapar .
  • Değiştirerek ve bitsel ve ile 4 bayt kaydedildi . Sayesinde||&&&|TheLethalCoder'a .
  • Kaydedilen 54 bayt küçük şeyler çok basitleştirerek ve CSS optimize ederek.

Bravo!!! Full Frontend-Stack Dans Grubu bir hit !! Özel durumların miktarı için özür dilerim; Anten kombinasyonlarını özellikle hayal kırıklığına uğratmak için seçtim, ama sembollerin geri kalanı animasyonun hizmetindeydi - bunu SO olarak planlamamıştım. Şimdi, churlish'in böylesine mükemmel bir performansı eleştirdiğini hissediyorum, ancak alt çizgi / anten döndüklerinde hafifçe vurulduğunu düşünüyorum (sola çok fazla 1 karakter, ne olursa olsun) Ama her neyse - bu harika! Meydan okuduğum için teşekkürler!
İnişli çıkışlı

@ Inişli çıkışlı Teşekkürler. Haklısın, bazı sihirli sayıları karıştırdım. Antenler şimdi sırayla mükemmel. Ayrıca tüm rakamlar için aynı yükseklikte olmayı başardım. Gerçekten eğlenceli bir mücadele.
insertusernamehere

1
Saat 2'de dans eden robotlarla uğraşmak demek? Harika, bwahaha!
İnişli çıkışlı

1
||ve &&hiç |ve &?
TheLethalCoder

1
@ TheLethalCoder Kesinlikle. Öneriniz zaten kaynakta ve düzenlemelere yansıtıldı. Çok teşekkürler.
insertusernamehere

5

C #, 1188 1376 İstisnalardan sonra 1382 bayt

sıkıştırılmış:

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

Biçimlendirme ve yürütülebilir bir programa sarılmış biraz daha güzel:

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
}

Çevrimiçi deneyin!

  1. Bu bağlantıyı ziyaret edin: tutorialspoint.com
  2. Gelen Standart Süreli ekranın alt kısmında sekme, yazın:
    mono main.exe 8 400 40

Düzenle 1

Genel olarak 6 bayt tasarruf string.Format(i,j)ile değiştirildi i.Replace("?",j).

Düzenle 2

Yorumlardan gelen önerilerle yenilemek tamamlandı.


Yuppi! Çevrimiçi olarak bir yerde yayınlamanın kolay bir yolu var mı?
İnişli çıkışlı

@Bumpy, cevabına bir link ekledi!
El-E-Yemek

1
@insertusernamehere Anonim bir işleve ve bazı küçük golf
oyunlarına derleyerek

1
@insertusernamehere, tamamlandı! Senin sıran! :-D
El-E-Yemek

1
@TheLethalCoder, bunun için teşekkürler! cKüçük bir tasarruf için kurtuldum . Bundan daha iyisini unuttuğumu biliyordum new string(c,n). Ancak şimdi takma adıyorum S=String, new S(c,n)daha kısa.
El-E-Yemek

0

JavaScript, 948 bayt

Herhalde kendi sorunuzu cevaplamak için kötü bir formdur, ama yine de ...

Metni sıkıştırmanın her türlü yolunu denedim, ancak çoğu dahil tuş + algoritması ile orijinalinden daha uzun sürdü. Eminim hepsini sıkıştırmanın daha uygun bir yolu var, ama çizgiyi bir yere çekmek zorundayım.

İlginç bir şekilde, araştırma daha sonra geliştirebileceğim ve gönderebileceğim diğer bazı zorluklar için bir veya iki fikir üretti.

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

( Not: 1-31 aralığında, karakterleri buraya eklendiğinde biraz tuhaf olan bazı karakterler içerir)

CodePen'de tam psychedelic dans döngüsünü izleyin !

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.