Ruleta rusa

28

¡Escribe un programa que juegue a la ruleta rusa!

Si se inicia el programa,

  • debería haber una probabilidad de 5 en 6 de que termine normalmente después de imprimir "¡Sobreviví!"
  • debería haber una probabilidad de 1 en 6 de que el programa se bloquee. (falla de segmentación, etc.)

No hay entrada y no se permiten otras salidas.

La aleatoriedad debe ser justa: debe tener una distribución de probabilidad uniforme. Esto significa que una variable no inicializada (o un RNG sin semilla) MOD 6 no será suficiente.

Si la solución funciona con un solo sistema operativo / plataforma dedicado, recibirá una penalización de 6 bytes por puntaje.

El código más corto gana, no antes de 10 días después de la primera respuesta válida.

vsz
fuente
1
¿Podemos confiar en que el tiempo de ejecución subyacente sea justo, incluso si no está explícitamente garantizado en la documentación? Por ejemplo, Python randrange(5)podría implementarse como randrange(MAX_INT)%6.
Ugoren
Para inspirar creatividad, podría considerar otorgar un bono a aquellas soluciones que no dependen de la división por cero.
primo
Quizás dicho bono debería implicar dividir el puntaje entre 2.
Joe Z.
1
@JoeZeng: eso hubiera sido demasiado. Por lo general, puede convertirlo en un error diferente, como referencia de puntero nulo, etc. por el costo de unos pocos caracteres.
vsz
Veo. No tengo mucha experiencia en la creación de condiciones de puntaje para rompecabezas de golf de código, por lo que todavía estoy aprendiendo cosas así.
Joe Z.

Respuestas:

4

05AB1E , 13 12 bytes

6LΩiFë“IЖd!

-1 byte gracias a @Emigna .

05AB1E en realidad no debería ser capaz de error en absoluto, pero dado que la nueva versión de 05AB1E todavía tiene algunos problemas en comparación con la versión heredada, puedo aprovechar eso para equivocarme en este desafío.

Pruébalo en línea.

Explicación:

6L          # Create the list [1,2,3,4,5,6]
  Ω         # Get a random choice from this list
   i        # If it is 1:
    F       #  Do a ranged loop, which currently results in a "(RuntimeError) Could not
            #  convert  to integer." error when no argument is given
   ë        # Else:
    IЖd!  #  Push dictionary string "I survived!" (which is output implicitly as result)

Ver este consejo 05AB1E mío (sección Cómo usar el diccionario? ) Para entender por qué “IЖd!es "I survived!".

Kevin Cruijssen
fuente
Parece que 5ÝΩz“IЖd!debería funcionar, pero aparentemente 1 / 0 = 0.
Urna de pulpo mágico
1
@MagicOctopusUrn Sí, 05AB1E casi nunca comete errores ... Aparte del viejo y antiguo código incorporado .0que solía lanzar un error de división por 0 a STDERR en una versión anterior de 05AB1E, ni siquiera sé cómo cometer errores en el legado 05AB1E . Sin embargo, la nueva versión todavía tiene muchos errores, lo que aproveché para mi oportunidad aquí. ;)
Kevin Cruijssen
1
Echo de menos lo viejo .0, en más de una ocasión hizo que alguien dijera "Wat ... ¿Por qué es eso una orden?"
Urna de pulpo mágico
11

PHP 38 bytes

<?~$$s[rand(+$s=sssss,5)]?>I survived!

Colocando +antes de una cadena no numérica se evaluará a 0. Debería rand(0,5)volver 5, $s[rand(0,5)]será la cadena vacía (ya que $stiene solo cinco caracteres de longitud), y posteriormente $$s[rand(0,5)]será una variable no inicializada. Intentar realizar la inversión se detendrá en Tipo de operando no compatible. Cualquier otro valor 0-4volverá sy, como $sestá definido, sobrevivirá.

Nota: a partir de la versión 4.2.0 de php, el generador de números aleatorios se siembra automáticamente .

primo
fuente
6

R 30

"I survived!"[6*runif(1)<5||Z]

Una vez de cada seis, arrojará un error: Error: object 'Z' not found

flodel
fuente
6

