今日は Windows マシンから更新。
cf. ruby 文字列を指定数で分割する – それマグで!
Haskell でやってみた。
module Main where
slices :: Int -> [a] -> [[a]]
slices _ [] = []
slices n xs = h : slices n d
where
(h, d) = splitAt n xs
main :: IO ()
main = print $ slices 3 "abcdefghijklmnopqrstuvwxyz"
^o^ > runhaskell stringSlices.hs ["abc","def","ghi","jkl","mno","pqr","stu","vwx","yz"]
Scheme だとこう。
(define slices
(lambda (lis n)
(if (< (length lis) n)
(list lis)
(cons (take lis n) (slices (drop lis n) n)))))
(define string-slices
(lambda (str n)
(map list->string (slices (string->list str) n))))
(print (string-slices "abcdefghijklmnopqrstuvwxyz" 3))
^o^ > gosh string-slices.scm (abc def ghi jkl mno pqr stu vwx yz)
最後に JavaScript。
function stringSlices(n, str) {
var l = str.length;
var result = [];
for (var i = 0; i < l; i += n) {
result.push(str.slice(i, i + n));
}
return result;
}
console.log(stringSlices(3, "abcdefghijklmnopqrstuvwxyz"));
^o^ > node stringSlices.js [ 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqr', 'stu', 'vwx', 'yz' ]
これ、もうちょっとスマートにいかないかな。
[追記]
JavaScript 版、Haskell 版や Scheme 版と同じように考えてみた。少しはスマートになったかな。そうでもないか?
function stringSlices(n, str) {
if (str.length == 0) {
return [];
} else {
var l = stringSlices(n, str.slice(n))
l.unshift(str.slice(0, n))
return l
}
}
console.log(stringSlices(3, "abcdefghijklmnopqrstuvwxyz"));
^o^ > node stringSlices2.js [ 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqr', 'stu', 'vwx', 'yz' ]