Kode terpendek untuk menghasilkan keluaran non-deterministik

83

Anda perlu menghasilkan keluaran yang tidak deterministik .

Dalam hal ini, ini akan didefinisikan berarti bahwa output tidak akan selalu menjadi hasil yang sama.

Aturan:

  • Generator angka pseudo-acak yang selalu memiliki seed yang sama tidak masuk hitungan.

  • Anda dapat mengandalkan program yang dijalankan pada waktu yang berbeda (tidak diketahui) setiap eksekusi.

  • ID proses kode Anda (jika tidak diperbaiki oleh penerjemah) dapat dianggap non-deterministik.

  • Anda mungkin mengandalkan keacakan berbasis web.

  • Kode Anda mungkin tidak menerima input yang tidak kosong. Meta post terkait .

  • Program tidak diharuskan untuk berhenti, tetapi output harus ditampilkan.

Papan peringkat

mbomb007
sumber
33
@ mbomb007 Di C ada banyak hal yang hanya perilaku "tidak terdefinisi". Setiap penerjemah yang diberikan diizinkan untuk melakukan apa pun yang diinginkannya dalam situasi apa pun. Sejauh yang kami tahu, gcc mungkin memesan pizza jika Anda mencoba untuk melimpahi integer yang ditandatangani pada hari Selasa yang hujan, tetapi akan membuat trout melompat keluar dari layar pada hari-hari lainnya. Jadi Anda tidak akan pernah benar-benar tahu apakah itu benar-benar deterministik atau tidak dalam implementasi yang diberikan.
Martin Ender
12
@ MartinEnder Saya tidak yakin apakah itu penting. Kami mendefinisikan bahasa di sini dengan penerapannya, bukan oleh spesifikasi (karena bahasa tanpa implementasi tidak diizinkan)
Nathan Merrill
2
@ MartinEnder Ya, saya setuju dengan Nathan.
mbomb007
7
Perhatikan bahwa perilaku tidak terdefinisi di C sering menyebabkan crash, dan crash pada UNIX dan Linux mengarah ke file inti yang berisi ID proses di dalamnya. Itu tampaknya sesuai dengan pertanyaan seperti saat ini worded.
5
Kecuali saya salah paham, pertanyaan itu tidak menanyakan kode yang mengambil keuntungan dari perilaku yang tidak terdefinisi. Ia meminta kode yang memanfaatkan perilaku yang telah ditentukan untuk menjamin non-determinisme.
WGroleau

Jawaban:

110

WinDbg, 1 byte

#

Wow! Tidak pernah mengharapkan solusi 1 byte dari WinDbg!

#mencari pola pembongkaran, tetapi karena tidak ada parameter, sepertinya hanya mengembalikan instruksi perakitan berikutnya dalam dump / proses apa pun yang Anda lampirkan. Tidak yakin logika pengaturan alamat awal, tetapi itu benar.

Output sampel:

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]
susu
sumber
9
Salah satu jawaban yang lebih keren di sini, ini harus menang atas solusi "Tanggal Sekarang" menurut saya.
Guci Gurita Ajaib
bahwa di atas tampaknya disassebly, langkah demi langkah dimulainya beberapa fungsi dalam 386 perakitan intel cpu
RosLuP
60

Java 7, 33 30 27 byte

int a(){return hashCode();}

Karena jawa

Menyodok
sumber
49
Karena jawa Mungkin penjelasan terbaik tentang Jawa.
F. George
5
@carusocomputing yang saya miliki toStringdi versi sebelumnya tapi kemudian tipe kembalinya Stringlebih panjang dari int. Simpan byte! :]
Poke
12
Apakah ini valid sebagai fungsi? hashCode()adalah singkatan di sini this.hashCode(), jadi itu hanya berfungsi sebagai metode instance, bukan metode statis. Dalam hal ini, Anda memerlukan kode tambahan untuk membuat objek di pemanggil. Itu relevan di sini karena itu adalah kode untuk membuat objek yang bertanggung jawab atas nondeterminisme.
15
Di Java 8: ()->hashCode()selama 14 byte. Katakan saja;)
Olivier Grégoire
4
@ pts Saya akan didasarkan pada meta post yang membahas struktur submit default untuk postingan. Fungsi diperbolehkan secara default kecuali tantangan menentukan bahwa program lengkap diperlukan.
Poke
52

