Mã ngắn nhất để tạo đầu ra không xác định


83

Bạn cần phải tạo ra đầu ra không xác định .

Trong trường hợp này, điều này sẽ được xác định có nghĩa là đầu ra sẽ không luôn luôn có cùng kết quả.

Quy tắc:

  • Một trình tạo số giả ngẫu nhiên luôn có cùng một hạt giống không được tính.

  • Bạn có thể dựa vào chương trình đang được chạy ở một thời điểm khác nhau (không xác định) mỗi lần thực hiện.

  • Mã tiến trình của mã của bạn (nếu trình thông dịch không cố định) có thể được coi là không xác định.

  • Bạn có thể dựa vào tính ngẫu nhiên dựa trên web.

  • Mã của bạn có thể không lấy đầu vào không trống. Bài meta liên quan .

  • Chương trình không bắt buộc phải dừng lại, nhưng đầu ra phải được hiển thị.

Bảng xếp hạng


33
@ mbomb007 Trong C có nhiều điều chỉ đơn giản là hành vi "không xác định". Bất kỳ thông dịch viên nhất định đều được phép làm bất cứ điều gì nó muốn trong mọi tình huống. Đối với tất cả những gì chúng ta biết, gcc có thể đặt cho bạn một chiếc bánh pizza nếu bạn cố gắng tràn số nguyên đã ký vào ngày thứ ba mưa, nhưng sẽ khiến cá hồi nhảy ra khỏi màn hình của bạn vào tất cả các ngày khác. Vì vậy, bạn sẽ không bao giờ thực sự biết nếu nó thực sự mang tính quyết định hay không trong bất kỳ triển khai nào.
Martin Ender

12
@MartinEnder Tôi không chắc có vấn đề gì không. Chúng tôi xác định các ngôn ngữ ở đây bằng cách triển khai chúng, không phải theo đặc điểm kỹ thuật (vì các ngôn ngữ không có triển khai không được phép)
Nathan Merrill

2
@MartinEnder Vâng, tôi đồng ý với Nathan.
mbomb007

7
Lưu ý rằng hành vi không xác định trong C thường dẫn đến sự cố và sự cố trên UNIX và Linux dẫn đến các tệp cốt lõi chứa ID tiến trình bên trong chúng. Điều đó dường như sẽ tuân thủ các câu hỏi như hiện tại.

5
Trừ khi tôi hiểu lầm, câu hỏi không yêu cầu mã lợi dụng hành vi không xác định. Nó yêu cầu mã lợi dụng hành vi được xác định để đảm bảo tính không xác định.
WGroleau

Câu trả lời:


110

WinDbg, 1 byte

#

Ồ Không bao giờ mong đợi một giải pháp 1 byte từ WinDbg!

#tìm kiếm một mẫu tháo gỡ, nhưng vì không có tham số, nên có vẻ như chỉ trả về hướng dẫn lắp ráp tiếp theo trong bất kỳ kết xuất / quy trình nào mà bạn đã đính kèm. Không chắc chắn logic để thiết lập địa chỉ ban đầu, nhưng nó có.

Đầu ra mẫu:

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
Theo tôi, một trong những câu trả lời hay hơn ở đây là giải pháp "Ngày hiện tại".
Bạch tuộc ma thuật Urn

rằng ở trên có vẻ như không liên quan, từng bước bắt đầu một số chức năng trong lắp ráp cpu intel 386
RosLuP

60

Java 7, 33 30 27 byte

int a(){return hashCode();}

Vì Java.


49
Vì Java. Có lẽ là lời giải thích tốt nhất về Java từ trước đến nay.
F. George

5
@carusocomputing Tôi đã có toStringtrong phiên bản trước nhưng sau đó loại trả về Stringdài hơn int. Lưu các byte! :]
Chọc

12
Đây có phải là một chức năng? hashCode()là một từ viết tắt ở đây this.hashCode(), vì vậy nó chỉ hoạt động như một phương thức cá thể, không phải là một phương thức tĩnh. Trong trường hợp đó, bạn cần mã bổ sung để tạo một đối tượng trong trình gọi. Điều đó có liên quan ở đây bởi vì đó là mã để tạo ra một đối tượng chịu trách nhiệm cho chủ nghĩa không xác định.

