Rus Ruleti


32

Rus Ruleti oynayalım!

Normalde, bu en kısa MOD 6 programını yazmak için bir yarış olacaktır, ancak her tıklamada kazanma şansı azaldıkça, bu gerçekçi değildir. İşte kurallar:

  1. Gerçek bir altı kişiyi taklit edin :
    • Altı odadan birine tek bir kurşun yerleştirilir ve namlu bir kez döndürülür, sadece çalmadan önce.
    • Üzerinde kaybetme şansı n denemede inci 06/01 olduğunu.
    • N denemeden sonra kaybetme şansı 1 / (6-n)
    • En fazla 6 denemede kaybedeceğiniz garanti edilir.
  2. Losing:
    • Metni göster *BANG!*
    • Programı sonlandır.
  3. Kazanan:
    • "Kazanma", silahın ateşlemediği anlamına gelir, ancak mermi, çekiçe yakın bir odadır.
    • Metni göster *click*
    • Programı sonlandırma yeteneği ile birlikte kullanıcıya bir "tetikleyici" sunun (örneğin, "ctrl + c", aşağıya bakınız).
  4. Programa özel:
    • Tetiği çekmek ilk deneme de dahil olmak üzere bir tür kullanıcı girişidir. (Bu bir tuş vuruşu, bir fare tıklaması olabilir, herhangi bir şekilde olabilir; metin istemleri gerekli değildir.)
    • Programın yalnızca bir örneğine, sonlandırılıncaya kadar izin verilir. (Programın yeni bir örneğini çalıştırmak, namluya iyi bir dönüş sağlamaya benzer, yani bir sonraki tıklamada kaybetme olasılığı 1/6 olarak sıfırlanır.)

En kısa kod kazanır!

Liderler Sıralaması


3
Varsayımlarınız yanlıştır - n'inci denemede kaybetme şansı sadece shot her atıştan sonra mermilere cevap verirseniz geçerlidir. Cevap vermeden kaybetme şansı ⅙ ilk vuruşta, ⅕ ikincisinde, ¼ üçüncü sırada ... 6'da 1 ile bitiyor. Bunu "En fazla 6 denemede kaybetmeniz garantili" olarak kabul edersiniz.
15'te

2
@ user2956063, n: denemeye asla ulaşmamanız için bir (n-1) / 6 şansı olduğunu ve bu nedenle kaybedemeyeceğinizi unutuyorsunuz. Üniformanın 1 / 6'sına denk gelirler.
Jacob Raihle

2
belki bu şekilde bir farklılık bilgisayar bilim adamları ve istatistikçiler sonra olasılığını ifade var - Bana "inci denemede kaybetme şansı ⅙ olan" demek 's sabit var - ister n 1 veya 100'dür
rhialto

3
Bu neden "Russian Roulette, Reloaded" başlıklı değildi?
El-E-Yiyecek

1
@ user2956063: Olasılıklarınız şartlı . P (2. atışta kaybetti) = ⅙, ancak P (2. atışta kaybetti | 1. atışta kaybetmedi) = ⅕. Ayrıca, n(dolaylı olarak, size vereceğim) [1,6] ile sınırlıdır, yani 100 çıkar.
Tim Pederick

Yanıtlar:


3

Pyth, 23 bayt

VO6"*click*" w;"*BANG!*

Gerçekten basit. Rasgele 0 - 5 yineleme sayısı tıklanır ve bir satır girdi ister, ardından sonunda bir patlama olur.


1
Allah kahretsin, pyth!
Cyoce

+3 bayt: son dize olmalı *BANG!*, değilBANG
ayane

14

Ruby, 51 bayt

[*['*click*']*rand(6),'*BANG!*'].map{|x|gets;$><<x}

Ungolfed:

[
  *(                        # Unwrap the following array into the outer one
    ['*click*'] * rand(6)   # An array of 0-5 clicks, see Array#*
  ),
  '*BANG!*'                 # The End
].map do |x| # Shortest way to iterate I was able to find
  gets       # Await input
  $> << x    # Shove the output string to `stdout`
