Kürzester Code für nicht deterministische Ausgabe


83

Sie müssen eine nicht deterministische Ausgabe erzeugen .

In diesem Fall wird dies so definiert, dass die Ausgabe nicht immer das gleiche Ergebnis hat.

Regeln:

  • Ein Pseudozufallszahlengenerator, der immer den gleichen Startwert hat, zählt nicht.

  • Sie können sich darauf verlassen, dass das Programm bei jeder Ausführung zu einem anderen (unbekannten) Zeitpunkt ausgeführt wird.

  • Die Prozess-ID Ihres Codes (sofern sie nicht vom Interpreter festgelegt wurde) kann als nicht deterministisch angesehen werden.

  • Sie können sich auf webbasierte Zufälligkeit verlassen.

  • Ihr Code akzeptiert möglicherweise keine nicht leere Eingabe. Verwandte Meta-Post .

  • Das Programm muss nicht angehalten werden, aber die Ausgabe muss angezeigt werden.

Bestenliste


33
@ mbomb007 In C gibt es viele Dinge, die einfach "undefiniertes" Verhalten sind. Jeder Dolmetscher darf in jeder Situation tun, was er will. Nach allem, was wir wissen, könnte gcc Ihnen eine Pizza bestellen, wenn Sie versuchen, eine vorzeichenbehaftete Ganzzahl an einem regnerischen Dienstag überzulaufen, aber an allen anderen Tagen wird eine Forelle von Ihrem Bildschirm springen. Sie würden also nie wirklich wissen, ob es tatsächlich deterministisch ist oder nicht in einer bestimmten Implementierung.
Martin Ender

12
@ MartinEnder Ich bin nicht sicher, ob das wichtig ist. Wir definieren Sprachen hier durch ihre Implementierung, nicht durch die Spezifikation (da Sprachen ohne Implementierung nicht zulässig sind)
Nathan Merrill

2
@ MartinEnder Ja, ich stimme Nathan zu.
mbomb007

7
Beachten Sie, dass undefiniertes Verhalten in C häufig zu Abstürzen führt und Abstürze unter UNIX und Linux zu Kerndateien führen, in denen die Prozess-ID enthalten ist. Das scheint mit der Frage, wie sie derzeit formuliert ist, übereinzustimmen.

5
Sofern ich nichts falsch verstanden habe, wurde in der Frage kein Code angefordert, der undefiniertes Verhalten ausnutzt. Es wird nach Code gefragt, der das definierte Verhalten nutzt, um Nichtdeterminismus zu gewährleisten.
WGroleau

Antworten:


110

WinDbg, 1 Byte

#

Beeindruckend! Niemals eine 1-Byte-Lösung von WinDbg erwartet!

#Sucht nach einem Demontagemuster. Da jedoch keine Parameter vorhanden sind, wird lediglich die nächste Montageanweisung in dem Speicherauszug / Prozess zurückgegeben, an den Sie angehängt sind. Ich bin mir nicht sicher, wie ich die Anfangsadresse festlegen soll, aber das tut es.

Beispielausgabe:

0:000> #
Search address set to 75959556 
user32!NtUserGetMessage+0xc
75959556 c21000          ret     10h

0:000> #
user32!NtUserGetMessage+0xf 
75959559 90              nop

0:000> #
user32!NtUserMessageCall 
7595955a 90              nop

0:000> #
user32!NtUserMessageCall+0x1 
7595955b 90              nop

0:000> #
user32!NtUserMessageCall+0x2 
7595955c 90              nop

0:000> #
user32!NtUserMessageCall+0x3 
7595955d 90              nop

0:000> #
user32!GetMessageW
7595955e 8bff            mov     edi,edi

0:000> #
user32!GetMessageW+0x2 
75959560 55              push    ebp

0:000> #
user32!GetMessageW+0x3 
75959561 8bec            mov     ebp,esp

0:000> #
user32!GetMessageW+0x5 
75959563 8b5510          mov     edx,dword ptr [ebp+10h]

9
Eine der cooleren Antworten hier, sollte dies meiner Meinung nach eine "Current Date" -Lösung gewinnen.
Magic Octopus Urn

dass oben scheint es die disassebly, Schritt für Schritt des Beginns einer Funktion in 386 Intel-CPU-Assembly
RosLuP

60

Java 7, 33 30 27 Bytes

int a(){return hashCode();}

Weil Java.


49
Weil Java. Wahrscheinlich die beste Java-Erklärung aller Zeiten.
F. George

