整数の漢数字表記
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))
}
|





にしお
#3394()
Rating0/0=0.00
このお題は匿名での投稿です。 与えられる整数の範囲は一京未満(10000000000000000未満)としたいと思います。 ご投稿ありがとうございます。
2年前のLL Day&Nightの「キミならどう書く」で、 これ専用のCPANモジュールが作られていたような記憶があるので 勝手にPerlからの挑戦状とみなしておきます(笑)
[ reply ]