challenge 文字列の均等分割

一行の文字列を指定した数の行にできるだけ文字数が均等になるように分割してください.
ただし,除算や剰余算を使わないで書いてみてください.

sample = "ゆめよりもはかなき世のなかをなげきわびつゝあかしくらすほどに四月十よひにもなりぬれば木のしたくらがりもてゆく"

divid 4 sample =>
 "ゆめよりもはかなき世のなかを"
 "なげきわびつゝあかしくらすほ"
 "どに四月十よひにもなりぬれ"
 "ば木のしたくらがりもてゆく"

divid 5 sample => 
 "ゆめよりもはかなき世の"
 "なかをなげきわびつゝあ"
 "かしくらすほどに四月十"
 "よひにもなりぬれば木の"
 "したくらがりもてゆく"

divid 6 sample => 
 "ゆめよりもはかなき"
 "世のなかをなげきわ"
 "びつゝあかしくらす"
 "ほどに四月十よひに"
 "もなりぬれば木のし"
 "たくらがりもてゆく"

この問題は、除算だけでははく算術演算とか、文字列の長さをstrlenの類いで測るとかをしなくても、多分書けるのではないかと思います。

Posted feedbacks - Scala

0からnumまでの無限リスト(num=4なら0,1,2,3,0,1,2,3...)を作成し、文字列の長さ分takeします。

そのリスト中のnの出現回数を求めると分割後のn個目要素の文字数になります。

ちゅーか、無限リストをライブラリで用意するならcycleとかrepeatくらい提供してほしい・・・

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
def cycle[A](s:Iterable[A]):Stream[A] = {
  def rep[A](s:Stream[A], p:int):Stream[A] = {
    val n = (if(p<s.size){p}else{0})
    Stream.cons(s(n), rep(s, n+1))
  }; rep(s.toStream,0)
}

def divid(num:int, str:String) = {
  val table = (Array.make(num, 0) /: cycle(0 until num).take(str.length)){(r,n) =>
    r(n) = r(n)+1;r
  }
  val result = new Array[String](num)
  (str /: (0 until num)){(s,n) =>
    result(n) = s.substring(0, table(n))
    s.substring(table(n))
  }
  result
}

Index

Feed

Other

Link

Pathtraq

loading...