Російська рулетка


28

Напишіть програму, яка грає російську рулетку!

Якщо програма запущена,

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

Не дозволяється введення та інші виходи.

Випадковість повинна бути справедливою: вона повинна мати рівномірний розподіл ймовірностей. Це означає, що неініціалізована змінна (або RNG без насіння) MOD 6 буде недостатньою.

Якщо рішення працює лише з однією спеціальною операційною системою / платформою, ви отримаєте 6 байт штрафного бала.

Найкоротший код виграє, не пізніше ніж через 10 днів після першої дійсної відповіді.


1
Чи можемо ми покластися на те, що час виконання буде справедливим, навіть якщо це прямо не гарантується в документації? Наприклад, Python randrange(5)може бути реалізований як randrange(MAX_INT)%6.
угорен

Щоб надихнути на творчість, можна подумати про надання бонусу тим рішенням, які не покладаються на ділення на нуль.
прим

Можливо, зазначений бонус повинен включати ділення балу на 2.
Джо Z.

1
@JoeZeng: це було б занадто багато. Зазвичай ви можете зробити це іншою помилкою, наприклад, нульовою посиланням на вказівник і т. Д. За вартість лише кількох символів.
vsz

Розумію. Я не надто досвідчений у створенні бальних умов для головоломки з кодовим гольфом, тому я все ще вивчаю подібні речі.
Джо З.

Відповіді:


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який раніше кидав поділ на 0 помилок на STDERR у старій версії 05AB1E, я навіть не знаю, як помилитися у спадщині 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


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

Є питання про випадкове число в рубіні на SO . Насіння з srandавтоматично викликується з насінням з поточного часу, якщо воно ще не було викликане. (див. коментар Джуліанів )


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

Моє перше рішення можна скоротити (28 символів) з а undefined local variable or method ``a' for main:Object (NameError)

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

Можна ще коротше 6/rand(6).
угорен

Чи Рубі насідає свій RNG автоматично?
vsz

Ви можете обрізати ще три символи, видаливши контрольний потік:1/rand(6);p "I survived!"
гістократ

@ugoren / histocrat Дякую за ваші підказки, я адаптував своє рішення.
кнут

Ще один байт для вас: між pі до білого пробілу не потрібно "I survived!". На мій підрахунок, це лише 24 байти.
прим

6

Діялог APL - 25 22 21 20 Charachters

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

Друкується DOMAIN ERRORяк помилка через поділ на нуль.

Найкоротший варіант неділення на нульове рішення, який я міг придумати, - це 23 символи.

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

Це кидає INDEX ERROR

Спробуйте тут

Шрифт APL тут


Я хотів би прийняти це, але це, здається, не працює. Кілька разів він друкує " 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). У Діялогу PRNG можна висіяти за допомогою налаштування ⎕RL. Спочатку він має деяке заздалегідь визначене значення за замовчуванням. Якщо ви встановите ⎕RL←0, PRNG повторно засіває ОС досить непередбачувано. TryAPL в використанні Dyalog і має підтримку ?функції .
ngn

1
Цілком можливо, що тоді щось було змінено, ми періодично оновлюємо програмне забезпечення за TryAPL або експериментуємо з особливостями веб-сайту. Я пов'язаний? Якщо я вам скажу, мені доведеться вбити вас ... ну, з ймовірністю 1 ÷ 6 :)
ngn

1
До речі, ось рішення з 18 символів: «Я вижив!» ⊣ ÷ ⍟? 6
ngn

5

Пітона, 96

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

Якщо randrange(5)поверне 0, пітон вийде з ладу через помилку сегментації.


5

vba, 27

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

використовується в безпосередньому вікні.
У разі невдачі, вікно помилки з зазначенням:
ділення на нуль
з'являється


Відсутній !текст у тексті.
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!

5

J, 18

