非決定論的な出力を生成する最短コード


83

非決定的である出力を生成する必要があります。

この場合、これは、出力が常に同じ結果になるとは限らないことを意味するように定義されます。

ルール:

  • 常に同じシードを持つ擬似乱数ジェネレーターはカウントされません。

  • 実行ごとに異なる(不明な)時間に実行されるプログラムに依存できます。

  • コードのプロセスID(インタープリターによって修正されない場合)は、非決定的であると見なすことができます。

  • Webベースのランダム性に依存する場合があります。

  • コードは空でない入力を受け付けません。関連するメタ投稿

  • プログラムを停止する必要はありませんが、出力を表示する必要があります。

リーダーボード


33
@ mbomb007 Cには、単に「未定義」の動作である多くのことがあります。どんな通訳者でも、どんな状況でもやりたいことができるようになっています。雨の火曜日に符号付き整数をオーバーフローさせようとすると、gccはピザを注文するかもしれませんが、それ以外の日はマスが画面から飛び出します。そのため、特定の実装で実際に決定論的であるかどうかはわかりません。
マーティンエンダー

12
@MartinEnderそれが重要かどうかはわかりません。ここでは、仕様ではなく実装によって言語を定義します(実装のない言語は許可されていないため)
Nathan Merrill

2
@MartinEnderええ、私はネイサンに同意します。
mbomb007

7
Cでの未定義の動作はしばしばクラッシュを引き起こし、UNIXおよびLinuxでのクラッシュはプロセスIDを含むコアファイルを引き起こすことに注意してください。これは、現在の言葉どおりの質問に準拠しているようです。

5
私が誤解しない限り、質問は未定義の動作を利用するコードを要求しませんでした。定義された動作を利用して非決定性を保証するコードを要求します。
WGroleau 16

回答:


110

WinDbg、1バイト

#

うわー!WinDbgから1バイトのソリューションを期待したことはありません!

#逆アセンブリパターンを検索しますが、パラメータがないため、接続されているダンプ/プロセスで次のアセンブリ命令を返すように見えます。初期アドレスを設定するためのロジックはわかりませんが、実際はそうです。

サンプル出力:

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
私の意見では、これはよりクールな回答の1つであり、これは「現在の日付」ソリューションに勝つはずです。
魔法のタコUr

上記の386 Intel CPUアセンブリの一部の機能の開始の段階的な段階的であると思われる
RosLuP

60

Java 7、33 30 27バイト

int a(){return hashCode();}

なぜならJava。


49
なぜならJava。おそらくこれまでのJavaの最高の説明。
F.ジョージ

5
@carusocomputing toString以前のバージョンでは持っていましたが、戻り値の型Stringはの長さよりも長くなりintます。バイトを節約してください!:]
ポケ

12
これは関数として有効ですか?hashCode()はの省略形であるためthis.hashCode()、静的メソッドではなく、インスタンスメソッドとしてのみ機能します。その場合、呼び出し元でオブジェクトを作成するには追加のコードが必要になります。非決定性の原因となるオブジェクトを作成するコードであるため、ここで重要です。

15
Java 8の場合:()->hashCode()14バイト。Just sayin ';)
オリビエグレゴワール

4
@pts メタ投稿に基づいて、投稿のデフォルトの送信構造について説明します。チャレンジで完全なプログラムが必要であると指定されていない限り、関数はデフォルトで許可されています。
ポケ

52

MATLAB、3バイト

why

whyほとんどすべての質問に対する回答を提供します。いくつかの例:

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?

これはrand私が考えることができるどの機能よりも短いです。


33
MATLABにはこれが組み込まれていますか?どうして?
ETHproductions 16

59
@ETHproductionsプログラマーはそれを提案しました
エディカーティス

40

R、1バイト

t

関数のソースコードと、Rの(再)開始ごとに変化するメモリポインターアドレスを出力します。


36

え?、0バイト


空のプログラムでも出力が生成されます。実行されるPythonインタープリターの最後の行:

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

プログラムの最後に、Pythonインタープリターはを印刷し...、次にテキストファイルを作成/開きNotes.txt、現在の時刻を前に含む文字列を書き込みます。


