Русская рулетка, перезагрузка


32

Давайте играть в русскую рулетку!

Обычно это будет гонка за написание самой короткой программы MOD 6, но это не очень реалистично, так как вероятность выигрыша уменьшается с каждым кликом. Вот правила:

  1. Эмулируйте настоящий шестизарядник :
    • Одна пуля помещается в одну из шести камер, и ствол вращается один раз, только перед игрой.
    • Шанс проиграть с n- й попытки составляет 1/6.
    • Вероятность проигрыша после n попыток равна 1 / (6-n)
    • Вы гарантированно проиграете максимум за 6 попыток.
  2. Потеря:
    • Показать текст *BANG!*
    • Завершить программу.
  3. Выигрыш:
    • «Победа» означает, что пистолет не стреляет, но пуля на одну камеру ближе к молотку.
    • Показать текст *click*
    • Предоставьте пользователю «триггер» вместе с возможностью завершить программу (например, «ctrl + c», см. Ниже).
  4. Специфическая программа:
    • Нажатие на триггер - это некоторая форма пользовательского ввода, включая первую попытку. (Это может быть нажатие клавиши, щелчок мыши, что угодно; текстовые подсказки не требуются.)
    • Только один экземпляр программы разрешен, пока он не будет завершен. (Запуск нового экземпляра программы сродни хорошему вращению ствола, то есть вероятность проигрыша при следующем щелчке сбрасывается до 1/6.)

Самый короткий код выигрывает!

Leaderboard


3
Ваши предположения неверны - шанс проиграть с n-й попытки составляет только ⅙, если вы передышаете пули после каждого выстрела. Без повторного поворота вероятность проигрыша составляет ⅙ на первом выстреле, ⅕ на втором, ¼ на третьем ... и заканчивается 1 на 6-м. Вы узнаете это с помощью слова «Вы гарантированно проиграете максимум за 6 попыток».
Риальто

2
@ user2956063 вы забываете, что существует (n-1) / 6 вероятность того, что вы никогда не достигнете n: th попытки и, следовательно, не можете проиграть. Они уравновешиваются в униформе 1/6.
Джейкоб Райле

2
может быть, это различие в том, как компьютерные ученые и статистики выражают вероятность тогда - для меня "шанс проиграть на n-й попытке - это ⅙", скажем, это константа - будь то n или 100.
rhialto

3
Почему это не называется «Русская рулетка, перезагрузка»?
Hand-E-Food

1
@ user2956063: Ваши вероятности условны . P (проиграть на броске 2) = ⅙, но P (проиграть на броске 2 | не проиграл на броске 1) = lose. Кроме того, n(неявно, я предоставлю вам) ограничено [1,6], поэтому 100 отсутствует.
Тим Педерик

Ответы:


3

Pyth, 23 байта

VO6"*click*" w;"*BANG!*

Действительно просто. Случайное число итераций 0 - 5 отображает щелчок и запрашивает строку ввода, за которой следует удар в конце.


1
черт тебя подери!
Cyoce

+3 байта: последняя строка должна быть *BANG!*, а неBANG
ayane

14

Рубин, 51 байт

[*['*click*']*rand(6),'*BANG!*'].map{|x|gets;$><<x}

Ungolfed:

[
  *(                        # Unwrap the following array into the outer one
    ['*click*'] * rand(6)   # An array of 0-5 clicks, see Array#*
  ),
  '*BANG!*'                 # The End
].map do |x| # Shortest way to iterate I was able to find
  gets       # Await input
  $> << x    # Shove the output string to `stdout`
end          # Return value is an array of several (0-5) `stdout`s. Who cares.

или

(['*click*']*rand(6)<<'*BANG!*').map{|x|gets;$><<x}

Разгул оставлен для читателей. Не так сложно

  • Опять же, слава Мартину, на этот раз для подвоха $><<в качестве putsзамены.
  • Не выводит символы новой строки, но это не требуется.
  • Чем короче, тем проще. Суть требуемого поведения заключается в том, чтобы сделать 0-5 кликов, а затем выстрелить. Для этого выходы накапливаются внутри массива.
  • Еще 2 байта можно сбрить, если с выводами вроде "*click*"все в порядке (то, что требуется, напечатано в конце), заменив $><<на . Я не был уверен, будет ли это все еще следовать правилам.

68 64 байта

(другой подход)

