Detener con 50% sin detenerse


8

Cree un programa que se detenga exactamente el 50% del tiempo. Ser original. La pregunta más votada gana. Con exactamente quiero decir que en cada carrera hay un 50% de posibilidades de que se detenga.


8
Quiero decir que debería tener exactamente un 50% de probabilidad de detenerse en cada carrera.
ike

3
Pero entonces no será Alto, No Alto, Alto, No Alto porque con un 50% de probabilidad obtienes carreras.
Paul

55
Si el programa no se detiene, ¿eso significa que se ejecuta para siempre? Seguramente se detendrá cuando apague la PC. (A menos que sea un código NSA, entonces quién sabe ...)
Paul

77
¿Quién sigue votando estas pobres preguntas?
Gareth

44
Esta es una buena pregunta. Solo aquellos que no entienden la probabilidad están confundidos por ella. El título original fue quizás un poco engañoso, pero no peor que el New York Times.
Keith Randall

Respuestas:



13

JavaScript

Alternativas deteniéndose y no deteniéndose. (se detiene en la primera carrera, no se detiene en la segunda, ...)

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

@ Jan Oops, lo siento, arreglado. (Estoy respondiendo desde mi teléfono en este momento, así que no puedo probar)
Pomo de la puerta

se ve bien ahora (todavía me gusta mi respuesta mejor ;-))
John Dvorak

1
No funciona en ie8 / ff3 (troll de compatibilidad)
Tyzoid

@Tyzoid que usa FF3 de todos modos? Y funciona en IE8.
John Dvorak

Esto ya no se ajusta al desafío, porque es predecible.
The Guy with The Hat

13

Pitón

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

Cada vez alrededor del ciclo se rompe con una probabilidad exponencialmente decreciente. La posibilidad de que nunca se rompa es el producto (1-p) (1-p / 2) (1-p / 4) ... que es ~ 1/2. (El comentario obligatorio sobre el punto flotante no es exacto).


+1 para matemáticas. Esto sería un buen problema de prueba de "cuál es el comportamiento de este código".
primo

1
No funciona No puedes sumar las probabilidades así; la probabilidad real de detenerse es 1-3 / 4 * 7/8 * 15/16 ..., lo que equivale a alrededor del 42%.
user2357112 es compatible con Monica el

1
bueno, pero el comentario anterior es correcto: la probabilidad de no detenerse es P (no detenerse en el primero) * P (no detenerse en el segundo) * P (no en el tercero) * ... que tiende a ~ 58%. Ver aquí para obtener información exacta: wolframalpha.com/input/…
ejrb

2
comience con p=0.3078458para obtener 50.00002% :)
ejrb

2
Culpa mía. La probabilidad es difícil.
Keith Randall el

4

GolfScript

2rand{.}do

Sé que esto no es un desafío de , pero lo jugué de todos modos. :)


Alternativamente, aquí hay una implementación de GolfScript de la solución de Keith Randall :

2{2*.rand}do

En teoría, esto tendrá exactamente 1/4 + 1/8 + 1/16 + ... = 1/2 probabilidad de detenerse. En la práctica, sin embargo, siempre se quedará sin memoria y se detendrá, porque el denominador se vuelve cada vez más largo.


4

Rubí

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

Hay exactamente 24 números primos impares entre 0..100, el más grande es 97. Este algoritmo elige un número impar aleatorio dentro del rango y se repite hasta que encuentra un número primo:

Esta implementación particular tiene dos errores:

  • se utiliza un rango exclusivo, lo que significa que 99 nunca se prueba, lo que significa que solo hay 48 valores posibles n, de los cuales 24 son primos.
  • aunque nestaba destinado a ser redibujado en cada iteración, solo la prueba de primalidad se ejecuta en el bucle. Si al principio no tiene éxito, lo intentará nuevamente, pero con el mismo número.

4

Tenía ganas de jugar al golf:

Befunge - 5 caracteres

?><
@

(No estoy seguro de si esto realmente funciona ya que no tengo un compilador befunge)


3

GOLPETAZO

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

Solo un divertido script auto modificable.

Nota: las cadenas entre comillas vacías echo -n ''son solo para mayor claridad. Se pueden eliminar sin pérdida de funcionalidad.


