Codice più breve per produrre output non deterministico


83

È necessario produrre un output non deterministico .

In questo caso, questo verrà definito per indicare che l'output non avrà sempre lo stesso risultato.

Regole:

  • Un generatore di numeri pseudo-casuale che ha sempre lo stesso seme non conta.

  • Puoi fare affidamento sul programma in esecuzione in un momento diverso (sconosciuto) ad ogni esecuzione.

  • L'ID di processo del codice (se non è risolto dall'interprete) può essere considerato non deterministico.

  • Puoi fare affidamento sulla casualità basata sul web.

  • Il tuo codice potrebbe non accettare input non vuoti. Meta post correlato .

  • Non è necessario arrestare il programma, ma è necessario visualizzare l'output.

Classifica


33
@ mbomb007 In C ci sono molte cose che sono semplicemente comportamenti "indefiniti". A un determinato interprete è consentito fare tutto ciò che vuole in qualsiasi situazione. Per quanto ne sappiamo, gcc potrebbe ordinarti una pizza se provi a traboccare un intero con segno in un martedì piovoso, ma farà saltare una trota dallo schermo in tutti gli altri giorni. Quindi non sapresti mai se è effettivamente deterministico o meno in una data implementazione.
Martin Ender,

12
@MartinEnder Non sono sicuro che sia importante. Qui definiamo le lingue in base alla loro implementazione, non in base alle specifiche (in quanto le lingue senza un'implementazione non sono consentite)
Nathan Merrill

2
@MartinEnder Sì, sono d'accordo con Nathan.
mbomb007,

7
Si noti che il comportamento indefinito in C porta spesso a crash e crash su UNIX e Linux portano a file core che contengono l'ID di processo al loro interno. Ciò sembrerebbe conforme alla domanda come attualmente formulata.

5
A meno che non abbia frainteso, la domanda non ha richiesto il codice che sfrutta un comportamento indefinito. Richiede un codice che sfrutti un comportamento definito per garantire il non determinismo.
Francia,

Risposte:


110

WinDbg, 1 byte

#

Wow! Non mi sarei mai aspettato una soluzione da 1 byte da WinDbg!

#cerca un modello di disassemblaggio, ma poiché non ci sono parametri, sembra semplicemente restituire le istruzioni di assemblaggio successive in qualunque dump / processo a cui si è collegati. Non sono sicuro della logica per l'impostazione dell'indirizzo iniziale, ma lo fa.

Uscita campione:

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
Una delle risposte più interessanti qui, a mio avviso, dovrebbe vincere una soluzione "Data corrente".
Magic Octopus Urn,

che al di sopra di questo sembra disassicuratamente, passo dopo passo, l'inizio di alcune funzioni nell'assemblea della CPU di 386
RosLuP,

60

Java 7, 33 30 27 byte

int a(){return hashCode();}

Perché Java.


49
Perché Java. Probabilmente la migliore spiegazione di Java di sempre.
F. George,

5
@carusocomputing che avevo toStringin una versione precedente ma il tipo di ritorno è Stringche è più lungo di int. Salva i byte! :]
Poke

12
È valido come funzione? hashCode()è un'abbreviazione qui per this.hashCode(), quindi funzionerebbe solo come metodo di istanza, non come metodo statico. In tal caso, occorrerebbe un codice aggiuntivo per creare un oggetto nel chiamante. Questo è rilevante qui perché è il codice per creare un oggetto responsabile del non determinismo.

15
In Java 8: ()->hashCode()per 14 byte. Basta dire ';)
Olivier Grégoire il

4
@pts Sto andando in base al meta post che discute la struttura di invio predefinita per i post. Le funzioni sono consentite per impostazione predefinita a meno che la sfida non specifichi che è necessario un programma completo.
Poke

52

MATLAB, 3 byte

why

whyfornisce risposte a quasi tutte le domande. Alcuni esempi:

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?

