Rosetta Stone Challenge: Draw a Box Plot

10

El objetivo de Rosetta Stone Challenge es escribir soluciones en tantos idiomas como sea posible. ¡Muestra tu programación multilingüismo!

El reto

Su desafío es implementar un programa que ingrese una lista de números y genere un diagrama de caja de los datos, en tantos lenguajes de programación como sea posible . El diagrama de caja mostrará los cuartiles y los valores atípicos en los datos, e incluso tendrá una escala. Se le permite usar cualquier tipo de función de biblioteca estándar que tenga su idioma, ya que esto es principalmente un escaparate de idiomas.

¿Qué es un "diagrama de caja"?

Un diagrama de caja es una forma de graficar datos. Un diagrama de caja tiene algunas características esenciales. La primera característica es un cuadro, con ambos lados ubicados en el primer y tercer cuartil de los datos. Hay una línea en el centro del diagrama de caja que da la mediana. En cada extremo del diagrama de caja, hay "bigotes" que ayudan a mostrar la varianza de los datos. El bigote se extiende desde el cuadro hasta los puntos mínimos y máximos del conjunto de datos, excluyendo los valores atípicos. Los valores atípicos se trazan como puntos individuales.

Primero, tome la mediana de los datos. Luego, tome todos los puntos de datos que son estrictamente menores que la mediana y calcule la mediana de este conjunto para convertirse en el primer cuartil (Q1). Tome todos los puntos de datos que son estrictamente mayores que la mediana y calcule la mediana de este conjunto para convertirse en el tercer cuartil (Q3). Encuentra el valor de R = 1.5*(Q3 - Q1). Cualquier número menos Q1 - Resto son valores atípicos. Cualquier número mayor que Q3 + Rlos valores atípicos. Tome el conjunto de todos los puntos de datos que no son atípicos, y el mínimo y el máximo de este conjunto determinan los extremos de los dos bigotes.

Entrada

La entrada comenzará con n=seguido de un número. Luego habrá nnúmeros, uno por línea. Todos los números serán enteros del 0 al 63, inclusive.

n=8
29
1
22
18
12
16
16
22

Salida

La salida será una representación del diagrama de caja. Una posible forma de dibujar el diagrama es renderizándolo en ASCII. Puede representar el diagrama de caja de muchas formas distintas de ASCII, pero el requisito principal es que se dibuje lo suficientemente grande como para que sea posible determinar las ubicaciones exactas de las características importantes. El diagrama de caja debe tener una escala, que consta de alrededor de 5-10 números igualmente espaciados. Aquí hay un gráfico de ejemplo de los datos anteriores:

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

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

El criterio objetivo ganador

En cuanto a un criterio ganador objetivo, aquí está: cada idioma es una competencia separada en cuanto a quién puede escribir la entrada más corta, pero el ganador general sería la persona que gana la mayoría de estas subcompeticiones. Esto significa que una persona que responde en muchos idiomas poco comunes puede obtener una ventaja. Code-golf es principalmente un factor decisivo para cuando hay más de una solución en un idioma: la persona con el programa más corto obtiene crédito por ese idioma.

Reglas, restricciones y notas

Su programa se puede escribir en cualquier idioma que existiera antes del 11 de abril de 2013. También tendré que confiar en la comunidad para validar algunas respuestas escritas en algunos de los idiomas más infrecuentes / esotéricos, ya que es improbable que pueda probar ellos.


Tabla de clasificación actual

Esta sección se actualizará periódicamente para mostrar la cantidad de idiomas y quién lidera cada uno.

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

Ranking de usuarios actuales

  1. plannapus - 2
  2. Abhijit - 1
  3. chyanog - 1
PhiNotPi
fuente
2
¡Me encanta! Una muy buena configuración de reglas. Ahora para aprender algunos idiomas ...
luser droog

Respuestas:

6

R: 34 caracteres

Por supuesto, siendo R un lenguaje usado para estadísticas, viene con una función boxplotpara hacer esto (que necesita un contenedor aquí para acomodar el estilo de entrada):

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

Uso: dado un archivo que input1.txtcontiene lo siguiente:

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

Luego f("input1.txt")produce:

ingrese la descripción de la imagen aquí

Julia: 604 caracteres

Esta es mi primera función en Julia, así que pido disculpas a los fanáticos de Julia si está mal escrita.

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
fuente
2

Python2.X 85 caracteres, usando matplotlib

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

ingrese la descripción de la imagen aquí

Abhijit
fuente
1

Mathematica 71

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

ingrese la descripción de la imagen aquí

chyanog
fuente