私はソースを掛けます、あなたは(おそらく)出力を掛けます!


18

仕事

タスクは、一貫性のある任意の正の整数(厳密には0より大きい)を出力するプログラムを作成することです。キャッチは次のとおりです。ソースが回繰り返される(コードが自体に追加/連結される)場合、プログラムは確率でを出力し、残りの確率でそのまま出力する。xNN11NNxN1Nx

最初のソースがXYZintegerであり、integerを生成すると仮定しましょう3。次に:

  • 以下のための:出力すべきの確率で(時間の50%)、およびの確率で、ならびに(50時間の割合)。N=2XYZXYZ31223=612

  • 以下のための:出力すべきの確率で(時間の66.666パーセント)との確率での(33.333パーセント時間)N=3XYZXYZXYZ32333=913

  • 以下のための:出力すべきの確率で(時間の75%)、および の確率での(25%時間)N=4XYZXYZXYZXYZ33443=1214

等々....

ルール

  • 完全なプログラムを作成する必要があります。出力はSTDOUTに出力する必要があります。

  • あなたのプログラムは、理論的には、上記の確率で各可能な値を出力するはずですが、ランダムの実装によるこれからのわずかな逸脱は問題ありません実装が異なる分布ではない場合-あなたは使用できませんバイトを節約するための正規分布

  • プログラムは、任意の大きな値について(再び、理論的には)動作するはず、しかし精度に起因する技術的な制限は、大規模の罰金です。NN

  • 出力は基数10でなければなりません(他の基数または科学表記法での出力は禁止されています)。末尾/先頭のスペースと先頭のゼロは許可されます。

  • 最初のソースは(もちろん)少なくとも1バイト長でなければなりません。ソースのコピー間で改行を使用することはできません。プログラムは入力を受け付けてはなりません(または未使用の空の入力を使用しないでください)。

  • これはであるため、回答のスコアは(元の)ソースの長さ(バイト単位)であり、スコアが低いほど優れています。

注:この挑戦はの(かなり)難しいバージョンです、この1


プログラムはソースコードを読むことができますか?
私の代名詞は、

3
@someoneはい、許可されています。
Xcoder氏

回答:


16

R66 35バイト

digEmAllのおかげで-29バイト。

-2のおかげバイトジュゼッペ

+0->A
x=!0:F
F=F+1
sample(F*x+!x,1)

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

N = 4の分布を確認します。

キーは右向きの割り当て->です。コードが回乗算されると、への最初の呼び出しがに割り当てられ、最後の呼び出しのみが出力されます。NN1sampleA

元の、より複雑なソリューション:

R、66バイト

T->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?T

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

オンラインで試してください(3回繰り返します)!

使用する2つのトリック:1)は、関心の主な機能を呼び出す?我々はブラケットを使用してプログラムを終了せずに、それを呼び出すことができるようにということと、2)使用変数TTTで始まるコードで、Tとして終了?T

F反復カウンターです。?ブール引数を取る関数として再定義されます:の入力?TRUE(またはT)の場合、必要なランダムサンプリングを行います。入力がFALSE(または0)の場合、何もしません。の値はTTとして定義されている0ため?T、サンプリングは実行されますが、?TT何も実行されません。

ソースが繰り返されると、次のようになります。

T->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?TT->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?T

そのため、中央の呼び出しは?TT何も出力せず、最後の呼び出し?Tはランダムな結果を出力します。


5
私はこれまで不可能->だった状況でコードゴルフで使用されたことを見た<-ことはありません。これはとてもクールです!!
ジュゼッペ

PS私はこれをある時点で報奨金を与えるつもりです。
ジュゼッペ

2
絶対に素晴らしい!
digEmAll


@digEmAllとてもすてきです、ありがとう!
ロビンライダー

11

Pythonの381の 79バイト

+0if[]else 1
from random import*
try:n+=1
except:n=1
print([1,n][random()*n<1])

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

@西岡のおかげで-1バイト

これは、プログラムソースに直接アクセスしないPython 3ソリューションの1つです。Python 3でこれを行うことは、通常の印刷ステートメントが閉じ括弧で終わるため、Python 2よりも困難です。そのため、最初のソースの次のブロックでその動作を変更する選択肢は多くありません。Python 3でもっとクリエイティブなソリューションを見るのは面白いでしょう。


-1バイト:+0 if[]else 1
西岡

@西岡ありがとう。更新しました。
ジョエル




4

Pythonの378の 76 75バイト

投稿されたリンクと同じトリックを使用して、Pythonのもの(x = 1)を使用します。

from random import*;n=len(*open(__file__))//75;print(1+~-n*(random()<1/n))#

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

西岡のおかげで-1バイトよりも高い優先順位を持つ(n-1)式のためのXcoder氏のおかげで-2バイト~-n*


1
は、私にはよく見えますよ!import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#-2バイトのために働く必要があります
ミスターXcoder

1
このようなn-1のやり方を見たことはありません!気に入った、ありがとう:)
パリス・ドゥアディ

1
-1バイト:tio.run
西岡

別の-1バイトですが、アプローチが少し異なります:tio.run
西岡

はい私は、理由のやるrandom()<1/n;-)
パリDouady






2

Japt9 8 バイト

(°Tö)ΪT

テストする | 倍増 | 10回の繰り返し後の10000実行の3倍
検証分布

(°Tö)ΪT
(            :Prevent the operator that follows from being implicitly applied to the first input variable, U
 °T          :Increment T (initially 0) by 1
   ö         :Random element in the range [0,T)
    )        :Closing the parentheses here instead of after the T saves a byte as there would need to be a space here to close the random method
     Î       :Sign - 0 (falsey) or 1 (truthy)
      ªT     :Logical OR with current value of T

オリジナル、13 11 10 9バイト

末尾のスペースに注意してください。

NoÎp°T ö 

テストする | 倍増 | 10回の繰り返し後の10000実行の3倍
検証分布

NoÎp°T ö 
N             :Initially, the (empty) array of inputs
 o            :Replace the last element with
  Î           :  Its sign (always 1)
   p          :Push
    °T        :  T (initially 0) incremented
       ö      :Random element of N

2

JavaScript(JavaScriptシェル71)、78バイト

(async x=>x)().then(x=>f((''+f).length/78));f=x=>print(1-~x*Math.random()|0)//

TIOリンクがありません。TIOのspidermonkeyは古すぎます...

Firefox(Spidermonkey)はコメントを関数の一部と見なしますf。結果として、(''+f).lengthするb+79n場合、ソースコードの時間は、B <78、及び(N + 1)が繰り返されます。

このバグ(?よくわかりません。インタープリターよりもJavaScript仕様のバグであることが望ましい)の動作は、この回答が投稿された直後に他の誰かによってBMOに送信されていました:https : //bugzilla.mozilla.org/ show_bug.cgi?ID = 1579792。(bmoスレッドもツイートも私によって投稿されていません。)


とは何(async x=>x)()ですか?なぜ非同期ですか?
トマーシュ・ザト-モニカの復活

@TomášZatoそれは文字通りasyncひどいです。したがって、コールバックx=>f(...)は関数fが定義された後に呼び出されます。
tsh


1

、12バイト

⎚I⎇‽L⊞Oυω¹Lυ

オンラインでお試しください!リンクされた質問に対する私の回答に基づきます。それ以外の場合はn、確率¹/ₙで出力します1。説明:

⎚               Remove output from previous iterations
       υ        Initially empty list
        ω       Empty string
     ⊞O         Push
    L           Length
   ‽            Random integer [0..length)
  ⎇             Ternary
         ¹      If nonzero then literal 1
          Lυ    If zero then the new length
 I              Cast to string for implicit print
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.