Russian Roulette, Reloaded


32

Giochiamo alla roulette russa!

Normalmente, questa sarebbe una corsa per scrivere il programma MOD 6 più breve, ma non è molto realistico, poiché la possibilità di vincere diminuisce ad ogni clic. Ecco le regole:

  1. Emula un vero tiratore a sei :
    • Un singolo proiettile viene posizionato in una delle sei camere e la canna viene fatta girare una volta, solo prima di giocare.
    • La possibilità di perdere il n ° prova è 1/6.
    • La possibilità di perdere dopo n tentativi è 1 / (6-n)
    • Sei garantito di perdere, al massimo, in 6 tentativi.
  2. perdere:
    • Visualizza il testo *BANG!*
    • Termina il programma.
  3. Vincente:
    • "Vincere" significa che la pistola non spara, ma il proiettile è una camera più vicino al martello.
    • Visualizza il testo *click*
    • Presenta un "trigger" per l'utente, insieme alla possibilità di terminare il programma (es. "Ctrl + c", vedi sotto).
  4. Programma specifico:
    • Premere il grilletto è una forma di input dell'utente, incluso il primo tentativo. (Questo può essere un tasto, un clic del mouse, qualunque cosa; i messaggi di testo non sono richiesti.)
    • È consentita solo un'istanza del programma fino alla sua conclusione. (Eseguire una nuova istanza del programma è simile a dare alla canna una buona rotazione, ovvero la probabilità di perdere al clic successivo viene ripristinata a 1/6.)

Vince il codice più corto!

Classifica


3
I tuoi presupposti sono sbagliati: la possibilità di perdere all'ennesimo tentativo è solo ⅙ se rispondi ai proiettili dopo ogni tiro. Senza rischiare la possibilità di perdere è ⅙ al primo tiro, ⅕ al secondo, ¼ al terzo ... che termina con 1 al 6 °. Lo riconosci con "Sei sicuro di perdere, al massimo, in 6 tentativi".
rhialto

2
@utente2956063 stai dimenticando che esiste una possibilità (n-1) / 6 che non raggiungi mai il tentativo n: th, e quindi non puoi perdere. Si bilanciano in uniforme 1/6.
Jacob Raihle,

2
forse questa è una differenza nel modo in cui gli informatici e gli statistici esprimono probabilità allora - per me "La possibilità di perdere all'ennesimo tentativo è ⅙" dire che è costante - che n sia 1 o 100.
rhialto

3
Perché questo non era intitolato "Russian Roulette, Reloaded"?
Hand-E-Food,

1
@ user2956063: le tue probabilità sono condizionate . P (perdi nel tiro 2) = ⅙, ma P (perdi nel tiro 2 | non ha perso nel tiro 1) = ⅕. Inoltre, n(implicitamente, ti garantirò) limitato a [1,6], quindi 100 è uscito.
Tim Pederick,

Risposte:


3

Pyth, 23 byte

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

Davvero semplice. Un numero casuale di iterazioni 0 - 5 visualizza il clic e richiede una riga di input, seguito da un botto alla fine.


1
accidenti a te, pit!
Cyoce,

+3 byte: l'ultima stringa dovrebbe essere *BANG!*, nonBANG
ayane il

14

Rubino, 51 byte

