Русская рулетка

28

Напишите программу, в которую играет русская рулетка!

Если программа запущена,

  • там должно быть 5 из 6 шансов, что он закончится нормально после печати "Я выжил!"
  • вероятность сбоя программы должна составлять 1 к 6. (ошибка сегментации и т. д.)

Нет входа, и никакие другие выходы не допускаются.

Случайность должна быть справедливой: она должна иметь равномерное распределение вероятностей. Это означает, что неинициализированной переменной (или ГСЧ без начального числа) MOD 6 будет недостаточно.

Если решение работает только с одной выделенной операционной системой / платформой, вы получите штраф в 6 байт на счет.

Самый короткий код выигрывает не раньше, чем через 10 дней после первого правильного ответа.

ВСЗ
источник
1
Можем ли мы рассчитывать, что базовая среда выполнения будет честной, даже если это явно не гарантировано в документации? Например, Python randrange(5)может быть реализован как randrange(MAX_INT)%6.
Угорен
Чтобы вдохновить на творчество, вы можете рассмотреть возможность предоставления бонуса тем решениям, которые не основаны на делении на ноль.
Примо
Возможно, указанный бонус должен включать деление счета на 2.
Джо З.
1
@JoeZeng: это было бы слишком много. Обычно вы можете сделать это с другой ошибкой, такой как ссылка на нулевой указатель и т. Д., Стоимостью всего несколько символов.
vsz
Понимаю. Я не слишком опытен в создании условий выигрыша для головоломок Code Golf, поэтому я все еще изучаю подобные вещи.
Джо З.

Ответы:

4

05AB1E , 13 12 байт

6LΩiFë“IЖd!

-1 байт благодаря @Emigna .

На самом деле 05AB1E вообще не должен иметь ошибки, но, поскольку новая версия 05AB1E по-прежнему имеет некоторые проблемы по сравнению с унаследованной версией, я могу воспользоваться этим в своих интересах, чтобы ошибиться в этой задаче.

Попробуйте онлайн.

Объяснение:

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)

Посмотрите эту подсказку 05AB1E (раздел Как пользоваться словарем? ), Чтобы понять, почему “IЖd!это так "I survived!".

Кевин Круйссен
источник
Похоже, 5ÝΩz“IЖd!должно работать, но, по-видимому 1 / 0 = 0.
Волшебная Урна Осьминога
1
@MagicOctopusUrn Да, 05AB1E почти никогда не ошибается. Помимо довольно старой встроенной функции, .0которая в STDERR в старой версии 05AB1E выдает ошибку деления на 0, в старой версии 05AB1E я даже не знаю, как сделать ошибку . Однако в новой версии все еще много ошибок, которые я использовал здесь. ;)
Кевин Круйссен
1
Я скучаю по старому .0, не раз это заставляло кого-то говорить: "Ват ... Почему это команда?"
Волшебная Урна Осьминога
11

PHP 38 байт

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

Размещение +перед нечисловой строкой будет иметь значение 0. Должен rand(0,5)возвращаться 5, $s[rand(0,5)]будет пустой строкой (так как $sдлиной всего пять символов) и впоследствии $$s[rand(0,5)]будет неинициализированной переменной. Попытка принять инверсию остановится на неподдерживаемом типе операнда. Любое другое значение, 0-4вернется s, а поскольку $sопределено, вы выживете.

Примечание. Начиная с версии php 4.2.0, генератор случайных чисел заполняется автоматически .

Примо
источник
6

R 30

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

Один раз из шести он выдаст ошибку: Error: object 'Z' not found

flodel
источник
6

Руби, 24-28

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

Приблизительно каждые 6 раз, есть ZeroDivisionError

Существует даже более короткая версия с 24 символами (спасибо Угорену и гистократу):

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

Если вы не принимаете "в выводе, то мне нужно еще 3 символа. Первая опция ( puts) добавляет новую строку, вторая ( $><<) не делает новую строку:

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

Есть вопрос про случайное число в ruby ​​у SO . Семя с srandавтоматически вызывается семенем с текущего времени, если оно еще не было вызвано. (см. комментарий юлианцев )


