Roleta russa


28

Escreva um programa que jogue roleta russa!

Se o programa for iniciado,

  • deve haver uma chance de 5 em 6 de terminar normalmente após a impressão "Eu sobrevivi!"
  • deve haver uma chance de 1 em 6 do programa travar. (falha de segmentação etc.)

Nenhuma entrada e nenhuma outra saída é permitida.

A aleatoriedade deve ser justa: deve ter uma distribuição de probabilidade uniforme. Isso significa que uma variável não inicializada (ou um RNG sem semente) MOD 6 não será suficiente.

Se a solução funcionar com apenas um sistema operacional / plataforma dedicado, você receberá uma penalidade de 6 bytes na pontuação.

O código mais curto vence, não antes de 10 dias após a primeira resposta válida.


1
Podemos confiar no tempo de execução subjacente para ser justo, mesmo que não seja explicitamente garantido na documentação? Por exemplo, o Python randrange(5)pode ser implementado como randrange(MAX_INT)%6.
— ugoren

Para inspirar criatividade, considere conceder um bônus às soluções que não dependem da divisão por zero.
— primo

Talvez o referido bônus deva envolver dividir a pontuação por 2.
— Joe Z.

1
@ JoeZeng: isso teria sido demais. Geralmente, você pode cometer um erro diferente, como referência de ponteiro nulo etc., pelo custo de apenas alguns caracteres.
— vsz 15/02

Entendo. Não tenho muita experiência na criação de condições de pontuação para quebra-cabeças de código de golfe, então ainda estou aprendendo coisas assim.
— Joe Z.

Respostas:


4

05AB1E , 13 12 bytes

6LΩiFë“IЖd!

-1 byte graças a @Emigna .

O 05AB1E, na verdade, não deve ser capaz de errar, mas como a nova versão do 05AB1E ainda tem alguns problemas em comparação com a versão herdada, posso aproveitar isso para tirar proveito desse erro.

Experimente online.

Explicação:

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)

Veja esta dica 05AB1E meu (seção Como usar o dicionário? ) Para entender por que “IЖd!é "I survived!".


Parece que 5ÝΩz“IЖd!deve funcionar, mas aparentemente 1 / 0 = 0.
— Magic Octopus Urn

1
@MagicOctopusUrn Sim, 05AB1E quase nunca erros .. Além do bastante antigo, .0que costumava lançar uma divisão por 0 erro para STDERR em uma versão antiga do 05AB1E, eu nem sei como errar no legado 05AB1E . A nova versão ainda apresenta muitos erros, que eu aproveitei aqui. ;)
— Kevin Cruijssen

1
Sinto falta do antigo .0, em mais de uma ocasião ele fez alguém dizer "Wat ... Por que isso é um comando?"
— Magic Octopus Urn

11

PHP 38 bytes

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

A colocação de um +antes de uma sequência não numérica será avaliada como 0. Deve rand(0,5)retornar 5, $s[rand(0,5)]será a cadeia vazia (já que $spossui apenas cinco caracteres) e, posteriormente $$s[rand(0,5)], será uma variável não inicializada. A tentativa de inversão será interrompida no tipo de operando não suportado. Qualquer outro valor 0-4retornará se, como $sé definido, você sobreviverá.

Nota: a partir da versão 4.2.0 do php, o gerador de números aleatórios é propagado automaticamente .


6

R 30

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

Uma vez em cada seis, lançará um erro: Error: object 'Z' not found


6

Ruby, 24-28

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

Aproximadamente a cada 6 vezes, há uma ZeroDivisionError

Existe ainda uma versão mais curta, com 24 caracteres (Graças a ugoren e histocrat):

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

Se você não aceitar a "saída, preciso de mais 3 caracteres. A primeira opção ( puts) adiciona uma nova linha, a segunda ( $><<) não cria uma nova linha:

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

Há uma pergunta sobre número aleatório em ruby ​​no SO . A semente com srandé automaticamente chamada com a semente do momento atual, se ainda não foi chamada. (veja o comentário de Julians )