[*0..5].shuffle.find{|x|gets;x<1||puts('*click*')};puts'*BANG!*'

Я не особо задумывался над алгоритмом (он может быть еще более компактным, но не очень понятным), но мне действительно нравится модель внутри него:

  • Массив эмулирует бочку с элементами, являющимися содержимым камер. Поскольку только один элемент является пулей, вращение и перетасовывание эквивалентны.
  • 0это пуля Других номеров нет.
  • findнаходит первое возвращаемое значение, для которого блок не является falseни nil.
  • ||-выражение неявно возвращается из блока. Это короткое замыкание: оно возвращает свой первый операнд (если это не nilили false) или второй (иначе). Таким образом, он либо возвращает true(если x<1или, четче, но длиннее x == 0), либо возвращает значение puts, в то время как ...
  • putsвсегда возвращается nil. Ага.
  • getsзапрашивает ввод. EnterДостаточно просто ударить .
  • Ctrl+ Cзавершает программу

Вычеркнул 64 это нормально 64?
Cyoce

@ Кайос хм ... да. Должно быть, наверное. Это было заменено приведенной выше записью, но оно основано на другой идее, поэтому я оставил их перечеркнутыми.
D-сторона

это каламбур на это
Cyoce

@Cyoce о, простите меня, первый пост и все такое, не зная о краеведении :)
D-сторона

9

JavaScript, 64 байта

for(i=6;i<7&&prompt();)alert(new Date%i--?"*click*":i="*BANG!*")

объяснение

Чтобы нажать на триггер, введите любой текст в подсказку. Ничего не вводите или нажмите «Отмена», чтобы прекратить.

for(
  i=6;             // i = number of chambers
  i<7              // i equals "*BANG!*" (not less than 7) if we lost
    &&prompt();    // see if we should do another shot
)
  alert(           // alert the result
    new Date%i--   // use the current time in milliseconds as a random number, this is safe
                   //     to use because the gap between shots is greater than i (max 6ms)
      ?"*click*"   // on win pass "*click*" to alert
      :i="*BANG!*" // on lose alert "*BANG!*" and set i to not less than 7
  )

"*Bang!*"не больше 7. Но NaNне меньше 7.
Берги

@ Берги Это правда. Я перефразировал объяснение, чтобы сделать его более понятным.
user81655 16.12.15

6
@Bergi только в Javascript делает это утверждение даже близким к смыслу.
MikeTheLiar

7

Луа, 82 75 байт

Довольно долго, но в Луа много подробностей.

for a=math.random(6),1,-1 do io.read()print(a>1 and"*click*"or"*BANG!*")end

6

LabVIEW, 46 примитивов LabVIEW

Создает массив из 0 и 1, имеет цикл для ожидания щелчков и выводит строку. Первоначально написано BANG, потому что я забыл сбросить индикатор перед его запуском.

Также обратите внимание, что это GIF-файл, если он не воспроизводится / загружается для вас, пожалуйста, откройте страницу.


Я не вижу, где вы делаете вывод, "*click*"если пистолет не выстрелил. Кроме того, это выводит "bang"или "*BANG!*"?
Катенкё

это должно быть GIF, но для меня это не играет, это может быть проблемой. И да, это только ставит удар, это было, что я не читал должным образом, я изменяю это через секунду
Eumel

глупо, я забыл повторно инициализировать строку, чтобы очистить перед запуском, поэтому она показывает BANG в начале ...
Eumel

Нет проблем, я видел GIF сейчас, похоже, он работает довольно хорошо :)
Katenkyo

5

Pyth, 31 30 28 байт

FN.S6 EI!N"*BANG!*"B"*click*

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

Объяснение:

FN                               for N in...
  .S6                            shuffle(range(6))...
      E                          get a line of input
       I!N                       if N is falsy (i.e. 0)
          "*BANG!*"              implicit output
                   B             break
                    "*click*     else, print click

Ваш первый на самом деле короче, вам не нужен трейлинг ".
FryAmTheEggman

@FryAmTheEggman О, точно, забыл об этом. Благодарность!
Дверная ручка

Кроме того, я только что заметил что-то глупое, FN<any>все еще полностью идентичное тому V<any>, которое, вероятно, следует изменить, чтобы не сбивать с толку новых игроков в гольф ...: P
FryAmTheEggman

1
Вы можете просто удалить символы .?. Там нет необходимости else.
Якуб

