Halt mit 50% Nicht-Halt

8

Erstellen Sie ein Programm, das genau 50% der Zeit anhält . Sei originell. Die Frage mit der höchsten Abstimmung gewinnt. Mit genau meine ich, dass bei jedem Lauf eine 50% ige Chance besteht, dass es zum Stillstand kommt.

ike
quelle
8
Ich meine, es sollte eine Wahrscheinlichkeit von genau 50% haben, bei jedem Lauf anzuhalten.
wie am
3
Aber dann wird es nicht Halt, Don't Halt, Halt, Don't Halt sein, denn mit einer Wahrscheinlichkeit von 50% bekommst du Runs.
Paul
5
Wenn das Programm nicht anhält, heißt das, dass es für immer läuft? Es wird verdammt noch mal aufhören, wenn ich den PC ausschalte. (Es sei denn, es ist NSA-Code, wer weiß dann ...)
Paul
7
Wer stimmt diesen armen Fragen immer wieder zu?
Gareth
4
Das ist eine gute Frage. Nur wer die Wahrscheinlichkeit nicht versteht, ist verwirrt. Der ursprüngliche Titel war vielleicht etwas irreführend, aber nicht schlechter als die New York Times.
Keith Randall

Antworten:

33

Perl

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

Jedes Mal, wenn Sie dieses Programm ausführen, wird es angehalten und nicht angehalten.

Gilles 'SO - hör auf böse zu sein'
quelle
10
Schrödingers Halt
scrblnrd3
13

JavaScript

Alternativen anhalten und nicht anhalten. (hält beim ersten Lauf an, bleibt beim zweiten nicht stehen, ...)

var h = localStorage.halt;
while (h) localStorage.halt = false;
localStorage.halt = true;
Türknauf
quelle
@ Jan Ups, sorry, behoben. (Ich antworte gerade von meinem Telefon aus, damit ich nicht testen kann)
Türknauf
sieht jetzt gut aus (meine Antwort gefällt mir immer noch besser ;-))
John Dvorak
1
Funktioniert nicht auf ie8 / ff3 (Kompatibilitätstroll)
Tyzoid
@ Tyzoid wer benutzt FF3 überhaupt? Und es funktioniert in IE8.
John Dvorak
Dies passt nicht mehr zur Herausforderung, da es vorhersehbar ist.
Der Kerl mit dem Hut
13

Python

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

Jedes Mal um die Schleife bricht sie mit exponentiell abnehmender Wahrscheinlichkeit. Die Chance, niemals zu brechen, ist das Produkt (1-p) (1-p / 2) (1-p / 4) ... das ~ 1/2 ist. (Obligatorischer Kommentar, dass Gleitkomma nicht genau ist.)

Keith Randall
quelle
+1 für Mathe. Dies würde ein gutes Testproblem "Was ist das Verhalten dieses Codes?" Machen.
Primo
1
Funktioniert nicht Sie können die Wahrscheinlichkeiten nicht so addieren; Die tatsächliche Wahrscheinlichkeit des Anhaltens beträgt 1-3 / 4 * 7/8 * 15/16 ..., was ungefähr 42% entspricht.
user2357112 unterstützt Monica
1
schön, aber der obige Kommentar ist richtig: Die Wahrscheinlichkeit, nicht anzuhalten, ist P (nicht beim ersten Anhalten) * P (nicht beim zweiten Anhalten) * P (nicht beim dritten Anhalten) * ... was zu ~ 58% tendiert. Siehe hier für genaue: wolframalpha.com/input/…
ejrb
2
Beginnen Sie mit p=0.3078458, um 50.00002% zu erhalten :)
ejrb
2
Mein Fehler. Wahrscheinlichkeit ist schwer.
Keith Randall
4

GolfScript

2rand{.}do

Ich weiß, dass dies keine Herausforderung ist, aber ich habe es trotzdem gespielt. :) :)


Alternativ ist hier eine GolfScript-Implementierung der Lösung von Keith Randall :

2{2*.rand}do

Theoretisch hat dies eine Wahrscheinlichkeit von genau 1/4 + 1/8 + 1/16 + ... = 1/2 des Anhaltens. In der Praxis wird es jedoch immer irgendwann keinen Speicher mehr geben und anhalten, da der Nenner immer länger wird.

Ilmari Karonen
quelle
4

Rubin

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

Es gibt genau 24 ungerade Primzahlen zwischen 0 und 100, wobei die größte 97 ist. Dieser Algorithmus wählt eine zufällige ungerade Zahl innerhalb des Bereichs und wiederholt sich, bis eine Primzahl gefunden wird:

Diese spezielle Implementierung weist zwei Fehler auf:

  • Es wird ein exklusiver Bereich verwendet, was bedeutet, dass 99 niemals getestet wird, was bedeutet, dass es nur 48 mögliche Werte gibt n, von denen 24 Primzahlen sind.
  • Während nbei jeder Iteration neu gezeichnet werden sollte, wird nur der Primalitätstest in der Schleife ausgeführt. Wenn es zuerst nicht gelingt, wird es erneut versucht - aber mit der gleichen Nummer.
John Dvorak
quelle
4

Ich wollte dieses Golf spielen:

Befunge - 5 Zeichen

?><
@

(Ich bin nicht sicher, ob dies tatsächlich funktioniert, da ich keinen befunge Compiler bei mir habe)

Zaq
quelle
3

BASH

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

Nur ein lustiges selbstmodifizierendes Skript.

Hinweis: Die leere Zeichenfolge in Anführungszeichen dient echo -n ''nur der Übersichtlichkeit. Sie können ohne Funktionsverlust entfernt werden.

