Code le plus court pour produire une sortie non déterministe


83

Vous devez produire une sortie non déterministe .

Dans ce cas, cela sera défini comme signifiant que la sortie ne sera pas toujours le même résultat.

Règles:

  • Un générateur de nombre pseudo-aléatoire qui a toujours la même graine ne compte pas.

  • Vous pouvez compter sur le programme exécuté à une heure différente (inconnue) à chaque exécution.

  • L'identifiant de processus de votre code (s'il n'est pas fixé par l'interpréteur) peut être considéré comme non déterministe.

  • Vous pouvez compter sur le caractère aléatoire basé sur le Web.

  • Votre code ne peut pas prendre une entrée non vide. Méta post connexe .

  • Le programme n'est pas obligé de s'arrêter, mais la sortie doit être affichée.

Classement


33
@ mbomb007 En C, beaucoup de choses constituent simplement un comportement "non défini". Tout interprète est autorisé à faire ce qu'il veut dans n'importe quelle situation. Pour tout ce que nous savons, gcc pourrait vous commander une pizza si vous essayez de surcharger un entier signé le mardi pluvieux, mais fera sauter la truite de votre écran les autres jours. Donc, vous ne saurez jamais vraiment si c'est réellement déterministe ou non dans une implémentation donnée.
Martin Ender

12
@MartinEnder Je ne sais pas si cela compte. Nous définissons les langues ici par leur implémentation et non par la spécification (car les langues sans implémentation ne sont pas autorisées)
Nathan Merrill

2
@ MartinEnder Ouais, je suis d'accord avec Nathan.
mbomb007

7
Notez qu'un comportement non défini en C entraîne souvent des plantages et que les plantages sous UNIX et Linux conduisent à des fichiers de base contenant l'ID de processus. Cela semblerait correspondre à la question telle qu’elle est libellée actuellement.

5
À moins que je ne comprenne mal, la question ne demandait pas un code exploitant un comportement indéfini. Il demande un code qui tire parti d'un comportement défini pour garantir le non-déterminisme.
WGroleau

Réponses:


110

WinDbg, 1 octet

#

Hou la la! Jamais prévu une solution de 1 octet de WinDbg!

#recherche un modèle de désassemblage, mais comme il n'y a pas de paramètre, il semble simplement renvoyer l'instruction d'assemblage suivante dans le fichier de vidage / processus auquel vous êtes attaché. Pas sûr de la logique pour définir l'adresse initiale, mais c'est le cas.

Exemple de sortie:

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
Une des réponses les plus froides ici, cela devrait gagner sur une solution "Date actuelle" à mon avis.
Magic Octopus Urn

cela semble ci-dessus le désastre, étape par étape du début d'une fonction dans 386 assemblage de processeurs Intel
RosLuP

60

Java 7, 33 30 27 octets

int a(){return hashCode();}

Parce que Java.


49
Parce que Java. Probablement la meilleure explication de Java jamais.
F. George

5
@carusocomputing j'avais toStringdans une version précédente, mais le type de retour Stringest plus long que int. Enregistrez les octets! :]
Poke

12
Est-ce valide en tant que fonction? hashCode()est une abréviation ici this.hashCode(), elle ne fonctionnerait donc qu’en tant que méthode d’instance, pas de méthode statique. Dans ce cas, vous aurez besoin d'un code supplémentaire pour créer un objet dans l'appelant. C'est pertinent ici parce que c'est le code pour créer un objet responsable du non déterminisme.

15
En Java 8: ()->hashCode()pour 14 octets. Just sayin ';)
Olivier Grégoire

4
@pts Je me base sur la méta publication pour discuter de la structure d' envoi par défaut pour les publications. Les fonctions sont autorisées par défaut sauf si le défi spécifie qu'un programme complet est requis.
Poke

52

MATLAB, 3 octets

why

whyfournit des réponses à presque toutes les questions. Quelques exemples:

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?

C'est plus court que n'importe quelle randfonction à laquelle je peux penser.


