Código más corto para producir resultados no deterministas

83

Necesita producir una salida que no sea determinista .

En este caso, esto se definirá para significar que la salida no siempre será el mismo resultado.

Reglas:

  • Un generador de números pseudoaleatorio que siempre tiene la misma semilla no cuenta.

  • Puede confiar en que el programa se ejecute en un momento diferente (desconocido) cada ejecución.

  • Se puede suponer que la identificación del proceso de su código (si el intérprete no lo arregla) no es determinista.

  • Puede confiar en la aleatoriedad basada en la web.

  • Su código no puede tomar entradas no vacías. Meta publicación relacionada .

  • No es necesario que el programa se detenga, pero se debe mostrar la salida.

Tabla de clasificación

mbomb007
fuente
33
@ mbomb007 En C hay muchas cosas que son simplemente comportamientos "indefinidos". Cualquier intérprete puede hacer lo que quiera en cualquier situación. Por lo que sabemos, gcc podría pedirle una pizza si intenta desbordar un número entero firmado en un martes lluvioso, pero hará que una trucha salte de su pantalla todos los demás días. Por lo tanto, nunca sabría si es realmente determinista o no en una implementación determinada.
Martin Ender
12
@ Martininder No estoy seguro si eso importa. Definimos los idiomas aquí por su implementación, no por la especificación (ya que los idiomas sin implementación no están permitidos)
Nathan Merrill
2
@ MartinEnder Sí, estoy de acuerdo con Nathan.
mbomb007
77
Tenga en cuenta que el comportamiento indefinido en C a menudo conduce a bloqueos, y los bloqueos en UNIX y Linux conducen a archivos principales que contienen el ID del proceso dentro de ellos. Eso parecería cumplir con la pregunta tal como está redactada actualmente.
55
A menos que haya entendido mal, la pregunta no solicitó un código que aproveche el comportamiento indefinido. Pide un código que aproveche el comportamiento definido para garantizar el no determinismo.
WGroleau

Respuestas:

110

WinDbg, 1 byte

#

¡Guauu! ¡Nunca esperé una solución de 1 byte de WinDbg!

#busca un patrón de desmontaje, pero como no hay parámetros, solo busca devolver la siguiente instrucción de ensamblaje en cualquier volcado / proceso al que esté conectado. No estoy seguro de la lógica para configurar la dirección inicial, pero lo hace.

Salida de muestra:

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]
Leche
fuente
99
Una de las mejores respuestas aquí, en mi opinión, esto debería ganarse una solución de "Fecha actual".
Urna de pulpo mágico
que arriba parece desastrosamente, paso a paso, el comienzo de alguna función en el ensamblaje de la CPU 386
RosLuP
60

Java 7, 33 30 27 bytes

int a(){return hashCode();}

Porque Java

Meter
fuente
49
Porque Java Probablemente la mejor explicación de Java.
F. George
55
@carusocomputing que tenía toStringen una versión anterior pero luego el tipo de retorno es el Stringque es más largo que int. ¡Guarda los bytes! :]
Poke
12
¿Es esto válido como una función? hashCode()es una abreviatura para this.hashCode(), por lo que solo funcionaría como un método de instancia, no un método estático. En ese caso, necesitaría un código adicional para crear un objeto en la persona que llama. Eso es relevante aquí porque es el código para crear un objeto responsable del no determinismo.
15
En Java 8: ()->hashCode()para 14 bytes. Just sayin ';)
Olivier Grégoire
44
@pts Me basaré en la meta publicación discutiendo la estructura de envío predeterminada para las publicaciones. Las funciones están permitidas por defecto a menos que el desafío especifique que se requiere un programa completo.
Poke
52

MATLAB, 3 bytes

why

whyproporciona respuestas a casi cualquier pregunta. Algunos ejemplos:

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?

Esto es más corto que cualquier randfunción que se me ocurra.

Stewie Griffin
fuente
33
¿MATLAB tiene algo incorporado para esto ? ¿Por qué?
ETHproductions
59
@ETHproductions El programador lo sugirió
Eddie Curtis
40