Questo è più breve di qualsiasi randfunzione mi venga in mente.


33
MATLAB ha un builtin per questo ? Perché?
ETHproductions

59
@ETHproductions Il programmatore l'ha suggerito
Eddie Curtis il

40

R, 1 byte

t

Emette il codice sorgente della funzione e un indirizzo del puntatore di memoria che cambia ad ogni (ri) inizio di R.


36

eh? , 0 byte


Un programma vuoto produce ancora output. Le ultime righe dell'interprete Python eseguite:

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

Alla fine di un programma, l'interprete Python stamperà ..., quindi creerà / aprirà un file di testo chiamato Notes.txte scriverà una stringa che contiene l'ora corrente in primo piano.


5
Di tutte le cose che pensavo che le persone avrebbero usato sul mio GitHub, non pensavo che un interprete del linguaggio scherzoso fosse uno: P
Kade,

@Kade In realtà lo avrei usato anche per rispondere a un'altra domanda (il codice più breve per riprodurre un suono, con un solo byte) - ma la domanda ora è chiusa.
mbomb007,

Anche se sarebbe in competizione se non guardassi l'interprete .NET originale, immagino.
mbomb007,

30

Labirinto , 5 byte

v
!
@

O stampe 0o niente (50% di probabilità ciascuno).

Provalo online!

C'è un caso molto specifico in cui Labyrinth mostra un comportamento casuale:

  • Deve esserci un muro davanti al puntatore dell'istruzione e dietro di esso.
  • Ci deve essere una sinistra e una destra non puntatore del puntatore dell'istruzione.
  • L'attuale cima dello stack deve essere zero.

Se tutte queste condizioni sono soddisfatte, la direzione in cui si muove l'IP viene scelta (uniformemente) in modo casuale. La ciliegina sulla torta è che queste tre condizioni sono impossibili da soddisfare nel flusso di controllo regolare, il che significa che a meno che non modifichi il codice sorgente in fase di esecuzione.

(Questo può sembrare un po 'arbitrario, ma in realtà è il comportamento più coerente che ho trovato per queste condizioni, poiché normalmente la direzione dell'IP dipende sempre dalla direzione precedente, dai suoi vicini e dal segno della parte superiore dello stack, e questo sembrava un modo elegante per includere una fonte di casualità nella lingua.)

Con l'aiuto delle istruzioni di rotazione del codice sorgente ( <^>v) è possibile portare l'IP in questa situazione. Uno di questi esempi è visto in alto. L'IP inizialmente punta verso est e inizia in alto. I vruota la colonna corrente in modo da ottenere:

@
v
!

L'IP si muove insieme a questa rotazione in modo che sia ancora sulla v, puntando verso est. Tutte le condizioni sono soddisfatte ora, quindi l'IP salirà o scenderà casualmente. Se sale, il programma termina immediatamente. Se scende, stampa uno zero, ruota di nuovo la colonna e quindi termina.

Esistono altri tre programmi che ne fanno uso (uno che stampa anche 0, uno che stampa 00e uno che stampa 000):

v
@
!

"
>@!

"
>!@