Tyzoid
quelle
3

Geometry Dash 2.2 Editor Glitch - 2 Objekte

Geben Sie hier die Bildbeschreibung ein

Erläuterung:

Der zufällige Auslöser schaltet zufällig die Gruppen-ID 1 oder 2 mit einer 50% igen Chance um (deaktiviert sie).

Das lila Pad befindet sich im umgekehrten Modus (dh wenn der Würfel ihn berührt, bewegt sich der Würfel rückwärts, was für immer und ewig nach links geht.).

Da das lila Pad die Gruppen-ID 2 hat, besteht eine 50% ige Chance, dass es deaktiviert wird, was bedeutet, dass der Würfel es bis zum Ende des Levels passieren kann, was zum Stillstand kommt.

So reproduzieren Sie dies:

Das lila Pad befindet sich im umgekehrten Modus und hat die Gruppen-ID 1.

Geben Sie hier die Bildbeschreibung ein

Innerhalb des zufälligen Auslösers.

Geben Sie hier die Bildbeschreibung ein

MilkyWay90
quelle
2

C.

#include <unistd.h>
main() { while (getpid()&2); }
Pseudonym
quelle
-1: Nicht genau 50%
recursion.ninja
Es ist genau 50% auf meinem Betriebssystem. Es könnte nicht auf Ihrem sein ...
Pseudonym
2

Etwas verschleierte Lösung:

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

Die gleiche Lösung in Python ausgedrückt:

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

Erläuterung

Diese Lösung nutzt die Tatsache, dass das unendliche Produkt Π (1-p ^ (- 2)) gegen 6 / π ^ 2 konvergiert . Dies liegt daran, dass ζ (2) = Π (1 / (1-p ^ (- 2))) gegen π ^ 2/6 konvergiert .

Petr Pudlák
quelle
2

INTERCAL , 59 Bytes

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

Probieren Sie es online aus!

COME FROM COMING FROM macht eine Endlosschleife, aber es besteht eine 50% ige Chance, zum Ende des Programms zu springen.

KSmarts
quelle
1

TI-Basic

:Lbl 1:If round(rand):Pause:Goto 1
Timtech
quelle
1
Die Syntax für round(ist round(value,# of decimal places), und das zweite Argument ist standardmäßig 9.
lirtosiast
1

C.

int main() {
    char i;
    while(i&1);
}
meiamsome
quelle
@ JanDvorak Shhhhh, sag es nicht allen!
Meiamsome
Dies missbraucht undefiniertes Verhalten, das Compiler bereits unterbrechen , um den Code zu optimieren . Damit dies funktioniert, können Sie diesen Code nicht optimieren (nicht, dass dies auch dann funktioniert, da maindie Register aus Sicherheitsgründen in 0 initialisiert werden).
Konrad Borowski
1

Python, 48

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

Kein Code Golf, also könnte ich unlesbaren Code vermeiden (weil das, was er tut, wichtiger ist). Während der Kompilierungsphase wird zufällig eine Funktion deklariert. Wenn es deklariert wird, doublewird ein regulärer Ausdruck als Argument abgerufen. Wenn es nicht deklariert wird, doubleist es ein Barwort, und Perl teilt es 3endlos durch. Dies missbraucht Perls Bareword-Analyse, um Parser dazu zu bringen, denselben Code auf zwei verschiedene Arten zu analysieren.

Konrad Borowski
quelle
1

<> <, 5 Bytes und ein wunderschönes 2x2 Quadrat

x;
><

xsendet den Befehlszeiger in eine zufällige Richtung; Wenn es nach links oder rechts sendet, wird die IP getroffen; und beenden. Wenn es nach oben oder unten geht, bleibt die IP in der Endlosschleife stecken ><und wird zwischen den beiden hin und her gesendet.

Dave
quelle
es heißt nicht <><tho, es heißt ><>lol (es sei denn, es gibt einen, von dem <><ich noch nichts gehört habe)
Sagittarius
Sie können auch 1 Byte speichern, indem Sie das entfernen <(da sich der Zeiger umgibt). Es wird kein 2x2-Quadrat mehr sein, aber es wird schön gespielt. c:
Sagittarius
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);
    }
}

Diese Selbst ändert den Code zu wechseln die == 1zu == 0und zurück, es ist Lauf jedes Mal. Speichern Sie den Code nur mit Zeilenumbrüchen, da sonst der Versatz falsch ist.

Dies args.lengthdient nur dazu, Compiler-Optimierungen zu verhindern.

Mark Jeronimus
quelle
0

Genau 50% der Zeit?

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
quelle
0

Haskell

Läuft in zwei Intervallen mit einer Länge von jeweils 1 Sekunde (ausgewählt, da 1 Sekunde die SI-Einheit für die Zeit ist). Hält innerhalb von 50% der Intervalle an. 50% der laufenden Sekunden werden nicht angehalten, die anderen 50%. Funktioniert nur in GHC.

import Control.Concurrent (threadDelay)
main = threadDelay 1990000
Emil Vikström
quelle
0

Shell-Skript

Dieses Skript blockiert .md5sum-Dateien in den aktuellen und untergeordneten Verzeichnissen.

#!/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
quelle
0

GTB

[@r;p;]

Ich weiß, dass dies kein Code-Golf ist, aber ich habe mich trotzdem dazu entschlossen, Golf zu spielen.

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

Jeder Lauf wird angehalten, wenn der vorherige Lauf dies nicht getan hat.

Izabera
quelle
0

Windows-Befehlsskript

Dieses Skript hängt Code an sich selbst an, der letztendlich bei jedem Lauf 'x' wechselt.

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
quelle
0

Java

import java.util.Random;

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