50%非停止で停止


8

時間のちょうど 50%を停止するプログラムを作成します。オリジナルで。最も投票数の多い質問が勝ちます。することにより、正確に私が上であることを意味し、それぞれの実行停止、それの50%のチャンスがあります。


8
つまり実行ごとに停止する確率はちょうど 50%であるべきです。
2014年

3
しかし、それは停止しない、停止しない、停止しない、停止しないでください。50%の確率で実行されるためです。
Paul

5
プログラムが停止しない場合、それはそれが永久に実行されることを意味しますか?PCの電源を切ると完全に止まります。(それがNSAコードでない限り、誰が知っているか...)
Paul

7
だれがこれらの貧しい質問に賛成し続けますか?
Gareth

4
これは良い質問です。確率を理解していない人だけが混乱しています。元のタイトルはおそらく少し誤解を招くかもしれませんが、ニューヨークタイムズより悪くはありません。
キースランダル

回答:



13

JavaScript

代替案は停止し、停止しません。(最初の実行で停止し、2回目で停止しません...)

var h = localStorage.halt;
while (h) localStorage.halt = false;
localStorage.halt = true;

@Janおっと、申し訳ありませんが、修正されました。(私は今私の電話から応答しているので、テストできません)
ドアノブ

よさそうだ(私はまだ私の答えが好きです;
John Dvorak

1
ie8 / ff3(互換性トロール)では機能しません
Tyzoid

とにかくFF3を使用している@Tyzoid?また、IE8でも機能します。
John Dvorak

これは予測可能であるため、もはや課題に適合しません。
帽子をかぶった男

13

パイソン

import random
p=.3078458
while random.random()>=p:p/=2

ループを回るたびに、指数関数的に減少する確率で中断します。決して壊れない可能性は、積(1-p)(1-p / 2)(1-p / 4)...〜1/2です。(正確ではない浮動小数点に関する義務的なコメント。)


数学のための+1。これは、「このコードの動作は何か」というテストの問題をよくします。
プリモ2014年

1
動作しません。そのような確率を合計することはできません。実際の停止の確率は1-3 / 4 * 7/8 * 15/16 ...で、約42%になります。
user2357112はMonica

1
いいですが、上のコメントは正しいです。停止しない確率は、P(最初に停止しない)* P(2番目に停止しない)* P(3番目に停止しない)* ...で、58%程度になる傾向があります。:正確なため、ここを参照してくださいwolframalpha.com/input/...
ejrb

2
p=0.307845850.00002%を取得することから始めます:)
ejrb 2014年

2
私の悪い。確率は難しいです。
Keith Randall

4

GolfScript

2rand{.}do

これはチャレンジではないことは知っていますが、とにかくゴルフをしました。:)


または、キースランドールのソリューションの GolfScript実装を次に示します

2{2*.rand}do

理論的には、これには正確に1/4 + 1/8 + 1/16 + ... = 1/2の停止確率があります。しかし実際には、分母がどんどん長くなり続けるため、常にメモリが不足して停止します。


4

ルビー

n = 2*rand(1...49)+1; divisors = (1...100).select{|x|n % x == 0}.count until divisors == 2
print n

0..100の間にちょうど24の奇数の素数があり、最大値は97です。このアルゴリズムは、範囲内のランダムな奇数を選択し、素数が見つかるまで繰り返します。

この特定の実装には2つのバグがあります。

  • 排他的な範囲が使用されます。つまり、99がテストされることはありません。つまり、には48の可能な値しかなくn、そのうちの24は素数です。
  • しながら、n各反復で再描画であることを意味し、唯一の素数判定は、ループ内で実行されます。最初は成功しなかった場合、再試行しますが、同じ番号です。

4

私はこれをゴルフしたい気がしました:

Befunge-5文字

?><
@

(私は私にbefungeコンパイラを持っていないのでこれが実際に機能するかどうかわかりません)


3

バッシュ

#!/bin/bash
set -e
sed -i 's/true\;/false\;/' $0
while false; do echo -n ''; done;
sed -i 's/false\;/true\;/' $0

ただ楽しい自己修正スクリプト。

注:空の引用符で囲まれた文字列echo -n ''は、わかりやすくするためのものです。機能を失うことなく削除できます。


3

Geometry Dash 2.2 Editor Glitch-2オブジェクト

ここに画像の説明を入力してください

説明:

ランダムトリガーは、グループID 1または2を50%の確率でランダムに切り替えます(無効にします)。

紫色のパッドは反転モードになっています(つまり、立方体がそれに触れると、立方体が後方に移動し、それが永遠に左に移動します)。

紫色のパッドにはグループID 2があるため、無効になる可能性は50%です。つまり、キューブはそれを通過してレベルの最後に到達し、停止します。

これを再現する方法:

紫色のパッドは反転モードにあり、グループIDは1です。

ここに画像の説明を入力してください

ランダムトリガーの中。

ここに画像の説明を入力してください


2

C

#include <unistd.h>
main() { while (getpid()&2); }

-1:厳密に50%ではない
recursion.ninja 14年

私のオペレーティングシステムでは正確に50%です。それはあなたのものではないかもしれません...
仮名

2

やや難読化されたソリューション:

ハスケル

import Control.Monad
import Control.Monad.Random         -- package MonadRandom
import Control.Monad.Trans.Maybe
import Data.Numbers.Primes          -- package primes

-- | Continue the computation with a given probability.
contWithProb :: (MonadRandom m, MonadPlus m) => Double -> m ()
contWithProb x = getRandomR (0, 1) >>= guard . (<= x)

loop :: MonadRandom m => MaybeT m ()
loop = contWithProb (pi^2/12) >> mapM_ (contWithProb . f) primes
  where
    f p = 1 - (fromIntegral p)^^(-2)