3

Geometry Dash 2.2 Glitch Editor - 2 objetos

ingrese la descripción de la imagen aquí

Explicación:

El disparador aleatorio alterna aleatoriamente (deshabilita) la ID de grupo 1 o 2 con una probabilidad del 50%.

La almohadilla púrpura está en modo inverso (lo que significa que si el cubo lo toca, el cubo se mueve hacia atrás, lo que va hacia la izquierda para siempre).

Dado que la almohadilla púrpura tiene ID de grupo 2, tiene un 50% de posibilidades de desactivarse, lo que significa que el cubo puede pasar a través de ella hasta el final del nivel, lo que se detendrá.

Cómo reproducir esto:

La almohadilla púrpura está en modo inverso y tiene ID de grupo 1.

ingrese la descripción de la imagen aquí

Dentro del disparador aleatorio.

ingrese la descripción de la imagen aquí



2

Solución algo ofuscada:

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

Pitón

La misma solución expresada en 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))

Explicación

Esta solución hace uso del hecho de que el producto infinito Π (1-p ^ (- 2)) converge a 6 / π ^ 2 . Esto se debe a que ζ (2) = Π (1 / (1-p ^ (- 2))) converge a π ^ 2/6 .


2

INTERCAL , 59 bytes

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

Pruébalo en línea!

COME FROM COMING FROM realiza un bucle sin fin, pero hay un 50% de posibilidades de saltar al final del programa.


1

TI-Basic

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

1
La sintaxis para round(es round(value,# of decimal places), y el segundo argumento predeterminado es 9.
lirtosiast

1

C

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

@ JanDvorak Shhhhh, ¡no se lo digas a todos!
meiamsome

Esto abusa del comportamiento indefinido que los compiladores ya rompen para optimizar el código . Por lo tanto, para que esto tenga alguna posibilidad de funcionar, no puede optimizar este código (no es que esto funcione incluso entonces, porque en main, los registros se inicializan a 0 por razones de seguridad).
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 /

No codifico el golf, por lo que podría evitar el código ilegible (porque lo que hace es más importante). Declara aleatoriamente una función durante la fase de compilación. Si se declara, doubleobtiene expresión regular como argumento. Si no se declara, doublees una palabra simple, y Perl lo divide 3sin cesar. Esto abusa del análisis de palabras simples de Perl, para que el analizador analice el mismo código de dos maneras diferentes.


1

<> <, 5 bytes y un hermoso cuadrado de 2x2

x;
><

xenvía el puntero de instrucciones en una dirección aleatoria; Si envía izquierda o derecha, la IP golpeará; y terminar. Si sube o baja, la IP se atascará en el ><bucle infinito y se enviará de ida y vuelta entre los dos.


no se llama <><tho, se llama ><>lol (a menos que haya una llamada de la <><que no haya oído hablar)
Sagitario

también puede guardar 1 byte quitando el <(porque el puntero se ajusta); ya no será un cuadrado de 2x2 pero estará muy bien golfizado c:
Sagitario

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

Esto auto modifica el código para alternar el == 1 a== 0 ida y vuelta, cada vez que es dirigido. Guarde el código solo con líneas nuevas o el desplazamiento será incorrecto.

Esto args.lengthes solo para evitar optimizaciones del compilador.


0

Exactamente 50% del tiempo?

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

Se ejecuta durante dos intervalos, cada uno de 1 segundo de duración (elegido porque 1 segundo es la unidad SI por tiempo). Se detiene dentro del 50% de los intervalos. Entonces, el 50% de los segundos de funcionamiento no se detendrá, el otro 50% lo hará. Funciona solo en GHC.

import Control.Concurrent (threadDelay)
main = threadDelay 1990000

0

Shell Script

este script bloqueará los archivos .md5sum en los directorios actuales y secundarios.

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

Sé que esto no es golf de código, pero decidí jugarlo de todos modos.


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

Cada ejecución se detendrá si la ejecución anterior no lo hizo.


0

Script de comandos de Windows

Este script agregará código a sí mismo, que en última instancia alterna 'x' en cada ejecución.

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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.