Ruleta Rusa, Recargada


32

¡Juguemos a la ruleta rusa!

Normalmente, esta sería una carrera para escribir el programa MOD 6 más corto, pero eso no es muy realista, ya que la probabilidad de ganar disminuye con cada clic. Estas son las reglas:

  1. Emule a un verdadero tirador de seis :
    • Se coloca una sola bala en una de las seis cámaras y se hace girar el cañón una vez, solo antes de jugar.
    • La posibilidad de perder en el n º intento es 1/6.
    • La posibilidad de perder después de n intentos es 1 / (6-n)
    • Le garantizamos que perderá, como máximo, 6 intentos.
  2. Perdiendo:
    • Mostrar el texto *BANG!*
    • Terminar el programa.
  3. Victorioso:
    • "Ganar" significa que el arma no dispara, pero la bala está una cámara más cerca del martillo.
    • Mostrar el texto *click*
    • Presente un "disparador" al usuario, junto con la capacidad de terminar el programa (por ejemplo, "ctrl + c", ver más abajo).
  4. Programa específico:
    • Apretar el gatillo es una forma de entrada del usuario, incluido el primer intento. (Esto puede ser una pulsación de tecla, un clic del mouse, lo que sea; no se requieren mensajes de texto).
    • Solo se permite una instancia del programa hasta que finalice. (Ejecutar una nueva instancia del programa es similar a darle un buen giro al barril, es decir, la probabilidad de perder en el siguiente clic se restablece a 1/6).

¡El código más corto gana!

Tabla de clasificación


3
Sus suposiciones están equivocadas: la posibilidad de perder en el enésimo intento es solo ⅙ si respira las balas después de cada disparo. Sin repetir, la posibilidad de perder es ⅙ en el primer tiro, ⅕ en el segundo, ¼ en el tercero ... terminando en 1 en el 6to. Reconoce esto con "Se garantiza que perderá, como máximo, 6 intentos".
rhialto

2
@ user2956063 se está olvidando de que existe una posibilidad (n-1) / 6 de que nunca llegue al n: ésimo intento y, por lo tanto, no puede perder. Se equilibran a un uniforme 1/6.
Jacob Raihle

2
tal vez esa es una diferencia en la forma en que los informáticos y los estadísticos expresan la probabilidad, entonces, para mí "La posibilidad de perder en el enésimo intento es ⅙" dice que es constante, ya sea que n sea 1 o 100.
rhialto

3
¿Por qué no se tituló "Ruleta Rusa, Recargada"?
Hand-E-Food

1
@ user2956063: sus probabilidades son condicionales . P (perder en el tiro 2) = ⅙, pero P (perder en el tiro 2 | no perdió en el tiro 1) = ⅕. Además, nestá (implícitamente, lo concederé) limitado a [1,6], por lo que 100 está fuera.
Tim Pederick

Respuestas:


3

Pyth, 23 bytes

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

Muy simple Un número aleatorio de iteraciones 0 - 5 muestra el clic y solicita una línea de entrada, seguida de una explosión al final.


1
maldita sea, pyth!
Cyoce

+3 bytes: la última cadena debería ser *BANG!*, noBANG
ayane

14

Ruby, 51 bytes

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

Sin golf:

[
  *(                        # 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 se fue para los lectores. No es tan dificil

  • Nuevamente, felicitaciones a Martin, esta vez por un truco $><<como putsreemplazo.
  • No genera nuevas líneas, pero eso no era obligatorio.
  • Cuanto más corto, más simple. La esencia del comportamiento requerido es hacer 0-5 clics y luego disparar. Para eso, las salidas se acumulan dentro de la matriz.
  • Se pueden eliminar 2 bytes más si las salidas como "*click*"están bien (lo que se requiere se imprime al final), reemplazándolo $><<por . No estaba seguro de si esto seguiría las reglas.

68 64 bytes

(otro enfoque)

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

No pensé mucho en el algoritmo (posiblemente puede ser aún más compacto, pero no tan claro), pero realmente me gusta el modelo que contiene:

  • Una matriz emula un barril con sus elementos como contenido de las cámaras. Como solo un elemento es una bala, rotarlo y barajarlo son equivalentes.
  • 0Es una bala. Otros números no lo son.
  • findencuentra un primer valor de retorno para el cual el bloque no es falseni nil.
  • ||-expresión se devuelve implícitamente desde el bloque. Es un cortocircuito: devuelve su primer operando (a menos que sea nilo false) o un segundo (de lo contrario). Por lo tanto, devuelve true(si x<1o, más claro pero más largo x == 0) o el valor de retorno de puts, mientras ...
  • putssiempre vuelve nil. Sí.
  • getssolicita entrada. Simplemente golpearEnter suficiente.
  • Ctrl+ Ctermina el programa

Tachado 64 es normal 64?
Cyoce

@Cyoce uhm ... sí. Debería ser, probablemente. Ha sido reemplazado por la entrada anterior, pero se basa en una idea diferente, así que los dejé tachados.
Lado D

fue un juego de palabras con esto
Cyoce

@Cyoce oh, perdón, primera publicación y todo eso, no estoy al tanto de la tradición local :)
D-side

9

JavaScript, 64 bytes

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

Explicación

Para apretar el gatillo, ingrese cualquier texto en la solicitud. No ingrese nada o haga clic en cancelar para finalizar.

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!*"no es mayor que 7. Pero NaNno es menor que 7.
Bergi

@Bergi That's true. I reworded the explanation to make it a bit clearer.
user81655

6
@Bergi only in Javascript does that statement come even close to making sense.
MikeTheLiar

7

Lua, 82 75 bytes

Pretty long, but there's lot of verbose in lua.

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

6

LabVIEW, 46 LabVIEW Primitives

Creates an Array of 0s and one 1, has a loop to wait for clicks and outputs the string. It initially says BANG becuase i forgot to reset the indicator before starting it.

Also note that this is a gif, if if does not play/load for you please reopen the page.


I don't see where you do the output of "*click*" in case the gun didn't shoot. Also, does it output "bang" or "*BANG!*"?
Katenkyo

this should be a gif but for me it doesnt play, that might be the problem. And yes it only puts bang, that was me not reading properly i change that in a sec
Eumel

stupid me forgot to reinitialize the string to empty before starting so thats why it showes BANG at the start...
Eumel

No problem, I saw the gif now, looks like it works pretty well :)
Katenkyo