15
Trong Java 8: ()->hashCode()cho 14 byte. Chỉ cần nói ';)
Olivier Grégoire

4
@pts Tôi sẽ dựa trên bài đăng meta thảo luận về cấu trúc gửi mặc định cho bài viết. Các chức năng được cho phép theo mặc định trừ khi thách thức chỉ định rằng một chương trình đầy đủ là bắt buộc.
Chọc

52

MATLAB, 3 byte

why

whycung cấp câu trả lời cho hầu hết mọi câu hỏi Một vài ví dụ:

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ái này ngắn hơn bất kỳ randchức năng nào tôi có thể nghĩ ra.


33
MATLAB có tích hợp sẵn cho việc này ? Tại sao?
Sản phẩm ETH

59
@ETHproductions Lập trình viên đề xuất nó
Eddie Curtis

40

R, 1 byte

t

Xuất ra mã nguồn của hàm và một địa chỉ con trỏ bộ nhớ sẽ thay đổi theo mỗi (bắt đầu lại) của R.


36

Huh? , 0 byte


Một chương trình trống vẫn tạo ra đầu ra. Các dòng cuối cùng của trình thông dịch Python được thực thi:

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

Khi kết thúc chương trình, trình thông dịch Python sẽ in ..., sau đó nó sẽ tạo / mở một tệp văn bản được gọi Notes.txtvà viết một chuỗi chứa thời gian hiện tại ở phía trước.


5
Trong tất cả những điều tôi nghĩ mọi người sẽ sử dụng trên GitHub của mình, tôi không nghĩ một người phiên dịch ngôn ngữ đùa sẽ là một: P
Kade

@Kade Tôi thực sự sẽ sử dụng nó để trả lời một câu hỏi khác (mã ngắn nhất để phát âm thanh, chỉ với một byte) - nhưng câu hỏi hiện đã bị đóng.
mbomb007

Mặc dù nó sẽ không cạnh tranh trừ khi tôi nhìn vào trình thông dịch .NET gốc, tôi đoán vậy.
mbomb007

30

Mê cung , 5 byte

v
!
@

Hoặc là in 0hoặc không có gì (50% cơ hội mỗi).

Hãy thử trực tuyến!

Có một trường hợp rất cụ thể trong đó Labyrinth thể hiện hành vi ngẫu nhiên:

  • Phải có một bức tường ở phía trước con trỏ chỉ dẫn và đằng sau nó.
  • Phải có một bức tường bên trái và bên phải của con trỏ lệnh.
  • Đỉnh hiện tại của ngăn xếp phải bằng không.

Nếu tất cả các điều kiện đó được đáp ứng, hướng di chuyển của IP được chọn (thống nhất) một cách ngẫu nhiên. Điểm nổi bật nhất là ba điều kiện đó không thể đáp ứng trong luồng điều khiển thông thường, có nghĩa là trừ khi bạn sửa đổi mã nguồn khi chạy.

(Điều này có vẻ hơi độc đoán, nhưng thực ra đó là hành vi nhất quán nhất mà tôi có thể tìm thấy đối với các điều kiện này, vì thông thường hướng của IP luôn phụ thuộc vào hướng trước đó, hàng xóm của nó và dấu hiệu của đỉnh ngăn xếp và điều này có vẻ như là một cách thanh lịch để bao gồm một nguồn ngẫu nhiên trong ngôn ngữ.)

Với sự trợ giúp của các hướng dẫn xoay mã nguồn ( <^>v), có thể đưa IP vào tình huống này. Một ví dụ như vậy được nhìn thấy ở đầu. IP ban đầu chỉ về phía đông và bắt đầu từ đầu. Cột vxoay cột hiện tại để chúng tôi nhận được:

@
v
!

IP di chuyển cùng với vòng quay này để nó vẫn ở trên v, chỉ về hướng đông. Tất cả các điều kiện được đáp ứng ngay bây giờ, do đó IP sẽ tăng hoặc giảm ngẫu nhiên. Nếu nó đi lên, chương trình chấm dứt ngay lập tức. Nếu nó đi xuống, nó sẽ in số 0, xoay cột một lần nữa và sau đó chấm dứt.