end          # Return value is an array of several (0-5) `stdout`s. Who cares.

veya

(['*click*']*rand(6)<<'*BANG!*').map{|x|gets;$><<x}

Ungolfing okuyucular için ayrıldı. O kadar zor değil

  • Yine, bu kez Martin için kudos, yedek $><<olarak bir hile putsiçin.
  • Yeni satırlar çıkarmaz, ancak bu gerekli değildir.
  • Daha kısa, daha basit. Gerekli davranışın özü 0-5 tıklama yapmak ve sonra ateş etmektir. Bunun için çıkışlar dizinin içinde toplanır.
  • 2 daha bayt çıkışları seviyorsanız traş edilebilir "*click*"(sonunda yazdırılır ne gerekliyse) iyi misin değiştirerek, $><<ile . Bunun hala kuralları yerine getirip getirmediğinden emin değildim.

68 64 bayt

(başka bir yaklaşım)

[*0..5].shuffle.find{|x|gets;x<1||puts('*click*')};puts'*BANG!*'

Algoritmaya fazla düşünmedim (muhtemelen daha kompakt olabilir, ancak çok net olmayabilir), ama içindeki modeli gerçekten seviyorum:

  • Bir dizi, elemanları odaların içeriği olan bir namluya benziyor. Sadece bir element bir mermi olduğundan, onu döndürmek ve karıştırmak eşdeğerdir.
  • 0bir mermi. Diğer numaralar değil.
  • findbloğun ne falsede olmadığı bir ilk getiri değeri bulur nil.
  • ||ekspresyonu tamamen bloktan döndürülür. Bu kısa devre: ilk işleneni ( nilya da olmadıkça false) ya da ikincisini (aksi takdirde) döndürür. Yani ya döner true( ya da eğer x<1daha temiz ama daha uzun x == 0) ya da puts...
  • putsher zaman döner nil. Evet.
  • getsgirdi ister. Sadece vurmak Enteryeterli.
  • Ctrl+ Cprogramı sonlandırır

Geçti 64 normal 64?
Cyoce

@Cyoce uhm ... evet. Olmalı, muhtemelen. Yukarıdaki giriş tarafından üstlenildi, ancak farklı bir fikre dayanıyor, bu yüzden onları terkettim, çarpıştım.
D tarafı

öyleydi üzerinde bir kelime oyunu bu
Cyoce

@Cyoce oh, afedersiniz, ilk gönderi ve hepsini, yerel irfanın farkında değil :)
D-side

9

JavaScript, 64 bayt

for(i=6;i<7&&prompt();)alert(new Date%i--?"*click*":i="*BANG!*")

açıklama

Tetiği çekmek için istemde herhangi bir metni girin. Hiçbir şey girmeyin veya sonlandırmak için iptal düğmesini tıklayın.

for(
  i=6;             // i = number of chambers
  i<7              // i equals "*BANG!*" (not less than 7) if we lost
    &&prompt();    // see if we should do another shot
)
  alert(           // alert the result
    new Date%i--   // use the current time in milliseconds as a random number, this is safe
                   //     to use because the gap between shots is greater than i (max 6ms)
      ?"*click*"   // on win pass "*click*" to alert
      :i="*BANG!*" // on lose alert "*BANG!*" and set i to not less than 7
  )

"*Bang!*"7'den büyük değil. Ama 7'den NaNküçük değil.
Bergi

@Bergi Bu doğru. Açıklamayı biraz daha açık hale getirmek için açıklamayı yeniden yaptım.
user81655

6
@Bergi sadece Javascript'te bu ifadeyi bile mantıklı gelmiyor mu?
MikeTheLiar

7

Lua, 82 75 bayt

Çok uzun, ama Lua'da çok fazla ayrıntılı var.

for a=math.random(6),1,-1 do io.read()print(a>1 and"*click*"or"*BANG!*")end

6

LabVIEW, 46 LabVIEW İlkelleri

0'lardan oluşan bir Array oluşturur ve bir 1, tıklamaları beklemek için bir döngüye sahiptir ve dizeyi çıkarır. Başlangıçta BANG, başlamadan önce göstergeyi sıfırlamayı unuttuğumu söylüyor.

