Hi there! Today's challenge is quite similar to the last
one. Again, there are quartiles,
but the input is a little different and the output is the interquartile range:
`$Q_3 - Q_1$`

. The first input is `$n$`

followed by an array `$X$`

of size `$n$`

with our data, but the frequencies of each point are included in another array
of `$n$`

elements, `$F$`

, that is the next input. After reading this we need to
construct the actual data array `$S$`

. My solution is below.

```
package main
import (
"fmt"
"sort"
)
// assumes already sorted
func getMedian(a []int) float64 {
n := len(a)
if n%2 == 0 {
return float64(a[n/2]+a[n/2-1]) / 2.0
}
return float64(a[n/2])
}
func sum(a []int) int {
sum := 0
for i := 0; i < len(a); i++ {
sum += a[i]
}
return sum
}
func main() {
N := 0
fmt.Scanf("%d", &N)
// allocate memory
X := make([]int, N)
F := make([]int, N)
// read numbers from stdin
for i := 0; i < N; i++ {
fmt.Scanf("%d", &X[i])
}
for i := 0; i < N; i++ {
fmt.Scanf("%d", &F[i])
}
// construct array from numbers
// and frequencies
S := make([]int, sum(F))
k := 0
for i := 0; i < len(S); {
for j := 0; j < F[k]; j++ {
S[i+j] = X[k]
}
i += F[k]
k++
}
// sort
sort.Ints(S)
n := len(S)
var Q1, Q3 float64
// get quartiles
Q1 = getMedian(S[0 : n/2])
if n%2 == 0 {
Q3 = getMedian(S[n/2:])
} else {
Q3 = getMedian(S[n/2+1:])
}
fmt.Printf("%.1f\n", Q3-Q1)
}
```

The biggest problem I had was actually constructing `$S$`

. I simply forgot to
construct it the first time and I was thinking the problem was in the median
function, but it was fine. When I noticed I forgot it, it was quite easy to
solve.