MATLAB, 3 byte

why

whymemberikan jawaban untuk hampir semua pertanyaan. Beberapa contoh:

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?

Ini lebih pendek dari randfungsi apa pun yang dapat saya pikirkan.

Stewie Griffin
sumber
33
MATLAB memiliki builtin untuk ini ? Mengapa?
ETHproductions
59
@ ETHproductions Programmer menyarankannya
Eddie Curtis
40

R, 1 byte

t

Output kode sumber fungsi dan alamat penunjuk memori yang berubah dengan setiap (kembali) awal R.

chrki
sumber
36

Hah? , 0 byte


Program kosong masih menghasilkan output. Baris terakhir dari juru bahasa Python yang dieksekusi:

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

Pada akhir program, juru bahasa Python akan mencetak ..., maka itu akan membuat / membuka file teks yang disebut Notes.txtdan menulis string yang berisi waktu saat ini di depan.

mbomb007
sumber
5
Dari semua hal yang saya pikir orang akan gunakan di GitHub saya, saya tidak berpikir penerjemah bahasa lelucon akan menjadi satu: P
Kade
@Kade saya sebenarnya akan menggunakannya untuk menjawab pertanyaan lain juga (kode terpendek untuk memainkan suara, dengan hanya satu byte) - tetapi pertanyaannya sekarang ditutup.
mbomb007
Meskipun itu akan non-bersaing kecuali saya melihat penerjemah .NET asli, saya kira.
mbomb007
30

Labirin , 5 byte

v
!
@

Baik cetak 0 atau tidak sama sekali (masing-masing 50%).

Cobalah online!

Ada kasus yang sangat spesifik di mana Labyrinth menunjukkan perilaku acak:

  • Harus ada dinding di depan penunjuk instruksi dan di belakangnya.
  • Harus ada non-dinding kiri dan kanan dari penunjuk instruksi.
  • Bagian atas tumpukan saat ini harus nol.

Jika semua kondisi tersebut terpenuhi, arah IP bergerak dipilih (seragam) secara acak. Ceri di atas adalah bahwa ketiga kondisi tersebut tidak mungkin dipenuhi dalam aliran kontrol reguler, yang berarti kecuali Anda memodifikasi kode sumber saat runtime.

(Ini mungkin tampak agak sewenang-wenang, tapi itu sebenarnya perilaku paling konsisten yang bisa saya temukan untuk kondisi ini, karena biasanya arah IP selalu tergantung pada arah sebelumnya, tetangga-tetangganya, dan tanda bagian atas tumpukan, dan ini sepertinya cara yang elegan untuk memasukkan sumber keacakan dalam bahasa.)

Dengan bantuan instruksi rotasi kode sumber ( <^>v) dimungkinkan untuk membawa IP ke dalam situasi ini. Salah satu contohnya terlihat di atas. IP awalnya menunjuk ke timur dan mulai di atas. The vberputar kolom saat ini sehingga kita mendapatkan:

@
v
!

IP bergerak bersama dengan rotasi ini sehingga masih berada di v, menunjuk ke timur. Semua kondisi terpenuhi sekarang, sehingga IP akan naik atau turun secara acak. Jika naik, program akan segera berakhir. Jika turun, ia mencetak nol, memutar kolom lagi, dan kemudian berakhir.

Ada tiga program lain yang memanfaatkan ini (satu yang juga mencetak 0, satu yang mencetak 00dan satu yang mencetak 000):

v
@
!

"
>@!

"
>!@

