Skip to content

Instantly share code, notes, and snippets.

@eregon
Last active September 17, 2025 13:25
Show Gist options
  • Save eregon/4d8b27349054ce937f711218df2e52c8 to your computer and use it in GitHub Desktop.
Save eregon/4d8b27349054ce937f711218df2e52c8 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
class Stats
def initialize(data)
@data = data
@sorted = data.sort
end
def size
@data.size
end
def min
@data.min
end
def max
@data.max
end
def mean
@data.sum(0.0) / size
end
def median
if size.odd?
@sorted[size/2]
else
(@sorted[size/2-1] + @sorted[size/2]) / 2.0
end
end
def median_absolute_deviation(median = median())
Stats.new(@data.map { |v| (v - median).abs }).median
end
def quartile(n)
return median if n == 2
index = (n * size) / 4
@sorted[index]
end
end
data = STDIN.readlines.map { Float(_1) }
stats = Stats.new(data)
median = stats.median
mad = stats.median_absolute_deviation(median)
puts <<~OUT
median: #{stats.median}
average: #{stats.mean}
MAD: #{mad} (#{"%.2f" % (mad / median * 100.0)}%)
min-max: [#{stats.min} - #{stats.max}]
Q1-Q3: [#{stats.quartile(1)} - #{stats.quartile(3)}]
OUT
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment