LoginSignup
1
0

More than 5 years have passed since last update.

PPAP + Kotlin

Last updated at Posted at 2016-12-02

関数型言語の学習をしようと思ったのですがいいネタがなくて...
(結局PPAPに...)

関数型言語

考え方はこちらを参考に
関数型プログラミングはまず考え方から理解しよう

ちょっと自分には難しかったです:cry:w

とりあえず実装&実行

PPAP.kts
import java.util.*

val ppap = listOf("I have a ✏️", "I have a 🍍", "I have an 🍎", "I have a ✏️")

fun getPPAP(count : Int) : String {
    println(ppap[count])
    return ppap[count]
}

fun compile() {
    var list = mutableListOf("")
    while(true) {
        list.add(getPPAP(Math.abs(Random().nextInt() % 3)))
        if( list.takeLast(4).equals(ppap) ) {
            println("PEN_PINEAPPLE✏️🍍 , APPLE_PEN✏️🍎")
            break
        }
    }
}

compile()

これを関数型といっていいのかはわかりませんが....
オブジェクト指向を出るのをめざしてw

list

val ppap = listOf("I have a ✏️", "I have a 🍍", "I have an 🍎", "I have a ✏️"

ペンは使い回すので1つでいいかなと思ったんですが、後々つかうので、4つ定義しました

getPPAP

fun getPPAP(count : Int) : String {
    println(ppap[count])
    return ppap[count]
}

そのままですね
メソッド内でメンバー変数を変更すると関数型じゃないそうなので...メンバー変数の参照だけ

compile

fun compile() {
    var list = mutableListOf("")
    while(true) {
        list.add(getPPAP(Math.abs(Random().nextInt() % 3)))
        if( list.takeLast(4).equals(ppap) ) {
            println("PEN_PINEAPPLE✏️🍍 , APPLE_PEN✏️🍎")
            break
        }
    }
}

空のlist作って、addしていってます
(乱数は、0~2の間で出力します。マイナスも来るので絶対値にします)
最後から4つを調べて、PPAPだったら終了です
この終了の判断を簡単にするために、上のようなppaplistを作りました

結果

I have a ✏️
I have an 🍎
I have an 🍎
I have an 🍎
I have a 🍍
I have a 🍍
I have a ✏️
I have a ✏️
I have a ✏️
I have a 🍍
I have an 🍎
I have a ✏️
PEN_PINEAPPLE✏️🍍 , APPLE_PEN✏️🍎
[Finished in 3.1s]

ふむ!いい感じ

レベルアップ

PPAP_fixed.kts
import java.util.*

Random().let {
    val ppap = listOf("✏️", "🍍", "🍎", "✏️")
    generateSequence { ppap[Math.abs(it.nextInt() % 3)] }
            .fold(mutableListOf(""), { a, b ->
                println("I have " + (if (b.equals("🍎")) "an " else "a ") + b)
                a.add(b)
                if (a.takeLast(4).equals(ppap)) {
                    println(ppap.reduce { a, b -> a + b })
                    return@let
                }
                a
            })
}

generateSequence

簡単にいうと次の値を渡してくれますw
今回は、「papp[(乱数)]をどんどん渡して行く」という感じです

fold

イメージは引数付きのreduceです

fold(mutableListOf(""), { a, b -> a}

今回のをわかりやすくするとこんな感じです
初期値で空listmutableListOf("")を渡しています
その空listが引数aに渡されます
引数bには先ほどのpapp[(乱数)]の文字が渡されます
返り値として、最後にaを渡してあげます

三項演算子

javaで使いやすかった三項演算子がKotlinにはないらしく引っかかりました

b.equals("🍎") ? "an " : "a "
// b = "🍎" -> an
// b != "🍎" -> a

Kotlinは、ifが式なので、三項演算子はないとのこと....

if (b.equals("🍎")) "an " else "a "

終了

if (a.takeLast(4).equals(ppap)) {
    println(ppap.reduce { a, b -> a + b })
    return@let
}

return@letRandom().letに戻り終了します

感想

レベルアップは、一旦コードを参考にさせてもらって、理解する方法をとりました
結局調べてもRandom().let{}letがわからなかったですw
もしかしたら、理解のミスがあるかもしれないけれど、処理は追うことができたのでよかったです

参考

Kotlinのリスト操作関数まとめ
Kotlinでズンドコキヨシ
ズンドコキヨシ Kotlin

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0