Rubí, 24-28

p rand(6)<5?"I survived!":1/0

Aproximadamente cada 6 veces, hay un ZeroDivisionError

Incluso hay una versión más corta con 24 caracteres (Gracias a ugoren e histocrat):

6/rand(6);p"I survived!"

Si no acepta el "en la salida, entonces necesito 3 caracteres más. La primera opción ( puts) agrega una nueva línea, la segunda ( $><<) no hace nueva línea:

6/rand(6);puts"I survived!"
6/rand(6);$><<"I survived!"

Hay una pregunta sobre el número aleatorio en rubí en SO . La semilla con srandse llama automáticamente con la semilla desde la hora actual si aún no se ha llamado. (ver comentario de Julians )


Primo tuvo la idea de un bono extra para aquellas soluciones que no dependen de la división por cero .

Mi primera solución puede acortarse (28 caracteres) con un undefined local variable or method ``a' for main:Object (NameError)

p rand(6)<5?"I survived!":a
Knut
fuente
Puede ser incluso más corto con 6/rand(6).
Ugoren
¿Ruby siembra su RNG automáticamente?
vsz
Puede recortar otros tres caracteres eliminando el flujo de control:1/rand(6);p "I survived!"
histocrat
@ugoren / histocrat Gracias por sus sugerencias, adapté mi solución.
knut
Otro byte para usted: no se requiere espacio en blanco entre py "I survived!". Según mi cuenta, son solo 24 bytes.
primo
6

Dyalog APL - 25 22 21 20 Charachters

'I Survived!'⊣1÷6⊤?6

Imprime DOMAIN ERRORcomo el error, debido a la división por cero.

La solución de no división por cero más corta que se me ocurrió es de 23 caracteres.

('I Survived!'1)[~6⍷?6]

Arroja un INDEX ERROR

Pruébalo aquí

APL Font aquí

MrZander
fuente
Me gustaría aceptarlo, pero no parece funcionar. Algunas veces imprime " I survived", pero después de imprimir DOMAIN ERRORuna vez, sigue imprimiendo solo eso. Incluso si vuelvo a cargar el sitio por completo, nunca volverá a sobrevivir.
vsz
@vsz Qué extraño ... Funciona en mi Dyalog APL WS, y recuerdo haberlo probado con TryAPL cuando terminé. Todavía funciona en mi intérprete, pero no en el sitio web. Si esto ayuda: dl.dropbox.com/u/9086539/apl.png
MrZander
1
1÷0es un DOMAIN ERRORen Dyalog pero en ngn / apl lo es . El resultado de ?6es 1..6 cuando ⎕IO←1(predeterminado en Dyalog) y 0..5 cuando ⎕IO←0(única opción en ngn / apl). En Dyalog, el PRNG se puede sembrar configurando ⎕RL. Inicialmente tiene un valor predeterminado predeterminado. Si configura ⎕RL←0, el sistema operativo vuelve a sembrar PRNG de forma bastante impredecible. TryAPL está usando Dyalog y admite la ?función .
ngn
1
Es muy posible que algo haya cambiado en ese entonces, ocasionalmente estamos actualizando el software detrás de TryAPL o experimentando con las características del sitio web. ¿Estoy afiliado? Si te digo, tendré que matarte ... bueno, con una probabilidad de 1 ÷ 6 :)
ngn
1
Por cierto, aquí hay una solución de 18 caracteres: '¡Sobreviví!' ⊣ ÷ ⍟? 6
ngn
5

Python, 96

from ctypes import*
from random import*
randrange(5)or pointer(c_int())[9**9]
print'I survived!'

Si randrange(5)devuelve 0, Python se bloqueará debido a un error de segmentación.

grc
fuente
5

vba, 27

?1/int(6*rnd),"I Survived!"

utilizado en ventana inmediata.
En caso de fallo,
división por cero
aparece una ventana de error que indica:

SeanC
fuente
Falta el !en el texto.
steenslag
@steenslag, arreglado
SeanC
@SeanCheshire He ofrecido una alternativa a su respuesta.
Gaffi
5

Befunge - 48 caracteres

 v >91+"!devi"v
/?>?<v"I surv"<
 / / :
   :,_@#

