生成单调函数


12

总览

在此挑战中,您的任务是在两组之间随机生成单调数学函数

输入值

您的输入是两个正整数sn

让这些输入后,你的程序将生成一个随机的数学函数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 = 3n = 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}一次,并且每个对之后都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 = 2n = 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 2015年

@Sparr好主意;编辑。
Zgarb 2015年

限制运行时是必需的吗?我正在考虑一种生成随机函数的解决方案,直到找到单调函数为止。
Sparr 2015年

@Sparr我想我会为有限的运行时添加奖励,因此这样的解决方案不会被取消资格。
Zgarb 2015年

@Zgarb-也许您应该为有界且很可能在一小时内完成的解决方案大赚一笔。
Glen O

Answers:


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


输入很好的例子3, 2。不幸的是,我什至没有收到3, 3在线pyth执行器的回应。此组合是否有无限循环?!
bobbel 2015年

我认为@bobbel在线执行程序有超时。我在本地尝试。
isaacg 2015年

@bobbel与其说infitie循环慢,不如说是一个慢循环。它也适用于2, 4,但没有其他用途。
isaacg 2015年

@bobbel我添加了更慢的东西。
isaacg 2015年

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数组,因此显然每个内存都会用完-即使每个数字都是一个字节,即10 GB的数据)。

输出是基于1的索引,因此要确定给定输入的结果,您需要在每个输入值上加一个。例如,要找到f(1,2,6,0,3),您需要检查K[2,3,7,1,4]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.