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.
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.
Câu trả lời:
fork || do {sleep(1) while(1)}
Mỗi khi bạn chạy chương trình này, nó sẽ dừng lại và không dừng lại.
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;
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.)
p=0.3078458
để nhận 50.00002% :)
2rand{.}do
Tôi biết đây không phải là một thử thách chơi gôn , 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.
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:
n
, trong đó có 24 giá trị .n
có 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ố.#!/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.
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.
Bên trong kích hoạt ngẫu nhiên.
C
#include <unistd.h>
main() { while (getpid()&2); }
Một số giải pháp che giấu:
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
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 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 .
DO %50 (1) NEXT
DO COME FROM COMING FROM
(1) PLEASE GIVE UP
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.
:Lbl 1:If round(rand):Pause:Goto 1
round(
là round(value,# of decimal places)
và đối số thứ hai mặc định là 9.
C
int main() {
char i;
while(i&1);
}
main
, các thanh ghi được khởi tạo thành 0 vì lý do bảo mật).
import random
a=random.randrange(2)
while a:pass
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, double
lấy biểu thức chính quy làm đối số. Nếu nó không được khai báo, double
là một bareword và Perl chia nó 3
vô 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.
x;
><
x
gử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.
<><
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)
<
(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:
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 == 1
sang == 0
và 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.length
chỉ là để ngăn chặn tối ưu hóa trình biên dịch.
Chính xác 50% thời gian?
- (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];
}
}
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
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
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]
_($rand*2)+2>$
2>$
1
import time;H=[time.time()%2]
for h in H:H+=[h]*int(h)
Hành vi tạm dừng phụ thuộc vào thời gian hiện tại.