R, 1 byte

t

Emite el código fuente de la función y una dirección de puntero de memoria que cambia con cada (re) inicio de R.

chrki
fuente
36

eh? , 0 bytes


Un programa vacío todavía produce resultados. Las últimas líneas del intérprete de Python que se ejecutan:

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

Al final de un programa, el intérprete de Python imprimirá ..., luego creará / abrirá un archivo de texto llamado Notes.txty escribirá una cadena que contiene la hora actual al frente.

mbomb007
fuente
55
De todas las cosas que pensé que la gente usaría en mi GitHub, no pensé que un intérprete de lenguaje de broma sería uno: P
Kade
@Kade De hecho, también lo iba a usar para responder otra pregunta (el código más corto para reproducir un sonido, con solo un byte), pero la pregunta ahora está cerrada.
mbomb007
Aunque supondría que no competiría a menos que mirara al intérprete .NET original.
mbomb007
30

Laberinto , 5 bytes

v
!
@

Imprime 0o nada (50% de probabilidad cada uno).

Pruébalo en línea!

Hay un caso muy específico en el que Labyrinth exhibe un comportamiento aleatorio:

  • Debe haber una pared delante del puntero de instrucciones y detrás de él.
  • Debe haber un muro no a la izquierda y a la derecha del puntero de instrucciones.
  • La parte superior actual de la pila debe ser cero.

Si se cumplen todas esas condiciones, la dirección en la que se mueve la IP se elige (uniformemente) al azar. La cuestión principal es que esas tres condiciones son imposibles de cumplir en el flujo de control regular, lo que significa que a menos que modifique el código fuente en tiempo de ejecución.

(Esto puede parecer un poco arbitrario, pero en realidad es el comportamiento más consistente que podría encontrar para estas condiciones, ya que normalmente la dirección de la IP siempre depende de la dirección anterior, sus vecinos y el signo de la parte superior de la pila, y Esto parecía una forma elegante de incluir una fuente de aleatoriedad en el idioma).

Con la ayuda de las instrucciones de rotación del código fuente ( <^>v) es posible llevar la IP a esta situación. Un ejemplo de esto se ve en la parte superior. La IP inicialmente apunta al este y comienza en la parte superior. Las vrota la columna actual por lo que se obtiene:

@
v
!

La IP se mueve junto con esta rotación para que todavía esté en el v, apuntando hacia el este. Todas las condiciones se cumplen ahora, por lo que la IP aumentará o disminuirá aleatoriamente. Si sube, el programa termina inmediatamente. Si baja, imprime un cero, gira la columna nuevamente y luego termina.

Hay otros tres programas que hacen uso de esto (uno que también imprime 0, uno que imprime 00y otro que imprime 000):

v
@
!

"
>@!

"
>!@

(En realidad, hay muchos más que otros tres programas, porque también podría usarlos en .lugar de !imprimir bytes nulos, o reemplazarlos "con una gran variedad de comandos, pero creo que todos funcionan esencialmente igual).

Martin Ender
fuente
30

Befunge (-93 y -98), 3 bytes

?.@

La ?ejecución de los envíos en una dirección aleatoria. Si sube o baja, vuelve al bucle y se vuelve a ?enrollar. Si se va hacia la izquierda, el programa se envuelve @y sale sin imprimir nada. Si sale bien, imprime 0(la salida producida por .cuando la pila está vacía) y luego sale en el @.


fuente
No se garantiza que esto termine, pero iba a publicar esto exactamente así que +1
Daniel
Es posible que desee cambiar la coma a un punto para generar 0 como un número en lugar de un carácter nulo (valor ASCII 0). +1
MildlyMilquetoast
Estaba .en el programa que estaba usando para las pruebas, pero de alguna manera se convirtió en una ,copia cuando lo copié en PPCG. Fijo.
77
@Dopapp termina casi seguramente, sin embargo, con probabilidad 1. Tomaría eso como una garantía;)
Oliphaunt
@JamesHolderness Creo que puedes hacerlo en 1. Sin embargo, no estoy seguro de si esto cuenta ...
MildlyMilquetoast
29

