Rosyjska ruletka, załadowano ponownie


32

Zagrajmy w rosyjską ruletkę!

Zwykle byłby to wyścig, aby napisać najkrótszy program MOD 6, ale nie jest to zbyt realistyczne, ponieważ szansa na wygraną maleje z każdym kliknięciem. Oto zasady:

  1. Emuluj prawdziwego sześciostrzałowca :
    • Pojedyncza kula jest umieszczana w jednej z sześciu komór, a lufa jest obracana raz, tylko przed rozpoczęciem gry.
    • Prawdopodobieństwo utraty na n -tego spróbować jest 1/6.
    • Szansa na przegraną po n próbach wynosi 1 / (6-n)
    • Masz gwarancję, że przegrasz co najwyżej 6 prób.
  2. Przegrywający:
    • Wyświetl tekst *BANG!*
    • Zakończ program.
  3. Zwycięski:
    • „Wygrana” oznacza, że ​​broń nie strzela, ale kula znajduje się o jedną komorę bliżej młota.
    • Wyświetl tekst *click*
    • Przedstaw „wyzwalacz” użytkownikowi wraz z możliwością zakończenia programu (np. „Ctrl + c”, patrz poniżej).
  4. Program specyficzny:
    • Pociągnięcie za spust jest formą wprowadzania danych przez użytkownika, w tym pierwszą próbą. (Może to być naciśnięcie klawisza, kliknięcie myszą, cokolwiek; monity tekstowe nie są wymagane).
    • Tylko jedna instancja programu jest dozwolona, ​​dopóki nie zostanie zakończona. (Uruchomienie nowej instancji programu przypomina dobre obracanie lufy, tzn. Prawdopodobieństwo utraty następnego kliknięcia jest resetowane do 1/6.)

Najkrótszy kod wygrywa!

Tabela liderów


3
Twoje założenia są błędne - szansa na przegraną przy n-tej próbie jest tylko ⅙, jeśli przerzucisz pociski po każdym strzale. Bez utraty szansy na przegraną jest ⅙ przy pierwszym strzale, ⅕ na drugim, ¼ na trzecim ... kończącym się na 1 na 6. Rozpoznajesz to dzięki „Gwarantujesz, że przegrasz co najwyżej 6 prób”.
rhialto

2
@ user2956063 zapominasz, że istnieje szansa (n-1) / 6, że nigdy nie osiągniesz n: tej próby, a zatem nie możesz przegrać. Wyrównują się do jednolitego 1/6.
Jacob Raihle,

2
może to różnica w sposobie, w jaki informatycy i statystycy wyrażają prawdopodobieństwo wtedy - dla mnie „Szansa na przegraną przy n-tej próbie wynosi ⅙”, powiedzmy, że jest stała - bez względu na to, czy n wynosi 1 czy 100.
rhialto

3
Dlaczego nie było to zatytułowane „Russian Roulette, Reloaded”?
Hand-E-Food,

1
@ user2956063: Twoje prawdopodobieństwa są warunkowe . P (przegrać przy strzale 2) = ⅙, ale P (przegrać przy strzale 2 | nie przegrał przy strzale 1) = ⅕. Ponadto njest (domyślnie przyznam ci) ograniczony do [1,6], więc 100 nie ma.
Tim Pederick,

Odpowiedzi:


3

Pyth, 23 bajty

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

Naprawdę proste. Losowa liczba iteracji 0–5 wyświetla kliknięcie i żądanie linii wprowadzania, a następnie huk na końcu.


1
cholera, pyt!
Cyoce,

+3 bajty: ostatni ciąg powinien być *BANG!*, a nieBANG
ayane

14

Rubinowy, 51 bajtów

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

Nie golfowany:

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

lub

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

Unngolfing zostawił czytelnikom. Nie takie trudne

  • Ponownie, podziękowania dla Martina, tym razem za podstęp $><<w putszamian.
  • Nie wyświetla nowych linii, ale nie było to wymagane.
  • Im krótszy, tym prostszy. Istotą wymaganego zachowania jest zrobienie 0-5 kliknięć, a następnie wystrzelenie. W tym celu dane wyjściowe są gromadzone w tablicy.
  • 2 kolejne bajty można zgolić, jeśli takie wyjścia "*click*"są w porządku (to, co jest wymagane, jest wydrukowane na końcu), zastępując $><<je . Nie byłem pewien, czy nadal będzie to zgodne z zasadami.