5
私は人々が私のGitHub上で使用するだろうと思ったすべてのもののうち、私は冗談言語インタプリタが1になるとは思いませんでした:P
カーデ

@Kade私は実際にそれを使用して別の質問にも答えるつもりでした(サウンドを再生するための最短コード、1バイトのみで)。しかし、質問は現在閉じられています。
mbomb007 16

元の.NETインタプリタを見ない限り、競合することはないでしょうが、私は推測します。
mbomb007 16

30

ラビリンス、5バイト

v
!
@

印刷する0か、何もしない(それぞれ50%の確率)。

オンラインでお試しください!

ラビリンスがランダムな動作を示す非常に特殊なケースがあります。

  • 指示ポインターの前と後ろに壁がなければなりません。
  • 命令ポインタの左右に壁がなくてはなりません。
  • スタックの現在のトップはゼロでなければなりません。

これらの条件がすべて満たされている場合、IPの移動方向はランダムに(均一に)選択されます。一番上のチェリーは、これらの3つの条件は通常の制御フローでは満たすことができないということです。つまり、実行時にソースコードを変更しない限りです。

(これは少しarbitrary意的に思えるかもしれませんが、通常、IPの方向は常に前の方向、その隣人、およびスタックの最上部の符号に依存するため、これらの条件に対して実際に見つけることができる最も一貫した動作です。これは、言語にランダム性のソースを含めるエレガントな方法のように思えました。)

ソースコードローテーション命令(<^>v)の助けを借りて、IPをこのような状況にすることができます。そのような例の1つが上部にあります。IPは最初は東を指し、上部から始まります。v我々が得るように、現在の列を回転させます:

@
v
!

IPはこの回転に合わせて移動するため、まだ上にありv、東を指します。すべての条件が満たされたため、IPはランダムに上下します。それが上がると、プログラムはすぐに終了します。ダウンすると、ゼロを出力し、列を再度回転させてから終了します。

これを使用する他の3つのプログラムがあります(印刷するもの0、印刷するもの、00印刷するもの000)。

v
@
!

"
>@!

"
>!@

(実際には、3 バイト以上のプログラムがあります。.ヌルバイト!を印刷する代わりに使用したり、それ"をさまざまなコマンドに置き換えたりすることもできますが、これらはすべて基本的に同じように動作します。)


30

Befunge(-93および-98)、3バイト

?.@

?ランダムな方向に実行を送信します。上下する場合は、ループバックして?リロールします。左に移動すると、プログラムはに折り返し、@何も出力せずに終了します。正常に実行0された.場合、出力(スタックが空のときに生成される出力)してからで終了します@


これは終了を保証するものではありませんが、これを正確に投稿するつもりでした+1
ダニエル

コンマをピリオドに変更して、ヌル文字(ASCII値0)の代わりに数値として0を出力することもできます。+1
MildlyMilquetoast 16

それは.私がテストに使用していたプログラムの中にありましたが、,PPCGにコピーするとどういうわけかなりました。一定。

7
@Dopappはほぼ確実に終了しますが、確率1で保証します。)
Oliphaunt

@JamesHolderness 私は思う、これは...しかし数える場合は、1わからないでそれを行うことができます
MildlyMilquetoast

29

Minecraft、5 4バイト

op 8

サーバーのコンソールまたはコマンドブロックに入力してパワーを与えることで使用されます。を追加することにより、チャットインターフェイスから実行できます/

通常、これは何も行いませんが、サーバー上にユーザー名「8」のプレイヤーがいる場合、それらにはオペレーターの許可が与えられます。Minecraftでは通常、ユーザー名の長さを3文字にする必要がありますが、この制限の前に名前の長さが短いアカウントが作成されていることに注意してください。

これらのユーザー名のいずれかがない場合、またはユーザーオペレーターにアクセス許可を与えるリスクがない場合、非決定的であることが実証できるバージョンは次のとおりです。

me @r

全員にメッセージを表示します。このメッセージは、ランダムなプレーヤーのユーザー名です。このopコマンドは文字列リテラルのみを受け取り、文字列を返すスクリプトは受け取りません。

このmeコマンドは最初の例では実際には機能せず、表示されます"<your-username> 8"。コマンドブロックから実行する場合、すべてのコマンドブロックが同じ「ユーザー名」を持っているため、確定的ではありませんが、チャットインターフェイスから実行するに/は1バイト余分に必要です。