33
MATLAB a un construit pour cela ? Pourquoi?
ETHproductions

59
@ETHproductions Le programmeur l'a suggéré
Eddie Curtis

40

R, 1 octet

t

Envoie le code source de la fonction et une adresse de pointeur de mémoire qui change à chaque (nouveau) début de R.


36

hein? , 0 octet


Un programme vide produit toujours une sortie. Les dernières lignes de l'interpréteur Python exécutées:

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

À la fin d'un programme, l'interpréteur Python imprimera ..., puis créera / ouvrira un fichier texte appelé Notes.txtet écrira une chaîne contenant l'heure actuelle.


5
De toutes les choses que je pensais que les gens utiliseraient sur mon GitHub, je ne pensais pas qu'un interprète de langage blague serait un: P
Kade

@Kade J'allais aussi l'utiliser pour répondre à une autre question (le code le plus court pour jouer un son, avec un seul octet) - mais la question est maintenant close.
mbomb007

Bien que ce ne soit pas concurrent, à moins que je ne regarde l'interprète original .NET, je suppose.
mbomb007

30

Labyrinthe , 5 octets

v
!
@

Soit des impressions 0ou rien (50% de chance chacune).

Essayez-le en ligne!

Il existe un cas très spécifique dans lequel Labyrinth présente un comportement aléatoire:

  • Il doit y avoir un mur devant le pointeur d'instructions et derrière celui-ci.
  • Il doit y avoir un non-mur à gauche et à droite du pointeur d'instruction.
  • Le sommet actuel de la pile doit être zéro.

Si toutes ces conditions sont remplies, la direction dans laquelle l'IP se déplace est choisie (uniformément) de manière aléatoire. La cerise sur le gâteau, c’est que ces trois conditions sont impossibles à remplir dans un flux de contrôle normal, ce qui signifie que vous ne devez pas modifier le code source au moment de l’exécution.

(Cela peut sembler un peu arbitraire, mais c’est en fait le comportement le plus cohérent que j’ai pu trouver pour ces conditions, car normalement la direction de l’IP dépend toujours de la direction précédente, de ses voisins et du signe du sommet de la pile, et cela semblait être un moyen élégant d’inclure une source d’aléatoire dans la langue.)

À l’aide des instructions de rotation du code source ( <^>v), il est possible d’apporter l’IP dans cette situation. Un tel exemple est vu au sommet. L'IP pointe initialement vers l'est et commence au sommet. Le vfait pivoter la colonne actuelle pour que nous obtenions:

@
v
!

La propriété intellectuelle se déplace avec cette rotation de sorte qu'elle se trouve toujours sur le côté vest. Toutes les conditions sont remplies maintenant, de sorte que l'IP va monter ou descendre de façon aléatoire. Si cela monte, le programme se termine immédiatement. Si elle baisse, elle affiche un zéro, fait pivoter la colonne à nouveau, puis se termine.

Il y a trois autres programmes qui en font usage (un qui imprime aussi 0, un qui imprime 00et un qui imprime 000):

v
@
!

"
>@!

"
>!@

(En réalité, il existe beaucoup plus que trois autres programmes, car vous pouvez également utiliser .au lieu d' !imprimer des octets nuls, ou le remplacer "par une grande variété de commandes, mais je pense qu'elles fonctionnent toutes sensiblement de la même manière.)


30

Befunge (-93 et ​​-98), 3 octets

?.@

L' ?exécution envoie dans une direction aléatoire. S'il monte ou descend, il revient en boucle ?et se relance. S'il passe à gauche, le programme tourne autour du @et quitte donc sans rien imprimer. Si tout se passe bien, il imprime 0(le résultat obtenu .lorsque la pile est vide), puis se termine sur le @.


Cela ne garantit pas la fin, mais j'allais poster cela exactement alors +1
Daniel

Vous voudrez peut-être changer la virgule en un point pour afficher 0 sous la forme d'un nombre au lieu d'un caractère nul (valeur ASCII 0). +1
MildlyMilquetoast