(Sebenarnya ada lebih banyak dari tiga program lain, karena Anda juga dapat menggunakan .alih-alih !mencetak nol byte, atau menggantinya "dengan berbagai macam perintah, tetapi saya yakin semuanya bekerja pada dasarnya sama.)

Martin Ender
sumber
30

Befunge (-93 dan -98), 3 byte

?.@

The ?mengirimkan eksekusi dalam arah acak. Jika naik atau turun, itu kembali ke loop ?dan rerolls. Jika dibiarkan ke kiri, program membungkus ke @dan dengan demikian keluar tanpa mencetak apa pun. Jika berjalan dengan benar, ia mencetak 0(output yang dihasilkan oleh .ketika tumpukan kosong) dan kemudian keluar pada @.


sumber
Ini tidak dijamin akan berakhir, tetapi saya akan memposting ini dengan tepat +1
Daniel
Anda mungkin ingin mengubah koma ke periode untuk menghasilkan 0 sebagai angka, bukan karakter nol (nilai ASCII 0). +1
MildlyMilquetoast
Itu .dalam program yang saya gunakan untuk pengujian, tetapi entah bagaimana menjadi ,ketika saya menyalinnya ke PPCG. Tetap.
7
@Docapp itu hampir pasti berakhir, dengan probabilitas 1. Saya akan menganggap itu sebagai jaminan;)
Oliphaunt
@ JamesHolderness Saya pikir Anda bisa melakukannya di 1. Tidak yakin apakah ini diperhitungkan ...
MildlyMilquetoast
29

Minecraft, 5 4 byte

op 8

Digunakan dengan mengetik ke konsol server atau blok perintah dan memberikannya kekuatan. Dapat dijalankan dari antarmuka obrolan dengan menambahkan a /.

Biasanya ini tidak apa-apa, tetapi jika ada pemain dengan nama pengguna "8" di server, mereka akan diberikan izin operator. Perhatikan bahwa sementara Minecraft biasanya membutuhkan nama pengguna sepanjang 3 karakter, beberapa akun dengan panjang nama yang lebih pendek dibuat sebelum pembatasan ini.

Versi yang dapat ditunjukkan sebagai non-deterministik tanpa salah satu nama pengguna ini atau risiko memberikan izin operator pengguna ada di sini:

me @r

Menampilkan pesan untuk semua orang, pesan tersebut menjadi nama pengguna pemain acak. Ituop perintah saja mengambil string literal, tidak ada script yang mengembalikan sebuah string.

The meperintah tidak akan benar-benar bekerja untuk contoh pertama, itu akan menampilkan "<your-username> 8". Saat dijalankan dari blok perintah, itu tidak akan bersifat deterministik karena semua blok perintah memiliki "nama pengguna" yang sama tetapi menjalankannya dari antarmuka obrolan akan memerlukan /satu byte tambahan.

Pavel
sumber
Jadi /tidak termasuk dalam hitungan byte?
Buah Esolanging
11
@ Challenger5 Slash bersifat opsional di blok perintah, tidak diizinkan di konsol server, dan wajib di antarmuka obrolan.
Pavel
2
Sebenarnya, itu harus 4 byte + 2 blok (blok Command dan sumber redstone), atau 6 blytes
RudolfJelin
2
@RudolphJelinek Anda dapat menjalankannya dari konsol tanpa blok perintah.
Pavel
1
Opsi non-deterministik lainnya adalah helpdalam blok perintah, yaitu 4 byte (dan tidak memerlukan game bajakan).
Pokechu22
21

sh + procps, 1 byte

w

Ini adalah solusi terpendek yang saya ketahui yang berfungsi melalui pemanggilan ke executable eksternal. procpsadalah paket yang bertanggung jawab untuk melaporkan informasi tentang keadaan sistem saat ini ( psdan teman-teman), dan diinstal pada sebagian besar distribusi Linux secara default; wadalah perintah dengan nama terpendek di dalamnya, dan mengembalikan informasi tentang pengguna yang masuk, tetapi juga beberapa informasi nondeterministik seperti waktu aktif.


sumber
21

Menginformasikan 7, 6 byte

x is y

Ini bukan program Inform 7 yang valid, karena "x" atau "y" belum didefinisikan. Jadi ini melempar kesalahan.

Namun, beberapa pesan kesalahan Inform 7 — termasuk yang ini — diacak. Jadi teks yang dicetaknya secara teknis non-deterministik.