では/、バイトカウントに含まれていませんか?
エソランジングフルーツ

11
@ Challenger5コマンドブロックではスラッシュはオプションであり、サーバーコンソールでは許可されておらず、チャットインターフェースでは必須です。
パベル

2
実際には、4バイト+ 2ブロック(コマンドブロックとレッドストーンソース)、または6ブライト
RudolfJelin

2
@RudolphJelinekコマンドブロックなしでコンソールから実行できます。
パベル

1
別の非決定的なオプションはhelp、4バイトのコマンドブロックにあります(海賊版ゲームは必要ありません)。
ポケチュウ22 16

21

sh + procps、1バイト

w

これは私が知っている最短の解決策であり、外部実行可能ファイルを呼び出すことで機能します。procps現在のシステム状態(psおよびフレンド)に関する情報を報告する責任パッケージであり、デフォルトでほとんどのLinuxディストリビューションにインストールされます。wはその中で最も短い名前のコマンドであり、ログインしているユーザーに関する情報だけでなく、稼働時間などの非決定的な情報も返します。


21

通知7、6バイト

x is y

「x」も「y」も定義されていないため、これは有効なInform 7プログラムではありません。したがって、これはエラーをスローします。

ただし、Inform 7のエラーメッセージの一部(これを含む)はランダム化されています。したがって、印刷されるテキストは技術的に非決定的です。

いくつかの可能な出力は次のとおりです。

問題。「x is y」という文は、2つのことは同じだと言っているようです-私は「x」と「y」を2つの異なるものとして読んでいるので、一方が他方だと言うのは意味がありません:その「アダムスはジェファーソン」です。2番目の要素が種類の名前で、おそらくプロパティがあれば大丈夫です。たとえば、「バージニアは明るい部屋」とは、バージニアと呼ばれるものが存在し、それが「部屋」であり、私が知っている種類であることを示しますについて、私も知っている「照明」と呼ばれるプロパティと組み合わせます。

問題。「x is y」という文は、2つのことは同じだと言っているようです-私は「x」と「y」を2つの異なるものとして読んでいるので、一方が他方であると言うのは意味がありません:その「アダムはイブ」です。2つ目のものが種類の名前であり、おそらくプロパティがあれば大丈夫です。たとえば、「Land of Nodは明るい部屋」と呼ばれ、Land of Nodと呼ばれるものが存在し、それが「部屋」であると言います。私が知っている種類は、私が知っている「照明付き」と呼ばれるプロパティと組み合わせます。

問題。「x is y」という文は、2つのことは同じだと言っているようです-私は「x」と「y」を2つの異なるものとして読んでいるので、一方が他方であると言うのは意味がありません:その「クラーク・ケントはレックス・ルーサーです」。2つ目のものが種類の名前で、おそらくプロパティがあれば大丈夫です。たとえば、「メトロポリスは明るい部屋」とは、メトロポリスと呼ばれるものが存在し、それが「部屋」であるということです。については、私も知っている「点灯」と呼ばれるプロパティと組み合わせます。

問題。「x is y」という文は、2つのことは同じだと言っているようです-私は「x」と「y」を2つの異なるものとして読んでいるので、一方が他方であると言うのは意味がありません:その「エスキリュスはエウリピデス」です。2番目のものがおそらくプロパティを持つ種類の名前であれば大丈夫です:たとえば、「Underworld is lighted room」は、Underworldと呼ばれるものが存在し、それが「部屋」であると言いますについては、私も知っている「点灯」と呼ばれるプロパティと組み合わせます。


7
エラーメッセージも冗長です!
破壊可能なレモン

21

JavaScript、4バイト

Date

現在の日付/時刻を返す関数。私が考えて、これはそれが得る最も短いです...

説明

これがなぜ有効なのかについて多くの混乱を引き起こしているように見えるので、私は説明しようとします。

JavaScriptでは、変数に割り当てて関数のように呼び出すことができる場合、関数エントリは有効です。たとえば、この関数は有効なエントリです。

function(){return Date()}

それは次のような変数に割り当てることができる関数だからです:

f=function(){return Date()}

そして、f()必要な回数だけ実行します。毎回、現在の日付/時刻文字列を返します。これは、OPによって非決定的と判断されています。

このES6矢印関数も有効です。

_=>Date()

で割り当てることができ、他のようにf=_=>Date()実行できますf()

次に、別の有効なエントリを示します。

Date

どうして?他の2つのエントリと同様に、を割り当ててf=Dateから呼び出すことができるため、他の2つのエントリとf()まったく同じものを返します。それを試してみてください:


1
Date()関数を呼び出す必要はありませんか?
ミルク

4
@milk Dateは、入力なしで呼び出されると、現在の日付/時刻を生成する関数です。_=>Date()はまったく同じことを行う明確に有効なエントリであるためDate、有効なエントリでもあります。
ETHproductions

1
それは理にかなっている。
ミルク

2
DateブラウザのJavaScriptコンソールに入力すると、確定的な出力が生成され、常に次の結果が生成されますfunction Date() { [native code] }。おそらくDate()、6バイトです。
PTS

2
上記の「日付」がCでも「malloc(8)」または「time(0)」よりも良い場合
RosLuP


11

Python 2、11バイト

print id(1)

1
それが私が見つけたものです。id(0)しかし、私は持っていた。:)
mbomb007

2
私はOPであり、質問を投稿する前に見つけたので、技術的にはあなたをtechnicalりました。質問を投稿し、すぐに最短回答を投稿したくありませんでした。
mbomb007

11

Pyth、2バイト

O0

説明:

 0 0
O  Random float in [0, 1)

それはときに、ということだO0、その引数として、それは単に間のランダムな浮動小数点数を返す01、排他的に。

それだけのためにやろう!

また、これはかなりレトロなものであるようです(34718 / mbomb007のおかげです):

ディルバート:1992年9月8日


Pyth、2バイト

OT

説明:

 T 10
O  Random integer in [0, 10]

代わりにこのboooooooooooooooringバージョンをお試しください>:(



10

PowerShell、4 2バイト

(バツ印の4はまだ4のように見える

ps

これは、Get-Processハンドル、プライベートメモリ、CPU時間などを含む現在のプロセスリストをテーブルとして出力するエイリアスです。

次のような方法で実行します。

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

1
認めざるを得ない。実際に消されたかどうかを確認した。本当に言うことすらできません。
発がん物質16

@Carcigenicateテキストを選択せず​​に交差するかどうかを確認できます(Ubuntu 16.04.1、Chrome 54.0.2840.100)。
エリックアウトゴルファー16

明確ではありませんが、Androidでも表示されます:p
tomsmeding

iOSアプリでは問題ありません。
マテウスピオトロフスキ

私は自分でそれを行う担当者がいませんが、04を実行してそれを打ち消すことができます。
ボブソン


9

Commodore 64 Basic、4バイト

1S|0

PETSCII置換:|=SHIFT+Y

Commodore 64 のゼロページは、RAMの残りの部分よりも高速にアクセスできる256バイトのメモリ領域です。そのため、プログラム(BASICインタープリターなど)は頻繁にアクセスされるデータにそれを使用し、CPU自体はその内部状態の一部をここに保存します。内容は予告なく変更される場合があります。

上記のBASICプログラムは、ungolfed 1 SYS 0です。つまり、実行をメモリ位置0に転送します。これにより、コードとしてゼロページの実行が開始されます。通常、BASICインタープリターがプログラムの実行を開始すると、最初の16バイトは

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

そのSYS 0次のコマンドを実行します

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

全体的な結果は、BASIC READY.プロンプトを出力し、ユーザーに制御を返すことです。ただし、メモリロケーション0x00はCPUのI / O方向レジスタであり、メモリロケーション0x01はCPUのI / Oアドレスレジスタです。プログラムを実行する前にこれらを変更する何かを行った場合、ガベージの出力からコンピューターのロックに至るまで、結果は予測できない場合があります(通常、メモリロケーション0x07に含まれる0x22は、命令として実行される場合、文書化されていないHALTオペコードです) 。

または、より確実な予測不可能なプログラムは4バイトです

1?TI

システムの電源がオンになってからの経過時間を、ジフィー(1/60秒)で出力します。


8

05AB1E、2バイト

žd

オンラインでお試しください!

実行中のマシンの内部クロックから現在のマイクロ秒を出力します。

または、このようなことをすることができます...

05AB1E、3バイト

A.r

オンラインでお試しください!

ランダムにシャッフルされた小文字のアルファベットを出力します。

またはこれも機能します:

A.R

オンラインでお試しください!

アルファベットからランダムな文字を出力します。

または、これも機能し、よりクールです:

05AB1E、9バイト

"ž"A.RJ.V

オンラインでお試しください!

次のいずれかをランダムに出力します。

ž 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バイト

4バイトを節約してくれたpseudonym117に感謝します。

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

コンパイルgcc -o test lol.c(そうですね、ファイル名はかなりオリジナルです...)で実行しました./test

これはi、実行時に定義されるのメモリアドレスに対応する文字を出力するため、非決定的である必要があります。


1. &スタック上の変数の値が定義されていないため、スキップできますか?2.スタック上には一定数のものがあるので、メモリアドレスはi一定ですか?
ライリー

2
iが通常呼ばれるものになるargcので、あなたは正しいです、それは引数がまだない限り常に1になります。私はそれを覚えていなかったとは信じられない。場所が変わる理由はまだわかりませんが、機能する場合は機能します。
ライリー

1
ASLRにより、最新のオペレーティングシステムで変更されます。ASLRは、エクスプロイトがアドレスを推測しにくくするように設計されたセキュリティ機能です。一部の古いOSでは一貫した結果が得られます。

1
あなたは置き換えることで少しを保存することができputcharreturn
ceilingcat

1
パラメータの型を宣言しませに対する警告付きのモダンなコンパイラでは、あなたが行うことができます:main(){printf("%d");}
Myria

7

Python 2、29バイト

import os
print os.urandom(9)

悲しいことに、スマートフォンで初めてコードを書くことはありません。


6

Perl、5バイト

say$$

プロセスIDと改行を出力します。



5

パイク、1バイト

C

ここで試してみてください!

現在の時刻を出力します


1
これは決定論的であると確信しています。
Rɪᴋᴇʀ

削除されたコメントmbombの@EasterlyIrkは、これは大丈夫だと言った
ブルー

ああ、大丈夫。私には決定的なようですが、OPルールです。
Rɪᴋᴇʀ

編集履歴には、適切なランダム性を備えた3バイトバージョンがありました。
ブルー

@EasterlyIrk現在の時間が確定的である場合、擬似乱数もシードされているため、擬似乱数も確定的です。目標は「ランダム性」ではありません。目標は非決定論です。
mbomb007

5

GCC / Clangを使用したC89、20バイト

もう1つのCソリューションは、GCCまたはClangを使用してビルドされるたびにセグメンテーション違反になります。しかし、これ。

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

次のようになります:

$ 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

印刷できないジャンクはかなりたくさんありますが、非決定的です!


「main(n){puts(&n);}」ではなく「main(n){puts(&n + 1);}」となる理由
RosLuP 16

@RosLuP 2番目のオプションは、偶然の観察者には明らかなように、nの値でバイトを提供します(nが1の場合puts、アドレスが1になると、nが2の場合puts、アドレスが2になる)。4バイト幅を指すnのアドレスに1を追加intすると、次のNULバイトまで非常に一定のバイト数のジャンク値が格納されたジャンクアドレスが得られます。この動作は、GCCとClangの間で再現可能であり、私を完全に超えています。StackOverflowで質問するつもりです。

それを仮定し、それは、n個のアドレスを置くに与えるN = 0x01020304プットは文字で04 03 02 01を変換またはその逆の印刷し:私は、このように「プット(&N)」を読んで
RosLuP

1
覚えておいてください、あなたはnまだ、通常と呼ばれるもので初期化さargcである0として、あなたの一般的なテストケースでは&nputs空の文字列が得られ「\ 0」バイト(ポインタサイズ==整数のサイズとすべてのものを想定)に非常に決定論のポインタを取得します。&n+1ただし、通常は呼び出されるアドレスargv(少なくとも、レジスタの代わりに逆順でスタックにパラメーターを渡すABIで、スタックが高アドレスから低アドレスに成長する場合)のアドレスです。時間。
Guntram Blohm

@GuntramBlohmそのとおりです。私にとってはポインターは8バイトで、intは4バイトです。

5

PHP、12バイト

<?=uniqid();

583f4da627ee3現在の時間に基づいて一意のID をマイクロ秒単位で出力します。


<?=time();<-10バイト。
イスマエルミゲル

@IsmaelMiguel uniqid()は、未確定の1'000'000倍time()です;)
マリオ

私は反対を言っているのではありません。しかし、別の答えを提案します。あなたはそれを自由に選ぶことができます。
イスマエルミゲル

@IsmaelMiguel他の誰かがすでに同じ答えを与えました...-
マリオ

5

Groovy、9バイト

{print{}}

出力:

Script1$_run_closure1@2c8ec01c

クロージャのメモリアドレスを出力するため、非決定的です。


そして、私はKotlinが最短のJVMソリューションへの道だと思った。
F.ジョージ

これをファイルに入れて実行しようとするとgroovy Script1.groovy、エラーが発生します:Ambiguous expression could be either a parameterless closure expression or an isolated open code block;。これはどのように使用しますか?
パエロエベルマン

クロージャー変数に割り当ててから呼び出します。
魔法のタコUr

5

Emotinomicon、15バイト

😀😅🎲⏬

説明:

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

言語の名前はEmotinomiconです
acrolith

@daHugLennyどのように私はそれを見逃したのですか?)
ローマン・

