pythonでは、
def one_skipped(s):
return s[::2]
print one_skipped('abcdefg') #=> 'aceg'
と関数にするまでもありません。 Juliaでも、
function one_skipped(s)
s[1:2:length(s)]
end
print(one_skipped("abcdefg"))
のように文字列から文字列を生成できます。
Rubyでも文字列のメソッドに便利なものがあるのかと見てみましたが、 slice()では、範囲のみの指定のようです。 インデックスを指定して一文字取り出すことはできるようですので、 一つとびのインデックスさえ生成できれば、それをもとに文字列を組み立てられそうです。
def one_skipped(s)
return (0..s.length/2).map {|i| i*2}.collect {|i| s[i]}.join()
end
Rubyはreturnを省略できるということ。i*2として一つ飛びの数に直すより、 i%2==0の判定を使って取り出したいということで、selectメソッドを使ってみます。
def one_skipped(s)
(0..s.length).select {|i| i%2==0}.collect {|i| s[i]}.join()
end
ずらずらと記述が並びますね。関数に分けてみます。
def range(start, stop, step)
(start .. stop).select {|i| (i-start)%step==0}
end
def chars_at_indices(s, indices)
indices.collect {|i| s[i]}
end
def one_skipped(s)
chars_at_indices(s, range(0, s.length, 2)).join()
end
puts 'abcdefg'
こんな感じでしょうか。関数に分けるほどでもないでしょうか。
せっかく関数に分けたので、SBCLでも書いてみます。(defun range (start stop step) (loop for i from start below stop by step collect i)) (defun chars-at-indices (s indices) (loop for i in indices collect (elt s i))) (defun one-skipped (s) (concatenate 'string (chars-at-indices s (range 0 (length s) 2))))
普段使わない言語を、ちょっと調べつつ書いてみる題材としてちょうどよいですね。
Rubyは、Windows上で、
ruby 2.1.2p95 (2014-05-08 revision 45877)
irb 0.9.6(09/06/30)
を用いました。
0 件のコメント:
コメントを投稿