言語処理100本ノック1章をkotlinで解いてみた(6..9)


これの続きです。

06. 集合

“paraparaparadise”と”paragraph”に含まれる文字bi-gramの集合を,それぞれ, XとYとして求め,XとYの和集合,積集合,差集合を求めよ.さらに,’se’というbi-gramがXおよびYに含まれるかどうかを調べよ.
05の続きみたいなもんですね。

fun nGram(tg:List<Char>, n:Int):List<String> {
    val res:MutableList<String> = mutableListOf()
    for (i in 0..(tg.size-n)) {
        res.add(tg.slice(i..(i+n-1)).toString())
    }
    return res.toList()
}

fun main() {
    val s1:String = "paraparaparadise"
    val s2:String = "paragraph"
    val X:Set<String> = nGram(s1.toList(),2).toSet()
    val Y:Set<String> = nGram(s2.toList(),2).toSet()
    val se:String = "[s, e]"
    println("X : ${X}")
    println("Y : ${Y}")
    println("X|Y : ${X+Y}")
    println("X-Y : ${X-Y}")
    println("X*Y : ${X intersect Y}")
    println("se in X : ${se in X}")
    println("se in Y : ${se in Y}")
}
/*OutPut:
X : [[p, a], [a, r], [r, a], [a, p], [a, d], [d, i], [i, s], [s, e]]
Y : [[p, a], [a, r], [r, a], [a, g], [g, r], [a, p], [p, h]]
X|Y : [[p, a], [a, r], [r, a], [a, p], [a, d], [d, i], [i, s], [s, e], [a, g], [g, r], [p, h]]
X-Y : [[a, d], [d, i], [i, s], [s, e]]
X&Y : [[p, a], [a, r], [r, a], [a, p]]
se in X : true
se in Y : false*/

07. テンプレートによる文生成

引数x, y, zを受け取り「x時のyはz」という文字列を返す関数を実装せよ.さらに,x=12, y=”気温”, z=22.4として,実行結果を確認せよ.
これ簡単すぎません?03くらいにでてきてもいい感じ。

fun tmpNewString(x:Int, y:String, z:Double) = "${x}時の${y}は${z}"

fun main() {
    println(tmpNewString(12, "気温", 22.4))
}
//OutPut:12時の気温は22.4

08. 暗号文

与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ.
英小文字ならば(219 - 文字コード)の文字に置換
その他の文字はそのまま出力
この関数を用い,英語のメッセージを暗号化・復号化せよ.
Byteのところでつまってちょっと時間かかりました。やり力って見れば簡単なんですけどねえ。
文指定がないのでreadLine()してます。

fun clipher(s:String):String {
    var rs:String = ""
    val charset = Charsets.UTF_8
    val regex = """[a-z]""".toRegex()
    for (ch in s) {
        if (regex matches ch.toString()) {
            var cc = ch.toChar().toByte()
            rs += byteArrayOf((219-cc).toByte()).toString(charset)
        }
        else {
            rs += ch
        }
    }
    return rs
}

fun main() {
    val inp:String = readLine() ?: return
    val r1 = clipher(inp)
    println(r1)
    println(clipher(r1))
}
/*
InPut:I am kotliner and pythonista.
OutPut:I zn plgormvi zmw kbgslmrhgz.
OutPut:I am kotliner and pythonista.
*/

09. Typoglycemia

fun main() {
    val s1:String = "I couldn’t believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
    val ss:List<String> = s1.split(" ")
    for (s in ss) {
        if (s.length > 4) {
            print(s[0])
            for (x in (2..(s.length)-1).shuffled()) {
                print(s[x-1])
            }
            print(s[s.length-1])
            print(" ")
        }
        else {
            print("$s ")
        }
    }
}

OutPut


ランダムでやってるのでこんなふうに毎回結果が変わるのでぜひやってみてください〜

最後に

楽しかったです!
5,8,9あたりはちょっと時間がかかっちゃったんですけど無事解き終えられました〜
1,2時間で終わるくらいなのでみなさんもぜひチャレンジしてみてください〜