@FryAmTheEggman запутывает людей - это круто. Это может быть удивительно при фильтрации скрабов .
Cyoce

5

Серьезно, 27 25 байт

"*BANG!*"6J"*click*"nW,X.

Нет онлайн-ссылки, потому что нет способа сделать подсказку с вводом по каналу. Программа может быть CTRL-C'd в любой момент курица из прекратить.

Объяснение:

"*BANG!*"6J"*click*"nW,X.
"*BANG!*"                  push "*BANG!*"
         6J                push a random integer in [0,6) (n)
           "*click*"n      push "*click*" n times
                     W     while loop (implicitly closed at EOF):
                      ,X.    get input and discard, pop and print top of stack

4

PHP, 52 байта

*<?=$n=&rand(0,6-$argi)?click:"BANG!*";$n||@\n?>*

Требуется -Fопция командной строки, считается три. Спусковой крючок нажимается нажатием Enter.

Потому что -Fбуквально запускает скрипт снова для каждого входа (я не шучу), dieи тому подобное на самом деле не прекращается, поэтому мы выходим через подавленной ошибки во время выполнения вместо @\n.


Образец использования

$ php -F primo-roulette.php

*click*
*click*
*BANG!*
$

4

Perl 5, 43 байта

Беги с perl -p. Стабильный вариант пули - то есть позиция пули определяется только один раз в самом начале.

$i//=0|rand 6;$_=$i--?'*click*':die'*BANG*'

Ницца! Я бы изменил заголовок на «Perl 5.10+», так как вы используете //=. Кроме того, не забывайте считать -pв своем счете .
ThisSuitIsBlackNot

4

C 110 74 72 байта

Спасибо Деннису за избавление от включений и намного меньше байтов.

main(r){for(r=time(0)%6;getchar(),r--;)puts("*click*");puts("*BANG!*");}
main(r)
{
    for(r=time(0)%6;getchar(),r--;)
        puts("*click*");
    puts("*BANG!*");
}

3

Candy , 36 байтов

