Drag Yarışı Geri Sayımı


10

Meydan okuma:

Varsayımsal bir senaryoda, bir yarış için geri sayım sayacının sayım arasında, erken başlatmayı önlemek için rastgele aralıklar vardır;

3 (0.82 seconds pass), 2 (0.67 seconds pass), 1

Giriş:

hiçbir şey değil


Çıktı:

Her sayım arasında 0,50 saniye ile 1 saniye arasında rastgele bir zaman aralığına sahip 3 sayıyı yazdıran bir program (veya işlev) yazın.


Not:

  • Program her bir sayıyı (3, 2, 1) rastgele ( 0.50 ila 1 ila yüz arasında herhangi bir sayı; sabit kodlama yok) zaman aralığı ile çıktılamalıdır. Rastgele aralığın hassasiyeti yüzlerce kişiye kadar olmalıdır (örn: 0,52). Aralığı çıkarmanız gerekmez, yalnızca sayım.
  • @JoKing'in açıkladığı gibi, eşit olarak rasgele demek istiyorum (dilinizin sözde rasgele üretecini kullanabilirsiniz.
  • Birçok kişinin açıkladığı gibi, gerçekten 0,5 ile 1 arasında herhangi bir 2 ondalık sayı anlamına gelir. (0,50, 0,51 vb., 0,98, 0,99, 1'e kadar)

Bu , bu nedenle en düşük bayt sayısına sahip program kazanır.


4
Merhaba LordColus ve PPCG'ye hoş geldiniz! Bu iyi bir ilk zorluk gibi görünüyor. Gelecekteki zorluklar için, tüm ayrıntıları ütülemek için önce kum havuzundan geçmenizi öneririz .

1
@LordColus: Orijinal ifadeyi ve diğer birkaç düzenlemeyi geliştirdim, bir göz atın ve isterseniz onaylayın.
Muhammed Salman

1
Silinmiş bir önceki yorumda söylediğim gibi, hassas bir şekilde çok sıkı değilseniz "tekdüze rastgele" belirtmek iyidir. Şu anda olduğu gibi, duraklama süreleri iki ondalık basamak hassasiyetiyle eşit olmalıdır (veya en az iki ondalık basamak mı?). Bu, dağılımın 0,5, 0,51, 0,52, ..., 1 setinde eşit olması gerektiği veya 0.5 ve 1 arasında herhangi bir kayan nokta (muhtemelen iki ondalıktan fazla) olabileceği anlamına mı geliyor ?
Luis Mendo

2
En son düzenlemem temizliyor mu?
LordColus

6
@ mbomb007 Aynı ... bu neden tekrar kapandı? Temelde, aralarında iki .50-1.00 saniye beklemeyle 3'ten 1'e kadar sayılır. Gerçekten karmaşık değil.
Sihirli Ahtapot Urn

Yanıtlar:



2

SmileBASIC, 64 62 bayt

?3M?2M?1DEF M
M=MILLISEC
WHILE MILLISEC<M+500+RND(501)WEND
END

Ne yazık ki WAIT'i kullanamıyorum çünkü bu sadece saniyenin 1 / 60'lık aralıklarını destekliyor (giriş / çıkış kare başına yalnızca bir kez güncellendiği için normalde daha az bir şey kullanışlı değil)

Bu, üzerinde çalıştığı sistemin hızına bağlı olarak ayar yapılmasını gerektirir, bu nedenle geçerli olmayabilir (46 bayt):

?3M?2M?1DEF M
FOR I=-66E4-RND(66E4)TO.NEXT
END

Geçersiz WAIT sürümü (36 bayt):

?3WAIT 30+RND(30)?2WAIT 30+RND(30)?1

2

R , 4644 bayt

gerçek bir geri sayım için:

for(i in 3:1){cat(i)
Sys.sleep(runif(1,.5))}

Çevrimiçi deneyin!

başlangıçta meydan okumayı yanlış anladığım için baskı aralığı (46 bayt) Giuseppe 2 karakter kaydettiğiniz için teşekkürler .

for(i in 3:1)cat(i,format(runif(1,.5),,2)," ")

Çevrimiçi deneyin!


İnanıyorum runif()varsayılan olarak olarak sol ve sağ uç noktaları vardır 0ve 1sırasıyla, bu nedenle runif(1,.5)aynı çalışması gerekir -2 hem bayt.
Giuseppe

İyi yakalama teşekkürler @Giuseppe.
JayCe

2

Python 2 , 58 bayt

from time import*
for a in'321':print a;sleep(1-time()%.5)

Çevrimiçi deneyin!

Tohum zamanını alan çok basit bir rastgele sayı üreteci oluşturdum (birçok insanın yaptığı gibi).


İyileştirmeler


1-time()%.5hile yapmalı. (Bu arada ihtiyacın var [3,2,1])
Jonathan Allan

Ayrıca for a in'321' iki tane daha kaydeder
Jonathan Allan

@JonathanAllan Çok iyi bir nokta, güncellendi.
Neil

Bu geri sayımdan önce de bir kez uyuyor. Sanırım uykudan önce yazılı ifadeye ihtiyacınız var.
Sihirli Ahtapot Urn

@MagicOctopusUrn Kabul edildi, güncellendi.
Neil

1

APL + WIN, 37 bayt

3⋄r←⎕dl ↑n←.49+.01×2?51⋄2⋄r←⎕dl 1↓n⋄1

1

Java 8, 86 bayt

v->{for(int i=0;++i<4;Thread.sleep((int)(Math.random()*500+500)))System.out.print(i);}

Sınırlayıcı olmadan yazdırır. Buna izin almıyorsa değiştirerek 2 bayt var printetmek println(yeni hat sınırlayıcı).

Çevrimiçi deneyin.
Aralıkların doğru aralıkta olduğunu kanıtlayın[500, 1000) ms .

Açıklama:

v->{                        // Method with empty unused parameter and no return-type
  for(int i=0;++i<4;        //  Loop in range [1,4)
      Thread.sleep((int)(Math.random()*500+500)))
                            //    After every iteration: sleep for [500, 1000) ms randomly
     System.out.print(i);}  //   Print the current number


1

JavaScript (Node.js) , 75 65 60 bayt

  • 10 bayt azalttığı için @Shaggy sayesinde
  • @Kevin Cruijssen'e 5 byte azalttığı için teşekkürler
f=(i=3)=>i&&setTimeout(f,Math.random()*500+500,i-1,alert(i))

Çevrimiçi deneyin!



1
Eğer Date kullanıyorsanız @Shaggy gerçekten rastgele olacak mı? (ikinci kez rastgele meydana geldi)
DanielIndie

1
Neden *1000%500+500? Sadece kullanabilirsiniz *500+500.
Kevin Cruijssen

Spesifikasyondaki güncellemelerde, muhtemelen yeterince rastgele olmayacak, ancak açıklama istemeye değer olabilir.
Shaggy


1

Çip -wingjj , 33 bayt

0123456e7f s
???????p*9S!ZZZtaABb

Çevrimiçi deneyin!

Chip'te tam olarak saniyenin 1 / 100'ünü bekleyemeyiz, ancak saniyenin 1 / 256'sını bekleyebiliriz , bu yüzden burada kullanıyoruz.

pSorulduğunda, yığın kafası (bir bayt) * için yürütme duraklatır 1 / 256 saniye. Her bir döngüde, biz zaman yığın yüksek bitini ayarlamak ( 128 / 256 ) ve (rastgele diğer yığın bitlerini ?'ler). Bu 0,50 ila 1,00 saniye arasında eşit dağılım sağlar.

Args bazıları -wve -gjjgiriş yerine Stdin kullanmak yerine, bir geri sayım olması gerektiğini belirtmek 0xFFiçin 0x00(daha sonra sarma). Geri sayım için düşük iki bit sağlamak için bunu kullanıyoruz. Diğer tüm çıkış bitleri sabit kalır (ASCII'ye karşılık gelen değerde)0 ).

Son olarak, işimiz bittiğinde, tson numaradan sonra duraklamayı önleyerek programı sonlandırıyoruz .


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.