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 p . 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.