challenge 整数の漢数字表記

キーボードから正の整数を入力すると、それを漢数字で表示するプログラムを作ってください☆ 例えば「1732050807568877」なら「千七百三十二兆 五百八億 七百五十六万 八千八百七十七」といった感じです☆ 「一七三二兆 〇五〇八億 〇七五六万 八八七七」ではダメですよ^^;

このお題は匿名での投稿です。 与えられる整数の範囲は一京未満(10000000000000000未満)としたいと思います。 ご投稿ありがとうございます。

2年前のLL Day&Nightの「キミならどう書く」で、 これ専用のCPANモジュールが作られていたような記憶があるので 勝手にPerlからの挑戦状とみなしておきます(笑)

Posted feedbacks - Scala

日本語コケるのでエスケープしてます。こういうときのためにソースコードのASCII以外をエスケープするスクリプトを作ってあるのですが、役に立ちました。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
object num2K {
  val table = Map(0->"", 1->"\u5341",2->"\u767e",3->"\u5343",4->"\u4e07",8->"\u5104",12->"\u5146",16->"\u4eac")
  val table2 = Map(0->"",1->"\u4e00",2->"\u4e8c",3->"\u4e09",4->"\u56db", 5->"\u4e94", 6->"\u516d", 7->"\u4e03", 8->"\u516b", 9->"\u4e5d")
  def apply(num:long):String = {
    if(num == 0) return "\u96f6"
    val lst = num.toString.reverse.map(x=>Integer.parseInt(x+""))
    (0 to lst.length-1).foldLeft(List("")){(r, i) => 
      if(table.contains(i)) {
        table2(lst(i))+table(i)+(if(i>3){" "}else{""})::r
      }else if(lst(i) > 1){
        table2(lst(i))+table(i%4)::r
      }else if(lst(i) != 0){
        table(i%4)::r
      }else{
        r
      }
    }.mkString("")
  }
}

print(">>")
println(num2K(readLong))

ミスってたので修正。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
object num2K {
  val table = Map(0->"", 1->"\u5341",2->"\u767e",3->"\u5343",4->"\u4e07",8->"\u5104",12->"\u5146",16->"\u4eac")
  val table2 = Map(0->"",1->"\u4e00",2->"\u4e8c",3->"\u4e09",4->"\u56db", 5->"\u4e94", 6->"\u516d", 7->"\u4e03", 8->"\u516b", 9->"\u4e5d")
  def apply(num:long):String = {
    if(num == 0) return "\u96f6"
    val numStr = num.toString.reverse.mkString("")
    val lst = numStr.map(x=>Integer.parseInt(x+""))

    (0 to lst.length-1).foldLeft(List("")){(r, n) => 
      val i = (if(table.contains(n)){n}else{n%4})
      val sep = (if(i>3){" "}else{""})
      val v = lst(n)
      if(v==0 && i>3 && !numStr.substring(n).startsWith("0000")) 
        table(i)::sep::r
      else if(v > 1 || (i > 3 && v == 1))
        table2(v)+table(i)::sep::r
      else if(v > 0)
        (if(table(i) == ""){table2(v)}else{table(i)})::sep::r
      else
        r
    }.mkString("").trim
  }
}

while(true) {
  print(">>")
  println(num2K(readLong))
}

Index

Feed

Other

Link

Pathtraq

loading...