簡単で高速な実用プログラミング言語「Kuin」を使ってみた(かった)

簡単で高速な実用プログラミング言語「Kuin」を使ってみた(かった)

この記事はKogakuin Univ Advent Calendar 2019 3日目です。 これを読んだそこのあなたは参加登録してください。

はじめまして。umechanです。 普段は情報系のあれこれを広く浅く嗜んでいます。

さてさて、今回の記事で紹介するのは、簡単で高速な実用プログラミング言語「Kuin」!!! 今はじめて名前を聞いたという方も多いと思いますので、まずはざっくりとKuinの説明をします。

「Kuin」とは?

「Kuin」は、「くいなちゃん」(6さいのおんなのこ)によって開発されているプログラミング言語です。 マジです。公式がそう言っているので間違いありません。

一体全体くいなちゃんって何者なんだ?、と気になった方はくいなちゃん学園Twitterを見てみましょう! (ここでは割愛します)

Kuinは、公式ホームページの解説が質と量を兼ね備えています。 ほとんどの疑問はこのページを見るだけで解決するでしょう。 この記事でも、「公式見てね」とブン投げる部分が多々あります。

Kuinの特徴

では、そろそろ本題に入っていきましょう。 まずは、Kuinの特徴について、公式の紹介ページを見てみましょう。

f:id:hard_thick_and_a_lot:20191203023556p:plain

簡単にまとめると、簡単・高速・ゲーム向き でしょうか? 筆者はゲームを自作したことがないので、ゲーム部分の知識には疎いのですが、 なんとなくDXライブラリと似たような感じなのかな?と感じました。

Kuinの言語仕様

Kuinの言語仕様については、公式に詳細な解説が載っています。

あいにく、私は他言語の言語仕様について詳しくないので正確な比較はできませんが、比較的きつめの規則であると感じました。 特に命名規則はかなりきちっと定まっていて、ソースコード名までルールが定まっています。 自分が触った言語の中でこのような規則があるのはKuinのみです。経験値が少ないだけ

そんなことより、Kuinの言語仕様にはひとつ、絶対に注目しておきたいポイントがあります。 先述の解説ページには、「Kuinではどのように書くか」だけでなく、「なぜKuinではこう書くようにしたのか」 つまり、言語仕様の設計理由についても書かれている点です。

他言語を触ったことがあると、「Kuinではこう書くのか、面倒だなぁ」と思うことが多々ありますが、 解説を読むと、そのように書くように至った理由が理解・納得できるだけでなく、言語仕様についての勉強にもなります。 たとえば、Kuinでは代入演算子::で表されますが、まずみなさんは「????」と感じたと思います。 しかし、以下のような解説を読めば、

f:id:hard_thick_and_a_lot:20191203023611p:plain

なるほど。そんな事情があったのか。と納得できますね。

Kuinを使ってみる

さてさて、Kuinの説明はこのくらいにして、実際にKuinを使ってみましょう。 しかし、私はゲーム作成については何もわかりません。さて何を書こうか……

ん?簡単?高速?じゃあ最近話題の競技プログラミングで使えるのでは……? ちょっとAtCoder解いてみるか……

f:id:hard_thick_and_a_lot:20191203024215p:plain

どうやらAtCoderではKuinは提出できないらしいです。困った。どうにかならないかな。 と思って色々調べてみたら、なんと!yukicoderではKuinが提出できるではありませんか! 早速やってみましょう!

「Kuin」で競プロをやってみる。

yukicoderには、「初心者のためのガイド」というページがあります。 まずはこれを解いていきましょう。

No.9000 Hello World! (テスト用)

Hello World!を標準出力に出力してください。

なるほど。いつものやつね。じゃあ、さっくり書いていきましょう。はいできた。 こちらが完成版のコードでございます。





実は、Kuinでは1文字もコードを書かずに実行すると、

Hello World! を表示するプログラムになります。 楽勝だぜ!と0バイトのファイルを提出しようとしたけど提出できませんでした。おしまい。

仕方ないので、まっとうに解く方法を調べます。

まずは標準出力のやり方を調べます。ホームページを見てみると、cui@print()という関数を見つけました。 これを使えば良さそうですね。

じゃあ、こんな感じかな?

func main()
    do cui@print("Hello World!")
end func

ローカルで実行、結果ヨシ!提出だ提出!!

f:id:hard_thick_and_a_lot:20191203023628p:plain

???えっ?????何が悪いんだ・・・と悪戦苦闘すること30分

f:id:hard_thick_and_a_lot:20191203023635p:plain