Ayrıca, bunun sizin için bir gif olduğunu unutmayın, eğer oynamadıysanız / yüklenmezse, lütfen sayfayı yeniden açın.


Eğer çıktısını yapmak nerede görmüyorum "*click*"tabanca ateş etmedi durumda. Ayrıca, çıktı "bang""*BANG!*"?
Katenkyo

Bu bir gif olmalı ama benim için çalmıyor, sorun olabilir. Ve evet sadece ben o Bir saniye içinde düzgün i değişimi okumuyordu patlama, koyar
Eumel

aptal bana ... o başında BANG showes neden öylesine thats başlamadan önce boşaltmak için dizeyi yeniden başlatmak için unuttum
Eumel

Hiç sorun değil, şimdi
gif'i

5

Pyth, 31 30 28 bayt

FN.S6 EI!N"*BANG!*"B"*click*

Neredeyse kesinlikle geliştirilebilir. Tetiği çekmek için herhangi bir sayı, erken sonlandırmak için boş girdi (bir hatayla) girin.

Açıklama:

FN                               for N in...
  .S6                            shuffle(range(6))...
      E                          get a line of input
       I!N                       if N is falsy (i.e. 0)
          "*BANG!*"              implicit output
                   B             break
                    "*click*     else, print click

İlki aslında daha kısa, izlemene gerek yok ".
FryAmTheEggman

@FryAmTheEggman Oh, doğru, bunu unuttum. Teşekkürler!
Doorknob

Ayrıca, ben, saçma sadece fark bir şey var FN<any>hala tamamen özdeş olduğunu V<any>... muhtemelen şaşırtmak yeni değil golfçüler şekilde değiştirilmelidir: P
FryAmTheEggman

1
Karakterleri kolayca kaldırabilirsiniz .?. Bir gerek yok else.
Jakube

@ FryAmTheEggman insanların kafa karıştırıcı harika. Çalılıkları filtrelemek şaşırtıcı olabilir .
Cyoce

5

Cidden, 27 25 bayt

"*BANG!*"6J"*click*"nW,X.

Çevrimiçi bağlantı yok, çünkü boru girişiyle bilgi istemi yapmanın bir yolu yok. Program herhangi bir zamanda CTRL C'D olabilir dışarı tavuk sonlandırabilir.

Açıklama:

"*BANG!*"6J"*click*"nW,X.
"*BANG!*"                  push "*BANG!*"
         6J                push a random integer in [0,6) (n)
           "*click*"n      push "*click*" n times
                     W     while loop (implicitly closed at EOF):
                      ,X.    get input and discard, pop and print top of stack

4

PHP, 52 bayt

*<?=$n=&rand(0,6-$argi)?click:"BANG!*";$n||@\n?>*

-FÜç olarak sayılan komut satırı seçeneğini gerektirir . Tetiğe basılarak çekilir Enter.

Çünkü -Ftam anlamıyla her giriş, (eğer ben değil çocuk) için tekrar komut dosyasını çalıştırır dieyerine bastırılmış çalışma zamanı hatası yoluyla çıkabilir bu yüzden ve benzeri aslında sonlandırmak olmaz @\n.


Örnek Kullanım

$ php -F primo-roulette.php

*click*
*click*
*BANG!*
$

4

Perl 5, 43 bayt

İle koş perl -p. Kararlı mermi değişkeni - yani mermi pozisyonuna en başından sadece bir kez karar verilir.

$i//=0|rand 6;$_=$i--?'*click*':die'*BANG*'

Güzel! Kullandığınızdan beri başlığı "Perl 5.10+" olarak değiştirirdim //=. Ayrıca, puanınızı saymayı-p unutmayın .
ThisSuitIsBlackNot

4

C, 110 74 72 bayt

Içerikleri ve daha az bayt kurtulmak için Dennis'e teşekkür ederiz.

main(r){for(r=time(0)%6;getchar(),r--;)puts("*click*");puts("*BANG!*");}
main(r)
{
    for(r=time(0)%6;getchar(),r--;)
        puts("*click*");
    puts("*BANG!*");
}