[*['*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.

o

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

Ungolfing è partito per i lettori. Non così difficile

  • Ancora complimenti a Martin, questa volta per un trucco con $><<come putssostituto.
  • Non genera nuove righe, ma ciò non era necessario.
  • Il più corto, il più semplice. L'essenza del comportamento richiesto è fare 0-5 clic e poi sparare. Per questo, gli output vengono accumulati all'interno dell'array.
  • Altri 2 byte possono essere eliminati se gli output come "*click*"sono a posto (ciò che è necessario è stampato alla fine), sostituendolo $><<con . Non ero sicuro che questo avrebbe ancora seguito le regole.

68 64 byte

(un altro approccio)

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

Non ho pensato molto all'algoritmo (può essere forse ancora più compatto, ma non così chiaro), ma mi piace molto il modello al suo interno:

  • Un array emula un barile con i suoi elementi come contenuti delle camere. Poiché solo un elemento è un proiettile, ruotarlo e mescolarlo sono equivalenti.
  • 0è un proiettile. Altri numeri non lo sono.
  • findtrova un primo valore di ritorno per il quale il blocco non è né falsenil.
  • ||-espressione viene restituita implicitamente dal blocco. È un corto circuito: restituisce il suo primo operando (a meno che non sia nilo false) o un secondo (altrimenti). Quindi restituisce true(se x<1o, più chiaro ma più a lungo x == 0) o il valore restituito di puts, mentre ...
  • putsritorna sempre nil. Sì.
  • getsrichiede input. Basta colpire Enter.
  • Ctrl+ Ctermina il programma

Barrato 64 è normale 64?
Cyoce,

@Cyoce uhm ... si. Dovrebbe essere, probabilmente. È stato sostituito dalla voce precedente, ma si basa su un'idea diversa, quindi li ho lasciati, cancellati.
Lato D il

era un gioco di
parole

@Cyoce oh, scusami, primo post e tutto il resto, non consapevole della tradizione locale :)
D-side

9

JavaScript, 64 byte

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

Spiegazione

Per premere il grilletto, immettere qualsiasi testo nel prompt. Non inserire nulla o fare clic su Annulla per terminare.

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!*"non è maggiore di 7. Ma NaNnon è inferiore a 7.
Bergi,

@Bergi È vero. Ho riformulato la spiegazione per renderla un po 'più chiara.
user81655

6
@Bergi solo in Javascript quell'affermazione si avvicina persino al senso.
MikeTheLiar,

7

Lua, 82 75 byte

Abbastanza a lungo, ma c'è molto prolisso in lua.

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

6

LabVIEW, 46 Primitive LabVIEW

Crea un array di 0 e uno 1, ha un loop per attendere i clic e genera la stringa. Inizialmente dice BANG perché ho dimenticato di resettare l'indicatore prima di avviarlo.

Nota anche che questa è una gif, se non viene riprodotta / caricata per te riaprire la pagina.


Non vedo dove esegui l'output "*click*"nel caso in cui la pistola non abbia sparato. Inoltre, produce "bang"o "*BANG!*"?
Katenkyo,

questo dovrebbe essere una gif ma per me non funziona, questo potrebbe essere il problema. E sì, mi fa solo scoppiare, che non stavo leggendo bene, lo cambio in un secondo
Eumel

stupido mi sono dimenticato di reinizializzare la stringa da svuotare prima di iniziare, ecco perché mostra BANG all'inizio ...
Eumel,

Nessun problema, ho visto la gif ora, sembra che funzioni abbastanza bene :)
Katenkyo,

5

Pyth, 31 30 28 byte

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

Quasi certamente può essere migliorato. Immettere un numero qualsiasi per premere il grilletto, input vuoto per terminare in anticipo (con un errore).

Spiegazione:

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

Il tuo primo è in realtà più corto, non hai bisogno del finale ".
FryAmTheEggman,

@FryAmTheEggman Oh, giusto, me ne sono dimenticato. Grazie!
Maniglia della porta

Inoltre, ho appena notato qualcosa di stupido, FN<any>è ancora del tutto identico V<any>, che probabilmente dovrebbe essere cambiato per non confondere i nuovi giocatori di golf ...: P
FryAmTheEggman

1
Puoi semplicemente rimuovere i caratteri .?. Non è necessario un else.
Jakube,

@FryAmTheEggman confondere le persone è fantastico. Può essere sorprendente filtrare gli scrub .
Cyoce,

5

Scherzi a parte, 27 25 byte

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

