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: Q3Q1Q_3 - Q_1. The first input is nn followed by an array XX of size nn with our data, but the frequencies of each point are included in another array of nn elements, FF, that is the next input. After reading this we need to construct the actual data array SS. 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 SS. 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.