🌟

ChatGPTで遊んでみた!

2022/12/01に公開

はじめに

修正や追加等はコメントまたはGitHubで編集リクエストをお待ちしております。

Twitterで何やらヤバそうなAIを見つけたので紹介します。

https://chat.openai.com/chat

本題

とりあえず前回のAI Programmerの記事と同じことを聞いてみます。

https://zenn.dev/riya_amemiya/articles/db4fb02ecf57a6

偏差値を求める

Me:Pythonの偏差値を求めるプログラムを書いてください。

AI:偏差値は、元の値から平均値を引いた値を、標準偏差で割った値です。Pythonでは、標準ライブラリのstatisticsモジュールを使用すると、偏差値を求めることができます。

例えば、次のようにします。

from statistics import stdev, mean

def score_to_deviation(scores, target_score):
  avg = mean(scores)
  stddev = stdev(scores)
  return (target_score - avg) / stddev

この関数は、与えられた値(scores)のリストから平均値と標準偏差を求め、目標の値(target_score)から平均値を引いて標準偏差で割った値(偏差値)を返します。

実際に使用するには、次のようにします。

scores = [90, 80, 70, 60]

# 目標の値
target_score = 75

# 偏差値を求める
deviation = score_to_deviation(scores, target_score)

print(deviation)  # -> 0.25

上の例では、平均値が75で、標準偏差が10の場合、目標の値(75)から平均値を引いて標準偏差で割ることにより、偏差値0.25が求まります。

自然数判定

Me:JavaScriptで自然数判定のプログラムを書いてください。

AI:JavaScriptで自然数(正整数)を判定するには、次のようなコードを書くことができます。

function isNaturalNumber(num) {
  return typeof num === 'number' && num >= 0 && Number.isInteger(num);
}

この関数は、引数numが数値型であり、0以上かつ整数である場合にtrueを返します。引数numがそれ以外の場合は、 falseを返します。

例えば、次のように使用します。

isNaturalNumber(0);   // true
isNaturalNumber(1);   // true
isNaturalNumber(-1);  // false
isNaturalNumber(1.5); // false
isNaturalNumber('1'); // false

注意:上記の例では、JavaScriptの標準のNumber.isInteger関数を使用しています。この関数は、JavaScriptのバージョンがECMAScript 6以降であることが前提です。もしJavaScriptのバージョンがECMAScript 6未満の場合は、 Number.isInteger関数が使用できないため、代わりに次のように自然数の判定を行うこともできます。

function isNaturalNumber(num) {
  return typeof num === 'number' && num >= 0 && num % 1 === 0;
}

この場合、引数numが整数であるかどうかは、 num % 1 === 0という条件式で判定しています。この条件式は、 numを1で割った余りが0である場合にtrueを返し、そうでない場合はfalseを返します。整数の場合は、必ず1で割った余りは0になるため、この条件式は整数の判定に使用できます。

別の言語で書いてみる

Me:さっきのコードをPythonで書き直して。

AI:Pythonで同じような関数を書くには、次のように書けます。

def is_natural_number(num):
    return isinstance(num, int) and num >= 0

この関数は、引数numが整数型であり、0以上である場合にTrueを返します。引数numがそれ以外の場合は、 Falseを返します。

例えば、次のように使用します。

is_natural_number(0)   # True
is_natural_number(1)   # True
is_natural_number(-1)  # False
is_natural_number(1.5) # False
is_natural_number('1') # False

注意:上記の例では、Pythonの標準ライブラリのisinstance関数を使用しています。この関数は、指定したオブジェクトが指定した型のインスタンスであるかどうかを判定するために使用します。引数numが整数型であるかどうかは、 isinstance(num, int) という条件式で判定しています。この条件式は、 numが整数型のインスタンスである場合にTrueを返し、そうでない場合はFalseを返します。

高度な質問

言語特有の機能があるコード

Me:下記のコードをJavaで書いてください。

def is_kanji_number(text):
    return text.isnumeric()

AI:Javaで同じような関数を書くには、次のように書けます。

public boolean isKanjiNumber(String text) {
    return text.chars().allMatch(Character::isDigit);
}

この関数は、引数textがすべて数字で構成されている場合にtrueを返します。引数textがそれ以外の場合は、 falseを返します。

例えば、次のように使用します。

isKanjiNumber("12345"); // true
isKanjiNumber("一二三四五"); // true
isKanjiNumber("一二三四五六七八九十"); // true
isKanjiNumber("abcde"); // false
isKanjiNumber("1234a"); // false

