Dừng lại với 50% không dừng


8

Tạo một chương trình tạm dừng chính xác 50% thời gian. Nguyên bản. Câu hỏi bình chọn cao nhất chiến thắng. Bằng cách chính xác tôi có nghĩa là trên mỗi chạy có 50% cơ hội của nó ngăn chặn.


8
Tôi có nghĩa là nó nên có xác suất chính xác 50% để dừng lại trên mỗi lần chạy.
ike

3
Nhưng sau đó, nó sẽ không dừng lại, Đừng dừng lại, Dừng lại, Đừng dừng lại vì với 50% khả năng bạn sẽ chạy.
Paul

5
Nếu chương trình không dừng lại, điều đó có nghĩa là nó chạy mãi mãi? Nó chắc chắn sẽ dừng lại khi tôi tắt PC. (Trừ khi đó là mã NSA, thì ai biết ...)
Paul

7
Ai tiếp tục nâng cao những câu hỏi nghèo này?
Gareth

4
Đây là một câu hỏi tốt. Chỉ những người không hiểu xác suất mới bị nhầm lẫn bởi nó. Tiêu đề ban đầu có lẽ hơi sai lệch, nhưng không tệ hơn New York Times.
Keith Randall

Câu trả lời:



13

JavaScript

Các lựa chọn thay thế tạm dừng và không dừng lại. (dừng lại ở lần chạy đầu tiên, không dừng lại ở lần thứ hai, ...)

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

@Jan Rất tiếc, xin lỗi, đã sửa. (Tôi đang trả lời từ điện thoại của mình ngay bây giờ vì vậy tôi không thể kiểm tra)
Doorknob

bây giờ có vẻ tốt (tôi vẫn thích câu trả lời của mình hơn ;-))
John Dvorak

1
Không hoạt động trên eg8 / ff3 (troll tương thích)
Tyzoid

@Tyzoid ai sử dụng FF3? Và nó hoạt động trong IE8.
John Dvorak

Điều này không còn phù hợp với thách thức nữa, vì nó có thể dự đoán được.
Chàng trai với chiếc mũ

13

Con trăn

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

Mỗi lần xung quanh vòng lặp nó phá vỡ với xác suất giảm theo cấp số nhân. Cơ hội không bao giờ phá vỡ là sản phẩm (1-p) (1-p / 2) (1-p / 4) ... là ~ 1/2. (Nhận xét bắt buộc về điểm nổi không chính xác.)


+1 cho môn toán. Điều này sẽ làm cho một vấn đề kiểm tra "hành vi của mã này" là tốt.
primo

1
Không hoạt động. Bạn không thể thêm các xác suất như thế; xác suất tạm dừng thực tế là 1-3 / 4 * 7/8 * 15/16 ..., tỷ lệ này đạt khoảng 42%.
user2357112 hỗ trợ Monica

1
hay nhưng nhận xét ở trên là đúng: xác suất không tạm dừng là P (không dừng lại ở lần đầu tiên) * P (không dừng lại ở giây) * P (không phải thứ ba) * ... có xu hướng ~ 58%. Xem chính xác tại đây: wolframalpha.com/input/ từ
ejrb

2
bắt đầu với p=0.3078458để nhận 50.00002% :)
ejrb

2
Lỗi của tôi. Xác suất là khó.
Keith Randall

4

GolfScript

2rand{.}do

Tôi biết đây không phải là một thử thách , nhưng dù sao thì tôi cũng đã chơi nó. :)


Ngoài ra, đây là một triển khai GolfScript của giải pháp Keith Randall :

2{2*.rand}do

Về lý thuyết, điều này sẽ có chính xác 1/4 + 1/8 + 1/16 + ... = 1/2 xác suất tạm dừng. Tuy nhiên, trong thực tế, cuối cùng nó sẽ luôn hết bộ nhớ và dừng lại, bởi vì mẫu số cứ ngày càng dài hơn.


4

Hồng ngọc

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

Có chính xác 24 số nguyên tố lẻ trong khoảng từ 0..100, lớn nhất là 97. Thuật toán này chọn một số lẻ ngẫu nhiên trong phạm vi và lặp lại cho đến khi tìm thấy một số nguyên tố:

Việc thực hiện cụ thể này có hai lỗi:

  • một phạm vi độc quyền được sử dụng, có nghĩa là 99 không bao giờ được kiểm tra, có nghĩa là chỉ có 48 giá trị có thể có n, trong đó có 24 giá trị .
  • trong khi ncó nghĩa là được vẽ lại ở mỗi lần lặp, chỉ có kiểm tra tính nguyên thủy được thực hiện trong vòng lặp. Nếu lúc đầu nó không thành công, nó sẽ thử lại - nhưng với cùng một số.

4

Tôi cảm thấy như chơi golf này:

Befunge - 5 ký tự

?><
@

(Tôi không chắc liệu điều này có thực sự hoạt động hay không vì tôi không có trình biên dịch befunge đối với tôi)


3

BASH

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

Chỉ là một kịch bản tự sửa đổi thú vị.

Lưu ý: chuỗi trích dẫn trống trên echo -n ''chỉ để rõ ràng. Chúng có thể được gỡ bỏ mà không mất chức năng.


3

Geometry Dash 2.2 Editor Glitch - 2 đối tượng

