Disegna un diagramma di distribuzione!


12

Sfida

Vengono forniti tre numeri interi come input - min_value, max_value, sample_size, che è possibile passare alla risposta come array o più parametri.

Il tuo compito è quello di produrre un diagramma in qualsiasi formato conveniente , che mostri la frequenza dei numeri (min_value, max_value)nell'intervallo che appare quando viene selezionato un numero casuale (min_value, max_value)nell'intervallo sample_size. La sequenza numerica casuale dovrebbe essere generata nella tua risposta.

Con ampie gamme e dimensioni del campione, sei libero di modificare i passaggi utilizzati dal diagramma, purché la rappresentazione rimanga accurata.

Esempio

Con [1, 5, 10]come input:

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

Con [1, 100, 15]come input (in passi di 10, quindi 00 mostra 1-9, 10 mostra 10-19, ecc.):

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

punteggio

Questo è , quindi vince il codice più breve in byte.


1
Immagino che non ci sia permesso di produrre tabelle con un'altezza maggiore del necessario? Per il tuo [1,5,10]esempio, l'altezza può essere 10? Così colonna 4 sarebbe simile a questa (in senso verticale dall'alto verso il basso invece che in orizzontale da sinistra a destra): oooooooxxx4.
Kevin Cruijssen,

6
Cosa mi impedisce di selezionare un cestino di larghezza b-a? È un formato abbastanza conveniente ...
Giuseppe,

1
Giuseppe indica che per un intervallo a...b, il diagramma ha un unico contenitore che copre l'intero intervallo, risultante in una singola barra con altezza pari al numero di campioni.
Stewie Griffin,

1
Ci è consentito disegnare l'istogramma in orizzontale? Inoltre, i valori devono essere scelti in modo uniforme nell'intervallo o è valida una distribuzione in cui tutti i risultati sono possibili?

1
@Mnemonico sulla distribuzione: il consenso è che non deve essere uniforme se OP non lo ha specificato.
Stewie Griffin,

Risposte:


3

Gelatina , 13 byte

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

Utilizza un formato molto conveniente:

  • Stampa i valori sull'asse sinistro
  • Utilizza 0come pixel di distribuzione (come le xs) e 1come pixel di sfondo (come le os)
  • Utilizza tanti spazi orizzontali tra i "pixel" quanti sono i caratteri nel numero di lunghezza massima nell'intervallo (ad es. -23 è lunghezza 3, mentre 23 è lunghezza 2).

Provalo online!

Nota: se l'input non dovesse essere un array sarebbe di 11 byte prendendo due argomenti [from, to]e sampleSizecon just r/;"xẊĠ>ʋ¥G.


Penso che questo potrebbe portare il comodo margine di formattazione un po 'troppo lontano per 4 byte:

Ṗ;1K

Questo sta usando l'idea (che dovrebbe essere affrontata) proposta da Giuseppe nei commenti con un singolo cestino identificato frome toseparato da uno spazio, un altro spazio che rappresenta l'asse e un singolo che 1rappresenta l'altezza del 100%.

... o anche solo Ṗ1per 2 byte!


10

Ottava , 34 32 byte

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

Non funziona su TIO, ma funziona su Octave-online.net .

Crea un istogramma (grafico a barre) simile a questo:

inserisci qui la descrizione dell'immagine

Direi che conta come "Qualsiasi formato conveniente".

Se devono essere mostrati bin diversi da zero , questo può essere risolto in 38 byte:

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

Ho chiesto chiarimenti sui bidoni di altezza zero - questo non riesce a mostrare loro se sono strettamente inferiori o strettamente maggiori di tutti quelli diversi da zero ( f(1,5,1)mostrerebbe il comportamento per esempio).
Jonathan Allan,

1
Mi sento in dovere di sottolineare che questo è certamente non è un istogramma , piuttosto si tratta di un grafico a barre (che non sono la stessa cosa, a tutti).
caird coinheringaahing

2
@cairdcoinheringaahing sfogliando quelle pagine della wiki non vedo cosa non sarebbe un istogramma. Vuoi spiegare perché pensi invece che sia un grafico a barre?
Imus,

@Imus un istogramma è un tipo speciale di grafico a barre. Ritengo che il punto che vorrebbe fare il cauto coinheringaahing sia che si qualifica come istogramma solo se i contenitori sono abbastanza grandi da consentire la stima della distribuzione effettiva della variabile casuale (che in questo caso è in realtà completamente piatta). Per una dimensione del campione di soli 10 non è davvero possibile creare un istogramma corretto.
cessò di girare in senso antiorario il

6

R , 36 byte

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

Provalo online!

Sospiro. Uno stemplot.

La rovina dell'esistenza per gli studenti universitari del secondo anno che prendono Introduzione alla statistica per [Questa area specifica di studio] da alcuni professori che non sanno di cosa stanno parlando ma pensano ancora che gli stemplot siano una buona idea perché è ancora alla 14a edizione del libro di testo che usano dalla quarta edizione, pubblicata nel 1983.


5

Carbone , 25 byte

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

Provalo online! Spiegazione:

≔…·θηθ

Crea un intervallo inclusivo della distribuzione.

≔Eζ‽θη

Campionare l'intervallo per il numero di volte desiderato.

Eθ№ηι

Contare e stampare il numero di ciascuno degli intervalli nel campione.

↖←E⮌θ⮌Iι

Stampa le etichette.


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'

Provalo online!


Python 2 , 164 byte

output basato su colonne.

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,

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

Provalo online. (NOTA: String.repeat(int)viene emulato come repeat(String,int)per lo stesso conteggio byte, poiché Java 11 non è ancora su TIO.)

Spiegazione:

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

Provalo online!

Restituisce una tabledelle frequenze con namesuguale a intervalli semiaperte selezionati da cut, quindi (0,1], (1,2], (2,3]e così via. Non fa alcuno sforzo per selezionare un binning più ragionevole.


Non function(a,b,n)hist(sample(a:b,n,T))soddisferebbe i requisiti della domanda?
ngm,

@ngm Immagino ... volevo fare un testo dal momento che la sfida sembrava intenderlo, ma sei più che benvenuto a postarlo tu stesso
Giuseppe,

2

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

Ungolfed:

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)

Provalo online! - nel caso qualcun altro volesse provarlo come ho fatto io!
Dom Hastings,



1

JavaScript, 239

Mi dispiace per questo, ma le variabili sono state appena chiamate volenti o nolenti. Comunque, la domanda diceva qualsiasi formato conveniente , quindi questa funzione restituisce un grafico laterale

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

Accetta input nell'ordine max, min, size. Stampa il grafico in orizzontale.

õV
öW
Ë+QpVè¥D

Provalo


Spiegazione

             :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

Provalo qui

Spiegazione

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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.