C'était .dans le programme que j'utilisais pour les tests, mais qui est devenu ,quand même une copie lorsque je l'ai copié sur PPCG. Fixé.

7
Cependant, @Dopapp se termine presque sûrement, avec la probabilité 1. Je considérerais cela comme une garantie;)
Oliphaunt

@JamesHolderness Je pense que vous pouvez le faire en 1. Je ne suis pas sûr que cela compte si ...
MildlyMilquetoast

29

Minecraft, 5 à 4 octets

op 8

Utilisé en tapant dans la console d'un serveur ou un bloc de commande et en le mettant sous tension. Peut être exécuté à partir de l'interface de discussion en ajoutant un /.

Habituellement, cela ne fait rien, mais s'il y a un joueur avec le nom d'utilisateur "8" sur le serveur, il recevra les permissions de l'opérateur. Notez que bien que Minecraft exige normalement que les noms d'utilisateur aient 3 caractères, certains comptes avec des noms plus courts ont été créés avant cette restriction.

La version qui peut être démontrée comme étant non déterministe sans l’un de ces noms d’utilisateur ou le risque de donner des autorisations d’opérateur à un utilisateur est la suivante:

me @r

Affiche un message à tout le monde, le message étant le nom d'utilisateur d'un lecteur aléatoire. La opcommande ne prend qu'un littéral de chaîne, pas un script qui retourne une chaîne.

La mecommande ne fonctionnerait pas vraiment pour le premier exemple, elle s'afficherait "<your-username> 8". Lorsqu'il est exécuté à partir d'un bloc de commande, cela ne serait pas déterministe, car tous les blocs de commande ont le même "nom d'utilisateur", mais son exécution à partir de l'interface de discussion nécessiterait l' /octet supplémentaire.


Donc, /n'est pas inclus dans le nombre d'octets?
Fruit Esolanging

11
@ Challenger5 La barre oblique est facultative dans les blocs de commande, non autorisée dans la console du serveur et obligatoire dans l'interface de discussion.
Pavel

2
En fait, il devrait être de 4 octets + 2 blocs (bloc de commande et source de Redstone), ou 6 blytes
RudolfJelin

2
@RudolphJelinek Vous pouvez l'exécuter à partir de la console sans blocage de commande.
Pavel

1
Une autre option non déterministe serait helpun bloc de commande de 4 octets (qui ne nécessite pas de jeux piratés).
Pokechu22

21

sh + procps, 1 octet

w

A mon avis, c'est la solution la plus courte qui fonctionne via l'appel à des exécutables externes. procpsest le paquet responsable de la communication d'informations sur l'état actuel du système ( pset de ses amis) et est installé par défaut sur la plupart des distributions Linux; west la commande la plus courte qui y est nommée et renvoie des informations sur les utilisateurs connectés, mais également des informations non déterministes telles que la disponibilité.


21

Informer 7, 6 octets

x is y

Ce n'est pas un programme Inform 7 valide, car ni "x" ni "y" n'ont été définis. Donc, cela jette une erreur.

Cependant, certains messages d'erreur d'Inform 7, y compris celui-ci, sont aléatoires. Le texte imprimé est donc techniquement non déterministe.

Quelques sorties possibles incluent:

Problème. La phrase "x is y" semble indiquer que deux choses sont identiques - je lis "x" et "y" comme deux choses différentes et il est donc insensé de dire que l'une est l'autre: ce serait comme dire ce 'Adams est Jefferson'. Ce serait bien si la deuxième chose était un nom du genre, peut-être avec des propriétés: par exemple 'Virginia est une pièce éclairée' dit que quelque chose qui s'appelle Virginia existe et qu'il s'agit d'une 'pièce', un type que je connais à propos, combiné avec une propriété appelée «allumé» que je connais aussi.

Problème. La phrase "x is y" semble indiquer que deux choses sont identiques - je lis "x" et "y" comme deux choses différentes, et il est donc insensé de dire que l'une est l'autre: ce serait comme dire cet Adam est Eve. Ce serait bien si la deuxième chose était une sorte de nom, peut-être avec des propriétés: par exemple, "Le pays de Nod est une pièce éclairée" indique que ce qui s'appelle le pays de Nod existe et qu'il s'agit d'une "pièce" qui est un type que je connais, combiné à une propriété appelée «allumée» que je connais aussi.

