Roulette russa


28

Scrivi un programma che gioca alla roulette russa!

Se il programma è avviato,

  • dovrebbe esserci una probabilità 5 su 6 che finisca normalmente dopo la stampa di "I survived!"
  • ci dovrebbe essere 1 su 6 possibilità di crash del programma. (errore di segmentazione, ecc.)

Non sono consentiti input e altre output.

La casualità deve essere giusta: deve avere una distribuzione uniforme della probabilità. Ciò significa che una variabile non inizializzata (o un RNG senza seed) MOD 6 non sarà sufficiente.

Se la soluzione funziona con un solo sistema operativo / piattaforma dedicato, riceverai una penalità di 6 byte per il punteggio.

Il codice più corto vince, non prima di 10 giorni dopo la prima risposta valida.


1
Possiamo fare affidamento sul tempo di esecuzione sottostante per essere equi, anche se non esplicitamente garantiti nella documentazione? Ad esempio, Python randrange(5)potrebbe essere implementato come randrange(MAX_INT)%6.
ugoren,

Per ispirare la creatività, potresti considerare di concedere un bonus a quelle soluzioni che non si basano sulla divisione per zero.
primo

Forse detto bonus dovrebbe comportare la divisione del punteggio per 2.
Joe Z.

1
@JoeZeng: sarebbe stato troppo. Di solito puoi renderlo un errore diverso, come riferimento a puntatore null, ecc. Al costo di pochi caratteri.
vsz,

Vedo. Non ho troppa esperienza nella creazione di condizioni di punteggio per i puzzle del codice golf, quindi sto ancora imparando cose del genere.
Joe Z.

Risposte:


4

05AB1E , 13 12 byte

6LΩiFë“IЖd!

-1 byte grazie a @Emigna .

05AB1E in realtà non dovrebbe essere in grado di sbagliare affatto, ma dal momento che la nuova versione di 05AB1E presenta ancora alcuni problemi rispetto alla versione legacy, posso sfruttare questo a mio vantaggio per risolvere questo problema.

Provalo online.

Spiegazione:

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)

Vedere questo suggerimento 05AB1E mio (sezione Come utilizzare il dizionario? ) Per capire il motivo per cui “IЖd!è "I survived!".


Sembra che 5ÝΩz“IЖd!dovrebbe funzionare ma a quanto pare 1 / 0 = 0.
Magic Octopus Urn

1
@MagicOctopusUrn Sì, 05AB1E quasi mai errori .. A parte il vecchio e piuttosto vecchio builtin .0che ha usato per lanciare una divisione di 0 errori a STDERR in una vecchia versione di 05AB1E, non so nemmeno come sbagliare nell'eredità 05AB1E . Tuttavia, la nuova versione presenta ancora molti errori, che ho colto alla mia occasione qui. ;)
Kevin Cruijssen il

1
Mi manca il vecchio .0, in più di un'occasione ha fatto andare qualcuno "Wat ... Perché è un comando?"
Magic Octopus Urn

11

PHP 38 byte

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

Posizionando a +prima di una stringa non numerica verrà valutato 0. Dovrebbe rand(0,5)tornare 5, $s[rand(0,5)]sarà la stringa vuota (poiché $sè lunga solo cinque caratteri), e successivamente $$s[rand(0,5)]sarà una variabile non inizializzata. Il tentativo di eseguire l'inversione si interromperà sul tipo di operando non supportato. Qualsiasi altro valore, 0-4restituirà s, e poiché $sè definito, sopravvivrai.

Nota: a partire dalla versione 4.2.0 di php, il generatore di numeri casuali viene seminato automaticamente .


6

R 30

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

Una volta su sei, genererà un errore: Error: object 'Z' not found


6

Rubino, 24-28

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

Circa ogni 6 volte, c'è un ZeroDivisionError

Esiste anche una versione più corta con 24 caratteri (grazie a ugoren e histocrat):

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

Se non si accetta l' "output, allora ho bisogno di altri 3 caratteri. La prima opzione ( puts) aggiunge una nuova riga, la seconda ( $><<) non crea una nuova riga:

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

