Desafio da Pedra de Rosetta: Desenhe um gráfico de caixa

10

O objetivo do Rosetta Stone Challenge é escrever soluções no maior número possível de idiomas. Mostre seu multilinguismo de programação!

O desafio

Seu desafio é implementar um programa que insira uma lista de números e produza um gráfico de caixa dos dados, na maior quantidade possível de linguagens de programação . O gráfico da caixa exibirá os quartis e outliers nos dados e ainda terá uma escala. Você tem permissão para usar qualquer tipo de função de biblioteca padrão que seu idioma possua, pois essa é principalmente uma demonstração de idioma.

O que é um "gráfico de caixa"?

Um gráfico de caixa é uma maneira de representar graficamente os dados. Um gráfico de caixa tem alguns recursos essenciais. O primeiro recurso é uma caixa, com ambos os lados localizados no primeiro e terceiro quartis dos dados. Há uma linha no centro do gráfico da caixa que indica a mediana. Nas extremidades do gráfico de caixa, existem "bigodes" que ajudam a mostrar a variação dos dados. O bigode se estende da caixa aos mínimos e maiores pontos no conjunto de dados, excluindo os valores extremos. Os valores extremos são plotados como pontos individuais.

Primeiro, pegue a mediana dos dados. Em seguida, pegue todos os pontos de dados estritamente menores que a mediana e calcule a mediana desse conjunto para se tornar o primeiro quartil (Q1). Pegue todos os pontos de dados estritamente maiores que a mediana e calcule a mediana desse conjunto para se tornar o terceiro quartil (Q3). Encontre o valor de R = 1.5*(Q3 - Q1). Quaisquer números menos Q1 - Risso são discrepantes. Quaisquer números maiores que Q3 + Rsão discrepantes. Pegue o conjunto de todos os pontos de dados que não são discrepantes, e o mínimo e o máximo desse conjunto determinam as extremidades dos dois bigodes.

Entrada

A entrada começará com n=seguida de um número. Haverá então nnúmeros, um por linha. Todos os números serão inteiros de 0 a 63, inclusive.

n=8
29
1
22
18
12
16
16
22

Resultado

A saída será uma representação do gráfico da caixa. Uma maneira possível de desenhar o gráfico é renderizando-o em ASCII. É possível renderizar o gráfico da caixa de várias maneiras que não o ASCII, mas o principal requisito é aquele suficientemente grande, para que seja possível informar a localização exata dos recursos importantes. O gráfico da caixa deve ter uma escala, composta por cerca de 5 a 10 números igualmente espaçados. Aqui está um exemplo de plotagem dos dados acima:

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

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

O Critério de Vencimento Objetivo

Quanto a um critério de vitória objetivo, aqui está: Cada idioma é uma competição separada sobre quem pode escrever a entrada mais curta, mas o vencedor geral será a pessoa que vencer a maioria dessas subcompetições. Isso significa que uma pessoa que responde em vários idiomas incomuns pode obter uma vantagem. O código-golfe é principalmente um desempate para quando há mais de uma solução em um idioma: a pessoa com o programa mais curto recebe crédito por esse idioma.

Regras, restrições e notas

Seu programa pode ser escrito em qualquer idioma que existia antes de 11 de abril de 2013. Também terei que contar com a comunidade para validar algumas respostas escritas em alguns dos idiomas mais esotéricos / incomuns, pois é improvável que eu possa testar eles.


Classificação atual

Esta seção será atualizada periodicamente para mostrar o número de idiomas e quem lidera em cada um.

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

Classificação do usuário atual

  1. plannapus - 2
  2. Abhijit - 1
  3. chyanog - 1
PhiNotPi
fonte
2
Eu amo isso! Uma configuração muito agradável de regras. Agora, para aprender algumas línguas ...
luser Droog

Respostas:

6

R: 34 caracteres

Obviamente, R sendo uma linguagem usada para estatística, ele vem com uma função boxplotpara fazer isso (que precisa de um invólucro aqui para acomodar o estilo de entrada):

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

Uso: dado um arquivo que input1.txtcontém o seguinte:

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

Então f("input1.txt")produz:

insira a descrição da imagem aqui

Julia: 604 caracteres

Esta é a minha primeira função em Julia, então peço desculpas aos fãs de Julia se isso estiver mal escrito.

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

Uso:

g("input1.txt")
0        9       18       27       36       45       54       63
         +-----------+
---------|      |    |------------------                     x
         +-----------+
plannapus
fonte
2

Python2.X 85 caracteres, usando matplotlib

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

insira a descrição da imagem aqui

Abhijit
fonte
1

Mathematica 71

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

insira a descrição da imagem aqui

chyanog
fonte