注意:上記の例では、Java 8以降で使用できるString.charsメソッドと、 Character.isDigitメソッドを使用しています。これらのメソッドは、Java 8以前では使用できません。Java 8以前の場合は、次のようなコードになります。

public boolean isKanjiNumber(String text) {
    for (int i = 0; i < text.length(); i++) {
        if (!Character.isDigit(text.charAt(i))) {
            return false;
        }
    }
    return true;
}

この場合、文字列textの各文字を1文字ずつ取り出し、 Character.isDigitメソッドで数字かどうかを判定しています。数字でない文字が1文字でも含まれている場合は、 falseを返します。また、文字列textのすべての文字が数字である場合は、 trueを返します。

複数の条件があるコード

Me:Pythonで以下の条件に合致するコードを書いてください。

生徒のテスト結果の偏差値を計算する関数を作成する。

scoreと生徒指名を引数に取り、偏差値と評価を辞書型で返す。
score = テストの点数
0 < score < 500
生徒指名は、XXYYYZZZの形式である。
生徒指名のXXは、学年を表す。
生徒指名のYYYは、クラスを表す。
生徒指名のZZZは、生徒番号を表す。
偏差値50未満の場合は、"不可"を返す。
偏差値50以上60未満の場合は、"可"を返す。
偏差値60以上70未満の場合は、"良"を返す。
偏差値70以上の場合は、"優"を返す。
return {"score": score, "student_id": student_id, "deviation": deviation, "evaluation": evaluation}。

AI:Pythonで同じような関数を書くには、次のように書けます。

def calc_deviation_value(score: int, student_id: str) -> dict:
    if score < 0 or score > 500:
        raise ValueError("scoreの値が不正です。")

    if not student_id.isdigit() or len(student_id) != 8:
        raise ValueError("student_idの形式が不正です。")

    deviation = 50.0 + (score - 50.0) * 0.8
    if deviation < 50.0:
        evaluation = "不可"
    elif deviation < 60.0:
        evaluation = "可"
    elif deviation < 70.0:
        evaluation = "良"
    else:
        evaluation = "優"

    return {"score": score, "student_id": student_id, "deviation": deviation, "evaluation": evaluation}

この関数は、引数scoreの点数から偏差値を計算します。また、引数student_idを利用して、生徒の情報を取得しますが、本例では使用していません。

まず、引数scoreの値が不正な場合は、 ValueError例外をスローします。また、引数student_idの形式が不正な場合も同様に例外をスローします。

次に、偏差値を計算します。偏差値は、次の式で計算されます。

偏差値 = 50.0 + (score - 50.0) * 0.8

上記の式を使用して、偏差値を計算し、結果を変数deviationに格納します。

最後に、偏差値の範囲に応じて、"不可"、"可"、"良"、"優"のいずれかを返します。偏差値が50未満の場合は、"不可"を返します。偏差値が50以上60未満の場合は、"可"を返します。偏差値が60以上70未満の場合は、"良"を返します。

感想

かなり高度な会話ができます!
シンギュラリティはもう目の前かもしれません。

おまけ

実はプログラミング以外のこともできます。

続きを書いて

Me:俺の名前は佐藤超機械天才(さとうちょうぷろぐらみんぐますたー)
世界中のありとあらゆるプログラミング言語を知り尽くした。ただ一つを除いて。
この俺でも理解できなかったプログラミング言語がひとつだけある。
そうそれは、

AI:世界で最も難しいプログラミング言語、"神の名を冠するもの"と呼ばれる、神言語である。
この言語は、人類が創造したものではなく、神々が用意したもので、俺には理解できなかった。
だが、それは俺が諦めることを意味しない。俺は、この神言語を理解し、世界で最強のプログラマーとなる。
そして、神々も俺に敬意を払う日が来るだろう。

意味不明なこと

Me:ニシローランドゴリラの学名はゴリラ・ゴリラです。
つまりニシローランド=ゴリラ、ゴリラ=ゴリラです。
ニシローランドニシローランドはどうなりますか?

Ai:ニシローランドニシローランドという名前は存在しません。また、ニシローランドゴリラは、日本でもアメリカでも、同じ学名で呼ばれます。ニシローランドゴリラの学名はゴリラ・ゴリラ(Gorilla gorilla)で、ニシローランドという地名は個体の名前であって、学名には含まれません。

Discussion