Có ba chương trình khác sử dụng chương trình này (một chương trình cũng in 0, một chương trình in 00và một chương trình in 000):

v
@
!

"
>@!

"
>!@

(Trên thực tế có nhiều hơn ba chương trình khác, vì bạn cũng có thể sử dụng .thay vì !in byte rỗng hoặc thay thế "bằng nhiều lệnh lớn, nhưng tôi tin rằng tất cả chúng đều hoạt động giống nhau.)


30

Befunge (-93 và -98), 3 byte

?.@

Việc ?thực hiện gửi theo một hướng ngẫu nhiên. Nếu nó đi lên hoặc xuống, nó sẽ quay trở lại ?và rerolls. Nếu nó đi bên trái, chương trình kết thúc vòng đến @và do đó thoát ra mà không in bất cứ điều gì. Nếu nó đi đúng, nó sẽ in 0(đầu ra được tạo ra .khi ngăn xếp trống) và sau đó thoát ra trên @.


Điều này không được đảm bảo để chấm dứt, nhưng tôi sẽ đăng chính xác điều này +1
Daniel

Bạn có thể muốn thay đổi dấu phẩy thành dấu chấm thành đầu ra 0 dưới dạng số thay vì ký tự null (giá trị ASCII 0). +1
MildlyMilquetoast

Đó là .trong chương trình tôi đang sử dụng để thử nghiệm, nhưng bằng cách nào đó đã trở thành một ,khi tôi sao chép nó vào PPCG. Đã sửa.

7
@Dopapp nó chấm dứt gần như chắc chắn, với xác suất 1. Tôi sẽ coi đó là một sự đảm bảo;)
Oliphistic

@JamesHoldiness Tôi nghĩ bạn có thể làm điều đó trong 1. Không chắc chắn nếu điều này được tính mặc dù ...
MildlyMilquetoast

29

Minecraft, 5 4 byte

op 8

Được sử dụng bằng cách gõ vào bảng điều khiển của máy chủ hoặc khối lệnh và cung cấp năng lượng cho nó. Có thể được chạy từ giao diện trò chuyện bằng cách trả trước a /.

Thông thường, điều này không có gì, nhưng nếu có một người chơi có tên người dùng "8" trên máy chủ, họ sẽ được cấp quyền điều hành. Lưu ý rằng mặc dù Minecraft thường yêu cầu tên người dùng dài 3 ký tự, một số tài khoản có độ dài tên ngắn hơn đã được tạo trước hạn chế này.

Phiên bản có thể được chứng minh là không xác định nếu không có một trong những tên người dùng này hoặc có nguy cơ cấp quyền cho nhà điều hành người dùng ở đây:

me @r

Hiển thị tin nhắn cho mọi người, tin nhắn là tên người dùng của một người chơi ngẫu nhiên. Các oplệnh chỉ mất một chuỗi chữ, không phải bất kỳ kịch bản mà trả về một chuỗi.

Các melệnh sẽ không thực sự làm việc cho ví dụ đầu tiên, nó sẽ hiển thị "<your-username> 8". Khi chạy từ một khối lệnh, sẽ không có tính xác định vì tất cả các khối lệnh có cùng "tên người dùng" nhưng việc chạy nó từ giao diện trò chuyện sẽ yêu cầu /thêm một byte.


Vì vậy, /không được bao gồm trong số byte?
Esolanging Fruit

11
@ Challenger5 Dấu gạch chéo là tùy chọn trong các khối lệnh, không được phép trong bảng điều khiển máy chủ và bắt buộc trong giao diện trò chuyện.
Pavel

2
Trên thực tế, nó phải là 4 byte + 2 khối (Khối lệnh và nguồn đá đỏ) hoặc 6 blyte
RudolfJelin

2
@RudolphJelinek Bạn có thể chạy nó từ bàn điều khiển mà không cần khối lệnh.
Pavel

1
Một tùy chọn không xác định khác sẽ nằm helptrong một khối lệnh, có 4 byte (và không yêu cầu các trò chơi lậu).
Pokechu22

21

sh + Proc, 1 byte

w

