我乘以源,您(可能)乘以输出!


18

任务

任务是编写一个程序,该程序输出一致但任意的正整数X(因此严格大于0)。这是要抓住的地方:当源重复ñ次(代码被附加/串联ñ-1个到自身)时,程序应该具有的输出的概率以及剩余的概率。输出不变。1个ññXñ-1个ñX

假设您的初始来源是XYZ并产生integer 3。然后:

  • 对于:还应该输出的概率为(50%的时间),并输出的概率也为(50 % 的时间)。ñ=2XYZXYZ31个223=612

  • 对于N=3XYZXYZXYZ应输出3的概率为23(的时间66.666%)和33=9的概率为13(33.333%的时间)

  • 对于N=4XYZXYZXYZXYZ应输出3的概率为34(的时间的75%)和43=12 的概率为14(25%的时间)

等等....

规则

  • 您必须构建一个完整的程序。输出必须打印到STDOUT。

  • 从理论上讲,您的程序应输出具有上述概率的每个可能值,但是由于实现了随机而与之略有偏差是可以的(前提是实现的分布不相同-您不能使用正态分布以节省字节

  • 该程序应该(再次,理论上)适用于任意大的N值,但是由于精度引起的技术限制对于大N是很好的。

  • 输出必须以10为底(禁止以其他任何底数或以科学计数法输出)。允许尾随/前导空格和前导零。

  • 初始来源(当然)必须至少为1个字节长。您可能不会在源副本之间使用换行符。该程序不应接受输入(或具有未使用的空输入)。

  • 这是,因此答案的分数是(原始)源的长度(以字节为单位),分数越低越好。

注:此挑战的(多)更难版这一个


该程序可以读取其源代码吗?
我的代词是monicareinstate

3
@someone是的,允许。
Xcoder先生,19年

Answers:


16

R66 35字节

-29字节,感谢digEmAll

感谢Giuseppe -2个字节。

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

在线尝试!

检查N = 4的分布。

关键是向右分配->。当代码乘以ñ次时,对的前N1呼叫sample将分配给A,并且仅打印最后一个呼叫。

原始的,更复杂的解决方案:

R,66个字节

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

在线尝试!

在线尝试(重复3次)!

使用两个技巧:1)调用感兴趣的main函数?,以便我们可以在不使用方括号结束程序的情况下调用它,以及2)使用变量Tand TT,以及以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
我认为我从未见过-><-不可能的情况下用于代码高尔夫的情况;这太酷了!!
朱塞佩

附言:我会在某个时候给予赏金。
朱塞佩

2
绝对赞!
digEmAll


@digEmAll非常整洁,谢谢!
罗宾·赖德

11

Python 3中81 79个字节

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

在线尝试!

-1字节感谢@Nishioka

这是一个Python 3解决方案,不能直接访问程序源。在Python 3中执行此操作比在Python 2中更具挑战性,因为普通的打印语句以右圆括号结尾,因此在下一个初始源代码块中更改其行为的选择不多。在Python 3中看到更多具有创造性的解决方案将会很有趣。


-1个字节:+0 if[]else 1
Nishioka

@西冈谢谢。更新。
乔尔




4

Python 3中78 76 75个字节

使用与发布的链接相同的技巧,这是一个Python脚本(x = 1)。

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

在线尝试!

-2个字节感谢Xcoder先生的(n-1)公式, 由于Nishioka ,~-n其优先级高于*
-1个字节


1
在我看来很好!import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#应该工作-2个字节
Xcoder先生,19年

1
我从未见过这样的n-1方式!我喜欢它,谢谢:)
巴黎道阿地


另一个-1字节,但方法有所不同:tio.run/##K6gsycjPM/7/…
Nishioka

是我做的,因为的random()<1/n;-)
巴黎道阿地






2

Japt9 8 字节

(°Tö)ΪT

测试 | 加倍 | 重复10次后验证10000次运行的三重
验证分布

(°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次运行的验证分布

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 shell 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+79nb <78,其中(n + 1)是源代码重复的时间。

这个错误(?我不确定。我宁愿它是JavaScript规范的错误,而不是任何解释器的错误)行为已在以下答案发布后由其他人提交给BMO:https : //bugzilla.mozilla.org/ show_bug.cgi?id = 1579792。(bmo主题和推文均未发布。)


是什么(async x=>x)()?为什么异步?
托马什Zato -恢复莫妮卡

@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
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.