Primo teve a idéia de um bônus extra para as soluções que não dependem da divisão por zero .

Minha primeira solução pode ser reduzida (28 caracteres) com um undefined local variable or method ``a' for main:Object (NameError)

p rand(6)<5?"I survived!":a

Pode ser ainda mais curto com 6/rand(6).
— ugoren

O Ruby semeia seu RNG automaticamente?
— vsz

Você pode aparar outros três caracteres removendo o fluxo de controle:1/rand(6);p "I survived!"
— histocrat

@ugoren / histocrat Obrigado por suas dicas, adaptei minha solução.
— Knut

Outro byte para você: nenhum espaço em branco é necessário entre pe "I survived!". Pela minha conta, são apenas 24 bytes.
— Primo

6

Dyalog APL - 25 22 21 20 Caracteres

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

Imprime DOMAIN ERRORcomo o erro, devido à divisão por zero.

A menor solução sem divisão por zero que eu pude apresentar é de 23 caracteres.

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

Lança um INDEX ERROR

Experimente aqui

Fonte APL aqui


Eu gostaria de aceitá-lo, mas não parece funcionar. Algumas vezes imprime " I survived", mas após a impressão DOMAIN ERRORuma vez, continua imprimindo apenas isso. Mesmo se eu recarregar o site completamente, ele nunca mais sobreviverá.
— vsz

@vsz Que estranho ... Funciona no meu Dyalog APL WS e lembro de tê-lo testado com o TryAPL quando terminei. Ainda funciona no meu intérprete, mas não no site. Se isso ajudar: dl.dropbox.com/u/9086539/apl.png
— MrZander

1
1÷0é um DOMAIN ERRORem Dyalog, mas em ngn / apl é ∞. O resultado ?6é 1..6 quando ⎕IO←1(padrão no Dyalog) e 0..5 quando ⎕IO←0(somente opção em ngn / apl). No Dyalog, o PRNG pode ser semeado por configuração ⎕RL. Inicialmente, ele possui algum valor padrão predeterminado. Se você definir ⎕RL←0, o PRNG será reinicializado de forma bastante imprevisível pelo sistema operacional. O TryAPL está usando o Dyalog e suporta a ?função .
— NGN

1
É bem possível que algo tenha sido alterado na época; ocasionalmente, estamos atualizando o software por trás do TryAPL ou experimentando os recursos do site. Sou afiliado? Se eu te disser, terei que matá-lo ... bem, com uma probabilidade de 1 ÷ 6 :) #
— 1212 de ngn

1
By the way, aqui está uma solução de 18 caracteres: 'Eu sobrevivi!' ⊣ ÷ ⍟ 6?
— NGN

5

Python, 96

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

Se randrange(5)retornar 0, o python travará devido a uma falha de segmentação.



5

Befunge - 48 caracteres

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

A única aleatoriedade de Befunge é o ?operador, que o envia em uma das quatro direções possíveis ( 1/4chance). Ao bloquear uma ou duas direções, você tem 1/3ou 1/2chance e, combinando-as, terá a 1/6chance de sair do programa "vivo".

O programa falha ao fazer uma divisão por zero. Eu acho que é específico da implementação o que vai acontecer (na Wikipedia, ele diz que o programa deve pedir a resposta desejada), mas o befungee.py meio que falha ou sai com raiva:

$ 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!

5

J, 18