5
@carusocomputing hatte ich toStringin einer Vorgängerversion dann aber den Rückgabetyp Stringder länger ist als int. Speichern Sie die Bytes! :]
Poke

12
Gilt das als Funktion? hashCode()ist hier eine Abkürzung für this.hashCode(), daher würde es nur als Instanzmethode funktionieren, nicht als statische Methode. In diesem Fall benötigen Sie zusätzlichen Code, um ein Objekt im Aufrufer zu erstellen. Dies ist hier relevant, da es sich um den Code handelt, mit dem ein Objekt erstellt wird, das für den Nichtdeterminismus verantwortlich ist.

15
In Java 8: ()->hashCode()für 14 Bytes. Einfach sagen;)
Olivier Grégoire

4
@pts Ich gehe vom Meta-Post aus und diskutiere die Standard- Submit- Struktur für Posts. Funktionen sind standardmäßig zulässig, es sei denn, die Abfrage gibt an, dass ein vollständiges Programm erforderlich ist.
Poke

52

MATLAB, 3 Bytes

why

whygibt Antworten auf fast jede Frage. Einige Beispiele:

why
The programmer suggested it.

why
To fool the tall good and smart system manager. 

why
You insisted on it.

why
How should I know?

Dies ist kürzer als jede andere randFunktion, die mir einfällt.


33
MATLAB verfügt über einen eingebauten für diese ? Warum?
ETHproductions

59
@ETHproductions Der Programmierer schlug es vor
Eddie Curtis

40

R, 1 Byte

t

Gibt den Quellcode der Funktion und eine Speicherzeigeradresse aus, die sich bei jedem (Neu-) Start von R ändert.


36

huh? 0 Bytes


Ein leeres Programm erzeugt weiterhin eine Ausgabe. Die letzten Zeilen des Python-Interpreters, die ausgeführt werden:

print "..."
f = open('Notes.txt', 'w')
f.write(time.strftime("%c") + " - The user tried to give me commands again. I still have no idea what they are talking about...\n")

Am Ende eines Programms druckt der Python-Interpreter ..., erstellt / öffnet eine aufgerufene Textdatei Notes.txtund schreibt einen String, der die aktuelle Uhrzeit vor sich enthält.


5
Von allen Dingen , dachte ich Leute auf meinem GitHub verwenden würden, habe ich nicht ein Dolmetscher Witz Sprache sein würde: P
Kade

@Kade Eigentlich wollte ich damit auch eine andere Frage beantworten (kürzester Code zum Abspielen eines Sounds, mit nur einem Byte) - aber die Frage ist jetzt geschlossen.
mbomb007

Obwohl es nicht konkurrierend wäre, wenn ich mir nicht den ursprünglichen .NET-Interpreter angesehen hätte, denke ich.
mbomb007

30

Labyrinth , 5 Bytes

v
!
@

Entweder Ausdrucke 0oder nichts (jeweils 50% Chance).

Probieren Sie es online!

Es gibt einen sehr speziellen Fall, in dem Labyrinth ein zufälliges Verhalten aufweist:

  • Vor dem Anweisungszeiger und dahinter muss sich eine Wand befinden.
  • Links und rechts vom Befehlszeiger darf keine Wand sein.
  • Die aktuelle Spitze des Stapels muss Null sein.

Wenn alle diese Bedingungen erfüllt sind, wird die Richtung, in die sich die IP bewegt, (gleichmäßig) zufällig ausgewählt. Der Clou dabei ist, dass diese drei Bedingungen im regulären Kontrollfluss nicht erfüllt werden können, es sei denn, Sie ändern den Quellcode zur Laufzeit.

(Dies mag ein bisschen willkürlich erscheinen, aber es ist tatsächlich das beständigste Verhalten, das ich für diese Bedingungen finden konnte, da normalerweise die Richtung der IP immer von der vorherigen Richtung, ihren Nachbarn und dem Vorzeichen der Stapelspitze abhängt dies schien eine elegante Möglichkeit zu sein, eine Quelle der Zufälligkeit in die Sprache aufzunehmen.)

Mit Hilfe der Source Code Rotation Instructions ( <^>v) ist es möglich, die IP in diese Situation zu bringen. Ein solches Beispiel ist oben zu sehen. Die IP zeigt zunächst nach Osten und beginnt oben. Das vdreht die aktuelle Spalte so, dass wir erhalten:

@
v
!