Đây là giải pháp ngắn nhất mà tôi biết rằng nó hoạt động thông qua việc gọi vào các tệp thực thi bên ngoài. procpslà gói chịu trách nhiệm báo cáo thông tin về trạng thái hệ thống hiện tại ( psvà bạn bè) và được cài đặt trên hầu hết các bản phân phối Linux theo mặc định; wlà lệnh có tên ngắn nhất trong đó và trả về thông tin về người dùng đã đăng nhập, nhưng cũng có một số thông tin không xác định như thời gian hoạt động.


21

Thông báo 7, 6 byte

x is y

Đây không phải là chương trình Thông tin 7 hợp lệ, vì cả "x" và "y" đều không được xác định. Vì vậy, điều này ném một lỗi.

Tuy nhiên, một số thông báo lỗi của Inform 7, trong đó có một thông báo lỗi này là ngẫu nhiên. Vì vậy, văn bản nó in là về mặt kỹ thuật không xác định.

Một vài kết quả đầu ra có thể bao gồm:

Vấn đề. Câu 'x là y' dường như nói hai điều giống nhau - Tôi đang đọc 'x' và 'y' là hai điều khác nhau, và do đó, không có nghĩa gì để nói rằng một điều là khác: nó sẽ giống như nói đó là 'Adams là Jefferson'. Sẽ ổn thôi nếu thứ hai là tên của một loại, có lẽ với các thuộc tính: ví dụ 'Virginia là một căn phòng sáng' nói rằng một cái gì đó gọi là Virginia tồn tại và đó là một 'căn phòng', đó là một loại mà tôi biết về, kết hợp với một tài sản gọi là 'thắp sáng' mà tôi cũng biết.

Vấn đề. Câu 'x là y' dường như nói hai điều giống nhau - Tôi đang đọc 'x' và 'y' là hai điều khác nhau, và do đó, không có nghĩa gì để nói rằng một điều là khác: nó sẽ giống như nói đó là "Adam là đêm giao thừa". Sẽ ổn thôi nếu thứ hai là tên của một loại, có lẽ với các thuộc tính: ví dụ 'Vùng đất của Nod là một căn phòng sáng' nói rằng một cái gì đó gọi là Vùng đất của Nod tồn tại và đó là một 'căn phòng', đó là một loại tôi biết, kết hợp với một tài sản gọi là 'thắp sáng' mà tôi cũng biết.

Vấn đề. Câu 'x là y' dường như nói hai điều giống nhau - Tôi đang đọc 'x' và 'y' là hai điều khác nhau, và do đó, không có nghĩa gì để nói rằng một điều là khác: nó sẽ giống như nói đó là 'Clark Kent là Lex Luthor'. Sẽ ổn thôi nếu điều thứ hai là tên của một loại, có lẽ với các thuộc tính: ví dụ: 'Đô thị là một căn phòng sáng' nói rằng một cái gì đó gọi là Đô thị tồn tại và đó là một 'căn phòng', đó là một loại mà tôi biết về, kết hợp với một tài sản gọi là 'thắp sáng' mà tôi cũng biết.

Vấn đề. Câu 'x là y' dường như nói hai điều giống nhau - Tôi đang đọc 'x' và 'y' là hai điều khác nhau, và do đó, không có nghĩa gì để nói rằng một điều là khác: nó sẽ giống như nói đó là "Aeschylus là Euripides". Sẽ ổn thôi nếu thứ hai là tên của một loại, có lẽ với các thuộc tính: ví dụ 'Thế giới ngầm là một căn phòng sáng' nói rằng một thứ gọi là Địa ngục tồn tại và đó là một 'căn phòng', đó là một loại mà tôi biết về, kết hợp với một tài sản gọi là 'thắp sáng' mà tôi cũng biết.


7
Ngay cả các thông báo lỗi là dài dòng!
Lemon phá hủy

21

JavaScript, 4 byte

Date

Một hàm trả về ngày / giờ hiện tại. Tôi nghĩ rằng đây là ngắn nhất nó sẽ nhận được ...

Giải trình

Vì điều này dường như gây ra nhiều nhầm lẫn về lý do tại sao nó hợp lệ, tôi sẽ cố gắng giải thích.

Trong JavaScript, một mục nhập hàm là hợp lệ nếu nó có thể được gán cho một biến và được gọi như một hàm. Ví dụ: chức năng này là một mục hợp lệ:

