Buat program yang berhenti tepat 50% dari waktu. Jadi diri sendiri. Pertanyaan terpilih tertinggi menang. Dengan persis saya berarti bahwa pada setiap run ada kesempatan 50% dari itu tersendat-sendat.
Buat program yang berhenti tepat 50% dari waktu. Jadi diri sendiri. Pertanyaan terpilih tertinggi menang. Dengan persis saya berarti bahwa pada setiap run ada kesempatan 50% dari itu tersendat-sendat.
Jawaban:
fork || do {sleep(1) while(1)}
Setiap kali Anda menjalankan program ini, ia berhenti dan tidak berhenti.
Alternatif berhenti dan tidak berhenti. (Menghentikan pada menjalankan pertama, tidak berhenti pada kedua, ...)
var h = localStorage.halt;
while (h) localStorage.halt = false;
localStorage.halt = true;
import random
p=.3078458
while random.random()>=p:p/=2
Setiap kali di sekitar loop rusak dengan probabilitas menurun secara eksponensial. Peluang untuk tidak pernah putus adalah produk (1-p) (1-p / 2) (1-p / 4) ... yaitu ~ 1/2. (Komentar wajib tentang floating point tidak tepat.)
p=0.3078458untuk mendapatkan 50,00002% :)
2rand{.}do
Saya tahu ini bukan tantangan kode-golf , tapi saya tetap saja golf . :)
Atau, inilah implementasi GolfScript dari solusi Keith Randall :
2{2*.rand}do
Secara teori, ini akan memiliki tepat 1/4 + 1/8 + 1/16 + ... = 1/2 probabilitas penghentian. Namun dalam praktiknya, memori pada akhirnya selalu akan habis dan berhenti, karena penyebutnya semakin lama semakin lama.
n = 2*rand(1...49)+1; divisors = (1...100).select{|x|n % x == 0}.count until divisors == 2
print n
Ada tepat 24 bilangan prima ganjil antara 0,.100, yang terbesar adalah 97. Algoritma ini memilih angka ganjil acak dalam rentang dan mengulanginya sampai menemukan bilangan prima:
Implementasi khusus ini memiliki dua bug:
n, 24 di antaranya adalah bilangan prima.nitu dimaksudkan untuk digambar ulang pada setiap iterasi, hanya pengujian primality dieksekusi dalam loop. Jika pada awalnya tidak berhasil, itu akan mencoba lagi - tetapi dengan nomor yang sama.#!/bin/bash
set -e
sed -i 's/true\;/false\;/' $0
while false; do echo -n ''; done;
sed -i 's/false\;/true\;/' $0
Hanya script modifikasi yang menyenangkan.
Catatan: string kosong yang dikutip aktif echo -n ''hanya untuk kejelasan. Mereka dapat dihapus tanpa kehilangan fungsionalitas.
Penjelasan:
Pemicu acak secara acak mengaktifkan (menonaktifkan) ID Grup 1 atau 2 dengan peluang 50%.
Pad ungu berada pada mode terbalik (artinya jika kubus menyentuhnya, kubus bergerak mundur, yang pergi ke kiri selamanya dan selamanya.).
Karena pad ungu memiliki ID Grup 2, itu memiliki peluang 50% untuk dinonaktifkan, yang berarti bahwa kubus dapat melewatinya hingga akhir level, yang akan berhenti.
Cara mereproduksi ini:
Pad ungu dalam mode terbalik dan memiliki ID Grup 1.
Di dalam pemicu acak.
C
#include <unistd.h>
main() { while (getpid()&2); }
Solusi yang agak dikaburkan:
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
Solusi yang sama dinyatakan dalam 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))
Solusi ini memanfaatkan fakta bahwa produt tak terbatas Π (1-p ^ (- 2)) bertemu menjadi 6 / π ^ 2 . Ini karena ζ (2) = Π (1 / (1-p ^ (- 2)))) konvergen ke π ^ 2/6 .
DO %50 (1) NEXT
DO COME FROM COMING FROM
(1) PLEASE GIVE UP
COME FROM COMING FROM membuat loop tanpa akhir, tetapi ada peluang 50% untuk melompat ke akhir program.
:Lbl 1:If round(rand):Pause:Goto 1
round(adalah round(value,# of decimal places), dan argumen kedua default ke 9.
C
int main() {
char i;
while(i&1);
}
main, register diinisialisasi ke 0 untuk alasan keamanan).
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 /
Bukan kode golf, jadi saya bisa menghindari kode yang tidak dapat dibaca (karena apa yang dilakukannya lebih penting). Ini secara acak menyatakan suatu fungsi selama fase kompilasi. Jika dideklarasikan, doubledapatkan ekspresi reguler sebagai argumen. Jika tidak dideklarasikan, doubleadalah kata pengantar, dan Perl membaginya dengan 3tanpa henti. Ini menyalahgunakan pengartian kata kunci Perl, untuk mendapatkan parser mengurai kode yang sama dua cara yang berbeda.
x;
><
xmengirimkan penunjuk instruksi dalam arah acak; Jika mengirim ke kiri atau ke kanan IP akan mengenai; dan mengakhiri. Jika naik atau turun IP akan macet di infinite ><loop, dikirim bolak-balik di antara keduanya.
<><tho, itu disebut ><>lol (kecuali ada satu yang disebut <><saya belum pernah dengar)
<(karena pointer membungkus); itu tidak akan menjadi 2x2 persegi lagi tapi itu akan menjadi golf dengan baik 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);
}
}
Ini memodifikasi sendiri kode untuk beralih == 1 ke == 0dan kembali, setiap kali dijalankan. Simpan kode hanya dengan baris baru atau offset akan salah.
Itu args.lengthhanya untuk mencegah optimisasi kompiler.
Persis 50% dari waktu?
- (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];
}
}
Berjalan selama dua interval, masing-masing panjangnya 1 detik (dipilih karena 1 detik adalah satuan SI untuk waktu). Berhenti di dalam 50% interval. Jadi 50% dari detik berjalan itu tidak akan berhenti, 50% lainnya akan berhenti. Hanya bekerja di GHC.
import Control.Concurrent (threadDelay)
main = threadDelay 1990000
skrip ini akan clobber file .md5sum di direktori saat ini dan anak.
#!/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
Script ini akan menambahkan kode ke dirinya sendiri yang pada akhirnya akan menggantikan 'x' pada setiap proses.
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)
Perilaku berhenti tergantung pada waktu saat ini.