'I survived!'[q:?6

Невдача domain errorпри спробі розподілити значення 0.


Чи J насіє свій RNG автоматично?
vsz

@vsz Так, с ?. Можна використовувати ?.для фіксованого насіння.
випадкова

4

C, 67 65 62 символів

rand()%8не втрачає справедливості. Відділення виходить з ладу t=0, дає істину для 1 і 2 (повторити спробу), дає хибність для 3..7 (вижив).
EDIT: У попередній версії була використана тимчасова змінна, яка в кінцевому підсумку виявилася абсолютно непотрібною. 2/(rand()%8)реалізує обидва необхідні умови.

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

Це робить. "інші виходи не дозволені"
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!'

Помилка помилки Msg: Msg 8134, Рівень 16, Стан 1, Рядок 3 Розділіться на нульову помилку.


1
-1і ceilingне потрібні. castусечет
SeanC

Я перевіряю, чи можна зняти стелю, не порушуючи вимоги рівномірного розподілу, документи говорять про те, що rand () повертає
плавні

Мені хотілося знати, чи можна зняти стелю з мого першого вступу. Я не зміг визначити з документації 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 стає неявним закликом до неправдивого, тому в 5 з 6 випадків попередження з'являється у 6-му випадку, на певне bпосилається певне , що завершує процес.


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.

Використання функції bless, яка використовується для створення об’єктів в 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.

3
кілька пропозицій: позбудьтеся дужок, логічного &&та додаткового місця. використовувати ~~замість того, intщоб форсувати цілісні значення. Результат такий:1/~~rand 6;print"I survived!"
ardnew

3

GolfScript, 21 чол

,6rand/;'I survived!'

Як і більшість відповідей, і цей має шанс зірватися з ZeroDivisionError. Найкоротшим рішенням, яким я міг би керувати, не використовуючи поділ на нуль, є 23 знаки:

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

який має 1/6 шансу вийти з ладу undefined method `+' for nil:NilClass (NoMethodError).

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


Це безумовно здається помилкою. 5,5>листя []на стеку, що, мабуть, те, що він повинен робити, але 4,5>залишає nil. Якщо ви не видалите його, інтерпретатор фактично завершиться збоєм під час спроби вивести його. Цікавим побічним ефектом є те, що 4,6rand>+;'I survived!'стає правильним рішенням. Хтось, мабуть, повинен повідомити працівника.
примо

1
Про це я повідомив, і це було виправлено (разом з іншою помилкою, на яку я натрапив) в останній версії інтерпретатора GolfScript.
Ільмарі Каронен

3

Пітон, 70 символів

З натхненням у відповідь grc.

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

randrange (5) повертає значення між 0 і 5.
Якщо він повертає 0, Python виходить з ладу під час спроби виконати (ute) рядок коду, який містить 9 ^ 5 наборів дужок.


3

PHP - 30 байт

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

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

Як зазначено, rand()при першому використанні висівають автоматично .


Ділення на нуль не зупиняється, воно лише створює попередження, а також текст «Я вижив!». Також 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

Досить прямо. Збивання відбувається шляхом натискання 1s на стек, поки він не переповниться. Я зробив кілька спроб вирізати ці 11 коми і замінити їх на більш ефективний цикл, щоб надрукувати все, але не міг отримати його під 11 символів.

Зауважте, що підрахунок символів у Befunge трохи складний ... Наприклад, у третьому рядку є лише один символ, але я рахую додатковий, оскільки виконання може подорожувати через це місце.


Я вважаю, що це рекорд для найбільш послідовних коми, які я коли-небудь бачив у програмі.
Джо З.

І тоді я дивлюся, як Befunge насправді працює, і долонюю обличчя.
Джо З.

2

Оболонка CMD (Win XP або новіша версія), 40 +6

Я займаюся цим лише тим, що DOS - це не те, про що варто навіть думати для кодового гольфу, а пробіл важливий

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

У разі відмови він надрукує

Розділити на нульову помилку.


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 / зразок (c (NA, 1: 5), 1)), "я вижив!",): Аргумент "ні" відсутній, без замовчування


Я спробував R, і не зміг його вийти з ладу - if(1/0)"I Survived!"все ж надрукований I
Survived

На відміну від інших мов, R не вважає 1/0 математичною помилкою і не зупиняє виконання, вона просто повертає inf за 1/0. Я думаю, що @vsz хоче помилку в цьому раунді. Але якщо припустити, що vsz вважав НС смертною помилкою, я міг звести свою програму до 41 символу: ifelse (зразок (c (NA, 1: 5), 1), "Я вижив",)
програма


2

Javascript, 40 символів

У Javascript фокус поділу на нуль навіть не працює: він просто повертає нескінченність. Тому, посилаючись на неіснуючу змінну:

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

Не такий короткий, хоча веселий :)



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

Пітон, 53 байти

Ось короткий 53-байтний індекс пітона поза програмою:

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

Привіт і ласкаво просимо. Зверніть увагу, що в правилах цього виклику зазначено, що "MOD 6 буде недостатнім". Хоча я не знайомий з Python, мені здається, ви тут використовуєте Modulo.
Шон Бебберс

1
@ShaunBebbers Цитата "Це означає, що неініціалізована змінна (або RNG без насіння) MOD 6 буде недостатньою", але цей мета-пост говорить, що поточного часу модулю достатньо для PRNG для коду-гольфу
Stephen

Моє непорозуміння тоді.
Шон Бебберс

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!":"");}}

Помилка з помилкою "Масив поза межами". Вдалося поголити кілька символів, використовуючи анонімний об'єкт Random (без імпорту).


1

Гроовий, 39

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

Вибирає випадкове число від 0 до 5 включно. Якщо 0, кидає ділення на нульовий виняток.


1

Пітон (56), Хаскелл (77)

Це збої з IndexError, коли згенероване число дорівнює 1:

від випадкового імпорту *
print ['Я вижив!'] [1 / randint (1,7)]

Рішення Haskell має таку ж ідею:

імпорт System.Random
main = putStrLn. (["Я вижив!"] !!). div 1 = << randomRIO (1,6)

1

Пітона, 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


Збережіть 5 символів, змінивши імпорт: import random as rпотім використовуйтеr.randint
Стівен Румбальський

1
Або збережіть 8 символів, змінивши імпорт на import os, а потім використовуйте ord(os.urandom(1))%6як свій випадковий int.
Стівен Румбальський

Збережіть 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

Це вирішує значення a Run-time error '13': Type mismatchпри застосуванні негативного перемикача до рядка.


1

Japt v1.4.5, 16 байт

6ö
ªí
`I s¨viv!

Спробуй це

-1 байт завдяки @Shaggy!

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



Насправді, може бути ідеєю використовувати v1.4.5 для цього, про всяк випадок, якщо ETH додасть N.í()метод v1.4.6.
Кудлатий

Оновлено - Japt дуже намагається не врізатися в дивні програми. Я намагався з'ясувати, як посилатися на змінну, яка не існувала (AZ визначена), але не розглядала можливість виклику методу, який не існував.
дата

Так, N.í()це мій "перехід" на помилку (це було раніше N.y()). Є кілька інших способів помилки, але вони рідко корисні.
Кудлатий

Тепер, чому я не думав використовувати 3-й рядок ?! : \
Кудлатий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.