Narysuj schemat dystrybucji!

12

Wyzwanie

Jako dane wejściowe otrzymasz trzy liczby całkowite - min_value, max_value, sample_sizektóre możesz przekazać do odpowiedzi jako tablicę lub kilka parametrów.

Twoim zadaniem jest wydrukowanie diagramu w dowolnym dogodnym formacie , który pokazuje częstotliwość liczb w (min_value, max_value)zakresie wyświetlanych po wybraniu liczby losowej w (min_value, max_value)zakresie sample_size. Sekwencja liczb losowych powinna zostać wygenerowana w odpowiedzi.

Przy dużych zakresach i rozmiarach próbek możesz dowolnie zmieniać kroki stosowane na diagramie, o ile reprezentacja pozostaje dokładna.

Przykład

Z [1, 5, 10]jako dane wejściowe:

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

Przy [1, 100, 15]wprowadzaniu (w krokach co 10, więc 00 pokazuje 1-9, 10 pokazuje 10-19 itd.):

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

Punktacja

To jest , więc wygrywa najkrótszy kod w bajtach.

Ivan T.
źródło
1
Chyba nie wolno nam wyprowadzać tabel o wysokości większej niż to konieczne? Na [1,5,10]przykład, czy wysokość może być 10? Więc kolumna 4 wyglądałby następująco (w pionie góry do dołu, zamiast poziomo od lewej do prawej): oooooooxxx4.
Kevin Cruijssen
6
Co powstrzyma mnie przed wybraniem pojemnika szerokości b-a? To całkiem wygodny format ...
Giuseppe
1
Giuseppe oznacza, że ​​dla zakresu a...bschemat ma jeden pojemnik pokrywający cały zakres, w wyniku czego powstaje pojedynczy słupek o wysokości równej liczbie próbek.
Stewie Griffin
1
Czy wolno nam rysować histogram w poziomie? Ponadto, czy wartości muszą być wybierane równomiernie w przedziale, czy też jest jakikolwiek rozkład, w którym wszystkie wyniki są możliwe?
1
@Mememoniczny na temat dystrybucji: Konsensus jest taki, że nie musi być jednolity, chyba że OP go określił.
Stewie Griffin

Odpowiedzi:

3

Galaretka , 13 bajtów

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

Używa bardzo wygodnego formatu:

  • Drukuje wartości na lewej osi
  • Wykorzystuje 0jako piksele dystrybucji (jak xs) i 1jako piksele tła (jak os)
  • Używa tyle poziomych odstępów między „pikselami”, ile jest znaków w liczbie o maksymalnej długości w zakresie (np. -23 to długość 3, a 23 to długość 2).

Wypróbuj online!

Uwaga: Gdyby dane wejściowe nie musiały być tablicą, byłoby to 11 bajtów, biorąc dwa argumenty [from, to]i za sampleSizepomocą just r/;"xẊĠ>ʋ¥G.


Myślę, że może to być nieco zbyt wygodne dla formatowania 4 bajtów:

Ṗ;1K

Wykorzystuje to pomysł (do którego należy się odnieść) wysunięty przez Giuseppe w komentarzach z pojedynczym pojemnikiem oznaczonym spacją fromi tooddzielonym spacją, inną spacją reprezentującą oś oraz pojedynczą spacją reprezentującą 1wysokość 100%.

... a nawet tylko Ṗ1na 2 bajty!

Jonathan Allan
źródło
10

Oktawa , 34 32 bajty

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

Nie działa na TIO, ale działa na Octave-online.net .

Tworzy histogram (wykres słupkowy) wyglądający tak:

wprowadź opis zdjęcia tutaj

Powiedziałbym, że liczy się to jako „Dowolny wygodny format”.

Jeśli muszą być pokazane niezerowe pojemniki , można to rozwiązać w 38 bajtach:

@(a,b,n)hist(--a+randi(b-a,n,1),a+1:b)
Stewie Griffin
źródło
Poprosiłem o wyjaśnienie dotyczące pojemników o zerowej wysokości - to nie pokazuje ich, jeśli są one znacznie mniejsze lub ściśle większe niż wszystkie niezerowe ( f(1,5,1)pokazałoby to na przykład zachowanie).
Jonathan Allan
1
Czuję się zobowiązany do wskazania, że ​​z pewnością nie jest to histogram , a raczej wykres słupkowy (które wcale nie są tym samym).
caird coinheringaahing
2
@cairdcoinheringaahing przeglądanie tych stron wiki Nie widzę, co to nie byłby histogram. Chcesz wyjaśnić, dlaczego zamiast tego uważasz, że to wykres słupkowy?
Imus
@Imus histogram to specjalny rodzaj wykresu słupkowego. Uważam, że Cairair coinheringaahing chce, aby kwalifikował się jako histogram tylko wtedy, gdy przedziały są wystarczająco duże, aby umożliwić oszacowanie faktycznego rozkładu zmiennej losowej (która w tym przypadku jest w rzeczywistości całkowicie płaska). Dla próbki o wielkości zaledwie 10 nie jest możliwe utworzenie odpowiedniego histogramu.
przestał obracać przeciwnie do zegara
6

R , 36 bajtów

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

Wypróbuj online!

Westchnienie. Wykres wątku.

Zmora egzystencji dla studentów drugiego roku biorących wstęp do statystyki dla [This Specific Area of ​​Study] od profesora, który nie wie o czym mówią, ale nadal myślą, że wątki tematyczne są dobrym pomysłem, ponieważ wciąż jest w 14 edycji podręcznika, którego używali od czasu wydania 4. wydania w 1983 r.

ngm
źródło
5

Węgiel , 25 bajtów

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

Wypróbuj online! Wyjaśnienie:

≔…·θηθ

Utwórz obejmujący zakres dystrybucji.

≔Eζ‽θη

Próbkuj zakres żądaną liczbę razy.

Eθ№ηι

Policz i wydrukuj numer każdego zakresu w próbce.

↖←E⮌θ⮌Iι

Wydrukuj etykiety.

Neil
źródło
3

Python 2 , 115 bajtów

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'

Wypróbuj online!


Python 2 , 164 bajty

wyjście oparte na kolumnie.

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,

Wypróbuj online!

ovs
źródło
3

Java 11, 184 168 bajtów

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

Wypróbuj online. (UWAGA: String.repeat(int)jest emulowany jak repeat(String,int)dla tej samej liczby bajtów, ponieważ Java 11 nie jest jeszcze w TIO).

Wyjaśnienie:

(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`
Kevin Cruijssen
źródło
2

R , 52 bajty

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

Wypróbuj online!

Zwraca tableczęstotliwości z namesrównym interwałach półotwartych wybranych przez cuttak (0,1], (1,2], (2,3]i tak dalej. Nie stara się wybierać bardziej rozsądnego podziału na grupy.

Giuseppe
źródło
Czy nie function(a,b,n)hist(sample(a:b,n,T))spełniałby wymagań pytania?
ngm
@ngm Chyba ... Chciałem zrobić tekst, ponieważ wyzwanie wydawało się intymne, ale z przyjemnością opublikujesz go samodzielnie
Giuseppe
2

Rubinowy, 135 bajtów , 117 bajtów

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

Nie golfowany:

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)
Biketire
źródło
Wypróbuj online! - na wypadek, gdyby ktokolwiek chciał to przetestować tak jak ja!
Dom Hastings
L .
Stewie Griffin
1

JavaScript, 239

Przykro mi z tego powodu, ale zmienne zostały właśnie nazwane willy-nilly. W każdym razie pytanie brzmiało jakikolwiek dogodny format , więc ta funkcja zwraca wykres boczny

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`}
vityavv
źródło
1

Japt -R, 14 bajtów

Pobiera dane wejściowe w kolejności max, min, size. Wysyła wykres w poziomie.

õV
öW
Ë+QpVè¥D

Spróbuj


Wyjaśnienie

             :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.
Kudłaty
źródło
0

Pyth, 19 bajtów

JmOK}FPQeQVK,N*/JNd

Wypróbuj tutaj

Wyjaśnienie

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.

źródło