nhập mô tả hình ảnh ở đây

Giải trình:

Trình kích hoạt ngẫu nhiên bật tắt ngẫu nhiên (vô hiệu hóa) ID nhóm 1 hoặc 2 với cơ hội 50%.

Các miếng đệm màu tím ở chế độ đảo ngược (có nghĩa là nếu khối lập phương chạm vào nó, khối lập phương di chuyển về phía sau, đi về bên trái mãi mãi.).

Vì pad màu tím có ID nhóm 2, nó có 50% khả năng bị vô hiệu hóa, điều đó có nghĩa là khối lập phương có thể đi qua nó đến cuối cấp, sẽ dừng lại.

Làm thế nào để tái tạo điều này:

Bảng màu tím ở chế độ đảo ngược và có ID nhóm 1.

nhập mô tả hình ảnh ở đây

Bên trong kích hoạt ngẫu nhiên.

nhập mô tả hình ảnh ở đây


2

C

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

-1: Không chính xác 50%
đệ quy.ninja

Đó chính xác là 50% trên hệ điều hành của tôi. Nó có thể không thuộc về bạn ...
Bút danh

2

Một số giải pháp che giấu:

Haskell

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

Con trăn

Giải pháp tương tự được thể hiện bằng 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))

Giải trình

Giải pháp này sử dụng thực tế là produt vô hạn Π (1-p ^ (- 2)) hội tụ đến 6 / π ^ 2 . Điều này là do (2) = Π (1 / (1-p ^ (- 2))) hội tụ đến π ^ 2/6 .


2

INTERCAL , 59 byte

DO %50 (1) NEXT
DO COME FROM COMING FROM
(1) PLEASE GIVE UP

Hãy thử trực tuyến!

COME FROM COMING FROM tạo một vòng lặp vô tận, nhưng có 50% cơ hội để bỏ qua đến cuối chương trình.


1

TI-Basic

:Lbl 1:If round(rand):Pause:Goto 1

1
Cú pháp cho round(round(value,# of decimal places)và đối số thứ hai mặc định là 9.
lirtosiast

1

C

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

@JanDvorak Shhhhh, đừng nói với mọi người!
meiamsome

Điều này lạm dụng hành vi không xác định mà trình biên dịch đã phá vỡ để tối ưu hóa mã . Do đó, để điều này có bất kỳ cơ hội hoạt động nào, bạn không thể tối ưu hóa mã này (không phải điều này sẽ hoạt động ngay cả khi đó, bởi vì main, các thanh ghi được khởi tạo thành 0 vì lý do bảo mật).
Konrad Borowski


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 /

Không phải mã golf, vì vậy tôi có thể tránh mã không thể đọc được (vì những gì nó làm là quan trọng hơn). Nó ngẫu nhiên khai báo một hàm trong giai đoạn biên dịch. Nếu nó được khai báo, doublelấy biểu thức chính quy làm đối số. Nếu nó không được khai báo, doublelà một bareword và Perl chia nó 3vô tận. Điều này lạm dụng phân tích cú pháp bareword của Perl, để có được trình phân tích cú pháp phân tích cùng một mã theo hai cách khác nhau.


1

<> <, 5 byte và hình vuông 2x2 đẹp

x;
><

xgửi con trỏ lệnh theo hướng ngẫu nhiên; Nếu nó gửi trái hoặc phải, IP sẽ đánh; và chấm dứt. Nếu nó đi lên hoặc xuống, IP sẽ bị kẹt trong ><vòng lặp vô hạn , được gửi qua lại giữa hai người.


nó không được gọi là <><tho, nó được gọi là ><>lol (trừ khi có một người được gọi là <><tôi chưa từng nghe đến)
Sagittarius

bạn cũng có thể lưu 1 byte bằng cách loại bỏ <(vì con trỏ bao quanh); nó sẽ không còn là hình vuông 2x2 nữa nhưng nó sẽ được chơi golf đẹp mắt c:
Nhân Mã

1

Java

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

Điều này tự sửa đổi mã để chuyển đổi == 1sang == 0và quay lại, mỗi khi nó chạy. Chỉ lưu mã với dòng mới hoặc phần bù sẽ sai.

Đây args.lengthchỉ là để ngăn chặn tối ưu hóa trình biên dịch.


0

Chính xác 50% thời gian?

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

Haskell

Chạy trong hai khoảng thời gian, mỗi lần dài 1 giây (được chọn vì 1 giây là đơn vị SI cho thời gian). Dừng lại bên trong 50% của các khoảng. Vì vậy, 50% số giây đang chạy sẽ không dừng lại, 50% còn lại sẽ dừng lại. Chỉ hoạt động trong GHC.

import Control.Concurrent (threadDelay)
main = threadDelay 1990000

0

Shell Script

tập lệnh này sẽ ghi các tập tin .md5sum trong thư mục con và hiện tại.

#!/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;]

Tôi biết đây không phải là môn đánh gôn nhưng tôi quyết định chơi golf bằng mọi cách.


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

Mỗi lần chạy sẽ dừng lại trước khi chạy.


0

Tập lệnh lệnh Windows

Tập lệnh này sẽ nối thêm mã vào chính nó, cuối cùng sẽ thay thế 'x' trên mỗi lần chạy.

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

Java

import java.util.Random;

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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.