Minecraft, 5 4 bytes

op 8

Se usa escribiendo en la consola de un servidor o en un bloque de comandos y dándole poder. Se puede ejecutar desde la interfaz de chat anteponiendo a /.

Por lo general, esto no hace nada, pero si hay un jugador con el nombre de usuario "8" en el servidor, se les otorgarán permisos de operador. Tenga en cuenta que, aunque Minecraft normalmente requiere que los nombres de usuario tengan 3 caracteres, algunas cuentas con nombres más cortos se crearon antes de esta restricción.

La versión que se puede demostrar que no es determinista sin uno de estos nombres de usuario o el riesgo de otorgar permisos de operador de usuario está aquí:

me @r

Muestra un mensaje a todos, el mensaje es el nombre de usuario de un jugador aleatorio. El opcomando solo toma un literal de cadena, no cualquier script que devuelva una cadena.

El mecomando realmente no funcionaría para el primer ejemplo, se mostraría "<your-username> 8". Cuando se ejecuta desde un bloque de comandos, no sería determinista ya que todos los bloques de comandos tienen el mismo "nombre de usuario", pero ejecutarlo desde la interfaz de chat requeriría /un byte adicional.

Pavel
fuente
Entonces, /¿no está incluido en el recuento de bytes?
Esolanging Fruit
11
@ Challenger5 La barra diagonal es opcional en los bloques de comandos, no está permitida en la consola del servidor y es obligatoria en la interfaz de chat.
Pavel
2
En realidad, debe ser de 4 bytes + 2 bloques (bloque de comando y fuente de redstone), o 6 blytes
RudolfJelin
2
@RudolphJelinek Puede ejecutarlo desde la consola sin bloques de comandos.
Pavel
1
Otra opción no determinista estaría helpen un bloque de comandos, que es de 4 bytes (y no requiere juegos pirateados).
Pokechu22
21

sh + procps, 1 byte

w

Esta es la solución más corta que conozco que funciona mediante llamadas a ejecutables externos. procpses el paquete responsable de informar información sobre el estado actual del sistema ( psy sus amigos), y está instalado en la mayoría de las distribuciones de Linux de manera predeterminada; wes el comando con el nombre más corto que contiene y devuelve información sobre los usuarios conectados, pero también información no determinista como el tiempo de actividad.


fuente
21

Informar 7, 6 bytes

x is y

Este no es un programa válido de Inform 7, ya que no se ha definido "x" ni "y". Entonces esto arroja un error.

Sin embargo, algunos de los mensajes de error de Inform 7, incluido este, son aleatorios. Entonces, el texto que imprime es técnicamente no determinista.

Algunas posibles salidas incluyen:

Problema. La oración 'x es y' parece decir que dos cosas son iguales: estoy leyendo 'x' e 'y' como dos cosas diferentes, y por lo tanto no tiene sentido decir que una es la otra: sería como decir que "Adams es Jefferson". Estaría bien si la segunda cosa fuera el nombre de un tipo, tal vez con propiedades: por ejemplo, 'Virginia es una habitación iluminada' dice que existe algo llamado Virginia y que es una 'habitación', que es un tipo que sé sobre, combinado con una propiedad llamada 'iluminada' que también conozco.

Problema. La oración 'x es y' parece decir que dos cosas son iguales: estoy leyendo 'x' e 'y' como dos cosas diferentes, y por lo tanto no tiene sentido decir que una es la otra: sería como decir que "Adán es Eva". Estaría bien si la segunda cosa fuera el nombre de un tipo, tal vez con propiedades: por ejemplo, 'Land of Nod es una habitación iluminada' dice que existe algo llamado Land of Nod y que es una 'habitación', que es un tipo que conozco, combinado con una propiedad llamada 'iluminada' que también conozco.