function(){return Date()}

Bởi vì nó là một hàm có thể được gán cho một biến như vậy:

f=function(){return Date()}

Và sau đó chạy với f()nhiều lần như cần thiết. Mỗi lần, nó trả về chuỗi ngày / thời gian hiện tại, được quy định là không xác định bởi OP.

Chức năng mũi tên ES6 này cũng hợp lệ:

_=>Date()

Nó có thể được chỉ định với f=_=>Date(), sau đó chạy với f()như một cái khác.

Bây giờ, đây là một mục hợp lệ khác:

Date

Tại sao? Bởi vì giống như hai mục khác, nó có thể được gán f=Datevà sau đó được gọi với f(), trả về chính xác điều tương tự như hai mục còn lại. Thử nó:


1
Bạn không cần nó để được Date()gọi chức năng?
sữa

4
@milk Datelà một chức năng mà khi được gọi không có đầu vào sẽ tạo ra ngày / giờ hiện tại. _=>Date()là một mục hợp lệ rõ ràng thực hiện chính xác cùng một điều, vì vậy Datemột mục hợp lệ.
Sản phẩm ETH

1
Điều đó có ý nghĩa.
sữa

2
Nhập Datevào bảng điều khiển JavaScript của trình duyệt của tôi tạo ra đầu ra xác định, nó luôn tạo ra điều này : function Date() { [native code] }. Bạn có thể có nghĩa là Date(), 6 byte.
pts

2
nếu "ngày" ở trên là ok hơn "malloc (8)" hoặc "time (0)" cũng sẽ ổn trong C
RosLuP


11

Python 2, 11 byte

print id(1)

1
Đó là cái tôi tìm thấy. Tôi đã có id(0), mặc dù. :)
mbomb007

2
Tôi đã đánh bại bạn, về mặt kỹ thuật, vì tôi là OP và đã tìm thấy nó trước khi tôi đăng câu hỏi. Tôi không muốn đăng câu hỏi và ngay lập tức đăng câu trả lời ngắn nhất của mình.
mbomb007

11

Bình thường, 2 byte

O0

Giải trình:

 0 0
O  Random float in [0, 1)

Đó là, khi O0như là đối số của nó, nó chỉ đơn giản trả về một số float ngẫu nhiên giữa 01, độc quyền.

Hãy làm điều đó chỉ vì cái quái quỷ đó!

Ngoài ra, có vẻ như điều này có thể là sắp xếp theo kiểu retro (nhờ có 34718 / mbomb007):

Dilbert: ngày 8 tháng 9 năm 1992


Bình thường, 2 byte

OT

Giải trình:

 T 10
O  Random integer in [0, 10]

