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.