Beberapa kemungkinan keluaran meliputi:

Masalah. Kalimat 'x adalah y' tampaknya mengatakan dua hal adalah sama - saya membaca 'x' dan 'y' sebagai dua hal yang berbeda, dan oleh karena itu tidak masuk akal untuk mengatakan bahwa satu adalah yang lain: itu akan seperti mengatakan bahwa 'Adams adalah Jefferson'. Akan baik-baik saja jika yang kedua adalah nama sejenis, mungkin dengan properti: misalnya 'Virginia adalah ruang terang' mengatakan bahwa sesuatu yang disebut Virginia ada dan bahwa itu adalah 'ruang', yang merupakan jenis yang saya tahu tentang, dikombinasikan dengan properti yang disebut 'menyala' yang juga saya ketahui.

Masalah. Kalimat 'x adalah y' tampaknya mengatakan dua hal adalah sama - saya membaca 'x' dan 'y' sebagai dua hal yang berbeda, dan oleh karena itu tidak masuk akal untuk mengatakan bahwa satu adalah yang lain: itu akan seperti mengatakan bahwa 'Adam adalah Hawa'. Akan baik-baik saja jika yang kedua adalah nama sejenis, mungkin dengan properti: misalnya 'Tanah Mengangguk adalah ruang terang' mengatakan bahwa sesuatu yang disebut Tanah Mengangguk ada dan bahwa itu adalah 'ruang', yang merupakan jenis yang saya tahu, dikombinasikan dengan properti yang disebut 'menyala' yang juga saya ketahui.

Masalah. Kalimat 'x adalah y' tampaknya mengatakan dua hal adalah sama - saya membaca 'x' dan 'y' sebagai dua hal yang berbeda, dan oleh karena itu tidak masuk akal untuk mengatakan bahwa satu adalah yang lain: itu akan seperti mengatakan bahwa 'Clark Kent adalah Lex Luthor'. Akan baik-baik saja jika yang kedua adalah nama sejenis, mungkin dengan properti: misalnya 'Metropolis adalah ruangan terang' mengatakan bahwa sesuatu yang disebut Metropolis ada dan itu adalah 'kamar', yang merupakan jenis yang saya tahu tentang, dikombinasikan dengan properti yang disebut 'menyala' yang juga saya ketahui.

Masalah. Kalimat 'x adalah y' tampaknya mengatakan dua hal adalah sama - saya membaca 'x' dan 'y' sebagai dua hal yang berbeda, dan oleh karena itu tidak masuk akal untuk mengatakan bahwa satu adalah yang lain: itu akan seperti mengatakan bahwa 'Aeschylus adalah Euripides'. Akan baik-baik saja jika hal kedua adalah nama sejenis, mungkin dengan properti: misalnya 'Underworld adalah ruangan yang menyala' mengatakan bahwa sesuatu yang disebut Underworld ada dan bahwa itu adalah 'kamar', yang merupakan jenis yang aku tahu tentang, dikombinasikan dengan properti yang disebut 'menyala' yang juga saya ketahui.

Draconis
sumber
7
Bahkan pesan kesalahan pun bertele-tele!
Lemon Destructible
21

JavaScript, 4 byte

Date

Fungsi yang mengembalikan tanggal / waktu saat ini. Saya pikir ini adalah yang terpendek yang akan ...

Penjelasan

Karena ini tampaknya menyebabkan banyak kebingungan mengapa itu valid, saya akan mencoba menjelaskan.

Dalam JavaScript, entri fungsi valid jika dapat ditetapkan ke variabel dan disebut seperti fungsi. Misalnya, fungsi ini adalah entri yang valid:

function(){return Date()}

Karena itu adalah fungsi yang dapat ditugaskan ke variabel seperti:

f=function(){return Date()}

Dan kemudian jalankan dengan f() sebanyak yang diperlukan. Setiap kali, ia mengembalikan string tanggal / waktu saat ini, yang telah dikuasai non-deterministik oleh OP.

Fungsi panah ES6 ini juga valid:

_=>Date()