Thay vào đó hãy thử phiên bản boooooooooooooooring này>:(



10

PowerShell, 4 2 byte

(gạch bỏ 4 vẫn giống như 4 )

ps

Đây là bí danh Get-Processsẽ xuất ra danh sách quy trình hiện tại dưới dạng bảng, bao gồm các thẻ điều khiển, bộ nhớ riêng, thời gian CPU, v.v.

Thực hiện nó thông qua một cái gì đó như sau:

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

1
Tôi phải thừa nhận, tôi đã kiểm tra xem nó có thực sự bị gạch bỏ không. Bạn thực sự thậm chí không thể nói.
Carcigenicate

@Carcigenicate Tôi có thể biết nếu nó bị gạch chéo mà không chọn văn bản (Ubuntu 16.04.1, Chrome 54.0.2840.100).
Erik the Outgolfer

Hiển thị trên Android là tốt, mặc dù không rõ ràng: p
tomsmeding

Nó trông ổn trong ứng dụng iOS.
Mateusz Piotrowski

Tôi không có đại diện để tự làm điều đó, nhưng bạn có thể làm 04 và tấn công nó.
Bobson


9

Hàng hóa 64 cơ bản, 4 byte

1S|0

Thay thế PETSCII: |=SHIFT+Y

Các trang zero của một Commodore 64 là diện tích 256 byte của bộ nhớ có thể được truy cập nhanh hơn so với phần còn lại của bộ nhớ RAM. Do đó, các chương trình (như trình thông dịch BASIC) sử dụng nó cho dữ liệu được truy cập thường xuyên và CPU tự lưu trữ một số trạng thái bên trong của nó ở đây. Các nội dung có thể thay đổi mà không cần thông báo trước.

Chương trình BASIC ở trên, không có 1 SYS 0nghĩa là, tức là. chuyển thực thi đến vị trí bộ nhớ 0. Điều này bắt đầu thực thi trang zero dưới dạng mã. Thông thường, khi trình thông dịch BASIC bắt đầu chạy chương trình, 16 byte đầu tiên là

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

vì vậy SYS 0sẽ thực hiện như sau

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

Kết quả chung là xuất ra READY.dấu nhắc BASIC và trả lại quyền điều khiển cho người dùng. Tuy nhiên, vị trí bộ nhớ 0x00 là thanh ghi hướng I / O của CPU và vị trí bộ nhớ 0x01 là thanh ghi địa chỉ I / O của CPU. Nếu bạn đã thực hiện điều gì đó thay đổi những điều này trước khi chạy chương trình, kết quả có thể không dự đoán được, từ việc xuất rác đến khóa máy tính (0x22 thường có trong vị trí bộ nhớ 0x07, nếu được thực thi như một lệnh, là một HALTmã opcode không có giấy tờ ) .

Ngoài ra, một chương trình đáng tin cậy hơn là bốn byte

1?TI

In thời gian đã trôi qua, trong jiffies (1/60 giây), kể từ khi bật nguồn hệ thống.


8

05AB1E , 2 byte

žd

Hãy thử trực tuyến!

Xuất ra micro giây hiện tại từ đồng hồ bên trong của máy thực thi.

Hoặc bạn có thể làm một cái gì đó như thế này ...

05AB1E , 3 byte

A.r

Hãy thử trực tuyến!

Xuất ra một bảng chữ cái chữ thường xáo trộn ngẫu nhiên.

Hoặc điều này cũng hoạt động:

A.R

Hãy thử trực tuyến!

Xuất ra một chữ cái ngẫu nhiên từ bảng chữ cái.

Hoặc điều này cũng hoạt động, và mát hơn:

05AB1E , 9 byte

"ž"A.RJ.V

Hãy thử trực tuyến!

Đầu ra ngẫu nhiên một trong số này:

ž 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

Cảm ơn bút danh 117 đã lưu 4 byte.

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

Được biên dịch với gcc -o test lol.c(vâng tôi khá nguyên bản với tên tệp của tôi ...) và chạy với ./test.

Nó thực hiện những gì nó nói: in ký tự tương ứng với địa chỉ bộ nhớ của i, được xác định trong thời gian chạy, vì vậy nó không mang tính quyết định.


1. Bạn có thể bỏ qua &giá trị của một biến trên ngăn xếp không được xác định không? 2. Bạn có một số lượng không đổi các thứ trên ngăn xếp, vậy địa chỉ bộ nhớ có iphải là hằng số không?
Riley

2
itrở thành những gì thường được gọi argc, vì vậy bạn đúng, nó sẽ luôn là 1 trừ khi có nhiều đối số hơn. Tôi không thể tin rằng tôi đã không nhớ điều đó. Tôi vẫn không chắc tại sao vị trí thay đổi, nhưng nếu nó hoạt động thì nó hoạt động.
Riley

1
Nó thay đổi trên các hệ điều hành hiện đại do ASLR , một tính năng bảo mật được thiết kế để giúp khai thác khó hơn để đoán địa chỉ. Bạn sẽ nhận được một kết quả nhất quán trên một số hệ điều hành cũ.

1
Bạn có thể tiết kiệm một chút bằng cách thay thế putcharbằngreturn
trần mèo

1
Trên các trình biên dịch hiện đại có cảnh báo không khai báo loại tham số, bạn có thể thực hiện:main(){printf("%d");}
Myria

7

Python 2, 29 byte

import os
print os.urandom(9)

Đáng buồn thay, lần đầu tiên viết mã trên điện thoại thông minh.


6

Perl, 5 byte

say$$

Xuất ra ID tiến trình và một dòng mới.



5

Pyke, 1 byte

C

Hãy thử nó ở đây!

Xuất thời gian hiện tại


1
Tôi khá chắc chắn điều này là xác định.
Rɪᴋᴇʀ

@EasterlyIrk trong một bình luận đã bị xóa mbomb cho biết điều này là ổn
Blue

Ờ được rồi. Có vẻ quyết định với tôi, nhưng quy tắc OP.
Rɪᴋᴇʀ

Trong lịch sử chỉnh sửa của mình, tôi đã có phiên bản 3 byte với tính ngẫu nhiên thích hợp
Blue

@EasterlyIrk Nếu thời gian hiện tại là xác định, thì các số giả ngẫu nhiên cũng vậy, vì đó là những gì chúng được gieo hạt giống. Mục tiêu không phải là "sự ngẫu nhiên". Mục tiêu là không xác định.
mbomb007

5

C89 với GCC / Clang, 20 byte

Giải pháp C khác chỉ tách biệt mỗi lần khi được xây dựng bằng GCC hoặc Clang. Điều này, mặc dù.

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

Hình như:

$ 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

Khá nhiều thứ linh tinh không thể in được nhưng nó không đặc biệt!


tại sao "main (n) {đặt (& n + 1);}" mà không phải "main (n) {đặt (& n);}"?
RosLuP

@RosLuP Tùy chọn thứ hai của bạn, có vẻ hiển nhiên đối với người quan sát thông thường, đưa ra byte ở giá trị n (khi n là 1, putsing địa chỉ của nó cho 1 và khi n là 2, putsing địa chỉ của nó cho 2). Thêm 1 vào địa chỉ của n, sẽ trỏ đến chiều rộng 4 byte int, sẽ cho một địa chỉ rác có giá trị rác được lưu trữ ở đó với số byte rất nhất định cho đến byte NUL tiếp theo. Hành vi này có thể tái tạo giữa GCC và Clang và hoàn toàn vượt ra ngoài tôi. Tôi nghĩ rằng tôi sẽ hỏi về StackOverflow.
mèo

tôi đọc "đặt (& n)" theo cách này: nó đưa ra địa chỉ của n, giả sử rằng n = 0x01020304 đặt sẽ được chuyển đổi thành ký tự 04 03 02 01 hoặc ngược lại
RosLuP

1
Ghi của bạn nvẫn khởi tạo với những gì đang thường gọi argcđó là 0trong trường hợp thử nghiệm chung của bạn, như vậy với &n, putsđược một con trỏ khá xác định đến một byte '\ 0' kết quả là một chuỗi rỗng (giả sử kích thước con trỏ == kích thước nguyên và tất cả những thứ đó) . &n+1tuy nhiên là địa chỉ của những gì thường được gọi argv(ít nhất là trên ABI truyền các tham số trên ngăn xếp theo thứ tự ngược lại thay vì các thanh ghi và với một ngăn xếp phát triển từ địa chỉ cao đến thấp), giả sử ASLR, nên là một con trỏ khác nhau thời gian.
Guntram Blohm

@GuntramBlohm Bạn nói đúng và điều đó rất thú vị, mặc dù đối với tôi con trỏ là 8 byte và int là 4 byte.
con mèo

5

PHP, 12 byte

<?=uniqid();

Xuất ra một ID duy nhất 583f4da627ee3dựa trên thời gian hiện tại tính bằng micro giây.


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

@IsmaelMiguel gấp 1000 uniqid()lần so với 1000 lần so với time();)
Mario

