ロシアンルーレット、リローデッド


32

ロシアンルーレットで遊ぼう!

通常、これは最短のMOD 6プログラムを作成する競争になりますが、クリックするたびに勝つ可能性が低くなるため、あまり現実的ではありません。ルールは次のとおりです。

  1. 本物の6シューティングゲームをエミュレートします。
    • 1つの弾丸が6つの部屋の1つに配置され、バレルは演奏前に1回だけ回転します。
    • n回目の試行で負ける可能性は1/6です。
    • n回試行した に負ける確率は1 /(6-n)です
    • 最大で6回の試行で負けることが保証されています。
  2. 負け:
    • テキストを表示する *BANG!*
    • プログラムを終了します。
  3. 受賞:
    • 「勝つ」とは、銃が発射しないことを意味しますが、弾丸はハンマーに近い1つの部屋です。
    • テキストを表示する *click*
    • プログラムを終了する機能とともに、「トリガー」をユーザーに提示します(「ctrl + c」、以下を参照)。
  4. プログラム固有:
    • トリガーを引くことは、最初の試行を含む何らかの形式のユーザー入力です。(これは、キーストローク、マウスクリックなど何でも構いません。テキストプロンプトは必要ありません。)
    • 終了するまで、プログラムのインスタンスは1つだけ許可されます。(プログラムの新しいインスタンスを実行することは、バレルに良いスピンを与えることに似ています。つまり、次のクリックで負ける確率は1/6にリセットされます。)

最短のコードが勝ちます!

リーダーボード


3
あなたの仮定は間違っています-n回目の試行で負ける可能性は、各ショットの後に弾丸を回転させた場合のみです。再スピンせずに失う可能性は、最初のショットで⅙、2番目で⅕、3番目で¼です。これは、「最大6回の試行で負けることが保証されています」で認識します。
リアルト

2
@ user2956063あなたはn:th回の試行に決して到達せず、負けない(n-1)/ 6のチャンスがあることを忘れています。それらは均一な1/6にバランスします。
ジェイコブライレ

2
多分それは仕方の違いは、コンピュータ科学者や統計学者は、その後確率を表現だ-私には、「n番目の試行で失う可能性が⅙ある」と言うが、それの定数です-かどうかnは1または100です
rhialto

3
「ロシアンルーレット、リローデッド」というタイトルが付けられなかったのはなぜですか?
Hand-E-Food

1
@ user2956063:確率は条件付きです。P(ショット2で負ける)=⅙、P(ショット2で負ける|ショット1で負けなかった)=⅕。また、n(暗黙的に、あなたに付与します)は[1,6]に制限されているため、100が出ています。
ティムペデリック

回答:


3

Pyth、23バイト

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

本当に簡単です。0〜5のランダムな反復回数は、クリックを表示し、入力の行を要求し、最後に感嘆符が続きます。


1
いまいましい、ピス!
チョイス

3バイト:最後の文字列があるべき*BANG!*ではないBANG
彩音

14

Ruby、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回クリックしてから発砲することです。そのため、出力は配列内に蓄積されます。
  • 2つのより多くのバイトが出力が好きなら削り取らすることができる"*click*"(最終的に印刷される必要ているもの)大丈夫です置き換えることにより、$><<。これがまだルールに従うかどうかはわかりませんでした。

68 64バイト

(別のアプローチ)

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

アルゴリズムについてはあまり考慮していませんでしたが(おそらくもっとコンパクトになりますが、それほど明確ではありません)、私はその中のモデルが本当に好きです:

  • 配列は、チャンバーの内容である要素を持つバレルをエミュレートします。1つの要素のみが弾丸であるため、それを回転およびシャッフルすることは同等です。
  • 0弾丸です。他の数字はそうではありません。
  • findブロックもfalseでもない最初の戻り値を見つけnilます。
  • ||-expressionはブロックから暗黙的に返されます。ショートサーキットです。最初のオペランド(nilまたはでない限りfalse)または2番目のオペランド(そうでない場合)を返します。そのため、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.よりも大きくない。しかしNaN7よりも小さくない
Bergi

@Bergiそれは本当です。説明をわかりやすくするために書き直しました。
user81655

