Stone Rosetta Challenge: Draw a Box Plot

10

Celem Stone Rosetta Challenge jest pisanie rozwiązań w jak największej liczbie języków. Pochwal się swoją wielojęzycznością programistyczną!

Wyzwanie

Wyzwanie polega na wdrożeniu programu, który wprowadzi listę liczb i wyprowadzi wykres skrzynkowy danych, w jak największej liczbie języków programowania . Wykres pudełkowy wyświetli kwartyle i wartości odstające w danych, a nawet będzie miał skalę. Możesz używać dowolnej standardowej funkcji bibliotecznej, którą posiada Twój język, ponieważ jest to głównie prezentacja języka.

Co to jest „fabuła pudełkowa”?

Wykres pudełkowy jest sposobem wykresów danych. Fabuła pudełkowa ma kilka istotnych cech. Pierwszą cechą jest pole, w którym każda ze stron znajduje się w pierwszym i trzecim kwartyle danych. Na środku wykresu pola znajduje się linia, która podaje medianę. Na obu końcach wykresu pudełkowego znajdują się „wąsy”, które pomagają pokazać wariancję danych. Wąs rozciąga się od pudełka do najmniejszych i największych punktów w zbiorze danych, z wyłączeniem wartości odstających. Wartości odstające są wykreślane jako pojedyncze punkty.

Najpierw weź medianę danych. Następnie weź wszystkie punkty danych, które są znacznie mniejsze niż mediana, i oblicz medianę tego zbioru, aby stać się pierwszym kwartylem (Q1). Weź wszystkie punkty danych, które są ściśle większe niż mediana, i oblicz medianę tego zbioru, aby stać się trzecim kwartylem (Q3). Znajdź wartość R = 1.5*(Q3 - Q1). Wszelkie liczby mniejsze Q1 - Rto wartości odstające. Wszelkie liczby większe niż Q3 + Rsą wartościami odstającymi. Weź zestaw wszystkich punktów danych, które nie są wartościami odstającymi, a minimum i maksimum tego zestawu określa końce dwóch wąsów.

Wejście

Wprowadzanie rozpocznie się n=od numeru. Będą wtedy nliczby, po jednej w wierszu. Wszystkie liczby będą liczbami całkowitymi od 0 do 63 włącznie.

n=8
29
1
22
18
12
16
16
22

Wynik

Wyjście będzie interpretacją wykresu pudełkowego. Jednym z możliwych sposobów narysowania wykresu jest renderowanie go w ASCII. Możesz renderować wykresy pudełkowe na wiele sposobów innych niż ASCII, ale głównym wymaganiem jest to, aby były narysowane wystarczająco duże, aby można było określić dokładne położenie ważnych funkcji. Wykres pudełkowy powinien mieć skalę, składającą się z około 5-10 liczb w równych odstępach. Oto przykładowy wykres powyższych danych:

              +--+----+        
              |  |    |        
 X          +-+  |    +------+ 
              |  |    |        
              +--+----+        

0    0    1    1    2    2    3
0    5    0    5    0    5    0

Kryterium zwycięskiego celu

Jeśli chodzi o obiektywne kryterium wygranej, oto on: Każdy język to osobny konkurs na to, kto może napisać najkrótszą pracę, ale ogólnym zwycięzcą byłaby osoba, która wygra najwięcej z tych pod-konkursów. Oznacza to, że osoba, która odpowiada w wielu nietypowych językach, może zyskać przewagę. Code-golf jest przeważnie rozstrzygający, gdy istnieje więcej niż jedno rozwiązanie w języku: osoba z najkrótszym programem otrzymuje kredyt za ten język.

Reguły, ograniczenia i uwagi

Twój program może być napisany w dowolnym języku, który istniał przed 11 kwietnia 2013 r. Będę też musiał polegać na społeczności, aby zweryfikować niektóre odpowiedzi napisane w niektórych bardziej rzadkich / ezoterycznych językach, ponieważ jest mało prawdopodobne, że będę w stanie przetestować im.


Aktualny ranking

Ta sekcja będzie okresowo aktualizowana, aby pokazać liczbę języków i kto prowadzi w każdym z nich.

  • Julia (604) - plannapus
  • Mathematica (71) - chyanog
  • Python2.X (85) - Abhijit
  • R (34) - plannapus

Aktualne rankingi użytkowników

  1. plannapus - 2
  2. Abhijit - 1
  3. chyanog - 1
PhiNotPi
źródło
2
Kocham to! Bardzo ładna konfiguracja reguł. Teraz, aby nauczyć się kilku języków ...
luser droog

Odpowiedzi:

6

R: 34 znaki

Oczywiście, ponieważ R jest językiem używanym do statystyki, zawiera funkcję boxplotdo tego celu (która potrzebuje tutaj opakowania, aby dostosować się do stylu wprowadzania):

f=function(x)boxplot(scan(x,sk=1))

Użycie: Biorąc pod uwagę plik input1.txtzawierający następujące elementy:

n=10
29
1
22
19
9
13
15
22
63
2

Następnie f("input1.txt")produkuje:

wprowadź opis zdjęcia tutaj

Julia: 604 znaków

To moja pierwsza funkcja w Julii, więc przepraszam fanów Julii, jeśli jest źle napisana.

function g(f)
a=int(split(readall(open(f)),'\n')[2:])
b,c,d=int(quantile(a,[.25,.5,.75]))
w=1.5*(d-b)
o=a[a.<b-w]
O=a[a.>d+w]
t=int(b-w>0?b-w:0)
u=int(d+w<63?d+w:63)
S=s=""
if !isempty(o)
for i in 1:length(o)
s=s*lpad('x',[0,o][i+1]-[0,o][i]-1,' ')
end
end
if !isempty(O)
for i in 1:length(O)
S=S*lpad('x',[0,O][i+1]-[0,O][i]-u-1,' ')
end
end
x="0"
for i in 9:9:63
x=x*lpad(string(i),i-(i-9)," ")
end
v=isempty(o)?b-1:b-o[length(o)]-1
print(x*"\n"*lpad('+'*'-'^(d-b-1)*'+',d,' ')*'\n'*s*lpad('-'^(b-t-1),v,' ')*'|'*lpad('|',c-b,' ')*' '^(d-c-1)*'|'*'-'^(u-d)*S*'\n'*lpad('+'*'-'^(d-b-1)*'+',d,' '))
end

Stosowanie:

g("input1.txt")
0        9       18       27       36       45       54       63
         +-----------+
---------|      |    |------------------                     x
         +-----------+
plannapus
źródło
2

Python2.X 85 znaków, używając matplotlib

import matplotlib.pylab as p
p.boxplot(map(input,['']*int(raw_input()[2:])))
p.show()

wprowadź opis zdjęcia tutaj

Abhijit
źródło
1

Mathematica 71

BoxWhiskerChart[Input/@x~Array~FromDigits@StringTake[InputString[],-1]]

wprowadź opis zdjęcia tutaj

chyanog
źródło