Rosetta Stone Challenge: Disegna un diagramma a scatole


10

L'obiettivo di una Rosetta Stone Challenge è scrivere soluzioni in quante più lingue possibili. Mostra il tuo multilinguismo di programmazione!

La sfida

La tua sfida è quella di implementare un programma che inserirà un elenco di numeri e produca un diagramma a scatole dei dati, nel maggior numero di linguaggi di programmazione possibile . Il diagramma a scatole mostrerà i quartili e gli outlier nei dati e avrà anche una scala. Puoi usare qualsiasi tipo di funzione di libreria standard nella tua lingua, poiché questa è principalmente una vetrina linguistica.

Che cos'è un "diagramma a scatole"?

Un diagramma a scatole è un modo per rappresentare graficamente i dati. Un diagramma a scatole ha alcune caratteristiche essenziali. La prima caratteristica è una casella, con entrambi i lati situati nel primo e terzo quartile dei dati. C'è una linea al centro del diagramma a riquadri che indica la mediana. Alle due estremità del diagramma della scatola, ci sono "baffi" che aiutano a mostrare la varianza dei dati. Il baffo si estende dalla casella al minimo e al massimo dei punti nel set di dati, esclusi i valori anomali. I valori anomali vengono tracciati come punti individuali.

Innanzitutto, prendi la mediana dei dati. Quindi, prendi tutti i punti dati che sono strettamente inferiori alla mediana e calcola la mediana di questo set per diventare il primo quartile (Q1). Prendi tutti i punti di dati che sono strettamente maggiori della mediana e calcola la mediana di questo set per diventare il terzo quartile (Q3). Trova il valore di R = 1.5*(Q3 - Q1). Tutti i numeri in meno Q1 - Rsono valori anomali. Tutti i numeri maggiori di Q3 + Rsono valori anomali. Prendi l'insieme di tutti i punti di dati che non sono anomali e il minimo e il massimo di questo insieme determinano le estremità dei due baffi.

Ingresso

L'input inizierà con n=seguito da un numero. Ci saranno quindi nnumeri, uno per riga. Tutti i numeri saranno numeri interi compresi tra 0 e 63, inclusi.

n=8
29
1
22
18
12
16
16
22

Produzione

L'output sarà una rappresentazione del diagramma a riquadri. Un modo possibile per disegnare la trama è renderlo in ASCII. È possibile eseguire il rendering del diagramma a riquadri in molti modi diversi da ASCII, ma il requisito principale è che sia disegnato in modo sufficientemente grande da consentire di stabilire con esattezza le posizioni delle caratteristiche importanti. La trama della scatola dovrebbe avere una scala, composta da circa 5-10 numeri equidistanti. Ecco un esempio di trama dei dati sopra:

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

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

Il criterio vincente dell'obiettivo

Per quanto riguarda un criterio vincente oggettivo, eccolo qui: ogni lingua è una competizione separata su chi può scrivere la voce più breve, ma il vincitore generale sarebbe la persona che vince la maggior parte di queste sotto-competizioni. Ciò significa che una persona che risponde in molte lingue non comuni può ottenere un vantaggio. Il code-golf è principalmente un tiebreak per quando c'è più di una soluzione in una lingua: la persona con il programma più corto ottiene credito per quella lingua.

Regole, restrizioni e note

Il tuo programma può essere scritto in qualsiasi lingua esistente prima dell'11 aprile 2013. Dovrò anche fare affidamento sulla comunità per convalidare alcune risposte scritte in alcune delle lingue più insolite / esoteriche, poiché è improbabile che io sia in grado di testare loro.


Classifica attuale

Questa sezione verrà periodicamente aggiornata per mostrare il numero di lingue e chi guida in ciascuna di esse.

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

Classifiche utente corrente

  1. plannapus - 2
  2. Abhijit - 1
  3. chyanog - 1

2
Lo adoro! Una configurazione di regole molto bella. Ora per imparare alcune lingue ...
luser droog

Risposte:


6

R: 34 caratteri

Naturalmente, essendo R un linguaggio usato per le statistiche, viene fornito con una funzione boxplotper fare ciò (che ha bisogno di un wrapper qui per adattarsi allo stile di input):

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

Utilizzo: dato un file input1.txtcontenente quanto segue:

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

Quindi f("input1.txt")produce:

inserisci qui la descrizione dell'immagine

Julia: 604 personaggi

Questa è la mia prima funzione in assoluto a Julia, quindi mi scuso con i fan di Julia se questo è scritto male.

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
         +-----------+

2

Personaggi Python2.X 85, usando matplotlib

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

inserisci qui la descrizione dell'immagine


1

Mathematica 71

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

inserisci qui la descrizione dell'immagine

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.