Itu dapat ditugaskan dengan f=_=>Date(), lalu jalankan denganf() seperti yang lain.

Sekarang, inilah entri lain yang valid:

Date

Mengapa? Karena sama seperti dua entri lainnya, ia dapat ditugaskan dengan f=Datedan kemudian dipanggil dengan f(), mengembalikan hal yang persis sama dengan dua entri lainnya. Cobalah:

Produksi ETH
sumber
1
Apakah Anda tidak memerlukannya Date()untuk memanggil fungsi?
susu
4
@milk Dateadalah fungsi yang, ketika dipanggil tanpa input, menghasilkan tanggal / waktu saat ini. _=>Date()adalah entri yang jelas valid yang melakukan hal yang persis sama, begitu Datejuga entri yang valid.
ETHproduksi
1
Itu masuk akal.
susu
2
Mengetik Dateuntuk konsol JavaScript browser saya menghasilkan output deterministik, selalu menghasilkan ini: function Date() { [native code] }. Anda mungkin berarti Date(), 6 byte.
Poin
2
jika "tanggal" di atas tidak apa-apa dari "malloc (8)" atau "waktu (0)" juga akan ok di C
RosLuP
12

Bash (procps-ng), 2 byte

ps

$$ juga merupakan solusi.

Rɪᴋᴇʀ
sumber
1
Jika demikian, wlebih pendek dan juga berasal dari procps.
liori
1
Anda mengedit ini menjadi duplikat dari jawaban saya .
@ ais523 oops, maaf.
Rɪᴋᴇʀ
11

Python 2, 11 byte

print id(1)
Biru
sumber
1
Itu yang saya temukan. Tapi aku punya id(0). :)
mbomb007
2
Saya mengalahkan Anda, secara teknis, karena saya OP dan menemukannya sebelum saya memposting pertanyaan. Saya tidak ingin memposting pertanyaan dan segera memposting jawaban terpendek saya.
mbomb007
11

Pyth, 2 byte

O0

Penjelasan:

 0 0
O  Random float in [0, 1)

Itu bahwa, ketika Omemiliki 0sebagai argumennya, itu hanya mengembalikan float acak antara 0dan 1, eksklusif.

Mari kita lakukan hanya untuk itu!

Juga, tampaknya ini bisa agak retro (terima kasih kepada 34718 / mbomb007):

Dilbert: 8 September 1992


Pyth, 2 byte

OT

Penjelasan:

 T 10
O  Random integer in [0, 10]