'I survived!'[q:?6

Falha domain errorao tentar fatorar 0.


J semeia seu RNG automaticamente?
— vsz 15/02

@ vsz Sim, com ?. Você pode usar ?.para semente fixa.
— randomra

4

C, 67 65 62 caracteres

rand()%8não perde a justiça. A divisão falha para t=0, dá verdadeiro para 1 e 2 (nova tentativa), dá falso para 3..7 (sobrevivido).
EDIT: A versão anterior usava uma variável temporária, que acabou completamente desnecessária. 2/(rand()%8)implementa as duas condições necessárias.

main(){
        for(srand(time(0));2/(rand()%8););
        puts("I survived!");
}

Faz. "nenhuma outra saída é permitida"
— vsz 25/11/12

@ VSZ, de alguma forma perdeu. De qualquer forma, com o gcc / Linux, ele não imprime nada. Além disso, seguindo rigorosamente o padrão, esse requisito é impossível, porque um comportamento indefinido pode imprimir qualquer coisa.
— Ugoren

@ vsz, corrigido agora - sem saída extra em nenhum caso. Também funciona com otimização e 2 caracteres mais curtos.
— Ugoren

4

T-SQL 56 44 40 + 6

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

Crédito a Sean Cheshire por chamar o elenco de desnecessário

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

Dê crédito a uma mensagem pessoal de Sean Cheshire pela sugestão de mudar o teto para o chão.

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

Death Err Msg: Msg 8134, Nível 16, Estado 1, Linha 3 Divida pelo erro zero encontrado.


1
-1e ceilingnão são necessários. castserá truncado
— SeanC 28/11

Estou testando se teto pode ser removido sem violar a exigência de uma distribuição uniforme, os documentos dizem que rand () retorna flutuar valores de 0 a 1.
— freewary

Eu queria saber se o teto poderia ser removido da minha primeira entrada. Não consegui determinar a partir da documentação do T-SQL se a função rand () retornaria 1 ou não. Então, eu executei um loop cerca de 50 milhões de vezes testando a função rand (), mas nunca retornou um 1. Mas, remover o teto da minha primeira entrada ainda seria de 47 bytes, portanto minha segunda entrada ainda é mais curta. Mantenha o teto e remova o molde.
— freewary

Duvido que você tenha testado esse script mais de 20 vezes. Isso nem sempre retorna o resultado esperado sempre. 1 em 6 isso falhará e não retornará uma saída. Esta sintaxe funcionará: 0 / floor (rand () * 6) = 0
— t-clausen.dk

3

Javascript, 42

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

O bit a bit ou calcula o resultado da multiplicação, resultando em um valor entre 0 e 5. 0 é implicitamente convertido em falso; portanto, em 5 de 6 casos, o alerta aparece no 6º caso em que um certo bé referenciado, travando o processo.


3

Usando o método habitual de divisão por zero:

Versão Perl 5.8

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

Versão Perl 5.10

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

Na falha, estes serão exibidos:

Illegal division by zero at -e line 1.

Usando a função bless, usada para criar objetos em perl.

Versão Perl 5.8

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

Versão Perl 5.10

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

Na falha, estes serão exibidos:

Can't bless non-reference value at -e line 1.

3
algumas sugestões: livre-se dos parênteses, do lógico &&e do espaço extra. use em ~~vez de intpara forçar valores integrais. O resultado é este:1/~~rand 6;print"I survived!"
— ardnew

3

GolfScript, 21 caracteres

,6rand/;'I survived!'

Como a maioria das respostas, essa tem uma chance em seis de travar com um ZeroDivisionError. A solução mais curta que eu poderia gerenciar sem usar a divisão por zero é 23 caracteres:

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

que tem 1/6 de chance de falhar undefined method `+' for nil:NilClass (NoMethodError).

(Obs. Ao desenvolver isso, descobri o que poderia ser um erro no intérprete GolfScript: o código like 0,1>parece deixar um nilvalor na pilha, que travará o programa mais tarde se você tentar fazer algo com esse valor, exceto desativá-lo e jogá-lo fora com ;. Infelizmente, o fato de que eu preciso para usar o valor de alguma forma para acionar meios de acidente que mesmo exploram esse bug não me ajudar a ficar abaixo de 23 caracteres.)


Definitivamente, isso parece um bug. 5,5>deixa []na pilha, o que provavelmente é o que deve fazer, mas 4,5>deixa nil. Se você não removê-lo, o intérprete travará ao tentar produzi-lo. Um efeito colateral interessante é que 4,6rand>+;'I survived!'se torna uma solução válida. Alguém provavelmente deve informar Flagitious.
— Primo

1
Eu relatei isso, e ele foi corrigido (junto com outro bug que encontrei) na versão mais recente do interpretador GolfScript.
— Ilmari Karonen

3

Python, 70 caracteres

Com inspiração na resposta do grc.

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

randrange (5) retorna um valor entre 0 e 5.
Se retornar 0, o Python trava ao tentar executar (ute) uma sequência de códigos que contém 9 ^ 5 conjuntos de parênteses.


3

PHP - 30 bytes

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

Requer PHP 5.4+ para a sintaxe de matriz curta, ideia de operador inválida roubada descaradamente do @primo.

Como afirmado, rand()é automaticamente propagado no primeiro uso .


A divisão por zero não pára, apenas produz um aviso, bem como o texto 'Eu sobrevivi!'. Além disso, rand()%6não é uma distribuição uniforme, como 32768 = 2 (mod 6). No entanto, rand(0,5)||~$apara 30 bytes é e, adicionalmente, funcionará com todas as versões do PHP (a segunda expressão em um ternário é apenas opcional no 5.3.0+).
— Primo

@primo Acho que eu estava procurando apenas o rastreamento da pilha quando estava verificando a divisão por zero, mas não percebi que ainda estava impresso. Eu sei que a taquigrafia ternário é 5.3+, mas eu realmente não tenho interesse em apoiar muito tempo fora de versões data :)
— Leigh

Com quem eu concordo. Não há argumento válido para continuar usando menos de 5,3 neste momento. 5.4, ​​ainda estou esperando um número de revisão de dois dígitos.
— Primo

1
Eu conto 29 bytes.
— Titus

3

Befunge, 38

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

Bem direto. O travamento é feito pressionando 1s na pilha até ela transbordar. Fiz algumas tentativas de cortar essas 11 vírgulas e substituí-las por um loop mais eficiente para imprimir tudo, mas não consegui obtê-lo com menos de 11 caracteres.

Observe que a contagem de caracteres no Befunge é um pouco complicada ... Por exemplo, há apenas um caractere na terceira linha, mas estou contando um extra lá, já que a execução pode percorrer esse local.


Acredito que esse seja o recorde das vírgulas mais consecutivas que já vi em um programa.
— Joe Z.

E então eu olho para cima como Befunge realmente funciona e apalpe meu rosto.
— Joe Z.

2

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

Só estou fazendo isso porque o DOS não é algo que deva ser pensado para o código de golfe, e o espaço em branco é importante

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

Na falha, ele será impresso

Divida pelo erro zero.


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!',)

Mensagem de erro de morte:

Erro no ifelse (! Is.na (1 / sample (c (NA, 1: 5), 1)), "I Survived!",): O argumento "no" está ausente, sem padrão


Eu tentei o R e não consegui fazê-lo falhar - if(1/0)"I Survived!" ainda impresso I Survived #
— SeanC

Diferentemente de outras linguagens, R não considera 1/0 um erro de matemática e não interrompe a execução, apenas retorna inf para 1/0. Acho que o @vsz quer um erro de quebra para esta rodada. Mas, supondo que o vsz contasse NA como erro de morte, eu poderia reduzir meu programa para 41 caracteres: ifelse (exemplo (c (NA, 1: 5), 1), 'I Survived'))
— freewary

2

Emacs-Lisp, 42 caracteres

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

2

Javascript, 40 caracteres

Em Javascript, o truque da divisão por zero nem funciona: ele retorna o Infinity. Portanto, referenciando uma variável inexistente:

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

Não é tão curto, embora divertido :)



2

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

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

Não há entrada, como o desafio especifica.
A saída é I survived!bem-sucedida, umDIVIDE BY 0 caso contrário erro.

A DIVIDE BY 0tela de erro é semelhante à seguinte:

ERR:DIVIDE BY 0
1:Quit
2:Goto

Selecionar uma das opções (e retornar à tela inicial, se 2estiver selecionada) é exibida Errorapós a chamada do programa.

Exemplos:

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

Explicação:

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 é uma linguagem tokenizada. A contagem de bytes não é igual à contagem de caracteres.

  • Letras minúsculas são dois bytes cada.

    • Letras minúsculas podem ser ativadas usando este programa de montagem.
  • startTmré um comando apenas nas calculadoras TI-84 + e TI-84 + SE. As referidas calculadoras possuem diferentes sistemas operacionais.


2

Python, 53 bytes

Aqui está um pequeno programa fora do intervalo do índice python de 53 bytes:

import time
[0][time.time()%6<1]
print("I survived!")

Olá e bem vindo. Observe que nas regras deste desafio, ele declara "O MOD 6 não será suficiente". Embora eu não esteja familiarizado com o Python, parece-me que você está usando o Modulo aqui.
— Shaun Bebbers

1
@ShaunBebbers A citação é "Isso significa que uma variável não inicializada (ou um RNG sem semente) MOD 6 não será suficiente", mas esta meta post diz que o módulo de tempo atual é suficiente para um PRNG para código-golfe
— Stephen

Meu mal entendido então.
— 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!":"");}}

Falha com o erro "Matriz fora dos limites". Conseguiu barbear alguns caracteres usando o objeto Random anônimo (sem importações).


1

Groovy, 39

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

Seleciona um número aleatório entre 0 e 5, inclusive. Se 0, lança uma exceção de divisão por zero.


1

Python (56), Haskell (77)

Isso trava com um IndexError quando o número gerado é 1:

de importação aleatória *
print ['Eu sobrevivi!'] [1 / randint (1,7)]

A solução Haskell tem a mesma idéia:

import System.Random
main = putStrLn. (["Eu sobrevivi!"] !!). div 1 = << randomRIO (1,6)

1

Python, 59 55 53, 65 59 56

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

ZeroDivisionErrorquando ord(os.urandom(1))%6avalia para 0

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

IndexErrorquando ord(os.urandom(1))%6avalia para 5


Guardar 5 caracteres, alterando a importação: import random as ruso, em seguida,r.randint
— Steven Rumbalski

1
Ou salve 8 caracteres alterando import para import os, e use ord(os.urandom(1))%6como int aleatório.
— Steven Rumbalski

Salve 1 caractere removendo o espaço depois print.
— Steven Rumbalski

1

VBA - 39/46

Eu não amo a saída numérica de Sean Cheshire (embora ainda seja uma boa resposta, tecnicamente falha No input, and no other outputs are allowed.nas especificações ...), mais ele usa /0, então aqui estão minhas alternativas:

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

Isso é resolvido ao Run-time error '5': Invalid proceduretentar alcançar o caractere 0 (o VBA é uma indexação baseada em 1).

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

Isso é resolvido Run-time error '13': Type mismatchquando aplica uma opção negativa a uma sequência.


1

Japt v1.4.5, 16 bytes

6ö
ªí
`I s¨viv!

Tente

-1 byte graças a @Shaggy!

Lança TypeError: U.í is not a functionquando um número aleatório no intervalo [0,6)é 0.



Na verdade, pode ser uma idéia usar a v1.4.5 para isso, caso o ETH adicione um N.í()método à v1.4.6.
— Shaggy

Atualizado - Japt se esforça para não travar em programas estranhos. Eu estava tentando descobrir como fazer referência a uma variável que não existia (AZ é definido), mas não considerava chamar um método que não existia.
— dana

Sim, N.í()é o meu "ir para" por lançar um erro (costumava ser N.y()). Existem algumas outras maneiras de obter um erro, mas raramente são úteis.
— Shaggy

Agora, por que eu não pensei em usar uma terceira linha ?! : \
— Shaggy
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.