平均値順にソート

30分プログラム、その724。またもmixiの課題コミュニティからです。

複数の整数を平均値に近い順にソートするプログラムを作成せよ。平均値は切り捨てして整数値で、平均値との距離が等しい場合は値の小さな方を優先するものとする。

らしいです。うっかりしてて平均値の切り捨てを忘れてました。まあいいや。

使い方

print Dumper(sort_by_avg(4,2,1,3));
# $VAR1 = 2;
# $VAR2 = 3;
# $VAR3 = 1;
# $VAR4 = 4;

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# avg-sort.pl -
#
# Copyright(C) 2010 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2010/01/20 20:51:00
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

use strict;
use warnings;
use List::Util qw(sum);
use Data::Dumper;

sub avg(@) {
    my (@xs) = @_;
    my $n = @xs;
    sum(@xs) / $n;
}

sub sort_by_avg(@){
    my (@xs) = @_;
    my $n = avg(@xs);

    sort {
	my $x = abs($a - $n);
	my $y = abs($b - $n);
	if($x == $y){
	    $a <=> $b;
	}else{
	    $x <=> $y;
	}
    } @xs;
}

print Dumper(sort_by_avg(4,2,1,3));