La única aleatoriedad de Befunge es el ?operador, que te envía en una de las cuatro direcciones posibles ( 1/4posibilidad). Al bloquear una o dos direcciones, usted tiene 1/3o 1/2casualidad, y mediante la combinación de éstos, se obtiene 1/6la oportunidad de salir del programa "vivo".

El programa se bloquea al hacer una división por cero. Supongo que es específico de la implementación lo que sucederá (en Wikipedia dice que el programa debería pedir la respuesta deseada), pero befungee.py se bloquea o sale enojado:

$ for i in {1..6} ; do ./befungee.py roulette.befunge ; done
Error (1,2): integer division or modulo by zero
Error (3,2): integer division or modulo by zero
Error (1,2): integer division or modulo by zero
I survived!
Error (0,1): integer division or modulo by zero
I survived!
daniero
fuente
5

J, 18

'I survived!'[q:?6

Fallando con domain erroral tratar de factorizar 0.

randomra
fuente
¿J siembra su RNG automáticamente?
vsz
@vsz Sí, con ?. Se puede usar ?.para semilla fija.
randomra
4

C, 67 65 62 caracteres

rand()%8No pierde la justicia. La división se bloquea para t=0, da verdadero para 1 y 2 (reintento), da falso para 3..7 (sobrevivido).
EDITAR: La versión anterior utilizaba una variable temporal, que terminó siendo completamente innecesaria. 2/(rand()%8)implementa ambas condiciones necesarias.

main(){
        for(srand(time(0));2/(rand()%8););
        puts("I survived!");
}
Ugoren
fuente
Lo hace. "no se permiten otras salidas"
vsz
@vsz, de alguna manera lo perdí. Pero de todos modos, con gcc / Linux no imprime nada. Además, siguiendo estrictamente el estándar, este requisito es imposible, ya que un comportamiento indefinido puede imprimir cualquier cosa.
Ugoren
@vsz, arreglado ahora, sin salida adicional en ningún caso. También funciona con optimización, y 2 caracteres más cortos.
Ugoren
4

T-SQL 56 44 40 + 6

 if 1/cast(ceiling(rand()*6)-1as int)<2print'I Survived!'

Crédito Sean Cheshire por llamar al elenco como innecesario

 if 1/ceiling(rand()*6-1)<2print'I Survived!'

Acredite el mensaje personal de Sean Cheshire por la sugerencia de cambiar el techo al piso.

 if 1/floor(rand()*6)<1print'I Survived!'

Mensaje de error de muerte: Mensaje 8134, Nivel 16, Estado 1, Línea 3 Divide por cero error encontrado.

libre
fuente
1
-1y ceilingno son necesarios castse truncará
SeanC
Estoy probando si el techo se puede eliminar sin violar el requisito de distribución uniforme, los documentos dicen que rand () devuelve valores flotantes de 0 a 1.
cauteloso
Quería saber si el techo podría eliminarse de mi primera entrada. No pude determinar a partir de la documentación de T-SQL si la función rand () devolvería un 1 o no. Así que ejecuté un ciclo de aproximadamente 50 millones de veces probando la función rand (), ni una sola vez devolvió un 1. Pero, eliminar el techo de mi primera entrada aún sería de 47 bytes, por lo que mi segunda entrada aún es más corta. Mantenga el techo y retire el yeso.
Freewary
Dudo que hayas probado este script más de 20 veces. Esto no siempre devuelve el resultado esperado siempre. 1 en 6 esto fallará y no devolverá una salida. Esta sintaxis funcionará: 0 / floor (rand () * 6) = 0
t-clausen.dk
3

Javascript, 42

(Math.random()*6|0)?alert('i survived!'):b

El bit a bit o pisos el resultado de la multiplicación, por lo tanto, un valor entre 0 y 5 resultados. 0 se convierte implícitamente en falso, por lo que en 5 de 6 casos la alerta aparece en el sexto caso un ciertob se hace referencia a , lo que bloquea el proceso.

zaphod1984
fuente
3

Usando el método habitual de dividir por cero:

Perl 5.8 Versión

1/(int rand 6)&&print "I survived!"

Versión Perl 5.10

1/(int rand 6)&&say "I survived!"

En caso de falla, estos mostrarán:

Illegal division by zero at -e line 1.

Usando la función de bendición que se usa para crear objetos en perl.

Perl 5.8 Versión

print (int rand 6?"I survived!":bless me);

Versión Perl 5.10

say (int rand 6?"I survived!":bless me);

En caso de falla, estos mostrarán:

Can't bless non-reference value at -e line 1.
xxfelixxx
fuente
3
Algunas sugerencias: deshacerse de paréntesis, la lógica &&y el espacio extra use en ~~lugar de intforzar valores integrales. el resultado es el siguiente:1/~~rand 6;print"I survived!"
ardnew
3

GolfScript, 21 caracteres

,6rand/;'I survived!'

Como la mayoría de las respuestas, esta tiene una posibilidad entre seis de estrellarse con ZeroDivisionError. La solución más corta que podría administrar sin usar la división por cero es 23 caracteres:

5,6rand=+;'I survived!'

que tiene una probabilidad de 1/6 de chocar con undefined method `+' for nil:NilClass (NoMethodError) .

(Ps. Mientras desarrollaba esto, encontré lo que podría ser un error en el intérprete de GolfScript: el código 0,1>parece dejar un nilvalor en la pila, que luego bloqueará el programa si intenta hacer algo con ese valor, excepto abrirlo y deséchelo ;. Desafortunadamente, el hecho de que necesito usar el valor de alguna manera para provocar un bloqueo significa que incluso explotar este error no me ayudó a obtener menos de 23 caracteres).

Ilmari Karonen
fuente
Eso definitivamente parece un error. 5,5>deja []en la pila, que es probablemente lo que debería hacer, pero se 4,5>va nil. Si no lo elimina, el intérprete se bloqueará al intentar generarlo. Un efecto secundario interesante es que se 4,6rand>+;'I survived!'convierte en una solución válida. Alguien probablemente debería informar a Flagitious.
primo
1
Informé esto, y se ha solucionado (junto con otro error con el que me topé) en la última versión del intérprete de GolfScript.
Ilmari Karonen
3

Python, 70 caracteres

Con inspiración de la respuesta de grc.

from random import*
if randrange(5)<1:exec'()'*9**5
print'I survived!'

randrange (5) devuelve un valor entre 0 y 5.
Si devuelve un 0, Python se bloquea al intentar ejecutar (utear ) una cadena de código que contiene 9 ^ 5 conjuntos de paréntesis.

Joshua Sleeper
fuente
3

PHP - 30 bytes

<?rand(0,5)?:~[]?>I survived!

Requiere PHP 5.4+ para la sintaxis de matriz corta, idea de operador inválida robada descaradamente de @primo.

Como se indicó, rand()se siembra automáticamente en el primer uso .

Leigh
fuente
La división por cero no se detiene, solo produce una advertencia, así como el texto "¡Sobreviví!". Además, rand()%6no es una distribución uniforme, como 32768 = 2 (mod 6). Sin embargo, rand(0,5)||~$apara 30 bytes es, y además funcionará con todas las versiones de PHP (la segunda expresión en un ternario solo es opcional en 5.3.0+).
primo
@primo Supongo que solo estaba buscando el rastro de la pila cuando estaba comprobando la división entre cero, no noté que todavía estaba impreso. Sé que la taquigrafía ternaria es 5.3+, pero realmente no tengo interés en admitir versiones desactualizadas :)
Leigh
Con lo que estoy de acuerdo. No hay un argumento válido para continuar usando menos de 5.3 en este punto. 5.4, ​​todavía estoy esperando un número de revisión de dos dígitos.
primo
1
Cuento 29 bytes.
Titus
3

Befunge, 38

v>25*"!devivrus I",,,,,,,,,,,@
?^
v
?^
<1

Muy claro. El bloqueo se realiza presionando 1s en la pila hasta que se desborde. Hice algunos intentos de recortar esas 11 comas y reemplazarlas con un bucle más eficiente para imprimir todo, pero no pude obtener menos de 11 caracteres.

Tenga en cuenta que contar personajes en Befunge es un poco complicado ... Por ejemplo, solo hay un personaje en la tercera línea, pero estoy contando uno adicional allí ya que la ejecución podría viajar a través de esa ubicación.

Joe K
fuente
Creo que ese es el récord de las comas más consecutivas que he visto en un programa.
Joe Z.
Y luego miro cómo funciona realmente Befunge y me palmo la cara.
Joe Z.
2

CMD Shell (Win XP o posterior), 40 +6

Solo estoy haciendo esto porque DOS no es algo que deba pensarse para el golf de código, y el espacio en blanco es importante

set/a1/(%RANDOM% %% 6)&&echo I Survived!

En caso de falla, imprimirá

Dividir por cero error.

SeanC
fuente
2

R, 50 44 42 36

ifelse(!is.na(sample(c(NA,1:5),1)),'I Survived!',)

ifelse(floor(runif(1,0,5))>0,'I Survived!',)

ifelse(floor(runif(1,0,5)),'I Survived!',)

ifelse(sample(0:5,1),'I Survived!',)

Mensaje de error de muerte:

Error en ifelse (! Is.na (1 / sample (c (NA, 1: 5), 1)), "I Survived!",): Falta el argumento "no", sin valor predeterminado

libre
fuente
Traté de R, y no pude hacer que fallara - if(1/0)"I Survived!"todavía impreso I Survived
SeanC
A diferencia de otros lenguajes, R no considera que 1/0 sea un error matemático y no detiene la ejecución, solo devuelve inf para 1/0. Creo que @vsz quiere un error de última hora para esta ronda. Pero suponiendo que vsz contara a NA como el error de muerte, podría reducir mi programa a 41 caracteres: ifelse (muestra (c (NA, 1: 5), 1), 'I Survived',)
freewary
2

Emacs-Lisp, 42 caracteres

(if (= (random 6) 5) 
    z (message "I survived!")
    )
dualidad
fuente
2

Javascript, 40 caracteres

En Javascript, el truco de dividir por cero ni siquiera funciona: solo devuelve Infinity. Por lo tanto, haciendo referencia a una variable no existente:

alert(6*Math.random()|0?"I survived!":f)

No tan corto, aunque divertido :)

tomsmeding
fuente
2

PowerShell, 40 caracteres

IF(6/(Get-Random -Max 6)){'I Survived!'}

En caso de falla: "Intentó dividir por cero".

DBADon
fuente
Bienvenido a PPCG!
Laikoni
1
32 bytes
mazzy
31 bytes
Veskah
2

TI-BASIC (TI-84 + / SE), 36 bytes

startTmr→rand:1/(1<randInt(1,6:"I survived!

No hay entrada, como especifica el desafío.
La salida es I survived!si tiene éxito, un DIVIDE BY 0error de lo contrario.

La DIVIDE BY 0pantalla de error tiene el siguiente aspecto:

ERR:DIVIDE BY 0
1:Quit
2:Goto

Seleccionando cualquiera de las opciones (y volviendo a la pantalla de inicio si 2 está seleccionado) se muestraError después de la llamada del programa.

Ejemplos:

prgmCDGFE
           Error
prgmCDGFE
I survived!
prgmCDGFE
I survived!
prgmCDGFE
           Error

Explicación:

startTmr→rand:1/(1<randInt(1,6:"I survived!   ;full program

startTmr→rand                                 ;store the current time into "rand"
                                              ; this is necessary because "rand" is 0 after
                                              ; factory reset, the default state for TI-BASIC
                                              ; submissions
                   randInt(1,6                ;get a random integer in [1,6]
                 1<                           ;is greater than 1?  1 if true, 0 if false
              1/(                             ;divide 1 by the result
                                              ; throws "DIVIDE BY 0" error if result was
                                              ; false
                               "I survived!   ;leave this string in "Ans"
                                              ;implicitly print "Ans"

Notas:

  • TI-BASIC es un lenguaje tokenizado. El recuento de bytes no es igual al recuento de caracteres.

  • Las letras minúsculas son de dos bytes cada una.

    • Se pueden habilitar letras minúsculas usando este programa de ensamblaje.
  • startTmres un comando solo en las calculadoras TI-84 + y TI-84 + SE. Dichas calculadoras tienen diferentes sistemas operativos.

Tau
fuente
2

Python, 53 bytes

Aquí hay un breve programa de índice fuera de rango de 53 bytes de Python:

import time
[0][time.time()%6<1]
print("I survived!")
Alexander Wahlsten
fuente
Hola y bienvenidos Tenga en cuenta que en las reglas para este desafío, establece que "MOD 6 no será suficiente". Aunque no estoy familiarizado con Python, me parece que estás usando Modulo aquí.
Shaun Bebbers
1
@ShaunBebbers La cita es "Esto significa que una variable no inicializada (o un RNG sin semilla) MOD 6 no será suficiente", pero esta meta publicación dice que el módulo de tiempo actual es suficiente para un PRNG para golf de código
Stephen
Mi malentendido entonces.
Shaun Bebbers
1

Java, 149

public class R{public static void main(String[]s){int[]a={1,1,1,1,1};System.out.println(a[new java.util.Random().nextInt(7)]>0?"I survived!":"");}}

Falla con el error "Array fuera de límites". Se las arregló para afeitar algunos caracteres mediante el uso de objetos aleatorios anónimos (sin importaciones)

Noah
fuente
1

Groovy, 39

1/new Random().next(6);print"I survived!"

Selecciona un número aleatorio entre 0 y 5 inclusive. Si es 0, lanza una excepción dividir por cero.

Will Lp
fuente
1

Pitón (56), Haskell (77)

Esto se bloquea con un IndexError cuando el número generado es 1:

de importación aleatoria *
print ['Sobreviví!'] [1 / randint (1,7)]

La solución de Haskell tiene la misma idea:

Importar System.Random
main = putStrLn. (["¡Sobreviví!"] !!). div 1 = << randomRIO (1,6)
Hada lambda
fuente
1

Python, 59 55 53, 65 59 56

import os
1/(ord(os.urandom(1))%6)
print"I survived!"

ZeroDivisionErrorcuando se ord(os.urandom(1))%6evalúa a 0

import os
print(["I survived!"]*5)[ord(os.urandom(1))%6]

IndexErrorcuando se ord(os.urandom(1))%6evalúa a 5

Raufio
fuente
Ahorre 5 caracteres cambiando la importación: import random as rluego user.randint
Steven Rumbalski
1
O guarde 8 caracteres cambiando la importación a import os, luego use ord(os.urandom(1))%6como su int aleatorio.
Steven Rumbalski
Ahorre 1 personaje eliminando el espacio después print.
Steven Rumbalski
1

VBA - 39/46

No me encanta la salida numérica de Sean Cheshire (aunque sigue siendo una buena respuesta, técnicamente falla No input, and no other outputs are allowed.la especificación ...), además de que la usa /0, así que aquí están mis alternativas:

?Mid("I Survived!",IIf(Int(6*Rnd),1,0))

Esto se resuelve a Run-time error '5': Invalid procedurecuando se intenta alcanzar el carácter 0 (VBA es indexación basada en 1).

n="I Survived!":If Int(6*Rnd) Then ?n Else ?-n

Esto se resuelve en a Run-time error '13': Type mismatchcuando se aplica un interruptor negativo a una cadena.

Gaffi
fuente
1

Japt v1.4.5, 16 bytes

6ö
ªí
`I s¨viv!

Intentalo

-1 byte gracias a @Shaggy!

Emite TypeError: U.í is not a functioncuando un número aleatorio en el rango [0,6)es 0.

dana
fuente
1
17 bytes
Shaggy
En realidad, podría ser una idea usar v1.4.5 para esto, en caso de que ETH agregue un N.í()método a v1.4.6.
Shaggy
Actualizado: Japt se esfuerza por no bloquearse en programas extraños. Estaba tratando de descubrir cómo hacer referencia a una variable que no existía (se define AZ), pero no consideré llamar a un método que no existía.
dana
Sí, N.í()es mi "ir a" por arrojar un error (solía ser N.y()). Hay algunas otras formas de obtener un error, pero rara vez son útiles.
Shaggy
Ahora, ¿por qué no pensé en usar una tercera línea? : \
Shaggy