3

Şeker , 36 bayt

Programın yaklaşık yarısı yazdırılacak metindir :(

:6H_(=b"*click*"(;):=)"*BANG!*\n"(;)

uzun biçim:

getc
digit6 rand range0  # build a range from 0 .. rand#
while
  popA              # these are the *click* instances  
  stack2
  "*click*"
  while
    printChr
  endwhile
  getc
  popA
endwhile
"*BANG!*\n"         # out of luck
while
  printChr
endwhile

3

Python 3, 95 bayt

Ayrıca ilk golf denemem, Python 3'te de. Yemin ederim Bruce ve aynı kişi değilim.

from random import*
for a in range(randint(0,5)):input();print("*click*")
input();print("*bang*")

Ungolfed:

from random import*
for a in range(randint(0,5)):
    input()
    print("*click*")
input()
print("*bang*")

0 ile 5 arasında rastgele bir sayı oluşturun , birçok kez tıklayın , ardından patlamayı yazdırın . Tetiği çekmek için enter / return düğmesine basın.


Bruce'un örneğini from random import*
izleyerek

Kaybettiğim başka bir şey yoksa, bir tasarruf birikimidir. Ama ben alacağım! Teşekkürler!
Steve Eckert

İyi deneme, çözümünüzü python 2 çözümüm için ilham kaynağı olarak kullandım ^^
basile-henry

3

PlatyPar , 26 25 bayt

6#?;wT"*click*"O;"*BANG!*

Açıklama:

6#?;                        ## random integer [0,6)
    w           ;           ## while stack.last
     T                      ## stack.last--
      "*click*"O            ## alert "*click*"
                 "*BANG!*   ## alert "*BANG!*"

Çevrimiçi deneyin !


2

Emacs Lisp, 94 89 bayt

(set'b(%(random)6))(dotimes(a(+ b 1))(read-string"")(message(if(eq a b)"BANG""*click*")))

Ungolfed:

(set 'b (% (random) 6))
(dotimes (a (+ b 1))
  (read-string"")
  (message (if (eq a b) "BANG" "*click*")))

2

R, 86 80 77 bayt

Her zamanki gibi, R golf oynamayı kodlayan harika özelliklere sahip ancak looooooong fonksiyon isimleri.

sapply(sample(0:5),function(n){!n&&{cat('*BANG!*');q()};readline('*click*')})

2

Python 2, 108 104 102 100 98 bayt

Golfe ilk girişim:

from random import*
a=[1]+[0]*5
shuffle(a)
for i in a:input();print("*click*","*BANG!*")[i];" "[i]

Belki de , kaybettiğinizde programın doğru sonlanmadığını eklemeliyim , bu sadece bir istisna atar (bu fesihle sonuçlanır):

Traceback (most recent call last):
  File "russian_roulette.py", line 4, in <module>
    for i in a:input();print("*click*","*BANG!*")[i];" "[i]
IndexError: string index out of range

Programlama Bulmacaları ve Kod Golf'üne Hoşgeldiniz! Bir kod golf yanıtı gönderdiğinizde, lütfen dil adını ve bayt sayısını ekleyin (sizin için burada düzenledim). Teşekkürler!
ProgramFOX

Evet, çok teşekkürler! Aslında bu sorunu çözmeye çalışıyordum, sizden önce doğru şekilde düzenleme yapamadım.
15'te

Bayt sayısını 112 olarak alıyorum , ne kullandın?
wnnmaw

Ayrıca, 2 bayt yaparak a=shuffle([1,0,0,0,0,0])
kazanabilirsiniz

1
Shuffle'ın bildiğim kadarıyla, altta yatan veri yapısını değiştiriyor ve hiçbir şey döndürmüyor. Bunu denedim, yine de teşekkürler. Başlık (dil ve bayt sayısı) ProgramFOX tarafından yazılmıştır. Ama kullandığımda wcbana hangisini çok fazla 109 veriyor, bu yüzden doğru. Nasıl sayıyorsun?
15'te

2

Perl 5, 40 bayt

<>,print"*$_*"for(click)x rand 5,'BANG!'

Komut satırı seçenekleri olmadan çalıştırın, tuşuna basarak tetik çekilir Enter.


2

Python, 81 Bayt

import time
for i in["*click*"]*(int(time.time())%6)+["*BANG!*"]:input();print(i)

Ruby (51) ve Python çözümlerinden ilham aldı


1

Ortak Lisp, 109

(do(g(b(nthcdr(random 6)#1='(t()()()()() . #1#))))(g)(read-char)(princ(if(setf g(pop b))"*BANG!*""*click*")))

Çok rekabetçi değil, ancak dairesel listeleri severim:

(do (;; auxiliary variable x
     x
     ;; initialize infinite barrel, rotate randomly
     (b (nthcdr (random 6) #1='(t()()()()() . #1#))))

    ;; we end the loop when x is T (a bullet is fired)
    (x)

  ;; press enter to shoot
  (read-char)

  ;; pop from b, which makes b advance down the list. The popped value
  ;; goes into x and is used to select the appropriate string for
  ;; printing.
  (princ
   (if (setf x(pop b))
       "*BANG!*"
       "*click*")))

1

Perl 5, 43 bayt

42 bayt + -pkomut satırı seçeneği. enterTetiklemek için sadece basın .

$_=0|rand 7-$.<++$i?die"*BANG!*":"*click*"

Dom Hastings'e yardımları için teşekkürler! Orijinal cevap 67 baytı:

$i++;$a=$i>=int(rand(6));print$_=$a?'*BANG!*':'*click*';last if($a)

Aslında sorun -p, son printifadeyi çağırmadan önce çıkmasıydı, neden olduğundan emin değil. Denedim. Bunun dışında harika öneriler, teşekkürler!
Bilgim

@DomHastings Ayrıca, ne yazık ki bazı nedenlerden dolayı 0|hile beklendiği gibi çalışmadı, ancak bazı baytları, print deyimini ve sizin önerdiğiniz son ifadeyi traş ettim. Şimdi nasıl görünüyor?
Codefun64

@HomHastings Kahretsin, iyisin. Bunu kendi cevabınız olarak koymanızı öneririm, çünkü kesinlikle benden daha küçük bir program
yazdınız (

Açıklamayı takdir ediyorum! En sevdiğim komut dosyası dilinden daha fazla şey öğrenmek beni hep mutlu eder! Prefex artışını bilmiyordum bile, bu oldukça harika. Thanks :)
Codefun64

Çok hoş geldiniz, yardımcı olduğunuz için mutluyuz!
Dom Hastings,

1

MATL , 41 bayt

6Yr`j?t@=?'*BANG!*'DT.}'*click*'DT]}T.]]x

Tetiği çekmek için boş olmayan bir dize (örneğin 'try') girin.

Sonlandırmak için boş bir dize girin.

Örnekler

Bu durumda, tetik bir kez çekildi ve ... kötü şans:

>> matl
 > 6Yr`j?t@=?'*BANG!*'DT.}'*click*'DT]}T.]]x
 > 
> try
*BANG!*

Bu durumda, kullanıcı iki şanslı çekimden sonra durdu (son boş girişi not edin):

>> matl
 > 6Yr`j?t@=?'*BANG!*'DT.}'*click*'DT]}T.]]x
 > 
> try
*click*
> try
*click*
> 

açıklama

6Yr                  % random avlue from 1 to 6    
`                    % do...while  
  j                  % input string
  ?                  % if nonempty
    t                % duplicate the orignal random value
    @                % loop iteration index  
    =                % are the equal?
    ?                % if so             
      '*BANG!*'D     % display string
      T.             % unconditional break                                     
    }                % else
      '*click*'D     % display string
      T              % true value, to go on with do...while loop
    ]                % end if               
  }                  % else                                                    
    T.               % unconditional break
  ]                  % end                                                     
]                    % end                                                     
x                    % delete original random value