У Primo была идея дополнительного бонуса к тем решениям, которые не основаны на делении на ноль .

Мое первое решение может быть сокращено (до 28 символов) undefined local variable or method ``a' for main:Object (NameError)

p rand(6)<5?"I survived!":a
Кнут
источник
Может быть даже короче с 6/rand(6).
Угорен
Ruby запускает свой RNG автоматически?
vsz
Вы можете обрезать еще три символа, удалив поток управления:1/rand(6);p "I survived!"
Гистократ
@ugoren / histocrat Спасибо за ваши подсказки, я адаптировал свое решение.
Кнут
Еще один байт для вас: между pи "I survived!". По моим подсчетам, это всего 24 байта.
Примо
6

Dyalog APL - 25 22 21 20 персонажей

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

Печатает DOMAIN ERRORкак ошибку, из-за деления на ноль.

Самое короткое решение без деления на ноль - 23 символа.

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

Это бросает INDEX ERROR

Попробуй здесь

APL шрифт здесь

MrZander
источник
Я хотел бы принять это, но это не похоже на работу. Несколько раз он печатает " I survived", но после печати DOMAIN ERRORон продолжает печатать только это. Даже если я перезагружу сайт полностью, он никогда не выживет снова.
vsz
@vsz Как странно ... Это работает в моем Dyalog APL WS, и я помню, как тестировал его с TryAPL, когда закончил. Это все еще работает на моем переводчике, но не на веб-сайте. Если это поможет: dl.dropbox.com/u/9086539/apl.png
MrZander
1
1÷0это DOMAIN ERRORв Dyalog, но в ngn / apl это . Результат от ?61..6 когда ⎕IO←1(по умолчанию в Dyalog) и 0..5 когда ⎕IO←0(только опция в ngn / apl). В Dyalog PRNG можно посеять, установив ⎕RL. Первоначально он имеет некоторое заранее заданное значение по умолчанию. Если вы установите ⎕RL←0, PRNG будет посеян довольно непредсказуемо ОС. TryAPL в использовании Dyalog и имеет поддержку ?функции .
нгн
1
Вполне возможно, что тогда что-то изменилось, мы время от времени обновляем программное обеспечение, стоящее за TryAPL, или экспериментируем с функциями веб-сайта. Я аффилирован? Если я скажу вам, мне придется убить вас ... ну, с вероятностью 1 ÷ 6 :)
ngn
1
Кстати, вот 18-символьное решение: «Я выжил!» 6 ÷ ⍟? 6
ngn
5

Питон, 96

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

Если randrange(5)вернет 0, то python потерпит крах из-за ошибки сегментации.

GRC
источник
5

vba, 27

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

используется в непосредственном окне.
При ошибке
деление на ноль
появляется окно с сообщением об ошибке:

SeanC
источник
Отсутствует !в тексте.
Steenslag
@steenslag, исправлено
SeanC
@SeanCheshire Я предложил альтернативу вашему ответу.
Гаффи
5

Befunge - 48 символов

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

Единственная случайность Befunge - это ?оператор, который отправляет вас в одном из четырех возможных направлений ( 1/4шанс). Блокируя одно или два направления, у вас есть 1/3или 1/2шанс, и, комбинируя их, вы получаете 1/6шанс выйти из программы «живым».

Программа вылетает при делении на ноль. Я предполагаю, что это будет зависеть от реализации (в Википедии написано, что программа должна запросить желаемый ответ), но befungee.py вроде вылетает или гневно завершается:

$ 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
источник
5

J, 18