Problema. La oración 'x es y' parece decir que dos cosas son iguales: estoy leyendo 'x' e 'y' como dos cosas diferentes, y por lo tanto no tiene sentido decir que una es la otra: sería como decir que "Clark Kent es Lex Luthor". Estaría bien si la segunda cosa fuera el nombre de un tipo, tal vez con propiedades: por ejemplo, 'Metrópolis es una habitación iluminada' dice que existe algo llamado Metrópolis y que es una 'habitación', que es un tipo que sé sobre, combinado con una propiedad llamada 'iluminada' que también conozco.

Problema. La oración 'x es y' parece decir que dos cosas son iguales: estoy leyendo 'x' e 'y' como dos cosas diferentes, y por lo tanto no tiene sentido decir que una es la otra: sería como decir que 'Esquilo es Eurípides'. Estaría bien si la segunda cosa fuera el nombre de un tipo, tal vez con propiedades: por ejemplo, 'Underworld es una habitación iluminada' dice que existe algo llamado Underworld y que es una 'habitación', que es un tipo que sé sobre, combinado con una propiedad llamada 'iluminada' que también conozco.

Draconis
fuente
77
¡Incluso los mensajes de error son detallados!
Destructible Lemon
21

JavaScript, 4 bytes

Date

Una función que devuelve la fecha / hora actual. Creo que esto es lo más corto que será ...

Explicación

Como esto parece estar causando mucha confusión sobre por qué es válido, intentaré explicarlo.

En JavaScript, una entrada de función es válida si puede asignarse a una variable y llamarse como una función. Por ejemplo, esta función es una entrada válida:

function(){return Date()}

Debido a que es una función que se puede asignar a una variable así:

f=function(){return Date()}

Y luego corre f()tantas veces como sea necesario. Cada vez, devuelve la cadena de fecha / hora actual, que el OP ha determinado que no es determinista.

Esta función de flecha ES6 también es válida:

_=>Date()

Puede asignarse con f=_=>Date(), luego ejecutarse f()como el otro.

Ahora, aquí hay otra entrada válida:

Date

¿Por qué? Porque al igual que las otras dos entradas, se puede asignar f=Datey luego llamar con f(), devolviendo exactamente lo mismo que las otras dos. Intentalo:

ETHproducciones
fuente
1
¿No necesitas que sea Date()para invocar la función?
leche
44
@milk Datees una función que, cuando se llama sin entradas, produce la fecha / hora actual. _=>Date()es una entrada claramente válida que hace exactamente lo mismo, por lo que Datees una entrada válida.
ETHproductions
1
Eso tiene sentido.
leche
2
Tecleando Dateen la consola JavaScript del navegador produce una salida determinista, siempre produce esto: function Date() { [native code] }. Probablemente quieras decir Date(), 6 bytes.
pts
2
si la "fecha" anterior está bien, entonces "malloc (8)" o "hora (0)" también estarían bien en C
RosLuP
12

Bash (procps-ng), 2 bytes

ps

$$ También es una solución.

Rɪᴋᴇʀ
fuente
1
Si es así, wes más corto y también proviene de procps.
liori
1
Editaste esto en un duplicado de mi respuesta .
@ ais523 oops, lo siento.
Rɪᴋᴇʀ
11

Python 2, 11 bytes

print id(1)
Azul
fuente
1
Ese es el que encontré. Tenía id(0), sin embargo. :)
mbomb007
2
Te gané, técnicamente, ya que soy el OP y lo encontré antes de publicar la pregunta. No quise publicar la pregunta e inmediatamente publiqué mi respuesta más corta.
mbomb007
10

PowerShell, 4 2 bytes

(tachado 4 todavía parece 4 )

ps

Este es el alias para el Get-Processque se mostrará la lista de procesos actual como una tabla, incluidos los identificadores, la memoria privada, el tiempo de CPU, etc.

Ejecútelo a través de algo como lo siguiente:

C:\Tools\Scripts\golfing>powershell.exe "ps"
AdmBorkBork
fuente
1
Tengo que admitir que verifiqué si realmente estaba tachado. Realmente ni siquiera puedes decirlo.
Carcigenicate
@Carcigenicate Puedo decir si está cruzado sin seleccionar el texto (Ubuntu 16.04.1, Chrome 54.0.2840.100).
Erik the Outgolfer
Visible también en Android, aunque no claramente: p
tomsmeding
Se ve bien en la aplicación iOS.
Mateusz Piotrowski
No tengo el representante para hacerlo yo mismo, pero podrías hacer 04 y poncharlo.
Bobson
9

Zsh, 5 bytes

<<<$$

Imprime PID.

Betseg
fuente
9

Commodore 64 Basic, 4 bytes

1S|0

Sustitución de PETSCII: |=SHIFT+Y

La página cero de un Commodore 64 es un área de 256 bytes de memoria a la que se puede acceder más rápido que el resto de la RAM. En consecuencia, los programas (como el intérprete BASIC) lo utilizan para datos a los que se accede con frecuencia, y la CPU en sí almacena parte de su estado interno aquí. El contenido está sujeto a cambios sin previo aviso.

El programa BÁSICO anterior, sin golf, es 1 SYS 0, es decir. transferir la ejecución a la ubicación de memoria 0. Esto comienza a ejecutar la página cero como código. Normalmente, cuando el intérprete BASIC comienza a ejecutar un programa, los primeros 16 bytes son

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

entonces SYS 0ejecutaría lo siguiente

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

El resultado general es generar la READY.solicitud BASIC y devolver el control al usuario. Sin embargo, la ubicación de memoria 0x00 es el registro de dirección de E / S de la CPU, y la ubicación de memoria 0x01 es el registro de dirección de E / S de la CPU. Si ha hecho algo que los cambia antes de ejecutar el programa, los resultados pueden ser impredecibles, desde la salida de basura hasta el bloqueo de la computadora (el 0x22 generalmente contenido en la ubicación de memoria 0x07, si se ejecuta como una instrucción, es un HALTcódigo de operación no documentado ) .

Alternativamente, un programa impredecible más confiable es el de cuatro bytes

1?TI

Imprime el tiempo transcurrido, en segundos (1/60 de segundo), desde el encendido del sistema.

marca
fuente
8

05AB1E , 2 bytes

žd

Pruébalo en línea!

Emite microsegundos actuales del reloj interno de la máquina ejecutora.

O podrías hacer algo como esto ...

05AB1E , 3 bytes

A.r

Pruébalo en línea!

Emite un alfabeto en minúsculas aleatoriamente barajado.

O esto también funciona:

A.R

Pruébalo en línea!

Emite una letra aleatoria del alfabeto.

O esto también funciona, y es más genial:

05AB1E , 9 bytes

"ž"A.RJ.V

Pruébalo en línea!

Emite aleatoriamente uno de estos:

ž 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
Urna de pulpo mágico
fuente
8

BrainfuckX y políglota de script pequeño (etc.) - 2 bytes

?.

? - Aleatorizar el valor en la celda actual

. - Enviar celda actual a stdout

wyldstallyns
fuente
8

C, 25 21 bytes

Gracias a pseudonym117 por guardar 4 bytes.

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

Compilado con gcc -o test lol.c(sí, soy bastante original con el nombre de mi archivo ...), y ejecuté con ./test.

Hace lo que dice: imprime el carácter correspondiente a la dirección de memoria de i, que se define en tiempo de ejecución, por lo que no debe ser determinista.

Paul Picard
fuente
1. ¿Se puede omitir &ya que el valor de una variable en la pila no está definido? 2. Tiene un número constante de cosas en la pila, entonces, ¿la dirección de memoria es iconstante?
Riley
2
ise convierte en lo que normalmente se llama argc, así que tienes razón, siempre será 1 a menos que haya más argumentos. No puedo creer que no recordara eso. Todavía no estoy seguro de por qué cambia la ubicación, pero si funciona, funciona.
Riley
1
Cambia en los sistemas operativos modernos debido a ASLR , una característica de seguridad diseñada para dificultar que los exploits adivinen direcciones. Obtendrá un resultado consistente en algunos sistemas operativos más antiguos.
1
Puede ahorrar un poco reemplazando putcharconreturn
ceilingcat el
1
En compiladores modernos con advertencias para no declarar el tipo de parámetro, puede hacer:main(){printf("%d");}
Myria
7

