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.