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.


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:



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;

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


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


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.

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)


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.


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



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 .



1

TI-Basic

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

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

@ 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

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.


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.


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.


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

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

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

0

GTB

[@r;p;]

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


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.


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]

0

Java

import java.util.Random;

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.