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.


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:



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;

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


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


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.

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)


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.


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



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 .


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.


1

TI-Basic

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

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

@ 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

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.


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.


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.


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

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

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

0

GTB

[@r;p;]

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


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.


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]

0

Jawa

import java.util.Random;

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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.