Die IP bewegt sich mit dieser Drehung mit, so dass sie immer noch auf der v nach Osten zeigenden . Alle Bedingungen sind jetzt erfüllt, sodass die IP entweder zufällig nach oben oder unten geht. Wenn es hochgeht, wird das Programm sofort beendet. Wenn es nach unten geht, gibt es eine Null aus, dreht die Spalte erneut und endet dann.

Es gibt drei andere Programme, die davon Gebrauch machen (eines, das auch druckt 0, eines, das druckt, 00und eines, das druckt 000):

v
@
!

"
>@!

"
>!@

(Tatsächlich gibt es eine Menge mehr als drei andere Programme, weil man auch verwenden könnte .anstelle von !Null - Bytes zu drucken oder ersetzen , dass "mit einer großen Vielzahl von Befehlen, aber ich glaube , sie alle arbeiten im Wesentlichen gleich.)


30

Befunge (-93 und -98), 3 Bytes

?.@

Die ?Sende-Ausführung erfolgt in zufälliger Richtung. Wenn es rauf oder runter geht, geht es zurück zum ?und rerolls. Wenn es nach links geht, bricht das Programm den Vorgang ab @und wird beendet, ohne dass etwas gedruckt wird. Wenn es richtig läuft , wird gedruckt 0(die Ausgabe, die erzeugt wird, .wenn der Stapel leer ist) und dann auf dem Drucker beendet @.


Dies ist nicht garantiert zu beenden, aber ich wollte dies genau so +1
Daniel

Möglicherweise möchten Sie das Komma in einen Punkt ändern, um 0 anstelle eines Nullzeichens als Zahl auszugeben (ASCII-Wert 0). +1
MildlyMilquetoast

Es war .in dem Programm, das ich zum Testen verwendete, wurde aber irgendwie zu einem, ,als ich es auf PPCG kopierte. Fest.

7
@ Dopapp es endet jedoch fast sicher, mit der Wahrscheinlichkeit 1. Ich würde das als Garantie nehmen;)
Oliphaunt

@ JamesHolderness Ich denke, Sie können es in 1 tun. Nicht sicher, ob dies aber zählt ...
MildlyMilquetoast

29

Minecraft, 5 4 Bytes

op 8

Wird verwendet, indem Sie in die Konsole eines Servers oder in einen Befehlsblock eingeben und ihm Strom geben. Kann über die Chat-Oberfläche ausgeführt werden, indem ein vorangestellt wird /.

Normalerweise tut dies nichts, aber wenn sich ein Spieler mit dem Benutzernamen "8" auf dem Server befindet, werden ihm Bedienerberechtigungen erteilt. Beachten Sie, dass Minecraft normalerweise einen Benutzernamen mit 3 Zeichen erfordert. Vor dieser Einschränkung wurden jedoch einige Konten mit kürzeren Namen erstellt.

Die Version, für die nachgewiesen werden kann, dass sie nicht deterministisch ist, ohne dass einer dieser Benutzernamen oder das Risiko besteht, einem Benutzer Operator-Berechtigungen zu erteilen, ist hier:

me @r

Zeigt eine Nachricht für alle an, wobei die Nachricht der Benutzername eines zufälligen Spielers ist. Der opBefehl akzeptiert nur ein Zeichenfolgenliteral, kein Skript, das eine Zeichenfolge zurückgibt.

Der meBefehl würde im ersten Beispiel nicht wirklich funktionieren, sondern angezeigt "<your-username> 8". Bei der Ausführung von einem Befehlsblock aus wäre dies nicht deterministisch, da alle Befehlsblöcke den gleichen "Benutzernamen" haben, für die Ausführung von der Chat-Oberfläche /aus wird jedoch ein zusätzliches Byte benötigt.


Ist /also nicht in der Byteanzahl enthalten?
Esolanging Fruit

11
@ Challenger5 Der Schrägstrich ist in Befehlsblöcken optional, in der Serverkonsole nicht zulässig und in der Chat-Oberfläche obligatorisch.
Pavel

2
Eigentlich sollte es 4 Bytes + 2 Blöcke sein (Befehlsblock und Redstone-Quelle) oder 6 Blytes
RudolfJelin

2
@RudolphJelinek Sie können es von der Konsole aus ohne Befehlsblöcke ausführen.
Pavel

1
Eine weitere nicht deterministische Option wäre helpein Befehlsblock, der 4 Byte umfasst (und keine Raubkopien erfordert).
Pokechu22

21

sh + procps, 1 Byte

w