Около половины программы составляет текст для распечатки :(

:6H_(=b"*click*"(;):=)"*BANG!*\n"(;)

длинная форма:

getc
digit6 rand range0  # build a range from 0 .. rand#
while
  popA              # these are the *click* instances  
  stack2
  "*click*"
  while
    printChr
  endwhile
  getc
  popA
endwhile
"*BANG!*\n"         # out of luck
while
  printChr
endwhile

3

Python 3, 95 байт

Также моя первая попытка игры в гольф, также в Python 3. Клянусь, Брюс и я не тот человек.

from random import*
for a in range(randint(0,5)):input();print("*click*")
input();print("*bang*")

Ungolfed:

from random import*
for a in range(randint(0,5)):
    input()
    print("*click*")
input()
print("*bang*")

Создайте случайное число от 0 до 5 включительно, напечатайте щелчок столько раз, затем напечатайте удар . Нажмите ввод / возврат, чтобы нажать на курок.


Следуя примеру Брюса, вы можете сохранить несколько байтов с помощьюfrom random import*
wnnmaw 16.12.15

Если нет чего-то еще, что я пропускаю, это один байт экономии. Но я возьму это! Благодарность!
Стив Экерт

Хорошая попытка, я использовал ваше решение как источник вдохновения для своего решения на python 2 ^^
basile-henry


2

Emacs Lisp, 94 89 байт

(set'b(%(random)6))(dotimes(a(+ b 1))(read-string"")(message(if(eq a b)"BANG""*click*")))

Ungolfed:

(set 'b (% (random) 6))
(dotimes (a (+ b 1))
  (read-string"")
  (message (if (eq a b) "BANG" "*click*")))

2

R 86 80 77 байт

Как обычно, R обладает удивительными возможностями для написания кода для игры в гольф, но не имеет названий функций.

sapply(sample(0:5),function(n){!n&&{cat('*BANG!*');q()};readline('*click*')})

2

Python 2, 108 104 102 100 98 байт

Моя первая попытка игры в гольф:

from random import*
a=[1]+[0]*5
shuffle(a)
for i in a:input();print("*click*","*BANG!*")[i];" "[i]

Может быть, я должен добавить, что программа не завершается правильно, когда вы проигрываете, она просто генерирует исключение (что приводит к завершению):

Traceback (most recent call last):
  File "russian_roulette.py", line 4, in <module>
    for i in a:input();print("*click*","*BANG!*")[i];" "[i]
IndexError: string index out of range

Добро пожаловать в Программирование Пазлов и Code Golf! Когда вы отправляете кодовый ответ на гольф, пожалуйста, укажите название языка и количество байтов (я отредактировал его для вас здесь). Благодарность!
ProgramFOX

Да, большое спасибо! На самом деле я пытался решить эту проблему, не смог правильно ее отредактировать.
ბიმო

Я получил твой счет байта как 112, что ты использовал?
wnnmaw

Кроме того, вы можете сохранить 2 байта, выполнивa=shuffle([1,0,0,0,0,0])
wnnmaw 16.12.15

1
Насколько я знаю, shuffle меняет основную структуру данных и ничего не возвращает. Я попробовал это, спасибо в любом случае. Заголовок (язык и количество байтов) был написан ProgramFOX. Но когда я использую wcего, это дает мне 109, что слишком много, так что это правильно. Как ты считаешь?
ბიმო 16.12.15

2

Perl 5, 40 байт

<>,print"*$_*"for(click)x rand 5,'BANG!'

Запустите без параметров командной строки, триггер нажата нажатием Enter.


2

Python, 81 байт

import time
for i in["*click*"]*(int(time.time())%6)+["*BANG!*"]:input();print(i)

вдохновлен решениями Ruby (51) и Python


1

Common Lisp, 109

(do(g(b(nthcdr(random 6)#1='(t()()()()() . #1#))))(g)(read-char)(princ(if(setf g(pop b))"*BANG!*""*click*")))

Не очень конкурентоспособный, но мне нравятся круглые списки:

(do (;; auxiliary variable x
     x
     ;; initialize infinite barrel, rotate randomly
     (b (nthcdr (random 6) #1='(t()()()()() . #1#))))

    ;; we end the loop when x is T (a bullet is fired)
    (x)

  ;; press enter to shoot
  (read-char)

  ;; pop from b, which makes b advance down the list. The popped value
  ;; goes into x and is used to select the appropriate string for
  ;; printing.
  (princ
   (if (setf x(pop b))
       "*BANG!*"
       "*click*")))

1

Perl 5, 43 байта

42 байта + -pопция командной строки. Просто нажмите, enterчтобы вызвать.

$_=0|rand 7-$.<++$i?die"*BANG!*":"*click*"

Спасибо Дому Гастингсу за помощь! Оригинальный ответ был 67 байтов:

$i++;$a=$i>=int(rand(6));print$_=$a?'*BANG!*':'*click*';last if($a)

На самом деле проблема -pбыла в том, что он завершал работу до вызова последнего printоператора, не зная почему. Я попробовал это. Кроме этого, отличные предложения, спасибо! Мои знания продолжают расти ...
Codefun64

@DomHastings Также, к сожалению, по какой-то причине 0|уловка не сработала так, как ожидалось, но я сбрил некоторые байты, оператор печати и последнее предложение, как вы предложили. Как это выглядит сейчас?
Codefun64

@DomHastings Черт, ты хороший. Я рекомендую использовать это как свой собственный ответ, поскольку вы определенно написали программу меньшего размера, чем я (у вас 40 байтов по сравнению с моим исходным 67!)
Codefun64

Я ценю объяснение! Всегда рад узнать больше из моего любимого языка сценариев! Я даже не знал об увеличении префикса, это довольно круто. Спасибо :)
Codefun64

Добро пожаловать, рад помочь!
Дом Гастингс

1

MATL , 41 байт

6Yr`j?t@=?'*BANG!*'DT.}'*click*'DT]}T.]]x

Чтобы нажать на триггер, введите непустую строку (например, 'try').

Для завершения введите пустую строку

Примеры

В этом случае спусковой крючок был нажат один раз и ... невезение

>> matl
 > 6Yr`j?t@=?'*BANG!*'DT.}'*click*'DT]}T.]]x
 > 
> try
*BANG!*

В этом случае пользователь остановился (обратите внимание на последний пустой ввод) после двух удачных попыток:

>> matl
 > 6Yr`j?t@=?'*BANG!*'DT.}'*click*'DT]}T.]]x
 > 
> try
*click*
> try
*click*
> 

объяснение

6Yr                  % random avlue from 1 to 6    
`                    % do...while  
  j                  % input string
  ?                  % if nonempty
    t                % duplicate the orignal random value
    @                % loop iteration index  
    =                % are the equal?
    ?                % if so             
      '*BANG!*'D     % display string
      T.             % unconditional break                                     
    }                % else
      '*click*'D     % display string
      T              % true value, to go on with do...while loop
    ]                % end if               
  }                  % else                                                    
    T.               % unconditional break
  ]                  % end                                                     
]                    % end                                                     
x                    % delete original random value

