単調関数を生成する


12

概要

この課題の課題は、2つのセット間で単調な数学関数をランダムに生成することです。

入力

入力は2つの正の整数snです。

これらの入力を取得した後、プログラムはへのセットからランダムな数学関数を生成します。換言すれば、取り込み「ルール」であるとの間の整数のタプルと、戻るそのような整数です。さらに、次の意味で単調でなければなりません。もしおよび2つのです、このようなタプルすべての座標についても同様で、その後、。f{0,1,...,s-1}n{0,1,...,s-1}fn0s-1fABnA[i] ≥ B[i]if(A) ≥ f(B)

単調関数の正確な分布は、fそのような各関数が生成される正の確率を持っている限り、問題ではありません(完全なRNGを想定)。

出力

出力は、の入力と出力の列挙ですf。それはすべて含まなければならないnとの間の整数のタプルを0し、s-1それぞれが、対応する出力に続いている、いくつかのためにf。正確な出力形式は柔軟です(理由の範囲内)。

入力s = 3およびn = 2出力を生成する場合があります

(0, 0) 0
(0, 1) 1
(0, 2) 2
(1, 0) 0
(1, 1) 1
(1, 2) 2
(2, 0) 1
(2, 1) 1
(2, 2) 2

セットのすべてのペアが{0, 1, 2}1回だけ含まれ、各ペアの後にはf-value が続きます。単調性条件も満たされます。タプルはここでは辞書式順序で示されていますが、これは必須ではありません。

別の例として、s = 2そしてn = 4かもしれないプロデュース

(0, 0, 0, 0) 0
(0, 0, 0, 1) 0
(0, 0, 1, 0) 0
(0, 0, 1, 1) 0
(0, 1, 0, 0) 1
(0, 1, 0, 1) 1
(0, 1, 1, 0) 1
(0, 1, 1, 1) 1
(1, 0, 0, 0) 0
(1, 0, 0, 1) 1
(1, 0, 1, 0) 0
(1, 0, 1, 1) 1
(1, 1, 0, 0) 1
(1, 1, 0, 1) 1
(1, 1, 1, 0) 1
(1, 1, 1, 1) 1

以下は、s = 2およびn = 2(タプルの並べ替えまで)のすべての可能な出力です。あなたのプログラムはそれらの一つをランダムに出力するはずです:

(0,0) 0
(0,1) 0
(1,0) 0
(1,1) 0
-------
(0,0) 0
(0,1) 0
(1,0) 0
(1,1) 1
-------
(0,0) 0
(0,1) 0
(1,0) 1
(1,1) 1
-------
(0,0) 0
(0,1) 1
(1,0) 0
(1,1) 1
-------
(0,0) 0
(0,1) 1
(1,0) 1
(1,1) 1
-------
(0,0) 1
(0,1) 1
(1,0) 1
(1,1) 1

ルールとスコアリング

完全なプログラムまたは関数を作成できます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。説明付きのコードが推奨されます。

時間の複雑さに制限はありませんが、ソリューションが常に一定の時間内に終了することが保証されている場合、入力に応じて、一定の時間で実行される完全なRNGを想定して、-15%のボーナスを提供します。


s = 2 n = 2などの小さなケースで可能な関数をすべて完全に列挙すると役立つ場合があります。ランダム性がどのように作用するかを把握するために、説明を数回読む必要がありました。
スパー

@Sparr良いアイデア。編集しました。
-Zgarb

バインドされたランタイムは要件ですか?単調なものが見つかるまでランダム関数を生成するソリューションを考えています。
スパー

@Sparr制限付きランタイムにボーナスを追加すると思うので、そのようなソリューションは失格になりません。
ズガルブ

@Zgarb-制限されており、1時間以内に終了する可能性が高いソリューションには、おそらく大きなボーナスを与える必要があります。
グレンO

回答:


4

Pyth、35バイト(38-15%= 31.45さらに下)

#I!sm><FhMds<MCeMd^JC,mOQK^UQvzK2JB

デモンストレーション

入力の形式は次のとおりです。

n
s

出力は次の形式です。

[[value, tuple], [value, tuple], ...]

単純にランダムな可能性を生成し、テストします。


ボーナスの資格があると思われる代替の37バイトバージョン:

Of!sm><FhMds<MCeMd^T2mC,d^UQvz^UQ^Qvz

デモンストレーション

これは、考えられるすべての単調関数を生成することから始まり、ランダムに関数を出力します。それははるかに遅く、最高2,2です。


inputの良い例3, 2。残念ながら、私は3, 3オンラインのpyth executorで応答さえもしませんでした。この組み合わせには無限ループがありますか?!
ボベル

@bobbelオンラインexecutorにはタイムアウトがあります。ローカルで試します。
isaacg

@bobbel infitieループの速度はそれほど遅くありません。にも機能しますが2, 4、他にはあまり機能しません。
isaacg

@bobbelさらに遅いものを追加しました。
isaacg

1

CJam、40バイト-15%= 34バイト

q~1$\m*\1$,m*{W$\.+2m*{:.<2b}%1&!},mR]zp

このアプローチはすべての有効な関数を生成し、ランダムに選択します。実行時間は少なくともO(s 2s nですが、指定された入力に対して一定です。

私はこれがOPが念頭に置いていたことを疑っていますが、一定の時間内に完了することが保証されており(入力に応じて[...])、したがってボーナスの資格があります。

CJamインタプリタでオンラインで試してください。


1

ジュリア、64バイト(-15%= 54.4)

g(s,n)=(K=rand(0:s-1,ntuple(n,i->s));for i=1:n K=sort(K,i)end;K)

ゴルフをしていない:

function g(s,n)
  # Generates a random n-dimensional array with s per dimension
  # and all values being integers between 0 and s-1
  K=rand(0:s-1,ntuple(n,i->s))
  # Loop over the various dimensions
  for i=1:n
    # Sort in the current dimension
    K=sort(K,i)
  end
  return K
end

これはすぐに実行されますが、唯一の問題は十分な大きさのsおよびnのメモリにあります(g(10,10)は10 ^ 10配列を生成する必要があるため、明らかに各数字がメモリ不足になるでしょう) 1バイト、つまり10ギガバイトのデータ)。

出力は1から始まるインデックスであるため、特定の入力の結果を判断するには、各入力値に結果を追加する必要があります。たとえば、f(1,2,6,0,3)を見つけるには、を調べる必要がありますK[2,3,7,1,4]

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