あっ 企画倒れだ お疲れ様ですた。

まとめ

いかがでしたか?今回はKuinについて調べてみました! 残念ながら使い方はわかりませんでした!証明は読者への演習問題とします。 ではまたどこかで会いましょう!Advent Calender はまだまだ続くので、そちらもお楽しみに!










、となるのも寂しいので、2019-12-03現在提出はできていませんが、チュートリアルの問題をKuinで解いたので載せておきます。ローカルでサンプルは通したから多分大丈夫なはず。

No.480 合計

1からNまでの合計を求めてください

なるほど、今回は標準入力を取るんだな。えーと、関数はcui@input()か。これは[]charだからintに変換しないといけないな。 この書き方、なんか既視感あるような。

printするときは"\{(変数)}"を使うのね。把握した。

解答例:

func main()
    var n: int :: cui@input().toInt(&)
    var ans: int :: (1 + n) * n / 2
    do cui@print("\{ans}\n")
end func

はい次。

No.9001 標準入出力の練習問題(テスト用)

整数A,Bと文字列Sが与えられるので、 A+Bの結果と Sの文字列を半角空白区切りで出力してください。

なるほど。cui@input()は行の最後までまとめて取るから." "でsplitする必要がありますね。 こんな感じかな。

解答例:

func main()
    var l: [][]char :: cui@input().split(" ")
    var a: int :: l[0].toInt(&)
    var b: int :: l[1].toInt(&)
    var sum: int :: a + b
    var s: []char :: cui@input()
    
    do cui@print("\{sum} \{s}")
    
end func

次。

No.9002 FizzBuzz(テスト用)

わーいみんな大好きFizzBuzzだ。 実は、さっきのHello World!と同様にKuinではFizzBuzzを簡単に書くことができます。ぽん。

f

はいこちら。1-100まででFizzBuzzするコードです。しかし、今回の問題では1-NまででFizzBuzzしなければいけません。ざんねん、今回は使えませんね。 じゃあまっとうに書きましょう。

func main()
    var n: int :: cui@input().toInt(&)
    for i(1, n)
        if(i % 15 = 0)
            do cui@print("FizzBuzz\n")
        elif(i % 3 = 0)
            do cui@print("Fizz\n")
        elif(i % 5 = 0)
            do cui@print("Buzz\n")
        else
            do cui@print("\{i}\n")
        end if
    end for
end func

いつものでした。

No.9008 空白区切りで与えられる数値データの合計値を求める(テスト用)

N個の数値データが入力されるのでそれらの値の合計を求めてください。

空白区切りのものを扱う練習ですね。さっきと同じかな。 そういえばKuinの配列は動的配列ですね。要素数を書かなくてもいいのは個人的にちょい新鮮

func main()
    var n: int :: cui@input().toInt(&)
    var c: [][]char :: cui@input().split(" ")
    var ans: int
    for i(0, n - 1)
        do ans :+ c[i].toInt(&)
    end for
    do cui@print("\{ans}\n")
end func

おわり。

No.9009 改行区切りで与えられる数値データの合計値を求める(テスト用)

N個の数値データが入力されるのでそれらの値の合計を求めてください。

入力が改行区切りになっただけですね。

func main()
    var n: int :: cui@input().toInt(&)
    var ans: int
    for i(0, n - 1)
        do ans :+ cui@input().toInt(&)
    end for
    do cui@print("\{ans}")
end func

ここまででチュートリアルは終わりです。少々物足りないので、もう一問やってみましょう。

No.46 はじめのn歩

1歩でぴったりaセンチメートル歩ける。bセンチメートルの区間を歩くのに最小で何歩歩く? なお、区間はオーバーしても良い。

なるほど。b/aを切り上げすれば良さそうだな。切り上げの関数を調べてみよう。 ……あった!lib@ceilを使おう。floatにする必要があるな。ぽん。

func main()
    var n: [][]char :: cui@input().split(" ")
    var a: float :: n[0].toFloat(&)
    var b: float :: n[1].toFloat(&)
    var ans: float :: lib@ceil(b / a)
    do cui@print("\{ans}")
end func

ほんとうのまとめ

Kuinを用いて、競技プログラミングチュートリアルを解くことができた(かもしれません)。 もしあれば次回は、もう少し発展した問題にKuinを用いて挑戦してみたいと思います。

ここまで読んで頂き、ありがとうございました!少しでも興味を持った方は、是非一緒にくいなちゃんを愛でるKuinを使ってみましょう!

Kogakuin Univ Advent Calendar 2019はまだまだ続きます!こちらもお楽しみに!