(In realtà ci sono molti più di altri tre programmi, perché potresti anche usare .invece di !stampare byte null, o sostituirli "con una grande varietà di comandi, ma credo che funzionino sostanzialmente allo stesso modo.)


30

Befunge (-93 e -98), 3 byte

?.@

La ?invia esecuzione in una direzione casuale. Se va su o giù, torna indietro ?e rilancia. Se va a sinistra, il programma si avvolge attorno al @e quindi esce senza stampare nulla. Se va bene, stampa 0(l'output prodotto da .quando la pila è vuota) e quindi esce sul @.


Questo non è garantito per terminare, ma stavo per pubblicare questo esattamente così +1
Daniel

È possibile che si desideri modificare la virgola in un punto per generare 0 come numero anziché come carattere null (valore ASCII 0). +1
MildlyMilquetoast

Era .nel programma che stavo usando per i test, ma in qualche modo è diventato un ,quando l'ho copiato su PPCG. Fisso.

7
@Dopapp termina quasi sicuramente però, con probabilità 1. Lo prenderei come garanzia;)
Oliphaunt il

@JamesHolderness Penso che tu possa farlo in 1. Non so se questo conta però ...
MildlyMilquetoast

29

Minecraft, 5 4 byte

op 8

Utilizzato digitando nella console di un server o in un blocco comandi e dandogli potenza. Può essere eseguito dall'interfaccia della chat anteponendo a /.

Di solito questo non fa nulla, ma se c'è un giocatore con il nome utente "8" sul server, gli verranno date le autorizzazioni dell'operatore. Nota che mentre Minecraft richiede normalmente che i nomi utente siano lunghi 3 caratteri, prima di questa restrizione sono stati creati alcuni account con una lunghezza dei nomi più breve.

La versione che può essere dimostrata non deterministica senza uno di questi nomi utente o il rischio di concedere le autorizzazioni di un operatore utente è qui:

me @r

Mostra un messaggio a tutti, il messaggio è il nome utente di un giocatore a caso. Il opcomando accetta solo una stringa letterale, non uno script che restituisce una stringa.

Il mecomando non funzionerebbe davvero per il primo esempio, verrebbe visualizzato "<your-username> 8". Quando eseguito da un blocco di comando, non sarebbe deterministico poiché tutti i blocchi di comando hanno lo stesso "nome utente" ma eseguirlo dall'interfaccia di chat richiederebbe /un byte aggiuntivo.


Quindi /non è incluso nel conteggio dei byte?
Esolanging Fruit,

11
@ Challenger5 La barra è facoltativa nei blocchi di comando, non consentita nella console del server e obbligatoria nell'interfaccia di chat.
Pavel

2
In realtà, dovrebbe essere di 4 byte + 2 blocchi (blocco comandi e sorgente di pietra
rossa

2
@RudolphJelinek È possibile eseguirlo dalla console senza blocchi di comandi.
Pavel,

1
Un'altra opzione non deterministica sarebbe helpin un blocco comandi, che è di 4 byte (e non richiede giochi piratati).
Pokechu22,

21

sh + procps, 1 byte

w

Questa è la soluzione più breve di cui sono a conoscenza che funziona chiamando in eseguibili esterni. procpsè il pacchetto responsabile per la segnalazione di informazioni sullo stato attuale del sistema ( pse sugli amici) ed è installato sulla maggior parte delle distribuzioni Linux per impostazione predefinita; wè il comando con il nome più breve e restituisce informazioni sugli utenti che hanno effettuato l'accesso, ma anche alcune informazioni non deterministiche come il tempo di attività.


21

Informare 7, 6 byte

x is y

Questo non è un programma Inform 7 valido, poiché né "x" né "y" sono stati definiti. Quindi questo genera un errore.

Tuttavia, alcuni dei messaggi di errore di Inform 7, incluso questo, sono randomizzati. Quindi il testo che stampa è tecnicamente non deterministico.

Alcune possibili uscite includono:

Problema. La frase 'x is y' sembra dire che due cose sono uguali: sto leggendo 'x' e 'y' come due cose diverse, e quindi non ha senso dire che uno è l'altro: sarebbe come dire che "Adams è Jefferson". Va bene se la seconda cosa fosse il nome di un tipo, forse con proprietà: ad esempio "Virginia è una stanza illuminata" dice che esiste qualcosa chiamato Virginia e che è una "stanza", che è un tipo che conosco circa, combinato con una proprietà chiamata 'illuminata' di cui anch'io conosco.

Problema. La frase 'x is y' sembra dire che due cose sono uguali: sto leggendo 'x' e 'y' come due cose diverse, e quindi non ha senso dire che uno è l'altro: sarebbe come dire che "Adamo è Eva". Andrebbe bene se la seconda cosa fosse il nome di un tipo, forse con proprietà: per esempio "La Terra di Nod è una stanza illuminata" dice che esiste qualcosa chiamato Terra di Nod e che è una "stanza", che è un tipo che conosco, combinato con una proprietà chiamata 'illuminata' che conosco anche.

Problema. La frase 'x is y' sembra dire che due cose sono uguali: sto leggendo 'x' e 'y' come due cose diverse, e quindi non ha senso dire che uno è l'altro: sarebbe come dire che "Clark Kent è Lex Luthor". Va bene se la seconda cosa fosse il nome di un tipo, forse con proprietà: ad esempio "Metropolis è una stanza illuminata" dice che esiste qualcosa chiamato Metropolis e che è una "stanza", che è un tipo che conosco circa, combinato con una proprietà chiamata 'illuminata' di cui anch'io conosco.

Problema. La frase 'x is y' sembra dire che due cose sono uguali - sto leggendo 'x' e 'y' come due cose diverse, e quindi non ha senso dire che uno è l'altro: sarebbe come dire che "Eschilo è Euripide". Andrebbe bene se la seconda cosa fosse il nome di un tipo, forse con proprietà: per esempio "Underworld è una stanza illuminata" dice che esiste qualcosa chiamato Underworld e che è una "stanza", che è un tipo che conosco circa, combinato con una proprietà chiamata 'illuminata' di cui anch'io conosco.


7
Anche i messaggi di errore sono dettagliati!
Destructible Lemon

21

JavaScript, 4 byte

Date

Una funzione che restituisce la data / ora corrente. io che questo sia il più breve che otterrà ...

Spiegazione

Dal momento che questo sembra causare molta confusione sul perché sia ​​valido, cercherò di spiegare.

In JavaScript, una voce di funzione è valida se può essere assegnata a una variabile e chiamata come una funzione. Ad esempio, questa funzione è una voce valida:

function(){return Date()}

Perché è una funzione che può essere assegnata a una variabile in questo modo:

f=function(){return Date()}

E poi corri con f() tutte le volte che è necessario. Ogni volta, restituisce la stringa data / ora corrente, che è stata giudicata non deterministica dall'OP.

Questa funzione freccia ES6 è valida anche:

_=>Date()

Può essere assegnato con f=_=>Date(), quindi eseguire conf() come l'altro.

Ora, ecco un'altra voce valida:

Date

Perché? Perché proprio come le altre due voci, può essere assegnata con f=Datee quindi chiamata con f(), restituendo esattamente la stessa cosa delle altre due. Provalo:


1
Non ti serve Date()per invocare la funzione?
latte

4
@milk Dateè una funzione che, quando chiamata senza input, produce la data / ora corrente. _=>Date()è una voce chiaramente valida che fa esattamente la stessa cosa, quindi Dateè una voce valida.
ETHproductions

1
Questo ha senso.
latte il

2
Digitando Datealla console JavaScript del browser produce un output deterministico, produce sempre questo: function Date() { [native code] }. Probabilmente intendi Date(), 6 byte.
punti

2
se "date" sopra è ok rispetto a "malloc (8)" o "time (0)" sarebbe ok anche in C
RosLuP

12

Bash (procps-ng), 2 byte

ps

$$ è anche una soluzione.


1
Se è così, wè più corto e proviene anche da procps.
liori,

1
Hai modificato questo in un duplicato della mia risposta .

@ ais523 oops, scusa.
R

11

Python 2, 11 byte

print id(1)

1
Questo è quello che ho trovato. Ho avuto id(0), però. :)
mbomb007,

2
Tecnicamente ti ho battuto dal momento che sono l'OP e l'ho trovato prima di pubblicare la domanda. Non volevo pubblicare la domanda e pubblicare immediatamente la mia risposta più breve.
mbomb007,


10

PowerShell, 4 2 byte

(barrato 4 sembra ancora 4 )

ps

Questo è l'alias per Get-Process quale verrà visualizzato l'elenco dei processi corrente come tabella, inclusi handle, memoria privata, tempo della CPU, ecc.

Eseguire tramite qualcosa di simile al seguente:

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

1
Devo ammetterlo, ho controllato per vedere se era stato effettivamente barrato. Non puoi nemmeno dirlo.
Carcigenicato

@Carcigenicato Posso dire se viene attraversato senza selezionare il testo (Ubuntu 16.04.1, Chrome 54.0.2840.100).
Erik the Outgolfer,

Visibile anche su Android, anche se non chiaramente: p
tomsmeding

Sembra a posto nell'app iOS.
Mateusz Piotrowski,

Non ho il rappresentante per farlo da solo, ma potresti farlo 04 e farlo fuori.
Bobson,


9

Commodore 64 Basic, 4 byte

1S|0

Sostituzione PETSCII: |=SHIFT+Y

La pagina zero di un Commodore 64 è un'area di 256 byte di memoria a cui è possibile accedere più velocemente rispetto al resto della RAM. Di conseguenza, programmi (come l'interprete BASIC) lo usano per i dati a cui si accede frequentemente e qui la CPU stessa memorizza parte del suo stato interno. I contenuti sono soggetti a modifiche senza preavviso.

