Roulette Rusia, Muat Ulang


32

Ayo mainkan Roulette Rusia!

Biasanya, ini akan menjadi perlombaan untuk menulis program MOD 6 terpendek, tapi itu tidak terlalu realistis, karena peluang menang berkurang dengan setiap klik. Berikut aturannya:

  1. Meniru enam penembak sungguhan :
    • Peluru tunggal ditempatkan ke dalam salah satu dari enam kamar, dan laras diputar sekali, hanya sebelum bermain.
    • Peluang kalah pada percobaan ke- n adalah 1/6.
    • Kemungkinan kehilangan setelah n mencoba adalah 1 / (6-n)
    • Anda dijamin akan kalah, paling banyak, 6 percobaan.
  2. Kekalahan:
    • Tampilkan teks *BANG!*
    • Hentikan program.
  3. Kemenangan:
    • "Menang" berarti pistol tidak menembak, tetapi peluru itu adalah satu ruang yang lebih dekat ke palu.
    • Tampilkan teks *click*
    • Berikan "pemicu" kepada pengguna, bersama dengan kemampuan untuk menghentikan program (mis. "Ctrl + c", lihat di bawah).
  4. Khusus program:
    • Menarik pelatuk adalah beberapa bentuk input pengguna, termasuk percobaan pertama. (Ini bisa berupa ketukan tombol, klik mouse, apa pun; petunjuk teks tidak diperlukan.)
    • Hanya satu instance dari program yang diizinkan sampai program ini dihentikan. (Menjalankan instance baru dari program ini mirip dengan memberi laras putaran yang baik, yaitu kemungkinan kehilangan pada klik berikutnya diatur ulang ke 1/6.)

Kode terpendek menang!

Papan peringkat


3
Asumsi Anda salah - peluang untuk kalah pada percobaan ke-9 hanya ⅙ jika Anda merespek peluru setelah setiap tembakan. Tanpa mengulangi kesempatan kehilangan adalah ⅙ pada tembakan pertama, ⅕ pada tembakan kedua, ¼ pada tembakan ketiga ... berakhir pada 1 pada keenam. Anda mengenali ini dengan "Anda dijamin akan kalah, paling banyak, 6 percobaan".
rhialto

2
@ user2956063 Anda lupa bahwa ada kesempatan (n-1) / 6 bahwa Anda tidak pernah mencapai percobaan n: th, dan karenanya tidak akan hilang. Mereka menyeimbangkan seragam 1/6.
Jacob Raihle

2
mungkin itu perbedaan dalam cara para ilmuwan komputer dan ahli statistik menyatakan probabilitas saat itu - bagi saya "Peluang kalah pada percobaan ke-n adalah ⅙" katakanlah ini konstan - apakah n adalah 1 atau 100.
rhialto

3
Mengapa ini tidak berjudul "Russian Roulette, Reloaded"?
Hand-E-Food

1
@ user2956063: Peluang Anda bersyarat . P (kalah pada tembakan 2) = ⅙, tetapi P (kalah pada tembakan 2 | tidak kalah pada tembakan 1) = ⅕. Selain itu, n(secara implisit, saya akan memberi Anda) terbatas pada [1,6], jadi 100 keluar.
Tim Pederick

Jawaban:


3

Pyth, 23 byte

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

Sangat sederhana. Sejumlah acak iterasi 0 - 5 tampilan klik dan minta sederetan input, diikuti dengan bang di bagian akhir.


1
Sialan kamu, pyth!
Cyoce

+3 byte: string terakhir seharusnya *BANG!*, bukanBANG
ayane

14

Ruby, 51 byte

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

Tidak Disatukan:

[
  *(                        # 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.

atau

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

Tidak ada yang tersisa untuk para pembaca. Tidak sesulit itu

  • Sekali lagi, pujian untuk Martin, kali ini untuk trik dengan $><<sebagai putspenggantinya.
  • Tidak menampilkan baris baru, tapi itu tidak diperlukan.
  • Semakin pendek, semakin sederhana. Inti dari perilaku yang diperlukan adalah dengan melakukan 0-5 klik dan kemudian jalankan. Untuk itu, output diakumulasikan di dalam array.
  • 2 byte lagi dapat dicukur jika output seperti "*click*"baik-baik saja (apa yang diperlukan dicetak pada akhirnya), dengan mengganti $><<dengan . Saya tidak yakin apakah ini akan tetap mengikuti aturan.

68 64 byte

(pendekatan lain)

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

Saya tidak terlalu memikirkan algoritma (mungkin bisa lebih ringkas, tapi tidak begitu jelas), tapi saya sangat suka model di dalamnya:

  • Array mengemulasi per barel dengan elemen-elemennya menjadi isi bilik. Karena hanya satu elemen yang merupakan peluru, memutar dan mengocoknya adalah sama.
  • 0adalah sebuah peluru. Nomor lainnya tidak.
  • findmenemukan nilai pengembalian pertama yang bloknya juga falsetidak nil.
  • ||-ekspresi secara implisit dikembalikan dari blok. Ini korsleting: mengembalikan operan pertamanya (kecuali jika itu nilatau false) atau yang kedua (jika tidak). Jadi itu bisa mengembalikan true(jika x<1atau, lebih jelas tapi lebih lama x == 0) atau nilai pengembalian puts, saat ...
  • putsselalu kembali nil. Ya.
  • getsmeminta input. Cukup memukul saja Enter.
  • Ctrl+ Cmenghentikan program

Dicoret 64 adalah normal 64?
Cyoce

@ Ayo uhm ... ya. Mungkin, mungkin. Sudah digantikan oleh entri di atas, tetapi didasarkan pada ide yang berbeda, jadi saya meninggalkan mereka, dicoret.
Sisi-D

itu adalah permainan kata-kata untuk ini
Cyoce

@Cyoce oh, maafkan saya, posting pertama dan semua itu, tidak mengetahui pengetahuan lokal :)
D-side

9

JavaScript, 64 byte

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

Penjelasan

Untuk menarik pelatuk, masukkan teks apa saja ke dalam prompt. Masukkan apa pun atau klik batal untuk mengakhiri.

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!*"tidak lebih besar dari 7. Tetapi NaNtidak lebih kecil dari 7.
Bergi

@Bergi Itu benar. Saya menulis ulang penjelasan untuk membuatnya sedikit lebih jelas.
user81655

6
@Bergi hanya di Javascript apakah pernyataan itu nyaris masuk akal.
MikeTheLiar

7

Lua, 82 75 byte

Cukup panjang, tapi ada banyak kata dalam lua.

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

6

LabVIEW, 46 Primview LabVIEW

Membuat Array 0s dan 1, memiliki loop untuk menunggu klik dan output string. Awalnya katanya BANG karena saya lupa mengatur ulang indikator sebelum memulainya.

Perhatikan juga bahwa ini adalah gif, jika jika tidak diputar / muat untuk Anda silakan buka kembali halaman tersebut.


Saya tidak melihat di mana Anda melakukan output "*click*"kalau-kalau pistol tidak menembak. Juga, apakah itu output "bang"atau "*BANG!*"?
Katenkyo

ini harus menjadi gif tetapi bagi saya itu tidak bisa dimainkan, itu mungkin masalahnya. Dan ya itu hanya menempatkan bang, itu saya tidak membaca dengan benar saya mengubahnya dalam
hitungan

bodohnya aku lupa menginisialisasi ulang string menjadi kosong sebelum memulai jadi itu sebabnya ini menunjukkan BANG di awal ...
Eumel

Tidak masalah, saya melihat gif sekarang, sepertinya bekerja cukup baik :)
Katenkyo

5

Pyth, 31 30 28 byte

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

Hampir dipastikan bisa ditingkatkan. Masukkan nomor apa saja untuk menarik pelatuk, kosongkan input untuk mengakhiri lebih awal (dengan kesalahan).

Penjelasan:

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

Yang pertama Anda sebenarnya lebih pendek, Anda tidak perlu trailing ".
FryAmTheEggman

@FryAmTheEggman Oh, benar, lupa tentang itu. Terima kasih!
Gagang Pintu

Juga, saya baru saja melihat sesuatu yang konyol, FN<any>masih sepenuhnya identik dengan V<any>, yang mungkin harus diubah untuk tidak membingungkan pegolf baru ...: P
FryAmTheEggman

1
Anda cukup menghapus karakter .?. Tidak perlu untuk else.
Jakube

@FryAmTheEggman membingungkan orang-orang luar biasa. Ini luar biasa dalam menyaring scrub .
Cyoce

5

Serius, 27 25 byte

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

Tidak ada tautan online karena tidak ada cara untuk melakukan prompt dengan input yang disalurkan. Program ini dapat CTRL-C'd setiap saat untuk ayam keluar mengakhiri.

Penjelasan:

"*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 byte

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