Coba versi boooooooooooooooring ini sebagai gantinya>:(

Erik the Outgolfer
sumber
10

PowerShell, 4 2 byte

(dicoret 4 masih terlihat seperti 4 )

ps

Ini adalah alias untuk Get-Process yang akan menampilkan daftar proses saat ini sebagai tabel, termasuk pegangan, memori pribadi, waktu CPU, dll.

Jalankan melalui sesuatu seperti berikut:

C:\Tools\Scripts\golfing>powershell.exe "ps"
AdmBorkBork
sumber
1
Saya harus mengakui, saya memeriksa untuk melihat apakah itu benar-benar dicoret. Anda benar-benar tidak tahu.
Carcigenicate
@Carcigenicate Saya bisa tahu apakah itu dilintasi tanpa memilih teks (Ubuntu 16.04.1, Chrome 54.0.2840.100).
Erik the Outgolfer
Terlihat di android juga, meskipun tidak jelas: p
tomsmeding
Ini terlihat baik di aplikasi iOS.
Mateusz Piotrowski
Saya tidak memiliki perwakilan untuk melakukannya sendiri, tetapi Anda bisa melakukan 04 dan mencoretnya.
Bobson
9

Zsh, 5 byte

<<<$$

Mencetak PID.

betseg
sumber
9

Commodore 64 Basic, 4 byte

1S|0

Substitusi PETSCII: |=SHIFT+Y

Itu halaman nol dari Commodore 64 adalah area dari 256 byte memori yang dapat diakses lebih cepat dari sisa RAM. Akibatnya, program (seperti penerjemah BASIC) menggunakannya untuk data yang sering diakses, dan CPU sendiri menyimpan beberapa keadaan internalnya di sini. Konten dapat berubah tanpa pemberitahuan.

Program BASIC di atas, ungolfed, adalah 1 SYS 0, yaitu. transfer eksekusi ke lokasi memori 0. Ini mulai menjalankan halaman nol sebagai kode. Biasanya, ketika penerjemah BASIC mulai menjalankan program, 16 byte pertama adalah

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

jadi SYS 0akan menjalankan yang berikut ini

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

Hasil keseluruhan adalah untuk output BASIC READY. prompt dan mengembalikan kontrol kepada pengguna. Namun, lokasi memori 0x00 adalah register arah I / O CPU, dan lokasi memori 0x01 adalah register alamat I / O CPU. Jika Anda telah melakukan sesuatu yang mengubah ini sebelum menjalankan program, hasilnya bisa tidak dapat diprediksi, mulai dari mengeluarkan sampah hingga mengunci komputer (0x22 yang biasanya terdapat di lokasi memori 0x07, jika dijalankan sebagai instruksi, adalah HALTopcode yang tidak berdokumen ) .

Atau, program yang lebih andal dan tak terduga adalah empat byte

1?TI

Mencetak waktu yang telah berlalu, dalam jiffies (1/60 detik), sejak sistem dinyalakan.

Menandai
sumber
8

05AB1E , 2 byte

žd

Cobalah online!

Output mikrodetik saat ini dari jam internal mesin yang mengeksekusi.

Atau Anda bisa melakukan sesuatu seperti ini ...

05AB1E , 3 byte

A.r

Cobalah online!

Menghasilkan alfabet huruf kecil acak acak.

Atau ini juga berfungsi:

A.R

Cobalah online!

Menghasilkan huruf acak dari alfabet.

Atau ini juga berfungsi, dan lebih keren:

05AB1E , 9 byte

"ž"A.RJ.V

Cobalah online!

Keluaran secara acak salah satu dari ini:

ž 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
Guci Gurita Ajaib
sumber
8

BrainfuckX dan skrip kecil (dll) polyglot - 2 byte

?.

? - Acak nilai dalam sel saat ini

. - Kirim sel saat ini ke stdout

wyldstallyns
sumber
8

C, 25 21 byte

Berkat pseudonym117 karena telah menghemat 4 byte.

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

Dikompilasi dengan gcc -o test lol.c(ya saya cukup orisinal dengan nama file saya ...), dan dijalankan bersama ./test.

Itu tidak apa yang dikatakannya: mencetak karakter yang sesuai dengan alamat memori i, yang didefinisikan pada saat runtime, jadi itu harus non-deterministik.

Paul Picard
sumber
1. Bisakah Anda melewatkan &nilai variabel pada stack tidak didefinisikan? 2. Anda memiliki jumlah yang konstan di stack, jadi apakah alamat memorinya ikonstan?
Riley
2
imenjadi apa yang biasa disebut argc, jadi Anda benar, itu akan selalu menjadi 1 kecuali ada lebih banyak argumen. Aku tidak percaya aku tidak ingat itu. Saya masih tidak yakin mengapa lokasi berubah, tetapi jika berhasil berfungsi.
Riley
1
Ini berubah pada sistem operasi modern karena ASLR , fitur keamanan yang dirancang untuk mempersulit eksploit untuk menebak alamat. Anda akan mendapatkan hasil yang konsisten pada beberapa OS lama.
1
Anda dapat menghemat sedikit dengan menggantinya putchardenganreturn
ceilingcat
1
Pada kompiler modern dengan peringatan untuk tidak mendeklarasikan tipe parameter, Anda dapat melakukan:main(){printf("%d");}
Myria
7

Python 2, 29 byte

import os
print os.urandom(9)

Sayangnya bukan pertama kali menulis kode pada smartphone.

Pavel
sumber
6

Perl, 5 byte

say$$

Menghasilkan ID proses dan baris baru.


sumber
6

Ruby , 3 byte

p$$

Cobalah online!

Mencetak ID proses.

Martin Ender
sumber
1
$. akan juga bekerja pendekatan Nice :)
Jatin Dhankhar
5