Il programma BASIC sopra, non golfato, è 1 SYS 0, vale a dire. trasferisce l'esecuzione nella posizione di memoria 0. Questa operazione avvia l'esecuzione della pagina zero come codice. Normalmente, quando l'interprete BASIC inizia a eseguire un programma, sono i primi 16 byte

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

quindi SYS 0eseguirà quanto segue

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

Il risultato complessivo è generare il READY.prompt BASIC e restituire il controllo all'utente. Tuttavia, la posizione di memoria 0x00 è il registro di direzione I / O della CPU e la posizione di memoria 0x01 è il registro degli indirizzi I / O della CPU. Se hai fatto qualcosa che li modifica prima di eseguire il programma, i risultati possono essere imprevedibili, spaziando dall'emissione di immondizia al blocco del computer (lo 0x22 solitamente contenuto nella posizione di memoria 0x07, se eseguito come istruzione, è un HALTcodice operativo non documentato ) .

In alternativa, un programma più affidabile e imprevedibile è il quattro byte

1?TI

Stampa il tempo trascorso, in jiffies (1/60 di secondo), dall'accensione del sistema.


8

05AB1E , 2 byte

žd

Provalo online!

Emette i microsecondi correnti dall'orologio interno della macchina in esecuzione.

Oppure potresti fare qualcosa del genere ...