1

Perl 6 ,  58    53 байта

for ^6 .pick(*) {get;say <*BANG!* *click*>[?$_];!$_&&last} # 58 bytes

$ perl6 -pe '$///=^6 .pick;$_=$/--??"*click*"!!say("BANG!")&&last' # 52+1= 53 bytes

Нажмите ввод, чтобы нажать на курок, или Ctrl + C, чтобы нажать его.


1

Python 2, 88 84 байта

Это решение вдохновлено уже предоставленными решениями Python 3. Я выбрал python 2 для удаления круглых скобок при печати, хотя это меняет поведение input ().

import time
for i in[0]*int(time.time()%6)+[1]:input();print("*click*","*BANG!*")[i]
  • Я использую модуль времени как случайную функцию (достаточно для русской рулетки)
  • вход игрока должен быть «i», а затем «Enter» (иначе input () выдаст ошибку), этот прием основан на том факте, что ввод может быть «любым».

1

Рубин, 45 + 1 = 46

Не такой умный, как у D-стороны , но немного короче.

С флагом командной строки pзапустите

rand(7-$.)<1?(puts'*BANG*';exit):$_='*click*'

Пользователь может нажать на курок с возвратом и выйти с помощью control-c. pзаставляет программу работать в цикле, читая строки из STDIN и выводя $_. Каждый раз, когда он работает, он увеличивается $.. Поэтому при первом запуске выбирается случайное положительное целое число меньше 6, затем 5, затем 4 и так далее. На первом 0 мы выводим вручную и выходим, пока не выведем неявно.

(и теперь я замечаю, что уже есть очень похожий Perl. Ну, хорошо.)


1

Perl 5, 69 51 49 байт

map{<>;print"*click*"}1..rand 6;<>;print"*BANG!*"

Вероятно, есть еще несколько возможностей для игры в гольф, я посмотрю на это.

Изменения:

  • Сохранено 8 байтов путем удаления $lи некоторых точек с запятой, и 10 байтов при изменении <STDIN>на<>
  • Сохранено 2 байта благодаря Олегу Волкову

1
49:map{<>;print"*click*"}1..rand 6;<>;print"*BANG!*"
Олег В. Волков

@ OlegV.Volkov Спасибо! Я отредактирую это сейчас.
ASCIIThenANSI

0

VBA, 126 байт

Гольф-версия для минимальных байтов

Sub S()
r=Int(5*Rnd())
e:
a=MsgBox("")
If a=1 Then: If i=r Then MsgBox "*BANG!*" Else: MsgBox "*click*": i=i+1: GoTo e
End Sub

Веселая версия, которая делает кнопки более четкими для повышения восприятия пользователем.

Sub RR()
r = Int(5 * Rnd())
e:
a = MsgBox("Are you Feeling Lucky?", 4)
If a=6 Then: If i=r Then MsgBox "*BANG!*", 16 Else: MsgBox "*click*", 48: i=i+1: GoTo e
End Sub

Немного веселья с пользовательскими формами, и вы можете сделать красивую игру в VBA.


0

APL, 39/65 байт

{⍞⊢↑⍵:⍞←'*BANG*'⋄∇1↓⍵⊣⍞←'*click*'}6=6?6

Довольно простой ответ.


Что означают два байта?
Mego

0

C, 180 байт

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){srand(time(NULL));int r,i=6;while(i!=1){getchar();r=rand()%i;if(r){puts("CLICK");}else{puts("BANG");exit(0);}i--;}}

Моя первая попытка кода гольф, вероятно, есть много возможностей для улучшения :)


0

Юлия, 71 байт

b=rand(1:6);while b>0 readline();print(b>1?"*click*":"*BANG!*");b-=1end

Нажмите, Enterчтобы стрелять или Ctrl+C чтобы выйти. Последний заканчивается на InterruptException.

Ungolfed:

# Set an initial bullet location
b = rand(1:6)

while b > 0
    # Read user input
    readline()

    # Check the location
    if b > 1
        print("*click*")
    else
        print("*BANG!*")
    end

    b -= 1
end

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.