Tôi không nói ngược lại. Nhưng đề xuất một câu trả lời khác. Bạn được tự do chọn cái đó.
Ismael Miguel

@IsmaelMiguel người khác đã đưa ra câu trả lời tương tự ...
Mario

5

Groovy, 9 byte

{print{}}

Đầu ra:

Script1$_run_closure1@2c8ec01c

Bởi vì nó xuất ra địa chỉ bộ nhớ của bao đóng nên nó không xác định.


Và tôi nghĩ rằng Kotlin là cách để giải pháp JVM ngắn nhất có thể.
F. George

Cố gắng đặt nó vào một tập tin và chạy groovy Script1.groovy, tôi gặp lỗi : Ambiguous expression could be either a parameterless closure expression or an isolated open code block;. Làm thế nào để tôi sử dụng này?
Paŭlo Ebermann

Gán nó cho một biến đóng, sau đó gọi nó.
Bạch tuộc ma thuật Urn

5

Emotinomicon, 15 byte

😀😅🎲⏬

Giải trình:

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

Tên của ngôn ngữ là Emotinomicon
acrolith

@daHugLenny Tôi đã bỏ lỡ điều đó như thế nào :)
Roman Gräf

5

Borland C trên Windows, 12 byte

m(){puts();}

Tôi viết lại nó bởi vì họ nói có thể sử dụng một chức năng. Trình biên dịch đã không kiểm tra đối số để biên dịch nó; nhưng đặt một địa chỉ 'không ai biết và bắt đầu in địa chỉ đó cho đến khi tìm thấy byte 0x00. Có thể không ổn nếu địa chỉ đó hết bộ nhớ dành cho chương trình nhưng ở đây in một cái gì đó