Nessun collegamento online perché non è possibile eseguire un prompt con input convogliato. Il programma può essere CTRL-C'D in qualsiasi momento per far finta di niente terminare.

Spiegazione:

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

Richiede l' -Fopzione della riga di comando, conteggiata come tre. Il grilletto viene premuto premendo Enter.

Perché -Fletteralmente corre di nuovo lo script per ogni ingresso (non scherzo), diee simili non sarà effettivamente terminare, così abbiamo uscita Via errore di runtime soppressa, invece, @\n.


Esempio di utilizzo

$ php -F primo-roulette.php

*click*
*click*
*BANG!*
$

4

Perl 5, 43 byte

Corri con perl -p. Variante di proiettile stabile - ovvero la posizione del proiettile viene decisa solo una volta all'inizio.

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

Bello! Vorrei cambiare l'intestazione in "Perl 5.10+", poiché stai usando //=. Inoltre, non dimenticare di contare -pnel tuo punteggio .
ThisSuitIsBlackNon

4

C, 110 74 72 byte

Grazie a Dennis per aver eliminato le inclusioni e molti meno 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

Candy , 36 byte

Circa metà del programma è il testo da stampare :(

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

forma lunga:

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

Anche il mio primo tentativo di golf, anche in Python 3. Giuro Bruce e non sono la stessa persona.

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

Genera un numero casuale compreso tra 0 e 5 inclusi, stampa quel clic più volte, quindi stampa bang . Premi Invio / Invio per premere il grilletto.


Seguendo l'esempio di Bruce, puoi salvare alcuni byte confrom random import*
wnnmaw il

A meno che non ci sia qualcos'altro che mi manca, è un byte di risparmio. Ma lo prenderò! Grazie!
Steve Eckert,

Bel tentativo, ho usato la tua soluzione come fonte d'ispirazione per la mia soluzione python 2 ^^
basile-henry

3

PlatyPar , 26 25 byte

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

Spiegazione:

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

Provalo online !


2

Emacs Lisp, 94 89 byte

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

Come al solito, R ha fantastiche funzionalità per codificare il golf ma nomi di funzioni incredibilmente lunghi.

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

2

Python 2, 108 104 102 100 98 byte

Il mio primo tentativo di giocare a golf:

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

Forse dovrei aggiungere che il programma non si interrompe correttamente quando si perde, genera solo un'eccezione (che si traduce in interruzione):

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

Benvenuto in Programmazione di puzzle e codice golf! Quando pubblichi una risposta di golf del codice, includi il nome della lingua e il conteggio dei byte (l'ho modificato per te qui). Grazie!
Programma FOX

Sì, grazie mille! In realtà stavo cercando di risolvere quel problema, non sono riuscito a modificarlo correttamente prima di te.
ბიმო

Ottengo il conteggio dei byte come 112, che cosa hai usato?
wnnmaw,

Inoltre, puoi salvare 2 byte facendoa=shuffle([1,0,0,0,0,0])
wnnmaw il

1
Per quanto ne so shuffle cambia la struttura dei dati sottostanti e non restituisce nulla. Ci ho provato, grazie comunque. Il titolo (lingua e conteggio dei byte) è stato scritto da ProgramFOX. Ma quando lo uso wcmi dà 109 quale troppo, quindi è giusto. Come si conta?
ბიმო

2

Perl 5, 40 byte

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

Esegui senza opzioni della riga di comando, il grilletto viene premuto premendo Enter.


2

Python, 81 byte

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

ispirato alle soluzioni Ruby (51) e Python


1

Lisp comune, 109

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

Non molto competitivo, ma mi piacciono gli elenchi circolari:

(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 + -popzione della riga di comando. Basta premere enterper attivare.

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

Grazie a Dom Hastings per il suo aiuto! La risposta originale era di 67 byte:

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

In realtà il problema -pera che sarebbe uscito prima di chiamare l'ultima printaffermazione, non so perché. L'ho provato A parte questo, fantastici suggerimenti, grazie! La mia conoscenza continua a crescere ...
Codefun64,

@DomHastings Inoltre, sfortunatamente, per qualche ragione il 0|trucco non ha funzionato come previsto, ma ho eliminato alcuni byte da esso, la dichiarazione di stampa e l'ultima istruzione come hai suggerito. Com'è adesso?
Codefun64

@DomHastings Accidenti, sei bravo. Ti consiglio di inserirlo come risposta personale, dato che hai sicuramente scritto un programma più piccolo di me (hai 40 byte rispetto al mio 67 originale!)
Codefun64

Apprezzo la spiegazione! Sempre felice di saperne di più sul mio linguaggio di scripting preferito! Non ho mai nemmeno saputo dell'incremento prefex, è davvero fantastico. Grazie :)
Codefun64

Sei il benvenuto, felice di averti aiutato!
Dom Hastings,

1

MATL , 41 byte

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

Per premere il grilletto, inserisci una stringa non vuota (come 'try').

Per terminare, inserire una stringa vuota

Esempi

In questo caso il grilletto è stato premuto una volta e ... sfortuna:

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

In questo caso l'utente si è fermato (notare l'input vuoto finale) dopo due tiri fortunati:

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

Spiegazione

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

Premi Invio per premere il grilletto o ctrl + c per metterlo giù.


1

Python 2, 88 84 byte

Questa soluzione si ispira alle soluzioni Python 3 già fornite. Ho scelto Python 2 per rimuovere la parentesi di stampa anche se questo cambia il comportamento di input ().

import time
for i in[0]*int(time.time()%6)+[1]:input();print("*click*","*BANG!*")[i]
  • Sto usando il modulo del tempo come una funzione casuale (abbastanza buono per la roulette russa)
  • l'input del giocatore dovrebbe essere "i" quindi Enter (altrimenti input () genererà un errore), questo trucco si basa sul fatto che l'input può essere "qualunque".

1

Rubino, 45 + 1 = 46

Non intelligente come il lato D ma leggermente più corto.

Con flag della riga di comando p, eseguire

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

L'utente può premere il grilletto con il ritorno e partire con control-c. pfa sì che il programma venga eseguito in un ciclo, leggendo le righe da STDIN e producendo $_. Ogni volta che viene eseguito, aumenta $.. Quindi al primo avvio, sceglie un numero intero positivo casuale inferiore a 6, quindi 5, quindi 4 e così via. Sul primo 0, eseguiamo l'output manuale e usciamo, fino ad allora abbiamo output implicito.

(e ora noto che esiste già un Perl molto simile. Vabbè.)


1

Perl 5, 69 51 49 byte

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

Probabilmente c'è un po 'più di potenziale per il golf, esaminerò questo.

I cambiamenti:

  • Salvato 8 byte rimuovendo $le alcuni punti e virgola e 10 byte cambiando <STDIN>in<>
  • Salvato 2 byte grazie a Oleg V. Volkov

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

@ OlegV.Volkov Grazie! Lo modificherò ora.
ASCIIThenANSI

0

VBA, 126 byte

Versione golf per byte minimi

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

Versione divertente che rende i pulsanti più chiari per una maggiore accettazione da parte dell'utente.

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

Un po 'di divertimento con moduli personalizzati e potresti creare un bel gioco Slick in VBA.


0

APL, 39/65 byte

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

Risposta piuttosto semplice.


Cosa significano i conteggi a due byte?
Mego

0

C, 180 byte

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

Il mio primo tentativo di code golf, probabilmente c'è molto margine di miglioramento :)


0

Julia, 71 byte

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

Premi Enterper sparare o Ctrl+ Cper uscire. Quest'ultimo termina con un InterruptException.

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 byte

q=io.read q()for i=2,math.random(6)do print"*click*"q()end print"*BANG!*"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.