68 64 bajtów

(inne podejście)

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

Nie zastanawiałem się długo nad algorytmem (może być jeszcze bardziej zwarty, ale nie tak wyraźny), ale naprawdę podoba mi się model w nim:

  • Tablica emuluje beczkę, której elementy są zawartością komór. Ponieważ tylko jeden element jest kulą, obracanie go i tasowanie jest równoważne.
  • 0jest kulą. Inne liczby nie są.
  • findznajduje pierwszą zwracaną wartość, dla której blok nie jest falseani nil.
  • ||-wyrażenie jest domyślnie zwracane z bloku. Jest to zwarcie: zwraca pierwszy argument (o ile nie jest to nilani false) lub drugi (inaczej). Zwraca więc true(jeśli x<1lub, wyraźniej, ale dłużej x == 0) lub zwraca wartość puts, podczas gdy ...
  • putszawsze wraca nil. Tak.
  • getsżąda wprowadzenia danych. EnterWystarczy uderzenie .
  • Ctrl+ Ckończy program

Przekreślone 64 to normalne 64?
Cyoce,

@Cyoce uhm ... tak. Prawdopodobnie powinno być. Został zastąpiony powyższym wpisem, ale opiera się na innym pomyśle, więc zostawiłem je przekreślone.
D,

to była gra słów na to
Cyoce

@Cyoce och, przepraszam, pierwszy post i to wszystko, nie zdając sobie sprawy z lokalnej tradycji :)
D-side

9

JavaScript, 64 bajty

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

Wyjaśnienie

Aby pociągnąć za spust, wpisz dowolny tekst w monicie. Wpisz nic lub kliknij przycisk Anuluj, aby zakończyć.

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!*"nie jest większa niż 7. Ale NaNnie jest mniejsza niż 7.
Bergi

@Bergi To prawda. Przeredagowałem wyjaśnienie, aby było trochę jaśniejsze.
user81655,

6
@Bergi tylko w Javascripcie to stwierdzenie jest nawet bliskie sensu.
MikeTheLiar,

7

Lua, 82 75 bajtów

Dość długo, ale w lua jest dużo gadatliwości.

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

6

LabVIEW, 46 LabVIEW Prymitywy

Tworzy tablicę zer i jeden 1, ma pętlę czekającą na kliknięcia i wyświetla ciąg znaków. Początkowo mówi BANG, ponieważ zapomniałem zresetować wskaźnik przed jego uruchomieniem.

Pamiętaj też, że jest to gif, jeśli jeśli nie można go odtworzyć / załadować, otwórz stronę ponownie.


Nie wiem, co robisz, na "*click*"wypadek gdyby pistolet nie strzelał. Ponadto, czy generuje, "bang"czy "*BANG!*"?
Katenkyo,

to powinien być gif, ale dla mnie to nie gra, to może być problem. I tak, to tylko huk, to ja nie czytałem poprawnie, zmieniam to za sekundę
Eumel

głupie, że zapomniałem ponownie zainicjować ciąg znaków, aby go opróżnić przed rozpoczęciem, dlatego pokazuje BANG na początku ...
Eumel

Nie ma problemu, widziałem teraz gif, wygląda na to, że działa całkiem dobrze :)
Katenkyo

5

Pyth, 31 30 28 bajtów

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

Niemal na pewno można go poprawić. Wprowadź dowolną liczbę, aby pociągnąć za spust, puste wejście, aby zakończyć wcześniej (z błędem).

Wyjaśnienie:

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

Twój pierwszy jest w rzeczywistości krótszy, nie potrzebujesz końca ".
FryAmTheEggman,

@FryAmTheEggman Och, racja, zapomniałem o tym. Dzięki!
Klamka

Zauważyłem też coś głupiego, FN<any>wciąż całkowicie identycznego V<any>, co prawdopodobnie należy zmienić, aby nie mylić nowych golfistów ...: P
FryAmTheEggman

1
Możesz po prostu usunąć znaki .?. Nie ma potrzeby else.
Jakube,

@FryAmTheEggman mylący ludzie jest niesamowity. Filtrowanie zarośli może być niesamowite .
Cyoce,

5

Poważnie, 27 25 bajtów

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