Điều này không cung cấp đầu ra không xác định, nó chỉ tách biệt mỗi lần.
mèo

Ngoài ra, nếu bạn nhận được một cái gì đó ngoài segfault, trình biên dịch nào ??
con mèo

@cat nó là một trình biên dịch Borland C + Windows7 Os. Theo cách tôi thấy: đoạn mã trên lấy địa chỉ trên cùng của ngăn xếp (trong trường hợp này có địa chỉ để trả về hàm main ()) và đọc từ địa chỉ đó bên trong mã không gian chính ... Vì vậy, nó phụ thuộc vào đầu ra của trình biên dịch. Nhưng tôi không biết 100% ... Có thể không gian mã có thể đọc được trong Os của bạn và từ đây => lỗi seg
RosLuP

1
@RosLuP: Nó sẽ chỉ in bất kỳ rác nào trong bộ nhớ ngăn xếp (hoặc trong thanh ghi chuyển tiếp thứ hai, cho x86-64 và hầu hết các quy ước gọi RISC vượt qua một vài đối số đầu tiên trong các thanh ghi). Nó sẽ không in địa chỉ của ngăn xếp. Trong x86-64, nó sẽ có khả năng in ra argv, vì trình biên dịch có thể sẽ gọi printf với đối số thứ hai của main vẫn còn trong thanh ghi đó. Đó chính xác là những gì xảy ra với gcc6.2 nhắm mục tiêu Linux: Xem nguồn + asm trên trình khám phá trình biên dịch Godbolt : main không chạm vào RSI trước đó call printf.
Peter Cordes

1
@RosLuP: argvnằm trên stack, nhưng không ở trên cùng. Địa chỉ của nó bị ảnh hưởng bởi stack ASLR, do đó, hoạt động. Điều này sẽ làm việc ít tốt hơn với -m32. Bạn có thể luôn luôn nhận được số 0, vì mainphải giữ ngăn xếp được căn chỉnh sao cho vị trí ngăn xếp phía trên chuỗi định dạng có thể là bộ nhớ ngăn xếp mới chưa từng được chạm vào (và có lẽ luôn luôn bằng 0, vì hạt nhân tránh rò rỉ thông tin bằng cách thay vào đó cung cấp cho các trang không gian người dùng đầy dữ liệu cũ).
Peter Cordes

5

Ngôn ngữ trẻ em , 0 byte



Tôi đã không gửi điều này ban đầu vì tôi nghĩ rằng nó đã hoãn câu hỏi. Tôi đã sai; ngôn ngữ đã có một thông dịch viên được tạo ra trong thời gian. Đây có lẽ cũng là giải pháp 0 byte gian lận nhất mà tôi từng thấy (với điều kiện là chương trình 0 byte được chỉ định để thực hiện chính xác những gì chương trình yêu cầu và không nhằm mục đích gian lận trong các thử thách chơi gôn).

Ngôn ngữ trẻ em được chỉ định để bỏ qua chương trình được đưa ra và làm điều gì đó một cách ngẫu nhiên. (Trình thông dịch được liên kết trên trang Esolang tạo ra một chương trình BF hợp pháp ngẫu nhiên và chạy nó.) Điều đó có vẻ như là một sự phù hợp hoàn hảo cho thử thách này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.