5

Pyth, 31 30 28 bytes

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

Almost certainly can be improved. Input any number to pull the trigger, blank input to terminate early (with an error).

Explanation:

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

Your first one is actually shorter, you don't need the trailing".
FryAmTheEggman

@FryAmTheEggman Oh, right, forgot about that. Thanks!
Doorknob

Also, I've just noticed something silly, FN<any> is still entirely identical to V<any>, that should probably be changed to not confuse new golfers... :P
FryAmTheEggman

1
You can simply remove the chars .?. There is no need for an else.
Jakube

@FryAmTheEggman confusing people is awesome. It can be amazing at filtering out the scrubs.
Cyoce

5

En serio, 27 25 bytes

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

No hay enlace en línea porque no hay forma de hacer un aviso con entrada entubada. El programa puede ser CTRL-C'D en cualquier momento para salir de pollo terminate.

Explicación:

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

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

Requiere la -Fopción de línea de comando, contada como tres. El gatillo se aprieta presionandoEnter.

Porque -Fliteralmente ejecuta el script nuevamente para cada entrada (no es broma), diey similares no terminarán realmente, por lo que salimos por un error de tiempo de ejecución suprimido @\n.


Uso de muestra

$ php -F primo-roulette.php

*click*
*click*
*BANG!*
$

4

Perl 5, 43 bytes

Corre con perl -p. Variante de viñeta estable, es decir, la posición de la viñeta se decide solo una vez en el comienzo.

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

¡Agradable! Cambiaría el encabezado a "Perl 5.10+", ya que lo está usando //=. Además, no olvide contar -pen su puntaje .
ThisSuitIsBlackNot

4

C, 110 74 72 bytes

Gracias a Dennis por deshacerse de las inclusiones y muchos menos bytes.

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

Caramelo , 36 bytes

