绘制分布图!


12

挑战

给您三个整数作为输入- min_value, max_value, sample_size,您可以将它们作为数组或多个参数传递给答案。

您的任务是以任何方便的格式输出图表,该图表将显示该(min_value, max_value)范围内的数字出现的频率,当该范围内的随机数(min_value, max_value)被选取时会显示出来sample_size。随机数序列应在您的答案内生成。

在较大范围和样本量的情况下,只要表示法保持准确,您就可以自由更改图表使用的步骤。

随着[1, 5, 10]输入:

o o o x o
x o x x x
x x x x x
1 2 3 4 5

[1, 100, 15]作为输入(在10步,所以00示出了1-9,图10示出10-19等):

xx oo oo xx oo xx oo oo oo oo
xx oo oo xx oo xx xx oo oo oo
xx xx oo xx xx xx xx xx xx oo
00 10 20 30 40 50 60 70 80 90

计分

这是,因此以字节为单位的最短代码获胜。


1
我猜我们不允许输出高度超出必要高度的桌子吗?为了您的[1,5,10]例子,可以高度来10?因此,第4列是这样的(垂直顶部至底部,而不是水平方向左到右): oooooooxxx4
凯文·克鲁伊森

6
是什么让我无法选择宽度的箱子b-a?这是一种非常方便的格式...
Giuseppe

1
朱塞佩(Giuseppe)表示,对于一个范围a...b,该图具有覆盖整个范围的单个容器,从而导致单个条形图的高度等于样本数。
Stewie Griffin

1
我们可以水平绘制直方图吗?另外,是否必须在范围内统一选择值,或者可能所有结果均有效的任何分布?

1
@有关分发的助记符:共识是除非OP指定,否则不必统一。
Stewie Griffin

Answers:


3

果冻,13 个字节

Ṫɓr/;"xẊĠ>ʋ¥G

使用非常方便的格式:

  • 在左轴上打印值
  • 用途0作为分发像素(如xS)和1作为背景像素(像oS)
  • 在“像素”之间使用的水平间隔与该范围内最大长度数中的字符一样多(例如-23为长度3,而23为长度2)。

在线尝试!

注意:如果输入不必是数组,则它将是11个字节,带有两个参数,[from, to]并且sampleSize带有just r/;"xẊĠ>ʋ¥G


我认为这对于4个字节来说可能占用了便利的格式化余量:

Ṗ;1K

这是使用朱塞佩(Giuseppe)在评论中提出的想法(应该解决的)其中一个垃圾桶用一个空格标识,fromto用一个空格隔开,另一个空格表示轴,一个空格表示1100%的高度。

...甚至只是Ṗ12个字节!


10

八度34 32字节

@(a,b,n)hist(--a+randi(b-a,n,1))

在TIO上不起作用,但在Octave-online.net起作用

它创建一个直方图(条形图),如下所示:

在此处输入图片说明

我想算作“任何方便的格式”。

如果必须显示非零bin ,则可以用38个字节解决:

@(a,b,n)hist(--a+randi(b-a,n,1),a+1:b)

我要求澄清零高度垃圾箱-无法显示它们是否严格小于或严格大于所有非零垃圾箱(f(1,5,1)例如,将显示行为)。
乔纳森·艾伦,

1
我觉得有必要指出的是,这是最肯定不是一个直方图,而这是一个条形图(这是不一样的东西,在所有)。
Caird coinheringaahing

2
@cairdcoinheringaahing浏览了这些维基页面,我看不出这不是直方图。试图解释为什么您认为它是条形图吗?
Imus

@Imus直方图是一种特殊的条形图。我认为,CairdCoinheringaahing想要说明的一点是,只有当垃圾箱足够大以允许估计随机变量的实际分布(在这种情况下,它实际上是完全平坦的)时,它才有资格作为直方图。对于只有10个样本的样本,实际上不可能创建合适的直方图。

6

R,36个字节

function(a,b,n)stem(sample(a:b,n,T))

在线尝试!

叹。一个小样。

二年级大学生的生存之道是从一位不知道他们在说什么但仍然认为干图是个好主意的教授的[本特定领域]统计学入门中学习,因为它仍在第14版中自1983年第四版以来,他们一直使用的教科书。


5

木炭,25字节

≔…·θηθ≔Eζ‽θηEθ№ηι↖←E⮌θ⮌Iι

在线尝试!说明:

≔…·θηθ

创建分布范围。

≔Eζ‽θη

对范围进行所需次数的采样。

Eθ№ηι

计数并打印样本中每个范围的编号。

↖←E⮌θ⮌Iι

打印标签。


3

Python 2,115个字节

from random import*
a,b,n=input()
r=range(a,b+1)
s=sample(r*n,n)
for v in r:print'%%0%dd'%len(`b`)%v,s.count(v)*'x'