Pyke, 1 byte

C

Coba di sini!

Output waktu saat ini

Biru
sumber
1
Saya cukup yakin ini deterministik.
Rɪᴋᴇʀ
@EasterlyIrk dalam komentar yang dihapus mbomb mengatakan ini ok
Biru
Oh baiklah. Tampak deterministik bagi saya, tetapi aturan OP.
Rɪᴋᴇʀ
Dalam riwayat edit saya, saya memiliki versi 3 byte dengan keacakan yang tepat
Biru
@ EasterlyIrk Jika waktu saat ini adalah deterministik, maka begitu juga angka pseudo-acak, karena itulah yang diunggulkan. Tujuannya bukan "keacakan". Tujuannya adalah non-determinisme.
mbomb007
5

C89 dengan GCC / Dentang, 20 byte

Solusi C lainnya hanya segfault setiap kali dibangun dengan GCC atau Dentang. Tapi ini.

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

Yang terlihat seperti:

$ 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

Cukup banyak sampah yang tidak patut dicetak tetapi tidak deterministik!

kucing
sumber
mengapa "main (n) {puts (& n + 1);}" dan bukan "main (n) {puts (& n);}"?
RosLuP
@RosLuP Opsi kedua Anda, yang tampak jelas bagi pengamat biasa, memberikan byte pada nilai n (ketika n adalah 1, putsing alamatnya memberi 1, dan ketika n adalah 2, putsing alamatnya memberikan 2). Menambahkan 1 ke alamat n, yang harus mengarah ke lebar 4-byte int, memberikan alamat sampah dengan nilai sampah yang tersimpan di sana dengan jumlah byte yang sangat pasti hingga byte NUL berikutnya. Perilaku ini direproduksi antara GCC dan Dentang dan benar-benar di luar saya. Saya pikir saya akan bertanya di StackOverflow.
kucing
saya membaca "menempatkan (& n)" dengan cara ini: itu memberi untuk menempatkan alamat n, anggap bahwa n = 0x01020304 put akan mencetak dikonversi dalam karakter 04 03 02 01 atau membalikkan itu
RosLuP
1
Ingat Anda nmasih diinisialisasi dengan apa yang biasa disebut argcyang ada 0dalam kasus uji umum Anda, jadi dengan &n, putsmendapat pointer yang cukup deterministik ke byte '\ 0' menghasilkan string kosong (dengan asumsi ukuran pointer == ukuran integer dan semua itu) . &n+1namun adalah alamat dari apa yang biasanya disebut argv(setidaknya pada ABI yang meneruskan parameter pada tumpukan dalam urutan terbalik, bukan dengan register, dan dengan tumpukan yang tumbuh dari alamat tinggi ke rendah), yang, dengan asumsi ASLR, harus menjadi penunjuk yang berbeda setiap waktu.
Guntram Blohm
@ GuntramBlohm Anda benar dan itu sangat menarik, meskipun bagi saya pointer adalah 8 byte dan int adalah 4 byte.
kucing
5

PHP, 12 byte

<?=uniqid();

Menghasilkan ID unik 583f4da627ee3berdasarkan waktu saat ini dalam mikrodetik.

Mario
sumber
<?=time();<- 10 byte.
Ismael Miguel
@IsmaelMiguel uniqid()adalah 1'000'000 kali lebih tidak pasti daripada time();)
Mario
Saya tidak mengatakan oposite. Tetapi mengusulkan jawaban lain. Anda bebas memilih yang itu.
Ismael Miguel
@IsmaelMiguel sudah ada orang yang memberikan jawaban yang sama ...
Mario
5

Groovy, 9 byte

{print{}}

Output:

Script1$_run_closure1@2c8ec01c

Karena output alamat memori dari penutupan itu adalah non-deterministik.