Python 2, 29 bytes

import os
print os.urandom(9)

Lamentablemente, no es la primera vez que escribo código en un teléfono inteligente.

Pavel
fuente
6

Perl, 5 bytes

say$$

Emite el ID del proceso y una nueva línea.


fuente
6

Ruby , 3 bytes

p$$

Pruébalo en línea!

Imprime el ID del proceso.

Martin Ender
fuente
1
PS aunque también funcionaría Buen enfoque :)
Jatin Dhankhar
5

Pyke, 1 byte

C

Pruébalo aquí!

Emite la hora actual

Azul
fuente
1
Estoy bastante seguro de que esto es determinista.
Rɪᴋᴇʀ
@EasterlyIrk en un comentario eliminado mbomb dijo que esto estaba bien
Azul
Ah, esta bien. Me parece determinista, pero las reglas de OP.
Rɪᴋᴇʀ
En mi historial de edición tenía una versión de 3 bytes con la aleatoriedad adecuada
azul el
@EasterlyIrk Si el tiempo actual es determinista, también lo son los números pseudoaleatorios, ya que eso es lo que se siembran. El objetivo no es la "aleatoriedad". El objetivo es el no determinismo.
mbomb007
5

C89 con GCC / Clang, 20 bytes

La otra solución de C simplemente falla siempre que se construye con GCC o Clang. Esto, sin embargo.

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

Que se parece a:

$ 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

¡Bastante basura no imprimible pero no es determinista!

gato
fuente
¿Por qué "main (n) {put (& n + 1);}" y no "main (n) {put (& n);}"?
RosLuP
@RosLuP Su segunda opción, que parece obvia para el observador casual, da el byte en el valor de n (cuando n es 1, putssu dirección da 1 y cuando n es 2, putssu dirección da 2). Agregar 1 a la dirección de n, que debería apuntar a un ancho de 4 bytes int, da una dirección basura con un valor basura almacenado allí con un número muy cierto de bytes hasta el siguiente byte NUL. Este comportamiento es reproducible entre GCC y Clang y completamente más allá de mí. Creo que iré a preguntar en StackOverflow.
gato
Leí "put (& n)" de esta manera: le da a put la dirección de n, supongamos que n = 0x01020304 put se imprimiría convertido en caracteres 04 03 02 01 o reverso de eso
RosLuP
1
Recuerde nque todavía se inicializa con lo que normalmente se llama, argcque se encuentra 0en su caso de prueba general, por lo que con &n, putsobtiene un puntero bastante determinista a un byte '\ 0' que da como resultado una cadena vacía (suponiendo que el tamaño del puntero == tamaño entero y todas esas cosas) . &n+1sin embargo, es la dirección de lo que normalmente se llama argv(al menos en las ABI que pasan parámetros en la pila en orden inverso en lugar de registros, y con una pila que crece de direcciones altas a bajas), lo que, suponiendo ASLR, debería ser un puntero diferente cada hora.
Guntram Blohm
@GuntramBlohm Tienes razón y eso es muy interesante, aunque para mí los punteros son de 8 bytes y los de 4 bytes.
gato
5

PHP, 12 bytes

<?=uniqid();

Emite una ID única 583f4da627ee3basada en la hora actual en microsegundos.

Mario
fuente
<?=time();<- 10 bytes.
Ismael Miguel
@IsmaelMiguel uniqid()es 1'000'000 veces más indeterminado que time();)
Mario
No estoy diciendo lo contrario. Pero proponiendo otra respuesta. Eres libre de elegir esa.
Ismael Miguel
@IsmaelMiguel alguien más ya dio la misma respuesta ...
Mario
5