05AB1E , 3 byte

A.r

Provalo online!

Emette un alfabeto minuscolo mescolato casualmente.

Oppure funziona anche:

A.R

Provalo online!

Emette una lettera casuale dall'alfabeto.

Oppure funziona anche ed è più interessante:

05AB1E , 9 byte

"ž"A.RJ.V

Provalo online!

Emette casualmente uno di questi:

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

Grazie a pseudonym117 per il salvataggio di 4 byte.

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

Compilato con gcc -o test lol.c(sì, sono abbastanza originale con il nome del mio file ...), e ho funzionato con ./test.

Fa quello che dice: stampa il carattere corrispondente all'indirizzo di memoria di i, che è definito in fase di esecuzione, quindi dovrebbe essere non deterministico.


1. Puoi saltare &come il valore di una variabile nello stack non è definito? 2. Hai un numero costante di cose nello stack, quindi l'indirizzo di memoria è icostante?
Riley,

2
idiventa ciò che viene normalmente chiamato argc, quindi hai ragione, sarà sempre 1 a meno che non ci siano più argomenti. Non posso credere di non averlo ricordato. Non sono ancora sicuro del perché la posizione cambi, ma se funziona funziona.
Riley,

1
Cambia sui moderni sistemi operativi grazie a ASLR , una funzionalità di sicurezza progettata per rendere più difficile per gli exploit indovinare gli indirizzi. Otterrai un risultato coerente su alcuni sistemi operativi precedenti.