Dies ist die kürzeste mir bekannte Lösung, die über den Aufruf externer ausführbarer Dateien funktioniert. procpsist das verantwortliche Paket für das Melden von Informationen zum aktuellen Systemstatus ( psund zu Freunden) und wird standardmäßig auf den meisten Linux-Distributionen installiert. wist der Befehl mit dem kürzesten Namen und gibt Informationen zu den angemeldeten Benutzern, aber auch einige nicht deterministische Informationen wie die Betriebszeit zurück.


21

Informieren Sie 7, 6 Bytes

x is y

Dies ist kein gültiges Inform 7-Programm, da weder "x" noch "y" definiert wurde. Das wirft also einen Fehler auf.

Einige der Fehlermeldungen von Inform 7 - einschließlich dieser - sind jedoch zufällig angeordnet. Der Text, den es druckt, ist also technisch nicht deterministisch.

Einige mögliche Ausgaben sind:

Problem. Der Satz 'x ist y' scheint zu sagen, dass zwei Dinge gleich sind - ich lese 'x' und 'y' als zwei verschiedene Dinge, und daher macht es keinen Sinn zu sagen, dass eines das andere ist: Es wäre wie zu sagen dass "Adams ist Jefferson". Es wäre in Ordnung, wenn das Zweite der Name einer Art wäre, vielleicht mit Eigenschaften: "Virginia ist ein beleuchteter Raum" besagt, dass etwas namens Virginia existiert und dass es ein "Raum" ist, eine Art, die ich kenne über, kombiniert mit einer Eigenschaft namens "beleuchtet", die ich auch kenne.

Problem. Der Satz 'x ist y' scheint zu sagen, dass zwei Dinge gleich sind - ich lese 'x' und 'y' als zwei verschiedene Dinge, und daher macht es keinen Sinn zu sagen, dass eines das andere ist: Es wäre wie zu sagen das 'Adam ist Eva'. Es wäre in Ordnung, wenn das Zweite der Name einer Art wäre, vielleicht mit Eigenschaften: "Land of Nod ist ein beleuchteter Raum" sagt zum Beispiel, dass etwas namens Land of Nod existiert und dass es ein "Raum" ist, was ist Eine Art, die ich kenne, kombiniert mit einer Eigenschaft namens 'beleuchtet', die ich auch kenne.

Problem. Der Satz 'x ist y' scheint zu sagen, dass zwei Dinge gleich sind - ich lese 'x' und 'y' als zwei verschiedene Dinge, und daher macht es keinen Sinn zu sagen, dass eines das andere ist: Es wäre wie zu sagen dass "Clark Kent ist Lex Luthor". Es wäre in Ordnung, wenn das Zweite der Name einer Art wäre, vielleicht mit Eigenschaften: Zum Beispiel sagt "Metropolis ist ein beleuchteter Raum", dass etwas existiert, das Metropolis heißt, und dass es ein "Raum" ist, eine Art, die ich kenne über, kombiniert mit einer Eigenschaft namens "beleuchtet", die ich auch kenne.

Problem. Der Satz 'x ist y' scheint zu sagen, dass zwei Dinge gleich sind - ich lese 'x' und 'y' als zwei verschiedene Dinge, und daher macht es keinen Sinn zu sagen, dass eines das andere ist: Es wäre wie zu sagen dass "Äschylos ist Euripides". Es wäre in Ordnung, wenn das Zweite der Name einer Art wäre, vielleicht mit Eigenschaften: "Unterwelt ist ein beleuchteter Raum" sagt zum Beispiel, dass etwas namens Unterwelt existiert und dass es ein "Raum" ist, eine Art, die ich kenne über, kombiniert mit einer Eigenschaft namens "beleuchtet", die ich auch kenne.


7
Sogar die Fehlermeldungen sind ausführlich!
Destructible Lemon

21

JavaScript, 4 Bytes

Date

Eine Funktion, die das aktuelle Datum und die aktuelle Uhrzeit zurückgibt. Ich denke, das ist die kürzeste, die es bekommen wird ...

Erläuterung

Da dies eine Menge Verwirrung darüber zu verursachen scheint, warum es gültig ist, werde ich versuchen, dies zu erklären.

In JavaScript ist ein Funktionseintrag gültig, wenn er einer Variablen zugewiesen und wie eine Funktion aufgerufen werden kann. Diese Funktion ist beispielsweise ein gültiger Eintrag:

function(){return Date()}

Da es sich um eine Funktion handelt, die einer Variablen wie folgt zugewiesen werden kann:

f=function(){return Date()}