1

Python 2, 88 84 bayt

Bu çözüm, daha önce verilen python 3 çözümlerinden ilham almıştır. Baskı parantezini kaldırmak için python 2'yi seçtim, ancak bu giriş davranışını değiştirdi.

import time
for i in[0]*int(time.time()%6)+[1]:input();print("*click*","*BANG!*")[i]
  • Zamanın modülünü rastgele bir işlev olarak kullanıyorum (rus ruleti için yeterince iyi)
  • Oynatıcı girişi "i" olmalı, sonra Enter (aksi takdirde input () bir hata atar), bu numara girişin "ne olursa olsun" olabileceğine dayanır.

1

Ruby, 45 + 1 = 46

D tarafı kadar akıllı değil, biraz daha kısa.

Komut satırı işaretiyle pçalıştır

rand(7-$.)<1?(puts'*BANG*';exit):$_='*click*'

Kullanıcı tetiği geri dönerek çekip kontrol-c ile bırakabilir. pProgramın bir döngüde çalışmasına, STDIN'den satırları okuyup çıkmasına neden olur $_. Her çalıştırıldığında, artar$. . Böylece ilk çalıştırmada, 6, daha az 5, daha sonra 4 ve daha az rastgele bir pozitif tamsayı seçer. İlk 0'da, elle çıktık ve o zamana kadar çıktık.

