Hentikan dengan 50% non-Hentikan

8

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.

ike
sumber
8
Maksud saya itu harus memiliki probabilitas tepat 50% untuk berhenti di setiap jalan.
Seperti
3
Tapi itu tidak akan berhenti, jangan berhenti, berhenti, jangan berhenti karena dengan probabilitas 50% Anda mendapatkan berjalan.
Paul
5
Jika program tidak berhenti, apakah itu berarti ia berjalan selamanya? Ini pasti akan berhenti ketika saya mematikan PC. (Kecuali itu adalah kode NSA, lalu siapa yang tahu ...)
Paul
7
Siapa yang terus menjawab pertanyaan-pertanyaan buruk ini?
Gareth
4
Ini pertanyaan yang bagus. Hanya mereka yang tidak mengerti probabilitas yang bingung karenanya. Judul aslinya mungkin agak menyesatkan, tetapi tidak lebih buruk dari New York Times.
Keith Randall

Jawaban:

33

Perl

fork || do {sleep(1) while(1)}

Setiap kali Anda menjalankan program ini, ia berhenti dan tidak berhenti.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
10
Pemberhentian
13

JavaScript

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;
Gagang pintu
sumber
@ Jan Ups, maaf, sudah diperbaiki. (Saya menjawab dari telepon saya sekarang jadi saya tidak bisa menguji)
Gagang pintu
terlihat bagus sekarang (saya masih suka jawaban saya lebih baik ;-))
John Dvorak
1
Tidak berfungsi pada ie8 / ff3 (troll kompatibilitas)
Tyzoid
@ Tyzoid yang menggunakan FF3? Dan itu berfungsi di IE8.
John Dvorak
Ini tidak sesuai dengan tantangan lagi, karena dapat diprediksi.
The Guy with The Hat
13

Python

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

Keith Randall
sumber
+1 untuk matematika. Ini akan menjadi masalah tes "apa perilaku kode ini" yang baik.
Primo
1
Tidak bekerja Anda tidak dapat menjumlahkan probabilitas seperti itu; probabilitas sebenarnya untuk berhenti adalah 1-3 / 4 * 7/8 * 15/16 ..., yang berhasil menjadi sekitar 42%.
user2357112 mendukung Monica
1
bagus tapi komentar di atas benar: probabilitas untuk tidak berhenti adalah P (tidak berhenti di tempat pertama) * P (tidak berhenti di tempat kedua) * P (bukan di tempat ketiga) * ... yang cenderung ~ 58%. Lihat persis di sini: wolframalpha.com/input/…
ejrb
2
mulai dengan p=0.3078458untuk mendapatkan 50,00002% :)
ejrb
2
Salahku. Probabilitas itu sulit.
Keith Randall
4

GolfScript

2rand{.}do

Saya tahu ini bukan tantangan , tapi saya tetap saja . :)


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.

Ilmari Karonen
sumber
4

Rubi

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:

  • rentang eksklusif digunakan, artinya 99 tidak pernah diuji, artinya hanya ada 48 nilai yang mungkin n, 24 di antaranya adalah bilangan prima.
  • sementara 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.
John Dvorak
sumber
4

Saya ingin bermain golf ini:

Befunge - 5 karakter

?><
@

(Saya tidak yakin apakah ini benar-benar berfungsi karena saya tidak memiliki compiler befunge pada saya)

Zaq
sumber
3

PESTA

#!/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.

Tyzoid
sumber
3

Geometry Dash 2.2 Editor Glitch - 2 objek

masukkan deskripsi gambar di sini

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.

masukkan deskripsi gambar di sini

Di dalam pemicu acak.

masukkan deskripsi gambar di sini

MilkyWay90
sumber
2

C

#include <unistd.h>
main() { while (getpid()&2); }
Nama samaran
sumber
-1: Tidak Tepat 50%
recursion.ninja
Persis 50% pada sistem operasi saya. Mungkin tidak ada pada Anda ...
Nama samaran
2

Solusi yang agak dikaburkan:

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

Python

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

Penjelasan

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 .

Petr Pudlák
sumber
2

INTERCAL , 59 byte

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

Cobalah online!

COME FROM COMING FROM membuat loop tanpa akhir, tetapi ada peluang 50% untuk melompat ke akhir program.

KSmarts
sumber
1

TI-Basic

:Lbl 1:If round(rand):Pause:Goto 1
Timtech
sumber
1
Sintaksnya round(adalah round(value,# of decimal places), dan argumen kedua default ke 9.
lirtosiast
1

C

int main() {
    char i;
    while(i&1);
}
meiamsome
sumber
@ JanDvorak Shhhhh, jangan bilang semuanya!
meiamsome
Ini menyalahgunakan perilaku yang tidak terdefinisi yang telah dipecah oleh kompiler untuk mengoptimalkan kode . Oleh karena itu, agar peluang ini berfungsi, Anda tidak dapat mengoptimalkan kode ini (bukan berarti ini akan berhasil, karena pada main, register diinisialisasi ke 0 untuk alasan keamanan).
Konrad Borowski
1

Python, 48

import random
a=random.randrange(2)
while a:pass
Patrick Collins
sumber
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 /

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.

Konrad Borowski
sumber
1

<> <, 5 byte dan kotak 2x2 yang indah

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.

Dave
sumber
itu tidak disebut <><tho, itu disebut ><>lol (kecuali ada satu yang disebut <><saya belum pernah dengar)
Sagitarius
Anda juga dapat menyimpan 1 byte dengan menghapus <(karena pointer membungkus); itu tidak akan menjadi 2x2 persegi lagi tapi itu akan menjadi golf dengan baik c:
Sagitarius
1

Jawa

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.

Mark Jeronimus
sumber
0

Persis 50% dari waktu?

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];
    }
}
malexdev
sumber
0

Haskell

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
Emil Vikström
sumber
0

Script Shell

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
Hildred
sumber
0

GTB

[@r;p;]

Saya tahu ini bukan kode-golf, tetapi saya memutuskan untuk tetap bermain golf.

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

Setiap lari akan berhenti jika lari sebelumnya tidak.

izabera
sumber
0

Script Perintah Windows

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]
Robert Sørlie
sumber
0

Jawa

import java.util.Random;

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

Python 2 , 54 byte

import time;H=[time.time()%2]
for h in H:H+=[h]*int(h)

Cobalah online!

Perilaku berhenti tergantung pada waktu saat ini.

Jonathan Frech
sumber