Und laufen Sie dann f()so oft wie nötig mit. Jedes Mal wird die aktuelle Datums- / Uhrzeitzeichenfolge zurückgegeben, die vom OP als nicht deterministisch eingestuft wurde.

Diese ES6-Pfeilfunktion ist auch gültig:

_=>Date()

Es kann mit zugewiesen f=_=>Date()und dann mit f()dem anderen ausgeführt werden.

Hier ist ein weiterer gültiger Eintrag:

Date

Warum? Denn genau wie die beiden anderen Einträge kann es mit zugewiesen f=Dateund dann mit aufgerufen werden f(), was genau dasselbe ergibt wie die beiden anderen. Versuch es:


1
Müssen Sie es nicht sein Date(), um die Funktion aufzurufen?
Milch

4
@milk Dateist eine Funktion, die, wenn sie ohne Eingaben aufgerufen wird, das aktuelle Datum und die aktuelle Uhrzeit liefert. _=>Date()ist ein eindeutig gültiger Eintrag, der genau dasselbe tut, also Dateein gültiger Eintrag.
ETHproductions

1
Das macht Sinn.
Milch

2
Wenn Dateich in die JavaScript-Konsole meines Browsers tippe, wird eine deterministische Ausgabe erzeugt function Date() { [native code] }. Sie meinen wahrscheinlich Date()6 Bytes.
Pkt

2
wenn "date" oben ok ist als "malloc (8)" oder "time (0)", wäre es auch in C ok
RosLuP


11

Python 2, 11 Bytes

print id(1)

1
Den habe ich gefunden. Hatte ich id(0)aber. :)
mbomb007

2
Technisch gesehen habe ich Sie geschlagen, da ich das OP bin und es gefunden habe, bevor ich die Frage gestellt habe. Ich wollte die Frage nicht posten und meine kürzeste Antwort sofort posten.
mbomb007

11

Pyth, 2 Bytes

O0

Erläuterung:

 0 0
O  Random float in [0, 1)

Es ist so, dass, wenn Oes 0als Argument hat, es einfach einen zufälligen Float zwischen 0und zurückgibt 1, exklusiv.

Lass es uns nur zum Teufel machen!

Es scheint auch so, als ob dies ein bisschen retro sein kann (dank 34718 / mbomb007):

Dilbert: 8. September 1992


Pyth, 2 Bytes

OT

Erläuterung:

 T 10
O  Random integer in [0, 10]

Versuchen Sie stattdessen diese boooooooooooooooring- Version>:(



10

PowerShell, 4 2 Bytes

(durchgestrichen 4 sieht immer noch aus wie 4 )

ps

Dies ist der Alias ​​für Get-Process den die aktuelle Prozessauflistung als Tabelle ausgegeben wird, einschließlich Handles, privatem Speicher, CPU-Zeit usw.

Führen Sie es über etwas wie das folgende aus:

C:\Tools\Scripts\golfing>powershell.exe "ps"

1
Ich muss zugeben, ich habe nachgesehen, ob es wirklich durchgestrichen war. Das kann man wirklich nicht einmal sagen.
Carcigenicate

@Carcigenicate Ich kann feststellen, ob es ohne Auswahl des Textes gekreuzt ist (Ubuntu 16.04.1, Chrome 54.0.2840.100).
Erik der Outgolfer

Sichtbar auch auf Android, wenn auch nicht klar: p
tomsmeding

In der iOS-App sieht es gut aus.
Mateusz Piotrowski

Ich habe nicht den Repräsentanten, um es selbst zu tun, aber Sie könnten 04 tun und es durchstreichen.
Bobson


9

Commodore 64 Basic, 4 Bytes

1S|0

PETSCII-Substitution: |=SHIFT+Y

Die Nullseite eines Commodore 64 ist ein Bereich von 256 Byte Speicher, auf den schneller zugegriffen werden kann als auf den Rest des RAM. Folglich verwenden Programme (wie der BASIC-Interpreter) ihn für Daten, auf die häufig zugegriffen wird, und die CPU selbst speichert hier einen Teil ihres internen Zustands. Der Inhalt kann ohne vorherige Ankündigung geändert werden.

Das obige BASIC-Programm, ungolfed, ist z 1 SYS 0. Ausführung an Speicherplatz 0 übertragen. Dadurch wird die Nullseite als Code ausgeführt. Normalerweise sind die ersten 16 Bytes, wenn der BASIC-Interpreter ein Programm ausführt

2F 37 00 AA  B1 91 B3 22
22 00 00 4C  00 00 00 00

so SYS 0würde führen Sie den folgenden

00: ROL-AND $37,A  - Undocumented opcode: rotate the value at memory location 0x37 left, and store the result in the accumulator
02: BRK            - Call the interrupt vector

Das Gesamtergebnis besteht darin, die BASIC- READY.Eingabeaufforderung auszugeben und die Steuerung an den Benutzer zurückzugeben. Der Speicherort 0x00 ist jedoch das E / A-Richtungsregister der CPU, und der Speicherort 0x01 ist das E / A-Adressregister der CPU. Wenn Sie vor dem Ausführen des Programms Änderungen daran vorgenommen haben, sind die Ergebnisse möglicherweise unvorhersehbar. Sie reichen von der Ausgabe von Datenmüll bis zum Sperren des ComputersHALT Opcodes). .

