재 장전 된 러시아 룰렛


32

러시안 룰렛을하자!

일반적으로 이것은 가장 짧은 MOD 6 프로그램을 작성하는 경쟁이지만, 클릭 할 때마다 이길 확률이 줄어들 기 때문에 그리 현실적이지는 않습니다. 규칙은 다음과 같습니다.

  1. 실제 6 명 사수를 에뮬레이션하십시오 .
    • 하나의 총알이 6 개의 방 중 하나에 놓이고 배럴은 한 번만 재생됩니다.
    • n 번째 시도 에서 패배 할 확률 은 1/6입니다.
    • n 번 시도 잃을 확률 은 1 / (6-n)
    • 최대 6 번의 시도를 잃게됩니다.
  2. 지는:
    • 텍스트를 표시 *BANG!*
    • 프로그램을 종료하십시오.
  3. 승리:
    • "승리"는 총이 발사되지 않는다는 것을 의미하지만, 총알은 해머에 가까운 한 방입니다.
    • 텍스트를 표시 *click*
    • 프로그램 종료 기능과 함께 "트리거"를 사용자에게 제시하십시오 (예 : "ctrl + c", 아래 참조).
  4. 프로그램 별 :
    • 트리거를 당기는 것은 첫 번째 시도를 포함하여 어떤 형태의 사용자 입력입니다. (키 입력, 마우스 클릭 등 텍스트 프롬프트가 필요하지 않음)
    • 프로그램이 종료 될 때까지 하나의 프로그램 인스턴스 만 허용됩니다. (프로그램의 새 인스턴스를 실행하는 것은 배럴에 좋은 스핀을주는 것과 유사합니다. 즉, 다음 클릭에서 잃을 확률이 1/6으로 재설정됩니다.)

최단 코드 승리!

리더 보드


3
당신의 가정이 잘못되었습니다-n 번째 시도에서 잃을 확률은 각 샷 후에 총알을 다시 ⅙ 경우에만 ⅙입니다. 잃을 확률은 첫 번째 샷에서 ⅙, 두 번째에서 ⅕, 세 번째에서 ¼ ... 6 일에 1로 끝납니다. "최대 6 번의 시도에서 패배 할 수 있습니다."로이를 인식합니다.
rhialto

2
@ user2956063 당신은 n : th 시도에 결코 도달하지 못하여 잃을 수없는 (n-1) / 6 확률이 있다는 것을 잊고 있습니다. 그들은 균일 한 1/6으로 균형을 잡습니다.
Jacob Raihle

2
어쩌면 그것은 컴퓨터 과학자들과 통계 학자들이 확률을 표현하는 방식의 차이 일 것입니다. 나에게 "n 번째 시도에서 패배 할 가능성은 ⅙입니다"라고 말하면 n은 1이든 100이든 상관 없습니다.
rhialto

3
"Russian Roulette, Reloaded"라는 제목이없는 이유는 무엇입니까?
Hand-E-Food

1
@ user2956063 : 확률은 조건부 입니다. P (샷 2에 손실) = but, P (샷 2에 손실 | 1 샷에 손실되지 않음) = ⅕. 또한 n(암시 적으로 당신에게 줄 것입니다)은 [1,6]으로 제한되어 있으므로 100이 나왔습니다.
Tim Pederick

답변:


3

Pyth, 23 바이트

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

정말 간단합니다. 임의의 반복 횟수 0-5는 클릭을 표시하고 입력 라인을 요청한 후 끝에 뱅이옵니다.


1
젠장, pyth!
Cyoce

+3 바이트 : 마지막 문자열은 *BANG!*아니 어야합니다BANG
ayane

14

루비, 51 바이트

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

언 골프 드 :

