とんちゃんといっしょ

Cloudに関する技術とか日常とかについて書いたり書かなかったり

なんか問題出されたので

http://kobin-lab.blogspot.com/2009/07/blog-post_19.html

前略
あんまり暇なので時間に余裕があるので、前みた問題考えてました。

問題
以下のような出力を得るプログラムをC言語で実装。


ABCDEFGHIJKLMNOPQRSTUVWXYZ
BCDEFGHIJKLMNOPQRSTUVWXYZA
CDEFGHIJKLMNOPQRSTUVWXYZAB
DEFGHIJKLMNOPQRSTUVWXYZABC
EFGHIJKLMNOPQRSTUVWXYZABCD
FGHIJKLMNOPQRSTUVWXYZABCDE
GHIJKLMNOPQRSTUVWXYZABCDEF
HIJKLMNOPQRSTUVWXYZABCDEFG
IJKLMNOPQRSTUVWXYZABCDEFGH
JKLMNOPQRSTUVWXYZABCDEFGHI
KLMNOPQRSTUVWXYZABCDEFGHIJ
LMNOPQRSTUVWXYZABCDEFGHIJK
MNOPQRSTUVWXYZABCDEFGHIJKL
NOPQRSTUVWXYZABCDEFGHIJKLM
OPQRSTUVWXYZABCDEFGHIJKLMN
PQRSTUVWXYZABCDEFGHIJKLMNO
QRSTUVWXYZABCDEFGHIJKLMNOP
RSTUVWXYZABCDEFGHIJKLMNOPQ
STUVWXYZABCDEFGHIJKLMNOPQR
TUVWXYZABCDEFGHIJKLMNOPQRS
UVWXYZABCDEFGHIJKLMNOPQRST
VWXYZABCDEFGHIJKLMNOPQRSTU
WXYZABCDEFGHIJKLMNOPQRSTUV
XYZABCDEFGHIJKLMNOPQRSTUVW
YZABCDEFGHIJKLMNOPQRSTUVWX
ZABCDEFGHIJKLMNOPQRSTUVWXY

後略

Cはめどい
というわけでRubyで実装してみた

a=[*"A".."Z"];26.times{puts a.join;a<<a.shift}


以下Ruby初心者のための解説
まずa=[*"A".."Z"];の部分。
これは[]内部のRangeに対して先頭に*をつけることで配列に展開。

[*"A".."Z"]
=> ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "
P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]

あとは";"で式の終了を明示。


次に26.timesの部分。
これは指定した回数文繰り返される。
また、繰り返しの回数はブロック内の内部変数|i|として受け取ることが可能。
ちなみに{}の部分はdo endでも可能。
あとputsは改行込みの出力関数。

5.times{|i|puts i}
0
1
2
3
4
=> 5

5.times do|i|puts i end
0
1
2
3
4
=> 5

最後はa.joinで配列の内部文字を結合。
またa.shiftで配列を左にずらす。
その際返り値として配列の先頭の値が得られると同時に配列から消去されるので、
それを再び<<でaの末尾に追加。

a.join
=> "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

a.shift
=>"A"
p a
=> ["B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "
P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
a<<a.shift
=> ["C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "
P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "B"]

これを26回繰り返せば上記の結果が得られる。
楽チン!