Brak linku online, ponieważ nie ma możliwości zrobienia monitu za pomocą wprowadzania potokowego. Program może być CTRL-C'd w każdej chwili do kurczaka z wypowiedzenia.

Wyjaśnienie:

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

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

Wymaga -Fopcji wiersza poleceń, liczonej jako trzy. Spust jest pociągany przez naciśnięcie Enter.

Ponieważ -Fdosłownie uruchamia skrypt ponownie dla każdego wejścia (nie żartuję), diei tym podobne nie zostaną zakończone, więc zamiast tego wychodzimy z powodu pomijanego błędu wykonania @\n.


Przykładowe użycie

$ php -F primo-roulette.php

*click*
*click*
*BANG!*
$

4

Perl 5, 43 bajtów

Uruchom z perl -p. Stabilny wariant pocisku - tj. Pozycja pocisku jest ustalana tylko raz na samym początku.

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

Miły! Zmieniłbym nagłówek na „Perl 5.10+”, ponieważ używasz //=. Nie zapomnij również doliczyć -pswojego wyniku .
ThisSuitIsBlackNot

4

C, 110 74 72 bajty

Dzięki Dennisowi za pozbycie się dołączeń i znacznie mniej bajtów.

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

Cukierki , 36 bajtów

Około połowa programu to tekst do wydrukowania :(

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

długa forma:

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 bajtów

Również moja pierwsza próba golfa, także w Pythonie 3. Przysięgam, że Bruce i nie jestem tą samą osobą.

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

Nie golfowany:

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

Wygenerować losową liczbę od 0 do 5 włącznie, wydrukować kliknij że wiele razy, a następnie wydrukować huk . Naciśnij enter / return, aby pociągnąć za spust.


Idąc za przykładem Bruce'a, możesz zapisać kilka bajtów za pomocąfrom random import*
wnnmaw

O ile nie brakuje mi czegoś innego, to jeden bajt oszczędności. Ale wezmę to! Dzięki!
Steve Eckert,

Niezła próba, wykorzystałem twoje rozwiązanie jako inspirację dla mojego rozwiązania python 2 ^^
basile-henry

3

PlatyPar , 26 25 bajtów

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

Wyjaśnienie:

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

Wypróbuj online !


2

Emacs Lisp, 94 89 bajtów

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

Nie golfowany:

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

2

R, 86 80 77 bajtów

Jak zwykle, R ma niesamowite funkcje do kodowania gry w golfa, ale nazwy funkcji looooooong.

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

2

Python 2, 108 104 102 100 98 bajtów

Moja pierwsza próba gry w golfa:

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

Może powinienem dodać, że program nie kończy się poprawnie, gdy przegrasz, po prostu zgłasza wyjątek (co powoduje zakończenie):

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

Witamy w Programowaniu Puzzle i Code Golf! Kiedy opublikujesz odpowiedź na kod do golfa, podaj nazwę języka i liczbę bajtów (edytowałem ją tutaj). Dzięki!
ProgramFOX,

Tak, wielkie dzięki! W rzeczywistości próbowałem rozwiązać ten problem, ale nie udało mi się go poprawnie edytować przed tobą.
ბიმო

Dostaję twój bajt jako 112, czego użyłeś?
wnnmaw,

Możesz także zaoszczędzić 2 bajty, robiąca=shuffle([1,0,0,0,0,0])
wnnmaw

1
O ile wiem, losowo zmienia podstawową strukturę danych i nic nie zwraca. Tak czy inaczej, dzięki. Nagłówek (język i liczba bajtów) został napisany przez ProgramFOX. Ale kiedy wcgo używam , daje mi 109 za dużo, więc to prawda. Jak liczyć
ბიმო

2

Perl 5, 40 bajtów

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

Uruchom bez opcji wiersza poleceń, spust jest pociągany przez naciśnięcie Enter.


2

Python, 81 bajtów

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

zainspirowany rozwiązaniami Ruby (51) i 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*")))

Niezbyt konkurencyjny, ale lubię okrągłe listy:

(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 bajtów

42 bajty + -popcja wiersza poleceń. Naciśnij, enteraby uruchomić.

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

Dzięki Dom Hastings za pomoc! Oryginalna odpowiedź miała 67 bajtów:

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

W rzeczywistości problem -ppolegał na tym, że program kończy działanie przed wywołaniem ostatniego printpolecenia, nie jestem pewien, dlaczego. Próbowałem Poza tym niesamowite sugestie, dzięki! Moja wiedza wciąż rośnie ...
Codefun64,

@DomHastings Również niestety z jakiegoś powodu 0|sztuczka nie działała zgodnie z oczekiwaniami, ale ogoliłem z niej kilka bajtów, instrukcję print i ostatnią instrukcję, jak zasugerowałeś. Jak to teraz wygląda?
Codefun64,

@DomHastings Cholera, jesteś dobry. Polecam podanie tego jako własnej odpowiedzi, ponieważ zdecydowanie napisałeś mniejszy program niż ja (masz 40 bajtów w porównaniu do mojego oryginalnego 67!)
Codefun64

Doceniam wyjaśnienie! Zawsze chętnie dowiem się więcej o moim ulubionym języku skryptowym! Nigdy nawet nie wiedziałem o zwiększaniu liczby prefiksów, to całkiem niesamowite. Dzięki :)
Codefun64

Nie ma za co, cieszę się, że pomogłeś!
Dom Hastings,

1

MATL , 41 bajtów

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

Aby pociągnąć za spust, wprowadź niepusty ciąg (np. 'try').

Aby zakończyć, wprowadź pusty ciąg

Przykłady

W tym przypadku spust został pociągnięty raz i ... pech:

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

W tym przypadku użytkownik zatrzymał się (zwróć uwagę na ostatnie puste wejście) po dwóch szczęśliwych pociągnięciach:

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

Wyjaśnienie

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 bajtów

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

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

Naciśnij enter, aby pociągnąć za spust, lub ctrl + c, aby go odłożyć.


1

Python 2, 88 84 bajtów

To rozwiązanie jest inspirowane już podanymi rozwiązaniami w języku Python 3. Wybrałem python 2, aby usunąć nawias drukowany, mimo że zmienia to zachowanie input ().

import time
for i in[0]*int(time.time()%6)+[1]:input();print("*click*","*BANG!*")[i]
  • Używam modulo czasu jako funkcji losowej (wystarczającej dla rosyjskiej ruletki)
  • wejście odtwarzacza powinno być „i”, a następnie Enter (inaczej input () wyrzuci błąd), ta sztuczka polega na tym, że wejście może być „cokolwiek”.

1

Rubin, 45 + 1 = 46

Nie tak sprytny jak strona D, ale nieco krótszy.

Z flagą wiersza polecenia puruchom

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

Użytkownik może pociągnąć za spust z powrotem i wyjść z klawiszem Control-c. ppowoduje, że program działa w pętli, odczytuje wiersze ze STDIN i wyświetla $_. Za każdym razem, gdy działa, zwiększa się $.. Tak więc przy pierwszym uruchomieniu wybiera losową liczbę całkowitą dodatnią mniejszą niż 6, następnie 5, a następnie 4 itd. Przy pierwszym 0, wyprowadzamy dane ręcznie i kończymy, do tego czasu wyprowadzamy dane niejawnie.

(a teraz zauważam, że już istnieje bardzo podobny Perl. No cóż.)


1

Perl 5, 69 51 49 bajtów

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

Prawdopodobnie jest więcej możliwości gry w golfa, przyjrzę się temu.

Zmiany:

  • Zaoszczędzono 8 bajtów, usuwając $li niektóre średniki, oraz 10 bajtów, zmieniając <STDIN>na<>
  • Zaoszczędzono 2 bajty dzięki Olegowi V. Wołkowowi

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

@ OlegV.Volkov Thanks! Zmienię to teraz.
ASCIIThenANSI,

0

VBA, 126 bajtów

Wersja golfowa dla minimalnej ilości bajtów

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

Zabawna wersja, która sprawia, że ​​przyciski stają się bardziej przejrzyste w celu zwiększenia akceptacji użytkownika.

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

Trochę zabawy z niestandardowymi formularzami i możesz zrobić fajną grę w VBA.


0

APL, 39/65 bajtów

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

Dość prosta odpowiedź.


Co oznaczają te dwa bajty?
Mego

0

C, 180 bajtów

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

Moja pierwsza próba gry w golfa kodowego, prawdopodobnie jest dużo miejsca na ulepszenia :)


0

Julia, 71 bajtów

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

Naciśnij, Enteraby zwolnić, lub Ctrl+, Caby wyjść. Ten ostatni kończy się na InterruptException.

Nie golfowany:

# 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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.