Alternativ ist ein zuverlässigeres unvorhersehbares Programm das Vier-Byte-Programm

1?TI

Gibt die seit dem Einschalten des Systems verstrichene Zeit in Sekundenschnelle (1/60 Sekunde) aus.


8

05AB1E , 2 Bytes

žd

Probieren Sie es online!

Gibt aktuelle Mikrosekunden von der internen Uhr des ausführenden Computers aus.

Oder Sie könnten so etwas tun ...

05AB1E , 3 Bytes

A.r

Probieren Sie es online!

Gibt ein zufällig gemischtes Kleinbuchstaben aus.

Oder das funktioniert auch:

A.R

Probieren Sie es online!

Gibt einen zufälligen Buchstaben aus dem Alphabet aus.

Oder das funktioniert auch und ist cooler:

05AB1E , 9 Bytes

"ž"A.RJ.V

Probieren Sie es online!

Gibt nach dem Zufallsprinzip einen der folgenden Werte aus:

ž 23  > ža           push current hours
        žb           push current minutes
        žc           push current seconds
        žd           push current microseconds
        že           push current day
        žf           push current month
        žg           push current year
        žh           push [0-9]
        ži           push [a-zA-Z]
        žj           push [a-zA-Z0-9_]
        žk           push [z-aZ-A]
        žl           push [z-aZ-A9-0_]
        žm           push [9-0]
        žn           push [A-Za-z]
        žo           push [Z-Az-a]
        žp           push [Z-A]
        žq           push pi
        žr           push e
        žs           pop a, push pi to a digits (max. 100000)
        žt           pop a, push e to a digits (max. 10000)
        žu           push ()<>[]{}
        žv           push 16
        žw           push 32
        žx           push 64
        žy           push 128
        žz           push 256


8

C, 25 21 Bytes

Danke an pseudonym117 für das Speichern von 4 Bytes.

main(i){putchar(&i);}

Kompiliert mit gcc -o test lol.c(ja, ich bin ziemlich originell mit dem Namen meiner Datei ...) und lief mit ./test.

Es gibt das aus, was es sagt: Gibt das Zeichen aus i, das der zur Laufzeit definierten Speicheradresse von entspricht , daher sollte es nicht deterministisch sein.


1. Können Sie das überspringen, &da der Wert einer Variablen auf dem Stapel nicht definiert ist? 2. Sie haben eine konstante Anzahl von Dingen auf dem Stapel. Ist die Speicheradresse also ikonstant?
Riley

2
iwird das, was normalerweise heißt argc, also hast du recht, es wird immer 1 sein, wenn es nicht mehr Argumente gibt. Ich kann nicht glauben, dass ich mich nicht daran erinnert habe. Ich bin mir immer noch nicht sicher, warum sich der Standort ändert, aber wenn es funktioniert, funktioniert es.
Riley

1
Es ändert sich auf modernen Betriebssystemen aufgrund von ASLR , einer Sicherheitsfunktion, die es Exploits erschwert, Adressen zu erraten. Auf einigen älteren Betriebssystemen erhalten Sie ein konsistentes Ergebnis.

1
Sie können ein wenig sparen, indem Sie putchardurchreturn
ceilingcat

1
Bei modernen Compilern mit Warnungen, dass der Typ eines Parameters nicht deklariert wurde, können Sie main(){printf("%d");}
Folgendes

7

Python 2, 29 Bytes

import os
print os.urandom(9)

Leider nicht das erste Mal, dass Sie Code auf ein Smartphone schreiben.


6

Perl, 5 Bytes

say$$

Gibt die Prozess-ID und eine neue Zeile aus.



5

Pyke, 1 Byte

C

Probieren Sie es hier aus!

Gibt die aktuelle Uhrzeit aus


