スタックを用いたreverse

30分プログラム、その732。mixiの課題コミュからの引用です。

一部、日本語がおかしいですがそのまま引用します。

スタックを用いて10 個の整数配列を5 個ずつ順序を入れ替えるプログラムを作りなさ
つまり

01234 56789
↓
43210 98765

と並び替えるプログラムをスタックを用いて作りなさい。
よろしくお願いします。

たぶん、普段のボクなら、5個づつに区切って、reverseして、concatする気がします。でも、スタックを使えと書かれているのでしょうがないです。スタックを使って手続き的に書きましょう。

使い方

reverse_n(5,
          1,2,3,4,5,6,7,8,9,10));
# => (5,4,3,2,1,10,9,8,7,6)

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# stack-rev.pl -
#
# Copyright(C) 2010 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2010/02/07 22:12:11
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

use strict;
use warnings;
use Data::Dumper;

sub reverse_n($@){
    my ($n, @xs) = @_;
    my @tmp = ();
    my @ys = ();

    for my $x (@xs){
	unshift @tmp, $x;

	if(@tmp == $n){
	    push @ys, @tmp;
	    @tmp = ();
	}
    }

    push @ys,@tmp;
    return @ys;
}

print Dumper(reverse_n(5,
		       1,2,3,4,5,6,7,8,9,10));