Membutuhkan -Fopsi baris perintah, dihitung sebagai tiga. Pemicu ditarik dengan menekan Enter.

Karena -Fsecara harfiah menjalankan skrip lagi untuk setiap input (I kid you not), diedan sejenisnya tidak akan benar-benar berakhir, jadi kami keluar melalui kesalahan runtime yang ditekan sebagai gantinya @\n,.


Contoh Penggunaan

$ php -F primo-roulette.php

*click*
*click*
*BANG!*
$

4

Perl 5, 43 byte

Jalankan dengan perl -p. Varian peluru stabil - yaitu posisi peluru diputuskan hanya sekali di awal.

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

Bagus! Saya akan mengubah header menjadi "Perl 5.10+", karena Anda menggunakan //=. Juga, jangan lupa untuk menghitung -pskor Anda .
ThisSuitIsBlackNot

4

C, 110 74 72 byte

Terima kasih kepada Dennis karena telah menyingkirkan menyertakan dan jauh lebih sedikit byte.

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

Permen , 36 byte

Sekitar setengah dari program adalah teks untuk dicetak :(

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

bentuk panjang:

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 byte

Juga upaya golf pertama saya, juga di Python 3. Saya bersumpah Bruce dan saya bukan orang yang sama.

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

Tidak Disatukan:

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

Hasilkan angka acak antara 0 dan 5 inklusif, cetak klik berkali-kali, lalu cetak bang . Tekan enter / kembali untuk menarik pelatuk.


Mengikuti contoh Bruce, Anda dapat menyimpan beberapa byte denganfrom random import*
wnnmaw

Kecuali ada hal lain yang saya lewatkan, ini satu byte penghematan. Tapi aku akan menerimanya! Terima kasih!
Steve Eckert

Usaha yang bagus, saya menggunakan solusi Anda sebagai inspirasi untuk solusi python 2 saya ^^
basile-henry

3

PlatyPar , 26 25 byte

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

Penjelasan:

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

Cobalah online !


2

Emacs Lisp, 94 89 byte

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

Tidak Disatukan:

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

2

R, 86 80 77 byte

Seperti biasa, R memiliki fitur luar biasa untuk kode golf tetapi nama fungsi looooooong.

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

2

Python 2, 108 104 102 100 98 byte

Upaya pertama saya bermain golf:

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

Mungkin saya harus menambahkan bahwa program tidak berhenti dengan benar ketika Anda kalah, itu hanya melempar pengecualian (yang menghasilkan penghentian):

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

Selamat Datang di Programming Puzzles & Code Golf! Saat Anda mengirim jawaban kode golf, harap sertakan nama bahasa dan jumlah byte (saya sunting untuk Anda di sini). Terima kasih!
ProgramFOX

Ya terima kasih banyak! Saya sebenarnya mencoba menyelesaikan masalah itu, tidak dapat mengeditnya dengan benar sebelum Anda melakukannya.
ბიმო

Saya mendapatkan jumlah byte Anda sebagai 112, apa yang Anda gunakan?
wnnmaw

Anda juga dapat menghemat 2 byte dengan melakukana=shuffle([1,0,0,0,0,0])
wnnmaw

1
Sejauh yang saya tahu shuffle mengubah struktur data yang mendasarinya dan tidak mengembalikan apa pun. Saya mencobanya, terima kasih. Judul (hitungan bahasa dan byte) ditulis oleh ProgramFOX. Tetapi ketika saya menggunakannya wcmemberi saya 109 mana yang terlalu banyak, jadi itu benar. Bagaimana Anda menghitung?
ბიმო

2

Perl 5, 40 byte

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

Jalankan tanpa opsi baris perintah, pemicu ditarik dengan menekan Enter.


2

Python, 81 Bytes

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

terinspirasi oleh solusi Ruby (51) dan Python


1

Common Lisp, 109

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

Tidak terlalu kompetitif, tapi saya suka daftar bundar:

(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 byte

42 byte + -popsi baris perintah. Cukup tekan enteruntuk memicu.

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

Terima kasih kepada Dom Hastings atas bantuannya! Jawaban asli adalah 67 byte:

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

Sebenarnya masalahnya -padalah bahwa ia akan keluar sebelum memanggil printpernyataan terakhir , tidak yakin mengapa. Saya sudah mencobanya. Selain itu, saran yang luar biasa, terima kasih! Pengetahuan saya terus bertambah ...
Codefun64

@HomHastings Juga, sayangnya, untuk beberapa alasan 0|trik tidak berfungsi seperti yang diharapkan, tapi saya mencukur beberapa byte darinya, pernyataan cetak dan pernyataan terakhir seperti yang Anda sarankan. Bagaimana tampilannya sekarang?
Codefun64

Sialan, kau bagus. Saya sarankan menempatkan itu sebagai jawaban Anda sendiri, karena Anda pasti menulis program yang lebih kecil daripada saya (Anda memiliki 40 byte dibandingkan dengan 67 asli saya!)
Codefun64

Saya menghargai penjelasannya! Selalu senang mempelajari lebih lanjut tentang bahasa skrip favorit saya! Saya bahkan tidak pernah tahu tentang kenaikan prefex, itu cukup mengagumkan. Terima kasih :)
Codefun64

Terima kasih banyak, senang telah membantu!
Dom Hastings

1

MATL , 41 byte

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

Untuk menarik pelatuk, masukkan string yang tidak kosong (seperti 'try' ).

Untuk mengakhiri, masukkan string kosong

Contohnya

Dalam hal ini pelatuk ditarik sekali dan ... nasib buruk:

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

Dalam hal ini pengguna berhenti (perhatikan input kosong terakhir) setelah dua lucky lucky:

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

Penjelasan

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

Perl 6 ,  58    53 byte

for ^6 .pick(*) {get;say <*BANG!* *click*>[?$_];!$_&&last} # 58 bytes

$ perl6 -pe '$///=^6 .pick;$_=$/--??"*click*"!!say("BANG!")&&last' # 52+1= 53 bytes

Tekan enter untuk menarik pelatuknya, atau ctrl + c untuk meletakkannya.


1

Python 2, 88 84 byte

Solusi ini terinspirasi oleh solusi python 3 yang sudah diberikan. Saya memilih python 2 untuk menghapus tanda kurung cetak meskipun ini mengubah perilaku input ().

import time
for i in[0]*int(time.time()%6)+[1]:input();print("*click*","*BANG!*")[i]
  • Saya menggunakan modulo waktu sebagai fungsi acak (cukup baik untuk roulette Rusia)
  • input pemain harus "i" kemudian Enter (jika tidak input () akan menimbulkan kesalahan), trik ini bergantung pada fakta bahwa input tersebut bisa "apa pun".

1

Ruby, 45 + 1 = 46

Tidak sepintar itu sisi-D tetapi sedikit lebih pendek.

Dengan bendera baris perintah p, jalankan

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

Pengguna dapat menarik pelatuk dengan kembali dan pergi dengan kontrol-c. pmenyebabkan program berjalan dalam satu lingkaran, membaca garis-garis dari STDIN dan mengeluarkan$_ . Setiap kali berjalan, itu bertambah$. . Jadi pada jalankan pertama, ia memilih bilangan bulat positif acak kurang dari 6, kemudian 5, lalu 4, dan seterusnya. Pada 0 pertama, kami output secara manual dan keluar, sampai saat itu kami output secara implisit.

(Dan sekarang saya perhatikan bahwa sudah ada Perl yang sangat mirip. Oh well.)


1

Perl 5, 69 51 49 byte

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

Mungkin ada beberapa potensi golf lagi, saya akan melihat ini.

Perubahan:

  • Disimpan 8 byte dengan menghapus $ldan beberapa titik koma, dan 10 byte dengan mengubah <STDIN>ke<>
  • Disimpan 2 byte berkat Oleg V. Volkov

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

@ OlegV.Volkov Terima kasih! Saya akan mengeditnya sekarang.
ASCIIThenANSI

0

VBA, 126 byte

Versi Golf untuk Minimal Bytes

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

Versi Menyenangkan yang Menjadikan Tombol Lebih Jelas untuk Peningkatan Penerimaan Pengguna.

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

Bersenang-senang dengan Formulir Kustom dan Anda bisa membuat Game yang cukup apik di VBA.


0

APL, 39/65 byte

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

Jawaban yang cukup mudah.


Apa arti dari dua byte?
Mego

0

C, 180 Bytes

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

Upaya pertama saya di kode golf, mungkin ada banyak ruang untuk perbaikan :)


0

Julia, 71 byte

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

Tekan Enteruntuk memecat atau Ctrl+ Cuntuk keluar. Yang terakhir berakhir dengan InterruptException.

Tidak Disatukan:

# 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 byte

q=io.read q()for i=2,math.random(6)do print"*click*"q()end print"*BANG!*"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.