OPENAIのCodexがホラーすぎる件について

# OPENAIのCodex

https://beta.openai.com/codex-access

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232003/2880c5b8-45f1-3f8d-613c-75c77a61e882.png)


巷を賑わせている、OPENAIそのCodex betaの利用申請が通りましたので試しに使ってみます。

# テスト

## 入力コード

```Python
"""Online 
This is a module of sequential calculation algorithm
for finding moving average, moving standard deviation
and moving variance in constraints.

    Author:  Hideto Manjo
    Date:    Aug 9, 2020
"""

import time
import random
import numpy as np
```

ここまでを入力します。ちなみにこの元になるコードはオンラインアルゴリズムに従って、逐次的に平均値や標準偏差を計算するモジュールになっています。今回はこのコードの説明の部分とインクルードの部分だけを入力に使いました。つまりあとはAIが適当に作ってみよというわけです。


さあどうなるか？

## Codexが出したコード

いまから、ホラーをお見せしますね。

これまじで出力してきてますからね。

コードを見やすくするために、入力文も含まれています。

`import numpy as np`から下はすべてCodexが出した答えです。

それではどうぞ・・・


```Python

"""Online 
This is a module of sequential calculation algorithm
for finding moving average, moving standard deviation
and moving variance in constraints.

    Author:  Hideto Manjo
    Date:    Aug 9, 2020
"""

import time
import random
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

class Online:
    """Online class
    """

    def __init__(self, n=10):
        """Initialize
        """
        self.n = n
        self.x = np.zeros(n)
        self.mean = 0
        self.var = 0
        self.std = 0

    def update(self, x):
        """Update
        """
        self.x = np.roll(self.x, 1)
        self.x[0] = x
        self.mean = np.mean(self.x)
        self.var = np.var(self.x)
        self.std = np.std(self.x)

    def get_mean(self):
        """Get mean
        """
        return self.mean

    def get_var(self):
        """Get variance
        """
        return self.var

    def get_std(self):
        """Get standard deviation
        """
        return self.std

def main():
    """Main
    """
    n = 10
    x = np.zeros(n)
    mean = 0
    var = 0
    std = 0
    online = Online(n)

    for i in range(n):
        x[i] = random.randint(0, 100)
        online.update(x[i])
        print("x[{}]: {}".format(i, x[i]))
        print("mean: {}".format(online.get_mean()))
        print("var: {}".format(online.get_var()))
        print("std: {}".format(online.get_std()))
        print("")

if __name__ == "__main__":
    main()

```


**もう人間要らなくね？**


なんか普通に動きそうです。

配列をずらす時にnumpy.rollを使ってるところなんかはかなり感心しました。

試しに動かしてみましょう。

## AIが出したコードを実際に動かしてみる

```
x[0]: 6.0
mean: 0.6
var: 3.2400000000000007
std: 1.8000000000000003

x[1]: 23.0
mean: 2.9
var: 48.09000000000001
std: 6.934695379034324

x[2]: 57.0
mean: 8.6
var: 307.44
std: 17.53396703544295

x[3]: 95.0
mean: 18.1
var: 956.2900000000002
std: 30.923938947035843

x[4]: 84.0
mean: 26.5
var: 1287.25
std: 35.878266401820476

x[5]: 14.0
mean: 27.9
var: 1230.69
std: 35.081191541907465

x[6]: 54.0
mean: 33.3
var: 1191.81
std: 34.522601292486634

x[7]: 78.0
mean: 41.1
var: 1219.8899999999999
std: 34.92692371223094

x[8]: 85.0
mean: 49.6
var: 1171.4399999999998
std: 34.226305672683985

x[9]: 60.0
mean: 55.6
var: 900.24
std: 30.003999733368882

```
普通に動きました。恐ろしいです。参りました。

近いうちに人間はコーディングする必要が無くなるでしょう。

使い方によってはこの技術はコーディング速度を飛躍的に高めるはずです。

## 細かな指摘

ところでAI君はなんで

```Python:不使用のインクルード
import pandas as pd
import matplotlib.pyplot as plt
```

**panda**と**pyplot**をインクルードしたんですかね？

少々おかしな挙動も見受けられます。（とりあえずこれをインクルードやってる人多い気もするが・・・）

コレは無駄なんで良い子のみんなは真似しないでね。



# 結論

OPENAIのCodexは噂通りヤバイです。というか途中まで入れて出てくるコードを眺めると冷や汗が出てきます。怖いですコレ。みなさんも是非体験してみてください。

ところで、この記事利用許諾の範囲内ですよね？ミスってたら消します。あまりにもすごすぎるんで、記事を書かざるを得ませんでした。未だ複雑なプログラムは書けないとは思いますが、今回のテストだけでも相当の火力を秘めていることがわかります。

今から将来プログラマーになろうとしてる人は少し情報を集めたほうがいいかも知れませんよコレ。本気で必要なくなる可能性十分にありです。


# 付録：入力に使ったコードの続き

下記は実際に自分が書いていたコードです。ほぼほぼ同じことをやっていますがアルゴリズムは違うことをやっています。

```Python:移動平均、移動標準偏差モジュールとテスト用のメイン関数
"""Online 
This is a module of sequential calculation algorithm
for finding moving average, moving standard deviation
and moving variance in constraints.

    Author:  Hideto Manjo
    Date:    Aug 9, 2020
"""

import time
import random
import numpy as np


class Online:

    def __init__(self):
        self.K = 0
        self.n = 0
        self.Ex = 0
        self.Ex2 = 0

    def add_variable(self, x):
        if (self.n == 0):
            self.K = x
        self.n += 1
        self.Ex += x - self.K
        self.Ex2 += (x - self.K) * (x - self.K)

    def remove_variable(self, x):
        self.n -= 1
        self.Ex -= (x - self.K)
        self.Ex2 -= (x - self.K) * (x - self.K)

    def get_mean(self):
        return self.K + self.Ex / self.n

    def get_variance(self):
        return (self.Ex2 - (self.Ex * self.Ex) / self.n) / self.n


if __name__ == '__main__':
    # The main function is for calculation validation.
    TOTAL_NUM = 100
    cnt = 0
    data = [0] * TOTAL_NUM
    y = np.array([])


    online = Online()

    for i in range(200):

        val = random.random()

        s = time.time()
        if len(y) == TOTAL_NUM:
            y = np.delete(y, 0)
        y = np.append(y, val)
        print("Numpy : {:f}, {:f}, {:f}, time: {:.3f} ms"
              .format(y.mean(), y.std(), y.var(), (time.time() - s) * 1000))

        s = time.time()
        if cnt == TOTAL_NUM:
            cnt = 0

        if online.n == TOTAL_NUM:
            online.remove_variable(data[cnt])
        data[cnt] = val
        online.add_variable(data[cnt])

        average = online.get_mean()
        var = online.get_variance()

        print("Online: {:f}, {:f}, {:f}, time: {:.3f} ms"
              .format(average, np.sqrt(var), var, (time.time() - s) * 1000))

        cnt += 1

```

今回の例は特殊な計算をして高速化しているので、こちらのほうが速い（はず）ですが、AIの計算はかなり正攻法と言えます。
コードもAIの方が見やすいですよねｗ・・・、既に負けた感あり。