ナイツ関数(ボケの方)
Posted feedbacks - Scala
Scalaで。
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | import java.io.{File,FileInputStream,InputStreamReader,BufferedReader}
import scala.util.Random
object LevenshteinDistance {
def distance(a:String, b:String) = {
var t:List[List[Int]] = List.range(a.size, -1, -1).foldLeft(List[List[Int]]())(
(r,i) => i match {
case 0 => List.range(0, b.size + 1)::r
case _ => (i::List.make(b.size, 0))::r
}
)
1.to(t.size - 1).foreach(i =>
1.to(t(i).size - 1).foreach(j =>
t = t.take(i) ++
List(
t(i).take(j) ++
List(
(t(i - 1)(j) + 1)
.min(t(i)(j - 1) + 1)
.min(
t(i - 1)(j - 1) +
((a(i - 1) == b(j - 1)) match { case true => 0; case _ => 1 })
)
) ++
t(i).takeRight(t(i).size - j - 1)
) ++
t.takeRight(t.size - i - 1)
)
)
t.last.last
}
}
class CKnights(f:String, e:String) {
var d:List[String] = List()
val i:BufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(f), e))
val r:Random = new Random
while(i.ready) {
val l:String = i.readLine
if (l != "") d = d:::l.split("\\s+").toList
}
i.close
def translate(s:String)(j:(String,String)=>Boolean):List[String] =
s.split("\\s+").foldRight(List[String]())((w,k) =>
(d.filter(e => j(w, e)) match {
case t if t.isEmpty => w
case t => t(r.nextInt(t.size))
})::k
)
}
object Knights {
def source:List[String] = readLine match {
case null => List()
case l => l::source
}
def main(args:Array[String]):Unit = args.size match {
case a if a != 1 => println("usage: Knights DICTFILE")
case _ => {
var s:List[String] = source
var k:CKnights = new CKnights(args.first, "Shift_JIS")
println("入力:")
s.foreach(l => println(l))
println("出力:")
s.foreach(l => println(
k.translate(l)((w, e) =>
LevenshteinDistance.distance(w, e).toFloat / w.size.max(e.size) < 0.5
).mkString(" ")
)
)
println("出力:")
s.foreach(l => println(
k.translate(l)((w, e) =>
Math.abs(w.size - e.size) <= 1 && w.first == e.first && w.last == e.last
).mkString(" ")
)
)
}
}
}
|

syat
#8549()
[
Other
]
Rating-2/2=-1.00
(ナベアツ算を見てて思いつきました)
入出力の方法は標準入出力や引数・戻り値など、扱いやすい方法でかまいません。
文字単位でランダムに間違えても面白くないので、単語のリストから似た単語の候補を探すようにしてください。英単語でもOKです。単語のリストは参考ページからダウンロードしたものを加工して利用すると良いと思います。(4000個あります)
結果がつまらなくても構いませんが、面白いボケをうむ工夫があると良いです。
※人が考えたボケは求めてませんよ!
入力の例として「どう書く?org」の前文をお借りしました。ご自分でヤホーで調べたりして手ごろな文章を見つけて下しあ。
see: 日本語単語リスト
Rating-2/2=-1.00-0+
[ reply ]