Buat diagram distribusi!


12

Tantangan

Anda diberi tiga bilangan bulat sebagai input - min_value, max_value, sample_size, yang dapat Anda sampaikan ke jawaban sebagai array atau beberapa parameter.

Tugas Anda adalah menampilkan diagram dalam format apa pun yang nyaman , yang menunjukkan frekuensi angka dalam (min_value, max_value)rentang yang muncul ketika angka acak dalam (min_value, max_value)rentang tersebut diambil sample_sizekali. Urutan nomor acak harus dihasilkan dalam jawaban Anda.

Dengan rentang besar dan ukuran sampel, Anda bebas untuk mengubah langkah-langkah yang digunakan diagram Anda, selama representasi tetap akurat.

Contoh

Dengan [1, 5, 10]sebagai input:

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

Dengan [1, 100, 15]input (pada langkah 10, jadi 00 menunjukkan 1-9, 10 menunjukkan 10-19, dll.):

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

Mencetak gol

Ini adalah , jadi kode terpendek dalam byte menang.


1
Saya kira kita tidak diizinkan untuk menampilkan tabel dengan ketinggian lebih besar dari yang diperlukan? Untuk Anda [1,5,10]contoh, dapat tingginya menjadi 10? Jadi kolom 4 akan terlihat seperti ini (vertikal top-to-bottom bukan horizontal kiri ke kanan): oooooooxxx4.
Kevin Cruijssen

6
Apa yang membuat saya berhenti memilih tempat sampah b-a? Itu format yang cukup nyaman ...
Giuseppe

1
Giuseppe berarti bahwa untuk rentang a...b, diagram memiliki satu tempat sampah yang mencakup seluruh rentang, menghasilkan satu batang dengan tinggi yang sama dengan jumlah sampel.
Stewie Griffin

1
Apakah kami diizinkan menggambar histogram secara horizontal? Juga, apakah nilai-nilai harus dipilih secara seragam dalam kisaran, atau apakah distribusi mana pun yang memungkinkan semua hasil valid?

1
@Mnemonic tentang distribusi: Konsensus adalah bahwa itu tidak harus seragam kecuali OP telah menentukannya.
Stewie Griffin

Jawaban:


3

Jelly , 13 byte

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

Menggunakan format yang sangat nyaman:

  • Mencetak nilai pada sumbu kiri
  • Digunakan 0sebagai piksel distribusi (seperti xs) dan 1sebagai piksel latar belakang (seperti os)
  • Gunakan spasi horizontal antara "piksel" sebanyak karakter dalam jumlah panjang maksimum dalam rentang (mis. -23 adalah panjang 3, sedangkan 23 adalah panjang 2).

Cobalah online!

Catatan: Jika input tidak harus berupa array, itu akan menjadi 11 byte yang mengambil dua argumen, [from, to]dan sampleSizehanya dengan r/;"xẊĠ>ʋ¥G.


Saya pikir ini mungkin mengambil tunjangan pemformatan yang nyaman hanya sedikit terlalu jauh untuk 4 byte:

Ṗ;1K

Ini menggunakan ide (yang harus diatasi) yang diajukan oleh Giuseppe dalam komentar dengan satu bin yang diidentifikasi dengan fromdan todipisahkan oleh spasi, ruang lain yang mewakili sumbu dan dan satu yang 1mewakili ketinggian 100%.

... atau bahkan hanya Ṗ1untuk 2 byte!


10

Oktaf , 34 32 byte

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

Tidak berfungsi di TIO, tetapi bekerja di Octave-online.net .

Itu menciptakan histogram (grafik batang) terlihat seperti ini:

masukkan deskripsi gambar di sini

Saya akan mengatakan itu dianggap sebagai "Format nyaman".

Jika nampan non-nol harus ditampilkan, maka ini dapat diselesaikan dalam 38 byte:

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

Saya meminta klarifikasi tentang tempat sampah dengan tinggi nol - ini gagal menunjukkan kepada mereka apakah mereka benar-benar kurang dari atau benar-benar lebih besar daripada semua yang bukan nol ( f(1,5,1)akan menunjukkan perilaku misalnya).
Jonathan Allan

1
Saya merasa berkewajiban untuk menunjukkan bahwa yang pasti tidak sebuah histogram , melainkan merupakan bar chart (yang tidak sama, sama sekali).
caird coinheringaahing

2
@cairdcoinheringaahing membaca sekilas halaman-halaman wiki itu. Saya tidak melihat ini bukan histogram. Ingin menjelaskan mengapa Anda berpikir itu bagan batang?
Imus

@Imus a histogram adalah jenis grafik batang khusus. Saya rasa poin yang ingin dibuat oleh caird coinheringaahing adalah bahwa itu hanya memenuhi syarat sebagai histogram jika tempat sampah cukup besar untuk memungkinkan memperkirakan distribusi aktual dari variabel acak (yang dalam hal ini sebenarnya benar-benar datar). Untuk ukuran sampel yang hanya 10, itu tidak benar-benar mungkin untuk membuat histogram yang tepat.
Berhenti menghidupkan counterclockwis

6

R , 36 byte

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

Cobalah online!

Mendesah. Stemplot.

Kutukan keberadaan bagi mahasiswa tahun kedua mengambil Pengantar Statistik untuk [Bidang Studi Khusus ini] dari beberapa profesor yang tidak tahu apa yang mereka bicarakan tetapi masih berpikir stemplot adalah ide yang baik karena masih dalam edisi ke-14 dari buku teks yang telah mereka gunakan sejak edisi ke-4 diterbitkan pada tahun 1983.


5

Arang , 25 byte

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

Cobalah online! Penjelasan:

≔…·θηθ

Buat rentang distribusi yang inklusif.

≔Eζ‽θη

Cicipi kisaran jumlah yang diinginkan beberapa kali.

Eθ№ηι

Hitung dan cetak jumlah masing-masing rentang dalam sampel.

↖←E⮌θ⮌Iι

Cetak labelnya.


3

Python 2 , 115 byte

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'

Cobalah online!


Python 2 , 164 byte

output berbasis kolom.

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,

Cobalah online!


3

Java 11, 184 168 byte

(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]));}

Cobalah online. (CATATAN: String.repeat(int)ditiru repeat(String,int)untuk byte-count yang sama, karena Java 11 belum masuk TIO.)

Penjelasan:

(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 byte

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

Cobalah online!

Mengembalikan tablefrekuensi dengan namessama dengan interval setengah terbuka dipilih oleh cut, jadi (0,1], (1,2], (2,3], dan sebagainya. Tidak berusaha untuk memilih binning yang lebih masuk akal.


Tidak akan function(a,b,n)hist(sample(a:b,n,T))memenuhi persyaratan pertanyaan?
ngm

@ ngm saya kira ... Saya ingin melakukan output teks karena tantangannya tampaknya intim, tetapi Anda lebih dari senang untuk mempostingnya sendiri
Giuseppe

2

Ruby, 135 byte , 117 byte

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)}"}}

Tidak Disatukan:

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)

Cobalah online! - siapa tahu ada yang mau mengujinya seperti saya!
Dom Hastings



1

JavaScript, 239

Saya minta maaf tentang ini, tetapi variabel hanya bernama mau tak mau. Lagi pula, pertanyaannya mengatakan format apa pun yang nyaman , jadi fungsi ini mengembalikan grafik ke samping

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 byte

Mengambil input dalam urutan maks, minimum, ukuran. Output grafik secara horizontal.

õV
öW
Ë+QpVè¥D

Cobalah


Penjelasan

             :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 byte

JmOK}FPQeQVK,N*/JNd

Coba di sini

Penjelasan

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.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.