1
Puoi risparmiare un po 'sostituendo putcharconreturn
ceilingcat il

1
Sui compilatori moderni con avvertimenti per non aver dichiarato il tipo di un parametro, potresti fare:main(){printf("%d");}
Myria,

7

Python 2, 29 byte

import os
print os.urandom(9)

Purtroppo non è la prima volta che scrivo codice su uno smartphone.


6

Perl, 5 byte

say$$

Emette l'ID del processo e una nuova riga.



5

Pyke, 1 byte

C

Provalo qui!

Emette l'ora corrente


1
Sono abbastanza sicuro che questo sia deterministico.
R

@EasterlyIrk in un commento cancellato mbomb ha detto che andava bene
Blue

Oh ok. Mi sembra deterministico, ma le regole del PO.
R

Nella mia cronologia delle modifiche avevo una versione a 3 byte con casualità adeguata
Blue

@EasterlyIrk Se l'ora corrente è deterministica, lo sono anche i numeri pseudo-casuali, poiché è quello con cui vengono seminati. L'obiettivo non è "casualità". L'obiettivo è il non determinismo.
mbomb007,

5

C89 con GCC / Clang, 20 byte

L'altra soluzione C segfafa ogni volta quando viene costruita con GCC o Clang. Questo, comunque.

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

Che assomiglia 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

Un sacco di spazzatura non stampabile ma non è deterministico!


perché "main (n) {put (& n + 1);}" e non "main (n) {put (& n);}"?
RosLuP,

@RosLuP La tua seconda opzione, che sembra ovvia all'osservatore casuale, fornisce il byte al valore di n (quando n è 1, putsil suo indirizzo dà 1 e quando n è 2, putsil suo indirizzo dà 2). Aggiungendo 1 all'indirizzo n, che dovrebbe puntare a 4 byte di larghezza int, si ottiene un indirizzo spazzatura con un valore spazzatura memorizzato lì con un certo numero di byte fino al successivo byte NUL. Questo comportamento è riproducibile tra GCC e Clang e completamente al di là di me. Penso che andrò a chiedere su StackOverflow.
gatto

ho letto "put (& n)" in questo modo: dà a mette l'indirizzo di n, supponiamo che n = 0x01020304 put stampi convertito in caratteri 04 03 02 01 o viceversa
RosLuP

1
Ricorda che il tuo nè ancora inizializzato con quello che normalmente viene chiamato argcche è 0nel tuo caso di test generale, quindi con &n, putsottiene un puntatore abbastanza deterministico su un byte '\ 0' risultante in una stringa vuota (supponendo che la dimensione del puntatore sia == dimensione intera e tutto il resto) . &n+1tuttavia è l'indirizzo di ciò che viene normalmente chiamato argv(almeno sugli ABI che passano i parametri sullo stack in ordine inverso anziché nei registri e con uno stack che passa da indirizzi alti a indirizzi bassi), che, supponendo ASLR, dovrebbe essere un puntatore diverso ogni tempo.
Guntram Blohm,

@GuntramBlohm Hai ragione ed è molto interessante, anche se per me i puntatori sono 8 byte e gli ints sono 4 byte.
cat

5

PHP, 12 byte

<?=uniqid();

Emette un ID univoco 583f4da627ee3basato sull'ora corrente in microsecondi.


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

@IsmaelMiguel uniqid()è 1'000'000 volte più indeterminato di time();)
Mario

Non sto dicendo l'opposto. Ma proponendo un'altra risposta. Sei libero di sceglierlo.
Ismael Miguel,

@IsmaelMiguel qualcun altro ha già dato la stessa risposta ...
Mario