(ve şimdi farkettim ki zaten çok benzer bir Perl. Ah, evet.)


1

Perl 5, 69 51 49 bayt

map{<>;print"*click*"}1..rand 6;<>;print"*BANG!*"

Muhtemelen biraz daha golf potansiyeli var, bunu inceleyeceğim.

değişiklikler:

  • Kaldırılarak $lve bazı noktalı virgüllerle 8 bayt, değiştirerek 10 bayt kaydedildi<STDIN> .<>
  • Oleg V. Volkov sayesinde 2 bayt kaydedildi

1
49:map{<>;print"*click*"}1..rand 6;<>;print"*BANG!*"
Oleg V. Volkov

@ OlegV.Volkov Teşekkürler! Şimdi düzenleyeceğim.
ASCIIThenANSI

0

VBA, 126 bayt

Minimal Bayt için Golf Versiyonu

Sub S()
r=Int(5*Rnd())
e:
a=MsgBox("")
If a=1 Then: If i=r Then MsgBox "*BANG!*" Else: MsgBox "*click*": i=i+1: GoTo e
End Sub

Düğmeleri Artırılmış Kullanıcı Kabulü için Daha Net Yapan Eğlenceli Sürüm.

Sub RR()
r = Int(5 * Rnd())
e:
a = MsgBox("Are you Feeling Lucky?", 4)
If a=6 Then: If i=r Then MsgBox "*BANG!*", 16 Else: MsgBox "*click*", 48: i=i+1: GoTo e
End Sub

Özel Formlar ile Biraz Eğlenceli ve VBA'de güzel bir Kaygan Oyun yapabilirsiniz.


0

APL, 39/65 bayt

{⍞⊢↑⍵:⍞←'*BANG*'⋄∇1↓⍵⊣⍞←'*click*'}6=6?6

Oldukça basit cevap.


İki bayt sayısı ne anlama geliyor?
Mego

0

C, 180 Bayt

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){srand(time(NULL));int r,i=6;while(i!=1){getchar();r=rand()%i;if(r){puts("CLICK");}else{puts("BANG");exit(0);}i--;}}

İlk kod golf denememde muhtemelen iyileştirme için çok yer var :)


0

Julia, 71 bayt

b=rand(1:6);while b>0 readline();print(b>1?"*click*":"*BANG!*");b-=1end

EnterAteş etmek için Ctrl+ Cveya çıkmak için + tuşuna basın . Sonuncusu bir biterInterruptException .

Ungolfed:

# Set an initial bullet location
b = rand(1:6)

while b > 0
    # Read user input
    readline()

    # Check the location
    if b > 1
        print("*click*")
    else
        print("*BANG!*")
    end

    b -= 1
end

0

Lua, 73 bayt

q=io.read q()for i=2,math.random(6)do print"*click*"q()end print"*BANG!*"
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.