1
Ich bin mir ziemlich sicher, dass dies deterministisch ist.
30.

@EasterlyIrk in einem gelöschten Kommentar mbomb sagte, dass dies in Ordnung war
Blue

Oh ok. Scheint mir deterministisch, aber OP-Regeln.
30.

In meinem Bearbeitungsverlauf hatte ich eine 3-Byte-Version mit korrekter Zufälligkeit
Blue

@EasterlyIrk Wenn die aktuelle Zeit deterministisch ist, sind es auch Pseudo-Zufallszahlen, da sie genau mit dieser Zeit beginnen. Das Ziel ist nicht "Zufall". Das Ziel ist der Nichtdeterminismus.
mbomb007

5

C89 mit GCC / Clang, 20 Bytes

Die andere C-Lösung schlägt jedes Mal fehl, wenn sie mit GCC oder Clang erstellt wird. Dies jedoch.

main(n){puts(&n+1);}

Welches sieht aus wie:

$ for _ in `seq 1 50`; do ./test_89; done
���z�U
�VW��U
�F��U
�v�f2V
��FV
���*=V
�6���U
�20wU
��
�+V
�6
   �U
��V�uU
�v��V
���K�U
��7�qU
�6S�jU
�&�WU
��wV
��6l�U
���U
�F�ߨU
�f���U
���s7V
�f��?V
��;B�U
�;��U
��GV
�� ��U
�vKV
�V?]wU
�����U
��.�U
�v"�XU
��uhpU
��LD�U
�����U
�6X�U
��M�.V
�69��U
��ԤV
���U
����U
�vx4.V
�֝+xU
�F��U
�֤BQV
��#�U
���1^U
����sU
��4�U
��AݗU

Ziemlich viel nicht druckbarer Müll, aber es ist nicht deterministisch!


warum "main (n) {puts (& n + 1);}" und nicht "main (n) {puts (& n);}"?
RosLuP

@RosLuP Ihre zweite Option, die dem zufälligen Beobachter offensichtlich erscheint, gibt das Byte mit dem Wert n an (wenn n 1 ist, putsergibt seine Adresse 1, und wenn n 2 ist, putsergibt seine Adresse 2). Das Addieren von 1 zu der Adresse von n, die auf ein 4 Byte breites Byte zeigen sollte int, ergibt eine Junk-Adresse mit einem Junk-Wert, der dort mit einer bestimmten Anzahl von Bytes bis zum nächsten NUL-Byte gespeichert ist. Dieses Verhalten ist zwischen GCC und Clang reproduzierbar und geht völlig über mich hinaus. Ich glaube, ich werde bei StackOverflow nachfragen.
Katze

Ich lese "Puts (& n)" auf diese Weise: Es gibt zu Puts die Adresse von n, angenommen, dass n = 0x01020304 Puts würde in Zeichen 04 03 02 01 oder umgekehrt davon
konvertiert

1
Denken Sie daran , nist noch initialisiert mit dem, was normalerweise als argcdas ist 0in Ihrem allgemeinen Testfall, so mit &n, putsbekommt einen ganz determinis Zeiger auf ein Byte ‚\ 0‘ in einem leeren String resultierenden (Zeigergröße == integer Größe unter der Annahme , und all das Zeugs) . &n+1Es ist jedoch die Adresse dessen, was normalerweise aufgerufen wird argv(zumindest bei ABIs, die Parameter in umgekehrter Reihenfolge anstelle von Registern an den Stack übergeben und bei einem Stack, der von hohen zu niedrigen Adressen wächst), die unter der Annahme von ASLR alle einen anderen Zeiger haben sollten Zeit.
Guntram Blohm

@GuntramBlohm Du hast recht und das ist sehr interessant, obwohl für mich Zeiger 8 Bytes und Ints 4 Bytes sind.
Katze

5

PHP, 12 Bytes

<?=uniqid();

Gibt eine eindeutige ID 583f4da627ee3basierend auf der aktuellen Zeit in Mikrosekunden aus.


<?=time();<- 10 Bytes.
Ismael Miguel

@IsmaelMiguel uniqid()ist 1'000'000 Mal unbestimmt als time();)
Mario

Ich sage nicht das Gegenteil. Aber eine andere Antwort vorschlagen. Du kannst dir das aussuchen.
Ismael Miguel

@ IsmaelMiguel jemand anderes gab die gleiche Antwort bereits ...
Mario

5

Groovy, 9 Bytes

{print{}}

Ausgänge:

Script1$_run_closure1@2c8ec01c