[
  *(                        # 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}

Ungolfing은 독자들을 위해 떠났습니다. 그렇게 어렵지 않다

  • 다시 말하지만, 이번에 $><<puts교체품 으로 속임수를 쓸 수있는 마틴에게 도움이됩니다 .
  • 개행을 출력하지 않지만 필수는 아닙니다.
  • 짧을수록 간단합니다. 필요한 동작의 요지는 0-5 회의 클릭을 수행 한 다음 실행하는 것입니다. 이를 위해 출력은 배열 내부에 누적됩니다.
  • "*click*"로 교체 $><<하여 출력이 정상인 경우 (필요한 내용이 인쇄 됨) 2 바이트 줄일 수 있습니다 . 이것이 여전히 규칙을 따를 지 확신하지 못했습니다.

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

@Cyoce uhm ... 네. 아마해야합니다. 그것은 위의 항목으로 대체되었지만 다른 아이디어를 기반으로하므로 생략했습니다.
D-side


@Cyoce 오, 저를 용서하십시오, 첫 번째 게시물 및 지역 지식을 모르는 모든 것 :)
D-side

9

자바 스크립트, 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보다 크지 않지만 7보다 NaN작지 않습니다.
Bergi

@Bergi 사실입니다. 좀 더 명확하게 설명을 다시 작성했습니다.
user81655

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 becuase i를 시작하기 전에 표시기를 재설정하는 것을 잊었다 고 말합니다.

또한 이것은 gif이며, 재생 /로드하지 않으면 페이지를 다시여십시오.


"*click*"총이 쏘지 않았을 때 당신이 어디에서 출력을하는지 모르겠습니다 . 또한, 출력 수행 "bang"또는 "*BANG!*"?
Katenkyo

이것은 gif이어야하지만 나에게는 그렇지 않습니다. 문제가 될 수 있습니다. 그리고 예, 그것은 단지 뱅을 넣습니다. 그것은 제대로 읽지 않았습니다. 나는
그것을 조금만 바꿉니다.

바보 같은 나 ... 그것은 시작에 BANG를 showes 왜 그게 그래서 시작하기 전에 비워 문자열을 다시 초기화하는 것을 잊었다
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>
보았지만

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?>*

-F3으로 계산 된 명령 행 옵션이 필요합니다 . 를 누르면 트리거가 당겨집니다 Enter.

-F문자 그대로 모든 입력에 대해 스크립트를 다시 실행 하기 때문에 (나는 당신이 아닙니다) die실제로는 종료되지 않으므로 대신 런타임 오류 억제를 통해 종료합니다.@\n .


샘플 사용법

$ php -F primo-roulette.php

*click*
*click*
*BANG!*
$

4

펄 5, 43 바이트

로 실행하십시오 perl -p. 안정적인 총알 변형-즉 총알 위치는 처음에 한 번만 결정됩니다.

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

좋은! 를 사용하고 있기 때문에 헤더를 "Perl 5.10+"로 변경합니다 //=. 또한 점수세는-p 것을 잊지 마십시오 .
ThisSuitIsBlackNot

4

C, 110 74 72 바이트

포함을 없애고 바이트를 줄인 Dennis에게 감사합니다.

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

사탕 , 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

파이썬 3, 95 바이트

또한 첫 번째 골프 시도, Python 3에서도. Bruce를 맹세하고 나는 같은 사람이 아닙니다.

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

언 골프 드 :

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

0에서 5 사이의 난수를 생성하고 여러 번 클릭 하여 인쇄 한 다음 bang 을 인쇄하십시오 . Enter / Return을 눌러 트리거를 당깁니다.


Bruce의 예에 따라 다음과 같이 몇 바이트를 절약 할 수 있습니다.from random import*
wnnmaw

내가 잃어버린 다른 것이 없다면, 그것은 1 바이트 절약입니다. 그러나 나는 그것을 취할 것이다! 감사!
Steve Eckert

좋은 시도, 당신의 솔루션을 내 파이썬 2 솔루션에 대한 영감으로 사용했습니다 ^^
basile-henry


2

이맥스 리스프, 94 89 바이트

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

언 골프 드 :

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

2

R, 86 80 77 바이트

평소처럼 R에는 골프를 코딩하는 기능이 있지만 기능 이름은 looooooong입니다.

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

2

파이썬 (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

프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다! 코드 골프 답변을 게시 할 때 언어 이름과 바이트 수를 포함하십시오 (여기서 편집했습니다). 감사!
ProgramFOX

예, 고마워요! 나는 실제로 그 문제를 해결하려고 노력하고 있었고, 당신이하기 전에 올바르게 편집하지 못했습니다.
ბიმო

나는 당신의 수 바이트 수 (112)와 같은, 당신은 무엇을 사용 했을?
wnnmaw

또한 다음을 수행하여 2 바이트를 절약 할 수 있습니다.a=shuffle([1,0,0,0,0,0])
wnnmaw

1
내가 아는 한 셔플은 기본 데이터 구조를 변경하고 아무것도 반환하지 않습니다. 어쨌든 고맙습니다. 헤드 라인 (언어 및 바이트 수)은 ProgramFOX에 의해 작성되었습니다. 그러나 내가 그것을 사용할 때 wc어느 것이 너무 많은지 109를 제공하므로 맞습니다. 당신은 어떻게 계산합니까?
ბიმო

2

펄 5, 40 바이트

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

명령 행 옵션없이 실행하면을 눌러 트리거를 가져옵니다 Enter.


2

파이썬, 81 바이트

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

Ruby (51) 및 Python 솔루션에서 영감을 얻음


1

커먼 리스프, 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

펄 5, 43 바이트

42 바이트 + -p명령 행 옵션. 누르면 enter트리거됩니다.

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

그의 도움을 주신 Dom Hastings에게 감사드립니다! 원래 답변은 67 바이트였습니다.

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

Actually the problem with -p was that it would exit before calling the last print statement, not sure why. I've tried it. Other than that, awesome suggestions, thanks! My knowledge continues to grow...
Codefun64

@DomHastings 또한 불행히도 어떤 이유로 든 0|트릭이 예상대로 작동하지 않지만 인쇄 문장과 제안한 마지막 문장에서 약간의 바이트를 줄였습니다. 지금 어떻게 보입니까?
Codefun64

@DomHastings 젠장, 좋아. 나보다 작은 프로그램을 확실히 작성했기 때문에 본인의 답변으로 사용하는 것이 좋습니다 (원래 67에 비해 40 바이트가 있습니다!)
Codefun64

설명 감사합니다! 내가 좋아하는 스크립팅 언어에 대해 더 많이 배우게되어 기쁩니다! 나는 심지어 prefex 증가에 대해 몰랐다. 그것은 굉장하다. 감사합니다 :)
Codefun64

천만에요, 도와 주셔서 감사합니다!
Dom Hastings

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

펄 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

Enter 키를 눌러 트리거를 당기거나 ctrl + c를 눌러 내려 놓습니다.


1

파이썬 2, 88 84 바이트

이 솔루션은 이미 제공된 Python 3 솔루션에서 영감을 얻었습니다. input ()의 동작이 바뀌더라도 인쇄 괄호를 제거하기 위해 python 2를 선택했습니다.

import time
for i in[0]*int(time.time()%6)+[1]:input();print("*click*","*BANG!*")[i]
  • 나는 시간의 모듈로를 임의의 함수로 사용하고 있습니다 (러시아 룰렛에 충분합니다)
  • 플레이어 입력은 "i"여야하고 Enter (그렇지 않으면 input ()은 오류를 발생시킵니다) 여야합니다.이 방법은 입력이 "무엇이든"될 수 있다는 사실에 의존합니다.

1

루비, 45 + 1 = 46

D면 만큼 영리하지는 않습니다.'s but slightly shorter.

명령 행 플래그 p로 다음을 실행하십시오.

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

사용자는 트리거를 리턴으로 당기고 control-c를 그대로 둘 수 있습니다. p프로그램이 루프에서 실행되어 STDIN에서 행을 읽고 출력 $_합니다. 실행될 때마다 증가합니다$.. So on the first run, it chooses a random positive integer less than 6, then 5, then 4, and so on. On the first 0, we output manually and exit, until then we output implicitly.

(이제 이미 비슷한 Perl이 있다는 것을 알았습니다.


1

Perl 5, 69 51 49 bytes

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

There is probably some more golfing potential, I will look into this.

Changes:

  • Saved 8 bytes by removing $l and some semicolons, and 10 bytes by changing <STDIN> to <>
  • Saved 2 bytes thanks to Oleg V. Volkov

1
49: map{<>;print"*click*"}1..rand 6;<>;print"*BANG!*"
Oleg V. Volkov

@OlegV.Volkov Thanks! I'll edit it in now.
ASCIIThenANSI

0

VBA, 126 bytes

Golf Version for Minimal Bytes

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

Fun Version that Makes The Buttons more Clear for Increased User Acceptance.

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

Some Fun with Custom Forms and You could make a pretty Slick Game in VBA.


0

APL, 39/65 bytes

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

Pretty straightforward answer.


What do the two byte counts mean?
Mego

0

C, 180 Bytes

#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--;}}

My first attempt at code golf, there's probably a lot of room for improvement :)


0

Julia, 71 bytes

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

Press Enter to fire or Ctrl+C to quit. The latter ends with an 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

0

Lua, 73 bytes

q=io.read q()for i=2,math.random(6)do print"*click*"q()end print"*BANG!*"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.