5

Windows上のBorland C、12バイト

m(){puts();}

1つの関数を使用することが可能であると言うので、書き直しました。コンパイラは引数をチェックしていないため、コンパイルします。しかし、1人のアドレスが「誰も」知らないことを確認し、バイト0x00が見つかるまでそのアドレスのポイントを出力し始めます。そのアドレスがプログラム用に予約されたメモリ外にある場合は問題ないかもしれませんが、ここで何かを印刷します


これは、非決定的な出力を提供するのではなく、毎回セグメンテーションフォールトします。

また、場合あなたはセグメンテーションフォルト以外の何かを得る、どのようなコンパイラ?

@catは、1つのBorland Cコンパイラ+ Windows7 Osです。私が見る方法では、上記のコードはスタックのアドレストップを取得し(この場合、関数main()で返すアドレスがあります)、メインスペースコード内のそのアドレスから読み取ります...したがって、コンパイラの出力に依存します。しかし、私は100%を知りません...あなたの
OSで

1
@RosLuP:スタックメモリ(またはx86-64の場合は2番目の引数渡しレジスタ、およびレジスタの最初のいくつかの引数を渡すほとんどのRISC呼び出し規則)にあるゴミを印刷します。スタックのアドレスは出力されません。x86-64ではargv、コンパイラーはおそらくmainの2番目のargをまだレジスターに入れたままprintfを呼び出すため、印刷する可能性がいくらかあります。Linuxをターゲットとするgcc6.2でまさにそれが起こります。Godboltコンパイラエクスプローラーのsource + asmを参照してください。mainはRSIに触れませんcall printf
ピーターコーデス

1
@RosLuP:argvスタック上にありますが、最上部にはありません。ただし、そのアドレスはスタックASLRの影響を受けるため、動作します。これはでうまく機能しません-m32。おそらく常にゼロになるでしょう。なぜならmain、フォーマット文字列の上のスタックスロットが触れられたことのない新鮮なスタックメモリになるようにスタックを整列させなければならないためです(そしてカーネルは代わりにページをゼロにすることで情報リークを回避するため、おそらく常にゼロです)古いデータでいっぱいのユーザー空間ページを提供すること)。
ピーター

5

赤ちゃんの言語、0バイト



質問を先送りしたと思ったので、私はもともとこれを提出しませんでした。私は間違っていた; 言語には時間通りに作成された通訳者がいました。また、おそらくこれは私が見た中で最もチートな0バイトのソリューションです(ゴルフチャレンジで不正行為をするためではなく、プログラムが要求するとおりに正確に実行するように0バイトプログラムが指定されている場合)。

Baby Languageは、与えられたプログラムを無視し、ランダムに何かをするように指定されています。(Esolangページにリンクされたインタープリターは、ランダムな合法的なBFプログラムを生成して実行します。)これは、この課題にぴったりのようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.