6
Javascriptでのみ@Bergiを使用すると、そのステートメントが意味を成します。
MikeTheLiar

7

ルア、82 75バイト

かなり長いですが、luaには多くの詳細があります。

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

6

LabVIEW、46 LabVIEWプリミティブ

0と1の1つの配列を作成し、クリックを待機するループがあり、文字列を出力します。開始前にインジケーターをリセットするのを忘れたため、最初はBANGと表示されます。

また、これはgifであることに注意してください。再生/ロードが行われない場合は、ページを再度開いてください。


"*click*"銃が撃たなかった場合の出力をどこで行うかわかりません。また、それは出力します"bang""*BANG!*"
かてんきょう

これはgifである必要がありますが、私にとっては再生されません。それが問題になる可能性があります。そして、はい、それは私だけがその秒で適切に私変化を読んでいなかったこと、強打を置く
Eumel

愚かな私はそれが...開始時BANGをshowesなぜthatsのように、開始する前に空にした文字列を再初期化するのを忘れて
Eumel

問題ありません
。gifを

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
単にcharsを削除できます.?。の必要はありませんelse
ジャクベ

@FryAmTheEggman人を混乱させるのはすごい。スクラブを除去するのは驚くべきことです。
チョイス

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

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

キャンディ、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*")

ゴルフをしていない:

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

0から5までの乱数を生成し、そのクリックを何回か印刷してからbangを印刷します。エンター/リターンを押してトリガーを引きます。


ブルースの例に従って、次のようにして数バイトを保存できます。 from random import*
wnnmaw

他に何か足りないものがない限り、1バイトの節約になります。しかし、私はそれを取るでしょう!ありがとう!
スティーブエッカート

素敵な試み、私はあなたのソリューションを私の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*")))

ゴルフをしていない:

(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

プログラミングパズルとコードゴルフへようこそ!コードのゴルフの回答を投稿するときは、言語名とバイトカウントを含めてください(ここで編集しました)。ありがとう!
ProgramFOX

はい、どうもありがとう!私は実際にその問題を解決しようとしていました、あなたがする前にそれを正しく編集することができませんでした。
ბიმო

私はあなたを取得バイト数 112として、あなたは何を使用しましたが?
wnnmaw

また、あなたが行うことで2つのバイトを保存することができますa=shuffle([1,0,0,0,0,0])
wnnmaw

1
私の知る限り、シャッフルは基礎となるデータ構造を変更し、何も返しません。とにかくありがとう。見出し(言語とバイト数)はProgramFOXによって書かれました。しかし、私がwcそれを使うとき、どれが多すぎるかを私に与えるので、それは正しい。どのように数えますか?
ბიმო

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

助けてくれたDom Hastingsに感謝します!元の回答は67バイトでした。

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

実際の問題-pは、最後のprintステートメントを呼び出す前に終了することでした。理由はわかりません。試しました。それ以外に、素晴らしい提案、ありがとう!私の知識は...成長を続けて
Codefun64

@DomHastingsまた、残念なことに、何らかの理由で0|トリックが期待どおりに機能しませんでしたが、私はあなたの提案したように、printステートメントと最後のステートメントをいくつか削りました。今はどうですか?
Codefun64

@DomHastingsくそー、あなたは良いです。あなたは間違いなく私よりも小さなプログラムを書いたので、あなた自身の答えとしてそれを置くことをお勧めします(元の67に比べて40バイトあります!)
Codefun64

説明に感謝します!私の好きなスクリプト言語をもっと学ぶことができて、いつも幸せです!prefexの増分についても知りませんでした。ありがとう:)
Codefun64

手伝ってくれてうれしいです!
ドムヘイスティングス

1

MATL、41バイト

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

トリガーを引くには、空ではない文字列( 'try')を。

終了するには、空の文字列を入力します

この場合、トリガーは1回引っ張られましたが...不運:

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

この場合、2回のラッキープルの後、ユーザーは停止しました(最後の空の入力に注意してください)。

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

Enterキーを押してトリガーを引くか、ctrl + cを押してトリガーを下げます。


1

Python 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サイドほど賢くないが、少し短くなっています。

コマンドラインフラグを使用して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!*"

おそらくもっとゴルフの可能性があります。これについて見ていきます。

変更点:

  • 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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.