C'è una domanda sul numero casuale in rubino a SO . Il seme con srandviene automaticamente chiamato con il seme dell'ora corrente se non era già stato chiamato. (vedi commento di Julians )


Primo ha avuto l'idea di un bonus extra per quelle soluzioni che non si basano sulla divisione per zero .

La mia prima soluzione può essere abbreviata (28 caratteri) con a undefined local variable or method ``a' for main:Object (NameError)

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

Può essere ancora più breve con 6/rand(6).
ugoren,

Ruby semina automaticamente il suo RNG?
vsz,

Puoi tagliare altri tre caratteri rimuovendo il flusso di controllo:1/rand(6);p "I survived!"
istocratico il

@ugoren / histocrat Grazie per i suggerimenti, ho adattato la mia soluzione.
annodare il

Un altro byte per te: non è richiesto spazio tra pe "I survived!". Secondo il mio conteggio, sono solo 24 byte.
primo

6

Dyalog APL - 25 22 21 20 Personaggi

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

Stampa DOMAIN ERRORcome errore, a causa della divisione per zero.

La più breve non divisione per soluzione zero che potrei trovare è di 23 caratteri.

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

Si lancia un INDEX ERROR

Provalo qui

Carattere APL qui


Vorrei accettarlo, ma non sembra funzionare. Alcune volte stampa " I survived", ma dopo aver stampato DOMAIN ERRORuna volta, continua a stampare solo quello. Anche se ricarico completamente il sito, non sopravviverà mai più.
vsz

@vsz Che strano ... Funziona nel mio Dyalog APL WS, e quando ho finito mi ricordo di averlo provato con TryAPL. Funziona ancora sul mio interprete, ma non sul sito Web. Se questo aiuta: dl.dropbox.com/u/9086539/apl.png
MrZander

1
1÷0è un DOMAIN ERRORin Dyalog ma in ngn / apl lo è . Il risultato ?6è 1..6 quando ⎕IO←1(impostazione predefinita in Dyalog) e 0..5 quando⎕IO←0 (unica opzione in ngn / apl). In Dyalog, il PRNG può essere seminato impostando ⎕RL. Inizialmente ha un valore predefinito predeterminato. Se impostato ⎕RL←0, il PRNG viene riprogrammato in modo abbastanza imprevedibile dal sistema operativo. TryAPL sta usando Dyalog e supporta la ?funzione di .
ngn,

1
È possibile che qualcosa sia stato cambiato allora, occasionalmente stiamo aggiornando il software dietro TryAPL o sperimentando le funzionalità del sito Web. Sono affiliato? Se te lo dico, dovrò ucciderti ... beh, con una probabilità di 1 ÷ 6 :)
ngn

1
A proposito, ecco una soluzione di 18 caratteri: "Sono sopravvissuto!" ⊣ ÷ ⍟? 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)restituisce 0, Python si arresterà in modo anomalo a causa di un errore di segmentazione.


5

vba, 27

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

utilizzato nella finestra immediata.
In caso di fallimento, una finestra di errore che indica:
division by zero
appare


Manca !il testo.
steenslag,

@steenslag, risolto
SeanC

@SeanCheshire Ho offerto un'alternativa alla tua risposta.
Gaffi,

5

Befunge - 48 caratteri

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

L'unica casualità di Befunge è l' ?operatore, che ti manda in una delle quattro direzioni 1/4possibili ( possibilità). Bloccando una o due direzioni, hai1/3 o 1/2possibilità, e combinando queste, hai la 1/6possibilità di uscire dal programma "vivo".

Il programma si arresta in modo anomalo eseguendo una divisione per zero. Immagino che sia specifico dell'implementazione ciò che accadrà (su Wikipedia dice che il programma dovrebbe chiedere la risposta desiderata), ma befungee.py una sorta di crash, o esce con rabbia:

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