Problème. La phrase "x is y" semble indiquer que deux choses sont identiques - je lis "x" et "y" comme deux choses différentes, et il est donc insensé de dire que l'une est l'autre: ce serait comme dire que 'Clark Kent est Lex Luthor'. Ce serait bien si la deuxième chose était un nom de genre, peut-être avec des propriétés: par exemple, "Metropolis est une pièce éclairée", indique que quelque chose qui s'appelle Metropolis existe et qu'il s'agit d'une "pièce", un type que je connais. à propos, combiné avec une propriété appelée «allumé» que je connais aussi.

Problème. La phrase "x is y" semble indiquer que deux choses sont identiques - je lis "x" et "y" comme deux choses différentes, et il est donc insensé de dire que l'une est l'autre: ce serait comme dire qu'Eschyle est Euripide. Ce serait bien si la deuxième chose était le nom d'un genre, peut-être avec des propriétés: par exemple, "Underworld est une pièce éclairée", indique que quelque chose appelé Underworld existe et qu'il s'agit d'une "pièce", un type que je connais. à propos, combiné avec une propriété appelée «allumé» que je connais aussi.


7
Même les messages d'erreur sont verbeux!
Citron destructible

21

JavaScript, 4 octets

Date

Une fonction qui renvoie la date / heure actuelle. Je pense que c'est le plus court qu'il obtiendra ...

Explication

Étant donné que cela semble semer la confusion quant à la validité de sa validité, je vais tenter de vous expliquer.

En JavaScript, une entrée de fonction est valide si elle peut être affectée à une variable et appelée comme une fonction. Par exemple, cette fonction est une entrée valide:

function(){return Date()}

Parce que c'est une fonction qui peut être assignée à une variable comme ceci:

f=function(){return Date()}

Et puis courez avec f()autant de fois que nécessaire. À chaque fois, il retourne la chaîne de date / heure actuelle, qui a été jugée non déterministe par le PO.

Cette fonction de flèche ES6 est également valide:

_=>Date()

Il peut être assigné à f=_=>Date(), puis exécuté avec f()comme l’autre.

Maintenant, voici une autre entrée valide:

Date

Pourquoi? Parce que, tout comme les deux autres entrées, il peut être assigné avec f=Datepuis appelé avec f(), retournant exactement la même chose que les deux autres. Essayez le:


1
N'avez-vous pas besoin que ce soit Date()pour invoquer la fonction?
lait

4
@milk Dateest une fonction qui, lorsqu'elle est appelée sans entrées, produit la date / heure actuelle. _=>Date()est une entrée clairement valide qui fait exactement la même chose, donc Dateune entrée valide.
ETHproductions

1
Ça a du sens.
lait

2
Taper Dateà la console JavaScript de mon navigateur produit une sortie déterministe, il produit toujours ceci: function Date() { [native code] }. Vous voulez probablement dire Date(), 6 octets.
Pts

2
si "date" ci-dessus est acceptable, "malloc (8)" ou "heure (0)" convient également en C
RosLuP

12

Bash (procps-ng), 2 octets

ps

$$ est aussi une solution.


1
Si c'est le cas, west plus court et provient également de procps.
Liori

1
Vous avez édité ceci dans un duplicata de ma réponse .

@ ais523 oups, désolé.
Rɪᴋᴇʀ

11

Python 2, 11 octets

print id(1)

1
C'est celui que j'ai trouvé. J'ai eu id(0), cependant. :)
mbomb007

2
Techniquement, je t'ai battu puisque je suis le PO et que je l'ai trouvé avant de poster la question. Je ne voulais pas poster la question et poster immédiatement ma réponse la plus courte.
mbomb007


10

PowerShell, 4 2 octets

(4 barrés ressemblent encore à 4 )

ps

C'est l'alias pour Get-Processlequel la liste des processus en cours sera affichée sous forme de tableau, y compris les descripteurs, la mémoire privée, le temps CPU, etc.

Exécutez-le via quelque chose comme ce qui suit:

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

1
Je dois admettre que j’ai vérifié si c’était bien barré. Vous ne pouvez même pas dire.
Carcigenicate

@Carcigenicate, je peux dire s'il est croisé sans sélectionner le texte (Ubuntu 16.04.1, Chrome 54.0.2840.100).
Erik l'Outgolfer

Visible sur Android également, mais pas clairement: p
tomsmeding

Cela semble bien dans l'application iOS.
Mateusz Piotrowski

Je n'ai pas le représentant pour le faire moi-même, mais vous pouvez faire le 04 et le rayer.
Bobson


9

Commodore 64 Basic, 4 octets

1S|0

PETSCII substitution: |=SHIFT+Y

La page zéro d'un Commodore 64 est une zone de 256 octets de mémoire, à laquelle on peut accéder plus rapidement que le reste de la RAM. Par conséquent, les programmes (tels que l'interpréteur BASIC) l'utilisent pour les données fréquemment consultées, et la CPU stocke ici une partie de son état interne. Le contenu est sujet à changement sans préavis.

Le programme BASIC ci-dessus, non-golfé, est 1 SYS 0, c.-à-d. transférer l'exécution vers l'emplacement de mémoire 0. Ceci commence l'exécution de la page zéro en tant que code. Normalement, lorsque l’interpréteur BASIC commence à exécuter un programme, les 16 premiers octets sont

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

donc SYS 0exécuterait ce qui suit

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

Le résultat global consiste à sortir l' READY.invite BASIC et à rendre le contrôle à l'utilisateur. Cependant, l'emplacement de mémoire 0x00 est le registre de direction des E / S de la CPU et l'emplacement de mémoire 0x01 est le registre des adresses d'E / S de la CPU. Si vous avez fait quelque chose qui les a modifiés avant d'exécuter le programme, les résultats peuvent être imprévisibles, allant du bourrage au blocage de l'ordinateur (le 0x22 généralement contenu dans l'emplacement mémoire 0x07, s'il est exécuté en tant qu'instruction, est un HALTopcode non documenté ). .

Sinon, un programme plus fiable et imprévisible est le programme sur quatre octets.

1?TI

Imprime le temps écoulé, en 1 minute (1/60 de seconde), depuis la mise sous tension du système.


8

05AB1E , 2 octets

žd

Essayez-le en ligne!

Affiche le nombre actuel de microsecondes à partir de l'horloge interne de la machine d'exécution.

Ou vous pourriez faire quelque chose comme ça ...

05AB1E , 3 octets

A.r

Essayez-le en ligne!

Émet un alphabet de minuscule mélangé de manière aléatoire.

Ou cela fonctionne aussi:

A.R

Essayez-le en ligne!

Émet une lettre aléatoire de l'alphabet.

Ou cela fonctionne aussi, et est plus cool:

05AB1E , 9 octets

"ž"A.RJ.V

Essayez-le en ligne!

Sort aléatoirement l'un de ceux-ci:

ž 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 octets

Merci à pseudonym117 d’avoir économisé 4 octets.

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

Compilé avec gcc -o test lol.c(ouais je suis assez original avec le nom de mon fichier ...), et couru avec ./test.

Il fait ce qu'il dit: affiche le caractère correspondant à l'adresse mémoire de i, définie au moment de l'exécution, il doit donc être non déterministe.


1. Pouvez-vous ignorer le fichier &car la valeur d’une variable de la pile n’est pas définie? 2. Vous avez un nombre constant d'éléments sur la pile, alors l'adresse de mémoire est-elle iconstante?
Riley

2
idevient ce qui est normalement appelé argc, donc vous avez raison, ce sera toujours 1 à moins qu'il y ait plus d'arguments. Je ne peux pas croire que je ne m'en souvienne pas. Je ne sais toujours pas pourquoi l'emplacement change, mais si cela fonctionne, cela fonctionne.
Riley