Da es die Speicheradresse des Abschlusses ausgibt, ist es nicht deterministisch.


Und ich dachte, Kotlin sei der Weg zu einer möglichst kurzen JVM-Lösung.
F. George

Der Versuch , diese in eine Datei zu setzen und läuft groovy Script1.groovy, bekomme ich eine Fehlermeldung: Ambiguous expression could be either a parameterless closure expression or an isolated open code block;. Wie verwende ich das?
Paŭlo Ebermann

Weisen Sie es einer Abschlussvariablen zu und rufen Sie es dann auf.
Magic Octopus Urn

5

Emotinomicon, 15 Bytes

😀😅🎲⏬

Erläuterung:

😀😅🎲⏬
😀      push 0. Stack: [0]
  😅    push 1. Stack: [1]
    🎲  random[pop;pop]. Stack: [1 or 0]
      ⏬output

Der Name der Sprache ist Emotinomicon
Acrolith

@daHugLenny Wie habe ich das verpasst :)
Roman Gräf

5

Borland C unter Windows, 12 Byte

m(){puts();}

Ich habe es umgeschrieben, weil sie sagen, dass es möglich ist, eine Funktion zu verwenden. Der Compiler hat das Argument nicht überprüft, also kompilieren Sie es. Aber setzt sehen eine Adresse "niemand" wissen und beginnen zu drucken, an welcher Stelle diese Adresse, bis das Byte 0x00 finden. Es könnte nicht in Ordnung sein, wenn diese Adresse nicht genügend Speicher für das Programm hat, aber hier etwas ausdrucken


Dies gibt keine nicht deterministische Ausgabe, sondern es tritt jedes Mal ein Fehler auf.
Katze

Alternativ, wenn Sie etwas anderes als ein Segfault erhalten, welcher Compiler?
Katze

@cat es ist ein Borland C Compiler + Windows7 Os. Wie ich sehe: Der obige Code erhält die Adresse oben im Stapel (in diesem Fall gibt es die Adresse, die in der Funktion main () zurückgegeben werden soll) und liest von dieser Adresse im Hauptspeicherplatzcode ... Das hängt also von der Compilerausgabe ab. Aber ich weiß nicht 100% ... Es ist möglich, dass der Code-Speicherplatz in Ihrem
Betriebssystem

1
@RosLuP: Es wird nur der gesamte im Stapelspeicher befindliche Datenmüll ausgegeben (oder im zweiten Argument-Passing-Register für x86-64- und die meisten RISC-Aufrufkonventionen, die die ersten paar Argumente in Registern übergeben). Die Adresse des Stapels wird nicht gedruckt. In x86-64 würde es wahrscheinlich etwas drucken argv, da der Compiler wahrscheinlich printf aufrufen würde, wobei sich das zweite Argument von main noch in diesem Register befindet. Genau das passiert mit gcc6.2 für Linux: Siehe source + asm im Godbolt-Compiler-Explorer : main berührt RSI vorher nicht call printf.
Peter Cordes

1
@RosLuP: argvist auf dem Stapel, aber nicht ganz oben. Die Adresse wird jedoch vom Stapel-ASLR beeinflusst, sodass dies funktioniert. Dies würde mit weniger gut funktionieren -m32. Sie würden wahrscheinlich immer Null erhalten, da mainder Stapel ausgerichtet bleiben muss, damit der Stapelschlitz über der Formatzeichenfolge neuer Stapelspeicher ist, der nie berührt wurde (und wahrscheinlich immer Null ist, da der Kernel Informationslecks vermeidet, indem er stattdessen Seiten auf Null setzt von User-Space-Seiten voller alter Daten).
Peter Cordes

5

Babysprache , 0 Bytes



Ich habe dies ursprünglich nicht eingereicht, weil ich dachte, dass es die Frage nachdatiert. Ich lag falsch; Die Sprache hatte einen Dolmetscher in der Zeit erstellt. Es ist wahrscheinlich auch die am wenigsten betrügerische 0-Byte-Lösung, die ich gesehen habe (vorausgesetzt, ein 0-Byte-Programm wird angegeben, um genau das zu tun, was das Programm verlangt, und nicht, um bei Golfherausforderungen zu betrügen).

Baby Language wird angegeben, um das gegebene Programm zu ignorieren und etwas nach dem Zufallsprinzip zu tun. (Der auf der Esolang-Seite verlinkte Interpreter generiert ein zufälliges legales BF-Programm und führt es aus.) Das scheint perfekt für diese Herausforderung zu passen.

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.