Guci Gurita Ajaib
sumber
Dan saya pikir Kotlin adalah jalan menuju solusi JVM sesingkat mungkin.
F. George
Mencoba untuk menempatkan ini ke dalam sebuah file dan berjalan groovy Script1.groovy, saya mendapatkan error: Ambiguous expression could be either a parameterless closure expression or an isolated open code block;. Bagaimana saya menggunakan ini?
Paŭlo Ebermann
Tetapkan ke variabel penutupan, lalu panggil.
Magic Octopus Mm
5

Emotinomicon, 15 byte

😀😅🎲⏬

Penjelasan:

😀😅🎲⏬
😀      push 0. Stack: [0]
  😅    push 1. Stack: [1]
    🎲  random[pop;pop]. Stack: [1 or 0]
      ⏬output
Roman Gräf
sumber
Nama bahasanya adalah Emotinomicon
acrolith
@daHugLenny Bagaimana saya melewatkan itu :)
Roman Gräf
5

Borland C pada Windows, 12 byte

m(){puts();}

Saya menulis ulang karena mereka mengatakan mungkin untuk menggunakan satu fungsi. Compiler belum memeriksa argumennya jadi kompilasi; tetapi menempatkan melihat satu alamat 'tidak ada' yang tahu dan mulai mencetak apa alamat itu sampai menemukan byte 0x00. Bisa saja tidak ok jika alamat itu kehabisan memori yang disediakan untuk program tetapi di sini mencetak sesuatu

RosLuP
sumber
Ini tidak memberikan output nondeterministic, itu hanya kesalahan setiap waktu.
kucing
Atau, jika Anda mendapatkan sesuatu selain segfault, kompiler apa ??
kucing
@cat itu adalah salah satu kompiler Borland C + Windows7 Os. Dalam cara saya melihat: kode di atas mendapatkan alamat atas tumpukan (di mana dalam kasus ini ada alamat untuk kembali dalam fungsi main ()) dan membaca dari alamat itu di dalam kode ruang utama ... Jadi itu tergantung pada output kompiler. Tapi saya tidak tahu 100% ... Mungkin ruang kode tidak dapat dibaca di Os Anda dan dari ini => kesalahan seg
RosLuP
1
@RosLuP: Ini hanya akan mencetak sampah apa pun yang ada di memori tumpukan (atau dalam register arg-passing kedua, untuk x86-64 dan kebanyakan konvensi panggilan RISC yang melewati beberapa argumen pertama dalam register). Itu tidak akan mencetak alamat tumpukan. Pada x86-64, kemungkinan akan dicetak argv, karena kompiler mungkin akan memanggil printf dengan arg kedua utama masih dalam register itu. Itulah yang terjadi dengan penargetan gcc6.2 Linux: Lihat sumber + asm pada explorer compiler Godbolt : main tidak menyentuh RSI sebelumnya call printf.
Peter Cordes
1
@RosLuP: argvada di tumpukan, tetapi tidak di bagian paling atas. Alamatnya dipengaruhi oleh tumpukan ASLR, jadi itu berfungsi. Ini akan bekerja dengan kurang baik -m32. Anda mungkin selalu mendapatkan nol, karena mainharus menjaga agar stack tetap selaras sehingga slot stack di atas string format mungkin memori stack baru yang belum pernah disentuh (dan mungkin selalu nol, karena kernel menghindari info kebocoran oleh zeroing pages sebagai gantinya memberikan halaman ruang pengguna yang penuh dengan data lama).
Peter Cordes
5

Bahasa Bayi , 0 byte



Saya tidak mengirimkan ini pada awalnya karena saya pikir itu setelah pertanyaan. Saya salah; bahasa memang memiliki juru bahasa yang dibuat pada waktunya. Ini juga mungkin solusi 0-byte paling tidak curang yang pernah saya lihat (mengingat bahwa program 0-byte ditentukan untuk melakukan persis apa yang diminta oleh program, dan bukan untuk tujuan menyontek pada tantangan golf).

Bahasa Bayi ditentukan untuk mengabaikan program yang diberikannya dan melakukan sesuatu secara acak. (Penerjemah yang ditautkan pada halaman Esolang menghasilkan program BF hukum acak dan menjalankannya.) Itu sepertinya sangat cocok untuk tantangan ini.


sumber