在线尝试!


Python 2,164字节

基于列的输出。

from random import*
a,b,n=input()
r=range(a,b+1)
s=sample(r*n,n)
d=len(`b`)
while n:n-=1;print' '.join(d*'ox'[s.count(v)>n]for v in r)
for v in r:print'%%0%dd'%d%v,

在线尝试!


3

Java的11,184个 168字节

(m,M,s)->{int a[]=new int[M],q=M;for(;s>0;q=M)if((q*=Math.random())>m-2){a[q]++;s--;}for(;m<=M;)System.out.printf("%0"+(M+"").length()+"d%s%n",m,"*".repeat(a[m++-1]));}

在线尝试。(注意:String.repeat(int)因为repeat(String,int)相同的字节数而被仿真,因为Java 11尚未在TIO上。)

说明:

(m,M,s)->{                         // Method with three integer parameters & no return-type
                                   // (`m` = min_value; `M` = max_value; `s` = sample_size)
  int a[]=new int[M],              //  Integer-array, filled with `M` amount of 0s
      q=M;                         //  Temp integer for the random value, set to `M`
  for(;s>0;                        //  Loop as long as `s` isn't 0 yet:
      q=M)                         //    Reset `q` back to `M` after every iteration
    if((q*=Math.random())          //   Pick a random integer in the range [0, `M`)
       >m-2){                      //   If this random integer is larger than `m-2`:
      a[q]++;                      //    Increase the value at that this random index by 1
      s--;}                        //    And decrease `s` by 1
  for(;m<=M;)                      //  Loop in the range [`m`, `M`]
    System.out.printf(             //   Print with trailing new-line
      "%0"+(M+"").length()+"d%s%n",//   and leading zeros if necessary:
      m,                           //    The number
      "*".repeat(a[m++-1]));}      //    appended with "*" repeated the amount of times
                                   //    specified in the random array at index `m-1`

2

R,52个字节

function(a,b,n)table(cut(sample(a:b,n,T),a:(b+1)-1))

在线尝试!

返回一个table频率与names等于所选择的半开区间cut,因此(0,1](1,2](2,3],等等。尽力选择更合理的分箱。


不会function(a,b,n)hist(sample(a:b,n,T))满足问题的要求是什么?
ngm

@ngm我猜...我想做一个文本输出,因为挑战似乎暗示了这一点,但是您非常欢迎自己发布它
Giuseppe

2

Ruby,135个字节,117个字节

d=->(m,n,s){p=(m..n);t=(1..s).map{rand(p)};p.map{|h|g=t.count(h);"#{h}-#{'x'*g}#{'o'*(t.map{|e|t.count(e)}.max-g)}"}}

取消高尔夫:

d =-> (m,n,s) {
  p = (m..n)
  t = (1..s).map{rand(p)}
  p.map{ |h|
    g = t.count(h)
    "#{ h }-#{ 'x' * g }#{ 'o' * (t.map{|e| t.count(e) }.max - g) }"
  }
}

puts d.call(1,5,10)

在线尝试!-以防其他人想像我一样测试!
Dom Hastings



1

JavaScript 239

对此我感到抱歉,但是这些变量仅被命名为willy-nilly。无论如何,问题说任何方便的格式,所以该函数返回一个横图

f=>{x=Math;z=Array;q=_=>x.floor(x.random()*(f[1]-f[0]))+f[0];r=z(f[1]-f[0]).fill(0);z(f[2]).fill``.forEach(_=>r[q()-1]++);u=`${f[1]}`.length;return r.map((e,i)=>`${`${i}`.padEnd(u)}${" x".repeat(e)}`.padEnd(x.max(...r)*2+u," o")).join`\n`}

1

Japt -R,14个字节

以最大,最小,大小的顺序输入。水平输出图表。

õV
öW
Ë+QpVè¥D

尝试一下


说明

             :Implicit input of integers U=max_value, V=min_value & W=sample_size
õV           :Range [U,V]
\n           :Reassign to U
öW           :Get an array of W random elements from U
\n           :Reassign to V
Ë            :Map each integer D in U
 +           :  Append
  Q          :  Quotation mark
   p         :  Repeat
    Vè       :   Count the elements in V
      ¥D     :    That equal D
             :Implicitly join with newlines and output.

0

Pyth,19个字节

JmOK}FPQeQVK,N*/JNd

在这里尝试

说明

JmOK}FPQeQVK,N*/JNd
   K}FPQ             Get the inclusive range between the first two inputs as K.
JmO     eQ           Get <last input> random elements as J.
          VK         For each value in the range...
            ,N       ... output a list of the value...
              */JNd  ... and spaces equal to the count in J.
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.