🔖

AI Programmerで遊んでみた

2022/10/03に公開

はじめに

コード内のコメントはAIが書いたものではなく、私が入力したものです。
コードはAIが書いたものをそのまま貼り付けています。

本題

面白そうなサービスをTwitterで見つけたのでレポートします。
「また海外ですか、私英語できません。」って方、安心してください!
日本製です!
日本語でOKです!

https://aiprogrammer.hashlab.jp/

早速書かせてみる

JavaScript

//配列の平均値を求める関数

function average(arr) {
  var sum = 0;

  for(var i = 0; i < arr.length; i++) {
    sum += arr[i];
  }

  return sum / arr.length;
}

うーんvarになってしまいました。
varはゴミゴミのゴミなのでES6と付け加えてみます。

//ES6以上で配列の平均値を求める関数

const average = arr => arr.reduce((a, b) => a + b, 0) / arr.length;

いい感じに出力できました。
JavaScriptを指定した際はES6以上などの文言を入れた方がいいかもしれません。

Python

# 配列の平均値を求める関数

def average(arr):
sum = 0
for i in range(0, len(arr)):
sum += arr[i]
return sum / len(arr)

長いし、インデントがずれてます。

Ruby

# 配列の平均値を求める関数

def average(array)
sum = 0
array.each do |element|
sum += element
end
sum / array.length
end

長い!

Go

//配列の平均値を求める関数

func average(arr []int) int {
sum := 0
for _, v := range arr {
sum += v
}
return sum / len(arr)
}

Python,Ruby,Goのコードは同じですね。
どの言語も2~3行で書けるのに、冗長的なコードになってしまっています。

PHP

//配列の平均値を求める関数

<?php

function get_average($arr) {
return array_sum($arr) / count($arr);
}

?>

PHPは短くなりましたね。

複雑な指示出してみた

自然数判定

JavaScript
//自然数かどうか判定する関数

function isNatural(num) {
return num >= 0;
}

小数点もOKになってしまいました。

偏差値

JavaScript
//偏差値を求める関数

function getDeviation(arr) {
var mean = getMean(arr);
var deviations = arr.map(function(num) {
return num - mean;
});
return getMean(deviations);
}

謎の getMean が出てきました。

電卓

JavaScript
//文字列を解析して足し算、引き算、掛け算、割り算ができる電卓を作って

var calculator = {
add: function(x, y) {
return x + y;
},
subtract: function(x, y) {
return x - y;
},
multiply: function(x, y) {
return x * y;
},
divide: function(x, y) {
return x / y;
}
};

使い物になりません。

まとめ

AI Programmerは非常に面白いサービスです。
日本語に対応しているのが一番の魅力ですね。
今後のアップデートに期待です。

おまけ

GitHub Copilotにも書いてもらいました。

JavaScript
//配列の平均値を求める関数

const average = arr => arr.reduce((a, b) => a + b, 0) / arr.length;
Python
# 配列の平均値を求める関数

def average(arr):
    return sum(arr) / len(arr)
Ruby
# 配列の平均値を求める関数

def average(array)
    array.sum / array.length
end
Go
// 配列の平均値を求める関数

func average(arr []int) int {
    return sum(arr) / len(arr)
}
PHP
// 配列の平均値を求める関数

<?php
function average($arr) {
    return array_sum($arr) / count($arr);
}
?>
JavaScript
//偏差値を求める関数

const calc = (score) => {
    return (score - 50) / 10;
}
JavaScript
//自然数かどうか判定する関数
const isNaturalNumber = (num) => {
    return Number.isInteger(num) && num > 0;
}
JavaScript
//文字列を解析して足し算、引き算、掛け算、割り算ができる電卓を作って

function calculator(str) {
    let result = 0;
    let operator = '+';
    let num = 0;
    for (let i = 0; i < str.length; i++) {
        if (str[i] === '+' || str[i] === '-' || str[i] === '*' || str[i] === '/') {
            if (operator === '+') {
                result += num;
            } else if (operator === '-') {
                result -= num;
            } else if (operator === '*') {
                result *= num;
            } else if (operator === '/') {
                result /= num;
            }
            operator = str[i];
            num = 0;
        } else {
            num = num * 10 + parseInt(str[i]);
        }
    }
    if (operator === '+') {
        result += num;
    } else if (operator === '-') {
        result -= num;
    } else if (operator === '*') {
        result *= num;
    } else if (operator === '/') {
        result /= num;
    }
    return result;
}

Copilotの方は掛け算と割り算ができないですね。惜しいです。

おまけ2

ではなく構文を使うと別言語で書けるらしいです。

Java
// C++ではなくJavaで配列の平均値を求める関数を作って

public class Main {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5};
int sum = 0;
for (int i = 0; i < array.length; i++) {
sum += array[i];
}
int average = sum / array.length;
System.out.println(average);
}
}

執筆時点ではまだJavaは対応してないのにかけてしまいました。
(public class Main までは私が書いてます)
シンプルに驚きました。

おまけ3

コードを日本語で説明してくれるらしいので、試してみます。
スタイリングの関係でコメントアウトしています。

TypeScript
const getDecimalLength = (value: number) => {
let x = (value + '').split('.')[1];
if (typeof x !== 'undefined' && x.length > 0) {
return x.length;
}
return 0;
};

//数値から小数点以下の桁数を取得する関数です。
Assembly
.section __TEXT,__text,regular,pure_instructions
.build_version macos, 12, 0 sdk_version 12, 3
.globl __Z3addii ## -- Begin function _Z3addii
.p2align 4, 0x90
__Z3addii: ## @_Z3addii
.cfi_startproc
## %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
movl %edi, -4(%rbp)
movl %esi, -8(%rbp)
movl -4(%rbp), %eax
addl -8(%rbp), %eax
popq %rbp
retq
.cfi_endproc
## -- End function
.subsections_via_symbols

# このコードは、2つの整数を加算する関数を定義しています。

gccで作成したアセンブリですがしっかりと説明してくれています。

Discussion