文字列を指定されたバイト数で分割
良い問題がないかなあと探していたら「どう書く?org」を思い出したのでやってみる。
問題は234。
与えられた文字列を指定されたバイト数以下に分割する関数 splitBytes を書いてください。エンコーディングは実装側の 自由としますが、日本語対応は必須とします。 また、分割した結果の表現方法は、各言語で都合のよいものを 選択して下さい。(リスト,配列,改行区切りなど) [使用例] "あいうえおabcdeかきくけこfghij" -> 30バイト (Shift_JIS) "あいうえおabcdeかきくけこfghij" -> 40バイト (UTF-8) ★Shift_JISで10バイトで分割 splitBytes("あいうえおabcdeかきくけこfghij", 10, "Shift_JIS") => ["あいうえお", "abcdeかき", "くけこfghi", "j"] (10バイト, 9バイト, 10バイト, 1バイト) ★UTF-8で10バイトで分割 splitBytes("あいうえおabcdeかきくけこfghij", 10, "UTF-8") => ["あいう", "えおabcd", "eかきく", "けこfghi", "j"] (9バイト, 10バイト, 10バイト, 1バイト)
間数名がSchemeらしくないので変えているけど完成。
#!/usr/bin/gosh (define (string-split-byte byte . str) (let loop ((s (caar str)) (init "")) (let* ((s1 (make-string 1 (string-ref s 0))) (next (substring s 1 (string-length s))) (s2 (string-append init s1))) (cond [(= (string-size s) 0) init] [(= (string-size next) 0) s2] [(>= (+ (string-size init) 1) byte) (cons s2 (loop next ""))] [else (loop next s2)] )))) (define (main args) (print (string-split-byte 10 (cdr args))) 0)
追記:ちょいと修正 s2の追加。
日本語もOK。
match使った方が良いかな?