1
Il change sur les systèmes d'exploitation modernes en raison de ASLR , une fonctionnalité de sécurité conçue pour rendre plus difficile la tâche des exploitations pour deviner les adresses. Vous obtiendrez un résultat cohérent sur certains systèmes d'exploitation plus anciens.

1
Vous pouvez économiser un peu en remplaçant putcharparreturn
ceilingcat

1
Sur les compilateurs modernes avec des avertissements pour ne pas déclarer le type d'un paramètre, vous pouvez faire:main(){printf("%d");}
Myria

7

Python 2, 29 octets

import os
print os.urandom(9)

Malheureusement, ce n'est pas la première fois que j'écris du code sur un smartphone.


6

Perl, 5 octets

say$$

Affiche l'ID de processus et une nouvelle ligne.



5

Pyke, 1 octet

C

Essayez-le ici!

Affiche l'heure actuelle


1
Je suis assez certain que c'est déterministe.
Rɪᴋᴇʀ

@EasterlyIrk dans un commentaire supprimé mbomb a dit que c'était correct
Bleu

Ah d'accord. Cela me semble déterministe, mais OP règle.
Rɪᴋᴇʀ

Dans mon historique de montage, j'avais une version à 3 octets avec un caractère aléatoire approprié
Bleu

@EasterlyIrk Si l'heure actuelle est déterministe, il en va de même pour les nombres pseudo-aléatoires, car c'est ce qui leur est destiné. Le but n'est pas le "hasard". Le but est le non-déterminisme.
mbomb007

5

C89 avec GCC / Clang, 20 octets

L’autre solution C se segmente à chaque fois quand elle est construite avec GCC ou Clang. Ceci, cependant.

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

Qui ressemble à:

$ 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

Beaucoup de courrier indésirable, mais non déterministe!


pourquoi "main (n) {met (& n + 1);}" et non "main (n) {met (& n);}"?
RosLuP

@RosLuP Votre deuxième option, qui semble évidente pour l'observateur occasionnel, donne l'octet à la valeur de n (lorsque n est 1, putsson adresse donne 1 et lorsque n est 2, putsson adresse donne 2). L'ajout de 1 à l'adresse de n, qui doit pointer sur une largeur de 4 octets int, donne une adresse indésirable avec une valeur indésirable stockée avec un nombre d'octets très précis jusqu'au prochain octet NUL. Ce comportement est reproductible entre GCC et Clang et me dépasse complètement. Je pense que je vais aller demander sur StackOverflow.
Chat

Je lis "met (& n)" de cette façon: il donne à met l'adresse de n, supposons que n = 0x01020304 met une impression convertie en caractères 04 03 02 01 ou inversement
RosLuP

1
Rappelez-vous que votre nest toujours initialisé avec ce argcqui est normalement appelé ce qui est 0dans votre cas de test général, donc avec &n, putsobtient un pointeur assez déterministe sur un octet '\ 0' résultant en une chaîne vide (en supposant que la taille du pointeur == la taille entière et tout le reste) . &n+1Cependant, il s’agit de l’adresse de ce qui est normalement appelé argv(au moins sur les ABI qui transmettent les paramètres de la pile dans l’ordre inverse des registres, et avec une pile qui passe des adresses hautes aux adresses basses), qui, en supposant que ASLR est différent, doit être un pointeur différent chaque fois. temps.
Guntram Blohm

@GuntramBlohm Vous avez raison et c'est très intéressant, même si pour moi les pointeurs sont 8 octets et les octets sont 4 octets.
chat

5

PHP, 12 octets

<?=uniqid();

Génère un ID unique 583f4da627ee3basé sur l'heure actuelle en microsecondes.


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

@IsmaelMiguel uniqid()est 1'000'000 fois plus indéterminé que time();)
Mario

Je ne dis pas le contraire. Mais proposer une autre réponse. Vous êtes libre de choisir celui-ci.
Ismael Miguel