Groovy, 9 bytes

{print{}}

Salidas:

Script1$_run_closure1@2c8ec01c

Debido a que genera la dirección de memoria del cierre, no es determinista.

Urna de pulpo mágico
fuente
Y pensé que Kotlin era el camino hacia la solución JVM más corta posible.
F. George
Tratando de poner esto en un archivo y correr groovy Script1.groovy, me sale un error: Ambiguous expression could be either a parameterless closure expression or an isolated open code block;. ¿Cómo uso esto?
Paŭlo Ebermann
Asignarlo a una variable de cierre, luego llamarlo.
Urna de pulpo mágico
5

Emotinomicon, 15 bytes

😀😅🎲⏬

Explicación:

😀😅🎲⏬
😀      push 0. Stack: [0]
  😅    push 1. Stack: [1]
    🎲  random[pop;pop]. Stack: [1 or 0]
      ⏬output
Roman Gräf
fuente
El nombre del idioma es Emotinomicon
acrolith del
@daHugLenny ¿Cómo me perdí eso :)
Roman Gräf
5

Borland C en Windows, 12 bytes

m(){puts();}

Lo reescribí porque dicen que es posible usar una función. El compilador no ha verificado el argumento, así que compílelo; pero pone ver una dirección 'nadie' sabe y comienza a imprimir en qué punto esa dirección hasta encontrar el byte 0x00. Podría no estar bien si esa dirección no tiene memoria reservada para el programa, pero aquí imprima algo

RosLuP
fuente
Esto no da una salida no determinista, solo segfaults cada vez.
gato
Alternativamente, si usted consigue algo que no sea una violación de segmento, lo compilador ??
gato
@cat es un compilador de Borland C + Windows 7 Os. En lo que veo: el código anterior obtiene la dirección de la parte superior de la pila (donde en este caso hay una dirección para regresar en la función main ()) y leer desde esa dirección dentro del código del espacio principal ... Entonces, depende de la salida del compilador. Pero no sé 100% ... Es posible que el espacio de código no sea legible en su sistema operativo y de esto => falla de seg
RosLuP
1
@RosLuP: Simplemente imprimirá cualquier basura que haya en la memoria de la pila (o en el segundo registro de aprobación de argumentos, para x86-64 y la mayoría de las convenciones de llamadas RISC que pasan los primeros argumentos en los registros). No imprimiría la dirección de la pila. En x86-64, sería algo probable que imprimiera argv, ya que el compilador probablemente llamaría printf con el segundo argumento de main todavía en ese registro. Eso es exactamente lo que sucede con gcc6.2 dirigido a Linux: vea el código fuente + asm en el explorador del compilador Godbolt : main no toca RSI antes call printf.
Peter Cordes
1
@RosLuP: argvestá en la pila, pero no en la parte superior. Sin embargo, su dirección se ve afectada por la pila ASLR, por lo que funciona. Esto funcionaría menos bien con -m32. Probablemente siempre obtenga cero, ya que maintiene que mantener la pila alineada, por lo que la ranura de la pila sobre la cadena de formato puede ser una nueva memoria de pila que nunca se ha tocado (y probablemente siempre sea cero, ya que el núcleo evita pérdidas de información al poner a cero las páginas) de dar páginas de espacio de usuario llenas de datos antiguos).
Peter Cordes
5

Baby Language , 0 bytes



No envié esto originalmente porque pensé que era posterior a la pregunta. Estaba equivocado; el lenguaje tenía un intérprete creado a tiempo. También es probablemente la solución menos interesante de 0 bytes que he visto (dado que se especifica un programa de 0 bytes para hacer exactamente lo que el programa pide, y no con el propósito de hacer trampa en los desafíos de golf).

Baby Language se especifica para ignorar el programa que se proporciona y hacer algo al azar. (El intérprete vinculado en la página de Esolang genera un programa BF legal aleatorio y lo ejecuta.) Parece un ajuste perfecto para este desafío.


fuente