'I survived!'[q:?6

Errore domain errordurante il tentativo di scomporre 0.


J semina automaticamente il suo RNG?
vsz

@vsz Sì, con ?. Puoi usare ?.per seme fisso.
randomra,

4

C, 67 65 62 caratteri

rand()%8non perde l'equità. La divisione va in crash per t=0, dà vero per 1 e 2 (riprova), dà falso per 3..7 (sopravvissuto).
EDIT: la versione precedente utilizzava una variabile temporanea, che era completamente non necessaria. 2/(rand()%8)implementa entrambe le condizioni necessarie.

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

Lo fa. "Non sono consentite altre uscite"
vsz

@vsz, in qualche modo è mancato. Ma comunque, con gcc / Linux non stampa nulla. Inoltre, aderendo rigorosamente allo standard, questo requisito è impossibile, perché un comportamento indefinito potrebbe stampare qualsiasi cosa.
ugoren,

@vsz, risolto ora - nessun output aggiuntivo in ogni caso. Funziona anche con l'ottimizzazione e 2 caratteri più brevi.
ugoren,

4

T-SQL 56 44 40 + 6

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

Ringrazia Sean Cheshire per aver definito il cast inutile

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

Ringrazia il messaggio personale di Sean Cheshire per il suggerimento di cambiare il soffitto in piano.

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

Messaggio di errore: messaggio 8134, livello 16, stato 1, riga 3 Divisione per zero errori rilevati.


1
-1e ceilingnon sono necessari. casttroncherà
SeanC

Sto testando se il soffitto può essere rimosso senza violare il requisito di una distribuzione uniforme, i documenti dicono che rand () restituisce valori float da 0 a 1.
freewary

Volevo sapere se il soffitto poteva essere rimosso dalla mia prima entrata. Non sono stato in grado di determinare dalla documentazione T-SQL se la funzione rand () avrebbe mai restituito un 1 o meno. Quindi ho eseguito un ciclo circa 50 milioni di volte testando la funzione rand (), mai una volta ha restituito un 1. Ma, rimuovere il soffitto dalla mia prima voce sarebbe ancora 47 byte, quindi la mia seconda voce è ancora più breve. Mantieni il soffitto e rimuovi il cast.
freewary il

Dubito che tu abbia testato questo script più di 20 volte. Questo non restituisce sempre sempre il risultato atteso. 1 su 6 fallirà e non restituirà un output. Questa sintassi funzionerà: 0 / floor (rand () * 6) = 0
t-clausen.dk

3

Javascript, 42

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

Il bit per bit o floor il risultato della moltiplicazione quindi un valore compreso tra 0 e 5 risultati. 0 viene implicitamente impostato su false, quindi in 5 su 6 casi viene visualizzato l'avviso nel sesto caso a cui bviene fatto riferimento un determinato blocco , interrompendo il processo.


3

Utilizzando il solito metodo di divisione per zero:

Versione Perl 5.8

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

Versione Perl 5.10

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

In caso di errore, verranno visualizzati:

Illegal division by zero at -e line 1.

Usando la funzione benedica che è usata per creare oggetti in perl.

Versione Perl 5.8

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

Versione Perl 5.10

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

In caso di errore, verranno visualizzati:

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

3
alcuni suggerimenti: sbarazzarsi delle parentesi, dello &&spazio logico e extra. utilizzare ~~invece di intforzare i valori integrali. il risultato è questo:1/~~rand 6;print"I survived!"
ardnew,

3

GolfScript, 21 caratteri

,6rand/;'I survived!'

Come la maggior parte delle risposte, questa ha una possibilità su sei di andare in crash con ZeroDivisionError. La soluzione più breve che potrei gestire senza usare la divisione per zero è di 23 caratteri:

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

che ha una probabilità 1/6 di schiantarsi con undefined method `+' for nil:NilClass (NoMethodError).

(Ps. Durante lo sviluppo, ho trovato quello che potrebbe essere un bug nell'interprete GolfScript: il codice simile 0,1>sembra lasciare un nilvalore nello stack, che in seguito arresterà in modo anomalo il programma se provi a fare qualcosa con quel valore se non pop-off e buttalo via ;. Sfortunatamente, il fatto che ho bisogno di usare il valore in qualche modo per innescare un crash significa che anche sfruttare questo bug non mi ha aiutato a scendere sotto i 23 caratteri.)


Sembra decisamente un bug. 5,5>lascia []in pila, che è probabilmente quello che dovrebbe fare, ma 4,5>lascia nil. Se non lo si rimuove, l'interprete si arresta in modo anomalo durante il tentativo di output. Un interessante effetto collaterale è che 4,6rand>+;'I survived!'diventa una soluzione valida. Qualcuno dovrebbe probabilmente informare Flagitious.
primo

1
Ho segnalato questo, ed è stato risolto (insieme a un altro bug che mi sono imbattuto) nell'ultima versione dell'interprete GolfScript.
Ilmari Karonen,

3

Python, 70 caratteri

Con ispirazione dalla risposta di grc.

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

randrange (5) restituisce un valore compreso tra 0 e 5.
Se restituisce uno 0, Python si arresta in modo anomalo durante il tentativo di eseguire (ute) una stringa di codice che contiene 9 ^ 5 serie di parentesi.


3

PHP - 30 byte

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

Richiede PHP 5.4+ per la sintassi dell'array breve, idea operatore non valida sottratta spudoratamente a @primo.

Come detto, rand()viene automaticamente seminato al primo utilizzo .


La divisione per zero non si ferma, produce solo un avvertimento, così come il testo "Sono sopravvissuto!". Inoltre, rand()%6non è una distribuzione uniforme, come 32768 = 2 (mod 6). Tuttavia, rand(0,5)||~$aper 30 byte è e funzionerà anche con tutte le versioni di PHP (la seconda espressione in un ternario è opzionale solo in 5.3.0+).
primo

@primo Immagino che stavo cercando la traccia dello stack solo quando stavo controllando la divisione per zero, non ho notato che era ancora stampato. So che la stenografia ternaria è la 5.3+, ma non mi interessa davvero supportare versioni obsolete da tempo :)
Leigh,

Con questo sono d'accordo. Non ci sono argomenti validi per continuare a usare meno di 5.3 a questo punto. 5.4, ​​sto ancora aspettando un numero di revisione a due cifre.
primo

1
Conto 29 byte.
Tito

3

Befunge, 38

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

Abbastanza diretto. Lo schianto si ottiene spingendo 1 s sulla pila fino a quando non trabocca. Ho fatto alcuni tentativi di ritagliare quelle 11 virgole e sostituirle con un ciclo più efficiente per stampare tutto, ma non sono riuscito a farlo con meno di 11 caratteri.

Nota che contare i personaggi in Befunge è un po 'complicato ... Ad esempio, c'è solo un personaggio sulla terza riga, ma ne sto contando uno in più in quanto l'esecuzione potrebbe viaggiare attraverso quella posizione.


Credo che sia il record per le virgole più consecutive che abbia mai visto in un programma.
Joe Z.

E poi alzo lo sguardo come realtà Befunge funziona e Palm mia faccia.
Joe Z.

2

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

Lo sto facendo solo perché il DOS non è qualcosa da considerare per il codice golf e lo spazio bianco è importante

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

In caso di errore, verrà stampato

Dividi per zero errori.


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

Messaggio Death Err:

Errore in ifelse (! Is.na (1 / sample (c (NA, 1: 5), 1)), "I Survived!",): Manca l'argomento "no", senza impostazione predefinita


Ho provato R, e non sono riuscito a farlo fallire - hoif(1/0)"I Survived!" ancora stampato I Survived
SeanC il

A differenza di altre lingue, R non considera 1/0 un errore matematico e non interrompe l'esecuzione, ma restituisce solo inf per 1/0. Penso che @vsz voglia un errore di rottura per questo round. Ma supponendo che vsz abbia contato NA come errore di morte, potrei ridurre il mio programma a 41 caratteri: ifelse (campione (c (NA, 1: 5), 1), 'I Survived',)
freewary

2

Emacs-Lisp, 42 personaggi

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

2

Javascript, 40 caratteri

In Javascript il trucco di divisione per zero non funziona nemmeno: restituisce Infinity. Pertanto, facendo riferimento a una variabile inesistente:

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

Non così breve, anche se divertente :)



2

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

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

Non ci sono input, come specifica la sfida.
L'output ha I survived!esito positivo, DIVIDE BY 0altrimenti un errore.

La DIVIDE BY 0schermata di errore è simile alla seguente:

ERR:DIVIDE BY 0
1:Quit
2:Goto

La selezione di entrambe le opzioni (e il ritorno alla schermata principale se 2è selezionata) mostra Errordopo la chiamata al programma.

Esempi:

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

Spiegazione:

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"

Gli appunti:

  • TI-BASIC è un linguaggio tokenizzato. Il conteggio dei byte non equivale al conteggio dei caratteri.

  • Le lettere minuscole sono due byte ciascuna.

    • Le lettere minuscole possono essere abilitate usando questo programma di assemblaggio.
  • startTmrè un comando solo sui calcolatori TI-84 + e TI-84 + SE. Detti calcolatori hanno diversi sistemi operativi.


2

Python, 53 byte

Ecco un breve programma out of range per l'indice python a 53 byte:

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

Ciao e benvenuto. Si noti che nelle regole per questa sfida, si afferma "MOD 6 non sarà sufficiente." Anche se non ho familiarità con Python, mi sembra che tu stia usando Modulo qui.
Shaun Bebbers,

1
@ShaunBebbers La citazione è "Questo significa che una variabile non inizializzata (o un RNG senza seed) MOD 6 non sarà sufficiente", ma questo meta post dice che il tempo attuale modulo è sufficiente per un PRNG per code-golf
Stephen

Il mio fraintendimento quindi.
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!":"");}}

Errore con "Array out of bounds". Riuscito a radere alcuni caratteri usando un oggetto casuale anonimo (nessuna importazione).


1

Groovy, 39

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

Seleziona un numero casuale compreso tra 0 e 5 inclusi. Se 0, genera una divisione per zero eccezioni.


1

Python (56), Haskell (77)

Questo si blocca con un IndexError quando il numero generato è 1:

da importazione casuale *
print ['I survived!'] [1 / randint (1,7)]

La soluzione Haskell ha la stessa idea:

import System.Random
main = putStrLn. (["I survived!"] !!). 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))%6restituisce 0

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

IndexErrorquando ord(os.urandom(1))%6valuta 5


Salvare 5 caratteri modificando l'importazione: import random as rquindi utilizzarer.randint
Steven Rumbalski l'

1
Oppure salva 8 caratteri modificando import in import os, quindi usa ord(os.urandom(1))%6come int casuale.
Steven Rumbalski,

Salva 1 carattere rimuovendo lo spazio dopo print.
Steven Rumbalski,

1

VBA - 39/46

Non amo l' output numerico di Sean Cheshire (anche se è ancora una buona risposta, tecnicamente non riesce No input, and no other outputs are allowed.dalla specifica ...), inoltre usa /0, quindi ecco le mie alternative:

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

Questo si risolve in a Run-time error '5': Invalid procedurequando si tenta di raggiungere il carattere 0 (VBA è indicizzazione basata su 1).

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

Questo si risolve in a Run-time error '13': Type mismatchquando si applica uno switch negativo a una stringa.


1

Japt v1.4.5, 16 byte

6ö
ªí
`I s¨viv!

Provalo

-1 byte grazie a @Shaggy!

Genera TypeError: U.í is not a function, quando un numero casuale nell'intervallo [0,6)è 0.



In realtà, potrebbe essere un'idea usare v1.4.5 per questo, nel caso in cui ETH aggiunga un N.í()metodo a v1.4.6.
Shaggy,

Aggiornato - Japt si impegna a non arrestarsi in modo anomalo su programmi strani. Stavo cercando di capire come fare riferimento a una variabile che non esisteva (l'AZ è definita), ma non ho considerato di chiamare un metodo che non esisteva.
dana,

Sì, N.í()è il mio "vai a" per aver lanciato un errore (era un tempo N.y()). Esistono altri modi per ottenere un errore, ma raramente sono utili.
Shaggy,

Ora, perché non ho pensato di usare una terza linea ?! : \
Shaggy
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.