Aproximadamente la mitad del programa es el texto a imprimir :(

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

forma larga:

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 bytes

También mi primer intento de golf, también en Python 3. Juro que Bruce y yo no somos la misma persona.

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

Sin golf:

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

Genere un número aleatorio entre 0 y 5 inclusive, imprima clic tantas veces, luego imprima explosión . Presione enter / return para apretar el gatillo.


Siguiendo el ejemplo de Bruce, puede guardar algunos bytes confrom random import*
wnnmaw

A menos que haya algo más que me falta, es un byte de ahorro. ¡Pero lo tomaré! ¡Gracias!
Steve Eckert

Buen intento, utilicé tu solución como inspiración para mi solución de Python 2 ^^
basile-henry

3

PlatyPar , 26 25 bytes

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

Explicación:

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

Pruébalo en línea !


2

Emacs Lisp, 94 89 bytes

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

Sin golf:

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

2

R, 86 80 77 bytes

Como de costumbre, R tiene características increíbles para codificar el golf, pero nombres muuuuuuuuuuuuuuuuuu como largos.

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

2

Python 2, 108 104 102 100 98 bytes

Mi primer intento de jugar golf:

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

Tal vez debería agregar que el programa no finaliza correctamente cuando pierde, solo arroja una excepción (que resulta en la finalización):

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

¡Bienvenido a Programming Puzzles & Code Golf! Cuando publique una respuesta de código de golf, incluya el nombre del idioma y el recuento de bytes (lo edité para usted aquí). ¡Gracias!
ProgramFOX

Si muchas gracias! En realidad estaba tratando de resolver ese problema, no pude editarlo correctamente antes que tú.
ბიმო

Recibo tu byte como 112, ¿qué usaste?
wnnmaw

Además, puede guardar 2 bytes haciendoa=shuffle([1,0,0,0,0,0])
wnnmaw

1
Hasta donde yo sé, shuffle cambia la estructura de datos subyacente y no devuelve nada. Lo intenté, gracias de todos modos. El titular (idioma y número de bytes) fue escrito por ProgramFOX. Pero cuando lo uso wcme da 109 cuál demasiado, así que está bien. ¿Cómo cuentas?
ბიმო

2

Perl 5, 40 bytes

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

Correr sin opciones de línea de comandos, se aprieta el gatillo presionando Enter.


2

Python, 81 bytes

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

inspirado en las soluciones Ruby (51) y Python


1

Lisp común, 109

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

No es muy competitivo, pero me gustan las listas circulares:

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

42 bytes + -popción de línea de comando. Solo presione enterpara disparar.

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

¡Gracias a Dom Hastings por su ayuda! La respuesta original fue de 67 bytes:

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

En realidad, el problema -pera que saldría antes de llamar a la última printdeclaración, sin saber por qué. Lo he intentado Aparte de eso, sugerencias increíbles, ¡gracias! Mi conocimiento continúa creciendo ...
Codefun64

@DomHastings También, desafortunadamente, por alguna razón, el 0|truco no funcionó como se esperaba, pero eliminé algunos bytes, la declaración impresa y la última declaración como sugirió. ¿Cómo se ve ahora?
Codefun64

@DomHastings Maldición, eres bueno. Recomiendo poner eso como su propia respuesta, ya que definitivamente escribió un programa más pequeño que yo (¡tiene 40 bytes en comparación con mis 67 originales!)
Codefun64

Agradezco la explicación! ¡Siempre estoy feliz de aprender más de mi lenguaje de secuencias de comandos favorito! Nunca supe sobre el incremento de prefex, eso es bastante impresionante. Gracias :)
Codefun64

De nada, ¡me alegro de haber ayudado!
Dom Hastings

1

MATL , 41 bytes

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

Para apretar el gatillo, ingrese una cadena no vacía (como 'try' ).

Para terminar, ingrese una cadena vacía

Ejemplos

En este caso, el gatillo se apretó una vez y ... mala suerte:

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

En este caso, el usuario se detuvo (tenga en cuenta la entrada vacía final) después de dos intentos de suerte:

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

Explicación

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 bytes

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

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

Presione enter para apretar el gatillo, o ctrl + c para soltarlo.


1

Pitón 2, 88 84 bytes

Esta solución está inspirada en las soluciones de Python 3 ya dadas. Elegí python 2 para eliminar el paréntesis de impresión a pesar de que esto cambia el comportamiento de input ().

import time
for i in[0]*int(time.time()%6)+[1]:input();print("*click*","*BANG!*")[i]
  • Estoy usando el módulo del tiempo como una función aleatoria (lo suficientemente bueno para la ruleta rusa)
  • la entrada del jugador debe ser "i" y luego Enter (de lo contrario input () arrojará un error), este truco se basa en el hecho de que la entrada puede ser "lo que sea".

1

Rubí, 45 + 1 = 46

No es tan inteligente como el lado D pero es un poco más corto.

Con el indicador de línea de comando p, ejecute

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

El usuario puede apretar el gatillo con retorno y salir con control-c. phace que el programa se ejecute en un bucle, leyendo líneas de STDIN y generando resultados $_. Cada vez que se ejecuta, se incrementa$. . Entonces, en la primera ejecución, elige un entero positivo aleatorio menor que 6, luego 5, luego 4, y así sucesivamente. En el primer 0, salimos manualmente y salimos, hasta entonces salimos implícitamente.

(y ahora me doy cuenta de que ya hay un Perl muy similar. Oh, bueno.)


1

Perl 5, 69 51 49 bytes

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

Probablemente haya más potencial de golf, lo investigaré.

Cambios:

  • Se guardaron 8 bytes al eliminar $ly algunos puntos y comas, y 10 bytes al cambiar<STDIN> a<>
  • Guardado 2 bytes gracias a Oleg V. Volkov

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

@ OlegV.Volkov ¡Gracias! Lo editaré ahora.
ASCIIThenANSI

0

VBA, 126 bytes

Versión de golf para bytes mínimos

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ón divertida que hace que los botones sean más claros para una mayor aceptación del usuario.

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 poco de diversión con formularios personalizados y podrías hacer un bonito juego elegante en VBA.


0

APL, 39/65 bytes

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

Respuesta bastante directa.


¿Qué significan los recuentos de dos bytes?
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--;}}

Mi primer intento en el código de golf, probablemente hay mucho margen de mejora :)


0

Julia, 71 bytes

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

Presione Enterpara disparar o Ctrl+C para salir. Este último termina con un InterruptException.

Sin golf:

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

q=io.read q()for i=2,math.random(6)do print"*click*"q()end print"*BANG!*"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.