'I survived!'[q:?6

Сбой domain errorпри попытке факторизовать 0.

randomra
источник
J запускает свой RNG автоматически?
vsz
@vsz Да, с ?. Вы можете использовать ?.для фиксированных семян.
Рандомра
4

C 67 65 62 символа

rand()%8не теряет справедливости Деление падает для t=0, дает истину для 1 и 2 (повтор), дает ложь для 3,7 (выжил).
РЕДАКТИРОВАТЬ: предыдущая версия использовала временную переменную, которая в конечном итоге совершенно не нужна. 2/(rand()%8)реализует оба необходимых условия.

main(){
        for(srand(time(0));2/(rand()%8););
        puts("I survived!");
}
ugoren
источник
Оно делает. «никакие другие выходы не разрешены»
vsz
@vsz, как-то пропустил. Но в любом случае, с gcc / Linux он ничего не печатает. Кроме того, строго придерживаясь стандарта, это требование невозможно, поскольку неопределенное поведение может напечатать что угодно.
Угорен
@vsz, исправлено - никаких дополнительных выходов в любом случае. Также работает с оптимизацией и на 2 символа короче.
Угорен
4

T-SQL 56 44 40 + 6

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

Благодарим Шона Чешира за то, что он объявил актеров ненужными

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

Кредитное личное сообщение от Шона Чешира за предложение сменить потолок на этаж.

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

Сообщение об ошибке смерти: сообщение 8134, уровень 16, состояние 1, строка 3: ошибка деления на ноль.

freewary
источник
1
-1и ceilingне нужны. castбудет усекать
SeanC
Я проверяю , если потолок может быть удален , не нарушая требование равномерного распределения, документы говорят , что RAND () возвращает всплывает значение от 0 до 1.
freewary
Я хотел знать, можно ли снять потолок с моей первой записи. Я не смог определить из документации T-SQL, будет ли когда-нибудь функция rand () возвращать 1 или нет. Итак, я провёл цикл около 50 миллионов раз, тестируя функцию rand (), ни разу не вернул 1. Но удаление потолка из моей первой записи все равно будет 47 байтов, поэтому моя вторая запись все еще короче. Сохраните потолок и снимите слепок.
Бесплатная
Я сомневаюсь, что вы тестировали этот скрипт более 20 раз. Это не всегда возвращает ожидаемый результат всегда. 1 в 6 это не удастся и не вернет вывод. Этот синтаксис будет работать: 0 / floor (rand () * 6) = 0
t-clausen.dk
3

Javascript, 42

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

Поразрядное или минимальное значение результата умножения дает значение от 0 до 5. 0 неявно преобразуется в false, поэтому в 5 из 6 случаев предупреждение появляется в 6-м случае, когда на определенную bссылку ссылаются, что приводит к сбою процесса.

zaphod1984
источник
3

Используя обычный метод деления на ноль:

Версия Perl 5.8

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

Версия Perl 5.10

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

При сбое они будут отображать:

Illegal division by zero at -e line 1.

Использование функции благословения, которая используется для создания объектов в Perl.

Версия Perl 5.8

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

Версия Perl 5.10

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

При сбое они будут отображать:

Can't bless non-reference value at -e line 1.
xxfelixxx
источник
3
Несколько предложений: избавиться от скобок, логики &&и лишнего пробела. использовать ~~вместо того, intчтобы форсировать интегральные значения. результат 1/~~rand 6;print"I survived!"
таков
3

GolfScript, 21 символ

,6rand/;'I survived!'

Как и большинство ответов, у этого есть один из шести шансов на сбой с ZeroDivisionError. Самое короткое решение, которое я мог бы обойтись без деления на ноль, это 23 символа:

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

с вероятностью 1/6 столкновения с undefined method `+' for nil:NilClass (NoMethodError).

(Ps. При разработке этого я обнаружил, что может быть ошибка в интерпретаторе GolfScript: похоже, что подобный код 0,1>оставляет nilзначение в стеке, что позже приведет к сбою программы, если вы попытаетесь что-то сделать с этим значением, кроме как вытащить его и выбросить его с собой ;. К сожалению, тот факт, что мне нужно каким-то образом использовать значение, чтобы вызвать сбой, означает, что даже использование этой ошибки не помогло мне получить значение ниже 23 символов.)

Илмари Каронен
источник
Это определенно похоже на ошибку. 5,5>оставляет []в стеке, что, вероятно, то, что он должен делать, но 4,5>оставляет nil. Если вы не удалите его, интерпретатор фактически потерпит крах при попытке вывести его. Интересным побочным эффектом является то, что 4,6rand>+;'I survived!'становится правильным решением. Кто-то, вероятно, должен сообщить Flagitious.
Примо
1
Я сообщил об этом, и это было исправлено (наряду с еще одной ошибкой, с которой я столкнулся) в последней версии интерпретатора GolfScript.
Ильмари Каронен
3

Python, 70 символов

С вдохновением от ответа GRC.

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

randrange (5) возвращает значение от 0 до 5.
Если он возвращает 0, Python падает при попытке выполнить (использовать) строку кода, содержащую 9 ^ 5 наборов скобок.

Джошуа Спящий
источник
3

PHP - 30 байт

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

Требуется PHP 5.4+ для синтаксиса короткого массива, недопустимая идея оператора, бесстыдно украденная у @primo.

Как указано, rand()автоматически высевается при первом использовании .

Leigh
источник
Деление на ноль не останавливается, оно выдает только предупреждение, а также текст «Я выжил!». Кроме того, rand()%6не является равномерным распределением, как 32768 = 2 (mod 6). Тем не менее, rand(0,5)||~$aдля 30 байтов есть, и будет дополнительно работать со всеми версиями PHP (второе выражение в троичной является необязательным только в 5.3.0+).
Примо
@primo Думаю, я искал трассировку стека только тогда, когда проверял деление на ноль, не заметил, что он все еще печатается. Я знаю, что троичное сокращение - 5.3+, но я действительно не заинтересован в поддержке длинных устаревших версий :)
Leigh
С этим я согласен. На данный момент нет веских аргументов для продолжения использования менее 5,3. 5.4, ​​я все еще держусь за двузначный номер ревизии.
Примо
1
Я считаю 29 байтов.
Титус
3

Befunge, 38

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

Довольно просто. Сбой выполняется путем нажатия 1 на стек, пока он не переполнится. Я предпринял несколько попыток вырезать эти 11 запятых и заменить их более эффективным циклом для печати всего, но не смог получить его до 11 символов.

Обратите внимание, что подсчет символов в Befunge немного сложен ... Например, в третьей строке есть только один символ, но я рассчитываю дополнительный, так как выполнение может проходить через это место.

Джо К
источник
Я считаю, что это рекорд для самых последовательных запятых, которые я когда-либо видел в программе.
Джо З.
А потом я смотрю вверх, как на самом деле работает Befunge, и ласкаю мое лицо.
Джо З.
2

CMD Shell (Win XP или более поздняя версия), 40 +6

Я делаю это только потому, что DOS - это не то, о чем следует думать в коде гольф, а пробелы важны

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

При неудаче он напечатает

Разделите на ноль ошибок.

SeanC
источник
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!',)

Сообщение об ошибке смерти:

Ошибка в ifelse (! Is.na (1 / sample (c (NA, 1: 5), 1)), «Я выжил!»,): Аргумент «no» отсутствует, значение по умолчанию отсутствует

freewary
источник
Я попробовал R, и не смог заставить его потерпеть неудачу - if(1/0)"I Survived!"все еще напечатано, я выжил
SeanC
В отличие от других языков, R не считает 1/0 математической ошибкой и не останавливает выполнение, она просто возвращает inf для 1/0. Я думаю, что @vsz хочет решающую ошибку в этом раунде. Но если предположить, что vsz посчитал NA ошибкой смерти, я мог уменьшить свою программу до 41 символа: ifelse (sample (c (NA, 1: 5), 1), «I Survived»,)
бесплатная программа
2

Emacs-Lisp, 42 символа

(if (= (random 6) 5) 
    z (message "I survived!")
    )
dualinity
источник
2

Javascript, 40 символов

В Javascript трюк деления на ноль даже не работает: он просто возвращает бесконечность. Следовательно, ссылаясь на несуществующую переменную:

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

Не так коротко, хотя весело :)

tomsmeding
источник
2

PowerShell, 40 символов

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

При неудаче: «Попытка делить на ноль».

DBADon
источник
Добро пожаловать в PPCG!
Лайкони
1
32 байта
Mazzy
31 байт
Веска
2

TI-BASIC (TI-84 + / SE), 36 байтов

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

Вход не указан, как указано в задаче.
Вывод в I survived!случае успеха, в DIVIDE BY 0противном случае ошибка.

На DIVIDE BY 0экране ошибки выглядит следующим образом :

ERR:DIVIDE BY 0
1:Quit
2:Goto

Выбор любого из параметров (и возврат к начальному экрану, если 2выбран) отображается Errorпосле вызова программы.

Примеры:

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

Объяснение:

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"

Заметки:

  • TI-BASIC - это токенизированный язык. Количество байтов не равно количеству символов.

  • Строчные буквы по два байта каждая.

    • Строчные буквы могут быть включены с помощью этой программы сборки.
  • startTmrэто команда только на калькуляторах TI-84 + и TI-84 + SE. Указанные калькуляторы имеют разные операционные системы.

Тау
источник
2

Python, 53 байта

Вот короткий 53-байтовый индекс Python вне программы:

import time
[0][time.time()%6<1]
print("I survived!")
Александр Уолстен
источник
Привет и добро пожаловать. Пожалуйста, обратите внимание, что в правилах для этого испытания говорится: «MOD 6 будет недостаточно». Хотя я не знаком с Python, мне кажется, что вы используете Modulo здесь.
Шон Бебберс
1
@ShaunBebbers Цитата: «Это означает, что неинициализированная переменная (или ГСЧ без начального числа) MOD 6 будет недостаточной», но в этом мета-посте говорится, что текущего времени по модулю для ГСЧ для кода-гольфа
Стивен
Мое недоразумение тогда.
Шон Бебберс
1

Ява, 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!":"");}}

Сбой с ошибкой «Массив вне границ». Удалось сбрить несколько символов с помощью анонимного случайного объекта (без импорта).

Ной
источник
1

Groovy, 39

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

Выбирает случайное число от 0 до 5 включительно. Если 0, исключение делится на ноль.

Будет Lp
источник
1

Python (56), Haskell (77)

Это приводит к ошибке IndexError, когда сгенерированное число равно 1:

от случайного импорта *
печать ['Я выжил!'] [1 / randint (1,7)]

Решение Haskell имеет ту же идею:

импорт System.Random
main = putStrLn. (["Я выжил!"] !!). div 1 = << randomRIO (1,6)
Лямбда Фея
источник
1

Python, 59 55 53, 65 59 56

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

ZeroDivisionErrorкогда ord(os.urandom(1))%6оценивается в 0

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

IndexErrorкогда ord(os.urandom(1))%6оценивается до 5

Raufio
источник
Сохраните 5 символов, изменив импорт: import random as rзатем используйтеr.randint
Стивен Румбальски
1
Или сохраните 8 символов, изменив импорт на import os, а затем используйте в ord(os.urandom(1))%6качестве случайного целого
Стивен Румбальский
Сохранить 1 символ, удалив пробел после print.
Стивен Румбальски
1

VBA - 39/46

Я не люблю числовой вывод Шона Чешира (хотя все же хороший ответ, он технически не No input, and no other outputs are allowed.соответствует спецификации ...), плюс он использует /0, так что вот мои альтернативы:

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

Это разрешается до a Run-time error '5': Invalid procedureпри попытке достичь символа 0 (VBA - индексирование на основе 1).

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

Это разрешается Run-time error '13': Type mismatchпри применении отрицательного переключателя к строке.

Gaffi
источник
1

Japt v1.4.5, 16 байт

6ö
ªí
`I s¨viv!

Попытайся

-1 байт благодаря @Shaggy!

Выдает , TypeError: U.í is not a functionкогда случайное число в диапазоне [0,6)находится 0.

Dana
источник
1
17 байт
лохматый
На самом деле, это может быть идея использовать v1.4.5 для этого, на случай, если ETH добавляет N.í()метод к v1.4.6.
Лохматый
Обновлено - Japt старается не вылетать на странные программы. Я пытался выяснить, как ссылаться на переменную, которая не существует (определен AZ), но не рассматривал возможность вызова метода, который не существует.
Дана
Да, N.í()это мое "go to" для выдачи ошибки (раньше было N.y()). Есть несколько других способов получить ошибку, но они редко полезны.
Лохматый
Теперь, почему я не думал об использовании 3-й строки ?! : \
Лохматый