@IsmaelMiguel, quelqu'un d'autre a déjà donné la même réponse ...
Mario

5

Groovy, 9 octets

{print{}}

Les sorties:

Script1$_run_closure1@2c8ec01c

Comme il sort l'adresse de la mémoire de la fermeture, il n'est pas déterministe.


Et je pensais que Kotlin était la voie vers la solution JVM la plus courte possible.
F. George

Essayer de mettre cela dans un fichier et en cours d' exécution groovy Script1.groovy, je reçois une erreur: Ambiguous expression could be either a parameterless closure expression or an isolated open code block;. Comment puis-je l'utiliser?
Paŭlo Ebermann

Assignez-le à une variable de fermeture, puis appelez-le.
Urne magique Octopus

5

Emotinomicon, 15 octets

😀😅🎲⏬

Explication:

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

Le nom de la langue est Emotinomicon
acrolithe

@daHugLenny Comment j'ai raté ça :)
Roman Gräf

5

Borland C sous Windows, 12 octets

m(){puts();}

Je l'ai réécrit parce qu'ils disent qu'il est possible d'utiliser une fonction. Le compilateur n'a pas vérifié l'argument, alors compilez-le; mais met voir une adresse 'personne' sait et commence à imprimer quel point cette adresse jusqu'à trouver l'octet 0x00. Cela pourrait ne pas être correct si cette adresse est à court de mémoire réservée au programme mais ici imprimer quelque chose


Cela ne donne pas une sortie non déterministe, mais simplement des segfaults à chaque fois.
chat

Sinon, si vous obtenez autre chose qu'un segfault, quel compilateur ??
chat

@cat c'est un compilateur Borland C + Windows7 Os. Dans comment je vois: le code ci-dessus obtient l'adresse en haut de la pile (où dans ce cas il y a l'adresse à retourner dans la fonction main ()) et à lire à partir de cette adresse dans le code de l'espace principal ... Donc, cela dépend de la sortie du compilateur. Mais je ne sais pas à 100% ... Il est possible que l’espace de code ne soit pas lisible dans votre système d’exploitation et que ce soit => erreur de
segmentation

1
@RosLuP: Cela n'imprimerait que les déchets de la pile (ou dans le second registre de passage d'arguments, pour x86-64 et la plupart des conventions d'appel RISC qui transmettent les premiers arguments dans les registres). Cela n'imprimerait pas l'adresse de la pile. En x86-64, il serait assez probable d’imprimer argv, puisque le compilateur appellerait probablement printf avec le second argument de main toujours dans ce registre. C’est exactement ce qui se passe avec gcc6.2 ciblant Linux: Voir la source + asm sur l’explorateur du compilateur Godbolt : main ne touche pas à RSI auparavant call printf.
Peter Cordes

1
@RosLuP: argvest sur la pile, mais pas au sommet. Son adresse est cependant affectée par la pile ASLR, donc cela fonctionne. Cela fonctionnerait moins bien avec -m32. Vous obtiendrez probablement toujours zéro, car vous devez maingarder la pile alignée de sorte que son emplacement au-dessus de la chaîne de format puisse être une nouvelle pile de mémoire qui n'a jamais été touchée (et qui est probablement toujours égale à zéro, car le noyau évite les fuites d'informations en mettant à zéro les pages de donner des pages d’espace utilisateur pleines d’anciennes données).
Peter Cordes

5

Langue du bébé , 0 octet



Je ne l'ai pas soumis à l'origine car je pensais que cela postdatait la question. J'avais tort; la langue a eu un interprète créé dans le temps. C'est aussi probablement la solution 0 octet la moins trompeuse que j'ai vue (étant donné qu'un programme 0 octet est spécifié pour faire exactement ce que le programme demande, et non dans le but de tromper les défis du golf).

Baby Language est spécifié pour ignorer le programme qui lui est donné et faire quelque chose au hasard. (L'interprète lié sur la page Esolang génère un programme BF légal aléatoire et l'exécute.) Cela semble être une solution idéale pour ce défi.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.