main = evalRandIO . runMaybeT $ loop

パイソン

Pythonで表現された同じソリューション:

import itertools as it
import random as rnd
from math import pi

# An infinite prime number generator
# Copied from http://stackoverflow.com/a/3796442/1333025
def primes():
    D = {  }
    yield 2
    for q in it.islice(it.count(3), 0, None, 2):
        p = D.pop(q, None)
        if p is None:
            D[q*q] = q
            yield q
        else:
            # old code here:
            # x = p + q
            # while x in D or not (x&1):
            #     x += p
            # changed into:
            x = q + 2*p
            while x in D:
                x += 2*p
            D[x] = p

def contWithProb(p):
    if rnd.random() >= p:
        raise Exception()

if __name__ == "__main__":
    rnd.seed()
    contWithProb(pi**2 / 12)
    for p in primes():
        contWithProb(1 - p**(-2))

説明

このソリューションは、無限生成d (1-p ^(-2))6 /π^ 2に収束するという事実を利用しています。これは、ζ(2)=Π(1 /(1-p ^(-2))) π^ 2/6に収束するためです。




1

C

int main() {
    char i;
    while(i&1);
}

@JanDvorak Shhhhh、みんなに言わないで!
meiamsome 14年

これは、コンパイラがコードを最適化するためすでに破壊ている未定義の動作を悪用します。したがって、これが機能する可能性があるため、このコードを最適化することはできません(mainセキュリティ上の理由から、レジスタが0に初期化されているため、それでも機能しません)。
Konrad Borowski、2014年


1

Perl

BEGIN {
    # Do the following block 50% of time.
    if (int rand 2) {
        # Create a function that doubles values.
        *double = sub {
            2 * shift;
        };
    }
}
double / 3 while 1; # Calculates double divided using /

ゴルフをコーディングしないので、解読できないコードを回避できました(何をするかがより重要であるため)。コンパイル段階でランダムに関数を宣言します。宣言されている場合doubleは、引数として正規表現を取得します。宣言されない場合、それはdouble裸語であり、Perlはそれを3際限なく分割します。これは、パーサーに同じコードを2つの異なる方法で解析させるために、Perlのベアワード解析を悪用します。


1

<> <、5バイト、美しい2x2の正方形

x;
><

xランダムな方向に命令ポインタを送信します。左または右に送信すると、IPがヒットします。そして終了します。IPが上昇または下降すると、無限><ループに陥り、2つの間で送受信されます。


それは<><tho と呼ばれていません、それは><>lolと呼ばれ<><ています(聞いたことがないと呼ばれるものがない限り)
射手座

また、<(ポインターが循環するため)を削除することで1バイトを節約できます。2x2の四角形ではなくなりますが、見事にゴルフされますc:
射手座

1

ジャワ

import java.io.*;

public class HaltNoHalt {
    public static void main(String[] args) throws Exception {
        RandomAccessFile f = new RandomAccessFile("HaltNoHalt.java", "rw");
        f.seek(372);
        int b = f.read();
        f.seek(372);
        f.write(b ^ 1);
        Runtime.getRuntime().exec("javac HaltNoHalt.java");

        while ((args.length & 1) == 1);
    }
}

この自己修正切り替えるためのコード== 1== 0と戻って、それはのたびに実行を。改行のみでコードを保存してください。そうしないと、オフセットが正しくなくなります。

これargs.lengthは、コンパイラの最適化を防ぐためのものです。


0

時間のちょうど 50%ですか?

OBJ-C

- (void)applicationDidFinishLaunching:(NSNotification*)aNotification {
    BOOL haltedLastRun = [(NSNumber*)[[NSUserDefaults standardUserDefaults] objectForKey:@"halted"] boolValue];
    if (!haltedLastRun) {
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@"halted"];
        [[NSApplication sharedApplication] terminate:nil];
    }
}

0

ハスケル

2つの間隔で実行され、それぞれ1秒の長さです(1秒は時間のSI単位であるため選択されました)。間隔の50%内で停止します。したがって、実行中の秒の50%は停止せず、残りの50%は停止します。GHCでのみ機能します。

import Control.Concurrent (threadDelay)
main = threadDelay 1990000

0

シェルスクリプト

このスクリプトは、現在のディレクトリと子ディレクトリにある.md5sumファイルを上書きします。

#!/bin/sh
echo *.md5sum|xargs -n1|head -n1|xargs test -e && exec rm *.md5sum
while ! find . -name '*.md5sum' -print0 |xargs -0r grep 00000000000000
do {
    find . -type f -print|sed -e 's!^\(.*\)$!md5sum "\1" > "\1".md5sum!e'
}
done

0

GTB

[@r;p;]

これはコードゴルフではないことは知っていますが、とにかくゴルフをすることにしました。


0

C ++

#include <fstream>
main () {
    int c;
    std::fstream fs;
    fs.open ("myfile.txt", std::fstream::in);
    fs>>c;
    fs.close ();
    fs.open ("myfile.txt", std::fstream::out);
    fs<<c+1;
    fs.close ();
    while (c%2);
    return 0;
}

それぞれの実行は、以前の実行が行われなかった場合に停止します。


0

Windowsコマンドスクリプト

このスクリプトはそれ自身にコードを追加し、最終的に実行ごとに「x」を交互にします。

call :last
if %x%==1 (
    echo>>%0 set x=0
    exit /b 0
) else (
    echo>>%0 set x=1
)
:nohalt
goto :nohalt
:last
set x=1
[newline here]

0

ジャワ

import java.util.Random;

class Halt50 {
    public static void main(String[] args){
        if(new Random().nextInt(2)==0)for(;;);
    }
}


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