5

Groovy, 9 byte

{print{}}

Uscite:

Script1$_run_closure1@2c8ec01c

Poiché genera l'indirizzo di memoria della chiusura, non è deterministico.


E ho pensato che Kotlin fosse la strada per la soluzione JVM più breve possibile.
F. George,

Tentando di inserirlo in un file e in esecuzione groovy Script1.groovy, viene visualizzato un errore:Ambiguous expression could be either a parameterless closure expression or an isolated open code block; . Come lo uso?
Paŭlo Ebermann,

Assegnalo a una variabile di chiusura, quindi chiamalo.
Magic Octopus Urn il

5

Emotinomicon, 15 byte

😀😅🎲⏬

Spiegazione:

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

Il nome della lingua è Emotinomicon
acrolith

@daHugLenny Come mi sono perso :)
Roman Gräf

5

Borland C su Windows, 12 byte

m(){puts();}

L'ho riscritto perché dicono che è possibile usare una funzione. Il compilatore non ha verificato l'argomento, quindi compilalo; ma mette a vedere un indirizzo 'nessuno' lo sa e inizia a stampare quale punto quell'indirizzo fino a trovare il byte 0x00. Potrebbe non andare bene se quell'indirizzo è esaurito nella memoria riservata al programma ma qui stampa qualcosa


Questo non fornisce un output non deterministico, ma segfault ogni volta.
cat

In alternativa, se si ottiene qualcosa di diverso da un segfault, quale compilatore ??
cat

@cat è un compilatore Borland C + Windows 7 Os. In quello che vedo: sopra il codice ottiene l'indirizzo in cima allo stack (dove in questo caso c'è l'indirizzo da restituire nella funzione main ()) e letto da quell'indirizzo all'interno del codice dello spazio principale ... Quindi dipende dall'output del compilatore. Ma non lo so al 100% ... È possibile che lo spazio del codice non sia leggibile nei tuoi Os e da questo => seg fault
RosLuP

1
@RosLuP: Stamperebbe semplicemente qualunque immondizia fosse nella memoria dello stack (o nel secondo registro di passaggio arg, per x86-64 e la maggior parte delle convenzioni di chiamata RISC che superano i primi argomenti nei registri). Non stampa l'indirizzo della pila. In x86-64, sarebbe in qualche modo probabile stampare argv, poiché il compilatore probabilmente chiamerebbe printf con il secondo arg di main ancora in quel registro. Questo è esattamente ciò che accade con gcc6.2 come target per Linux: vedi source + asm sull'esploratore del compilatore Godbolt : main non ha mai toccato RSI prima call printf.
Peter Cordes,

1
@RosLuP: argvè in pila, ma non in cima. Il suo indirizzo è influenzato dallo stack ASLR, tuttavia, quindi funziona. Funzionerebbe meno bene con -m32. Probabilmente otterresti sempre zero, poiché maindeve mantenere lo stack allineato in modo che lo slot dello stack sopra la stringa di formato possa essere una memoria dello stack nuova che non è mai stata toccata (ed è probabilmente sempre zero, poiché il kernel evita le perdite di informazioni zero le pagine di dare pagine di spazio utente piene di vecchi dati).
Peter Cordes,

5

Baby Language , 0 byte



Non l'ho inviato originariamente perché pensavo che la domanda fosse postdatata. Mi sbagliavo; la lingua aveva un interprete creato in tempo. Probabilmente è anche la soluzione a 0 byte meno economica che abbia mai visto (dato che un programma a 0 byte è specificato per fare esattamente ciò che il programma chiede, e non allo scopo di imbrogliare sulle sfide del golf).

Baby Language viene specificato per ignorare il programma che viene dato e fare qualcosa a caso. (L'interprete collegato sulla pagina di Esolang genera un programma BF legale casuale e lo esegue.) Sembra una scelta perfetta per questa sfida.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.