# ループも再帰も継続も使わずに配列の順序を逆にする。
_published: 2010/03/12_ 
ループを使わずに配列の順序を逆にする。なんか流行ってるらしいです。
元ネタは、これの2ページ目。
- [プログラマーの力量を見極める--面接官になったら尋ねるべき質問実例集 - ZDNet Japan](http://japan.zdnet.com/sp/feature/07tenthings/story/0,3800082984,20409456,00.htm)
valvallowさんがやってたので、自分も参戦します。
- [vallog: 流行ってるようなので「ループを使わずに配列の順序を逆にする」](http://valvallow.blogspot.com/2010/03/blog-post.html)
- [vallog: ”再帰も”ループも使わずに配列を逆順にする:継続呼び出し編](http://valvallow.blogspot.com/2010/03/blog-post_12.html)
私は、ループも再帰も継続も使わずに、配列の順序を逆にします。要は、「繰り返し」を使わずに、配列の順序を逆にします。もちろん、スポンジや食器用洗剤も使いません。ただし、油汚れは落ちません。
```ruby
a = [0, 1, 2, 3, 4]
a.size.times do |i|
puts a[i]
end
class Array
def indexer_alt(nth)
self.indexer_org(self.size - nth - 1)
end
alias_method :indexer_org, :[]
alias_method :[], :indexer_alt
end
a.size.times do |i|
puts a[i]
end
```
逆になったでしょ?配列そのものではなくて、インデックス側をいじる。上のコードではメタプログラミングしてます。Lispなら、マクロでいけると思います。メタプログラミングできない言語なら、下のようなコード。
```ruby
a = [0, 1, 2, 3, 4]
def reverse_indexer(array, nth)
array[array.size - nth - 1]
end
a.size.times do |i|
puts reverse_indexer(a, i)
end
```
配列そのものが逆順になっていないですって?常に逆順に取り出している限り、逆順になっていないことを証明できませんよね。それでは、 `each` も逆順にしますよ。
```ruby
a = [0, 1, 2, 3, 4]
class Array
def each_alt
self.each_index do |i|
yield self[self.size - i - 1]
end
end
alias_method :each, :each_alt
end
a.each {|x| puts x}
```
おまけ。 `p` の出力結果も逆順に。
```ruby
a = [0, 1, 2, 3, 4]
class Array
def inspect_alt
self.inject("[") {|x, y| "#{x}#{y}, "} [0..-3] + "]"
end
alias_method :inspect, :inspect_alt
end
p a #=> [4, 3, 2, 1, 0]
```
数学的に数列を逆順にする方法がないかと探していたら、Z変換というのに行き着きました。Z変換というのは、離散群上でのラプラス変換だそうです。すみません。意味がわかりません。まったく関係ないかもしれません。油汚れも落ちません。