あなたはロボットではありませんか?で、たまに見るからに単純なパズルを見かける事があるが、あれって意味あるのかなと思う。
まあいままでなら、それを解くプログラムを書くような人は滅多にいなかったかもしれないが、Chat-GPT後の世界では、それも簡単に作れてしまうのかもしれない。
例えばこんな感じ。
まずは、200px × 200px の画像を縦と横に4分割。
これにより50pxで分割された画像が16個できた。
ファイル名をなぜか縦方向につけてしまっているが、これは右方向にしても良いと思う。つづいて、隣り合う画像を推測するためのアルゴリズムを作る。
まあ隣り合う画像はピクセル単位で見れば、まあまあ似てるんじゃないかと思うし、人間がそれを行うとするなら、近接しそうな部分に着目して、つなぎあわせるわけなので、そんな感じのアルゴリズムを考えつつ、CHAT-GPTにプログラムの実装を手伝ってもらうとしよう。
import cv2
import numpy as npnumbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,16]
for num in numbers:
img = cv2.imread('image_'+str(num)+'.png',0)
#下部の類似をはかる
img1 = img[49:50, 0:50]
#右側の類似をはかる
img2 = img[0:50, 49:50]
img2=img2.flatten()
others = [i for i in numbers if i != num]
e={}
d={}
for x in others:
imgb = cv2.imread('image_'+str(x)+'.png',0)
#上部
imgn = imgb[0:1, 0:50]
#左部
imgo = imgb[0:50, 0:1]
imgo=imgo.flatten()
d[x] = np.corrcoef(img1,imgn)[0,1]
e[x] = np.corrcoef(img2,imgo)[0,1]d_list = sorted(d.items(), key = lambda sd : sd[1])
e_list = sorted(e.items(), key = lambda se : se[1])
print('#no.'+str(num))
l,m=d_list[-1]
print("under:"+str(l)+","+str(m))
l,m=e_list[-1]
print("right:"+str(l)+","+str(m))
私が、CHAT-GPTにお願いしたのは、1から16の配列からひとつずつ値を取り出し、それ以外の数値を配列に入れてもらうところ。
隣り合う画像を比較するのに、corrcoefという相関係数を使ったのだが、これは簡単に言えば数列の類似性を数値化してくれるものである。
その辺のアイデアや実装は、引き続きプログラマーが考える部分になるのかもしれない。
で、肝心の結果はこんな感じ。各番号の、下と右を予想している。
#no.1
under:2,0.7685052319741218
right:5,0.989207792314838
#no.2
under:3,0.6333374572621592
right:6,0.998690706867028
#no.3
under:10,0.3726621759299401
right:7,0.9094745593930978
#no.4
under:6,0.8064182721450904
right:8,0.5543870423410759
#no.5
under:6,0.9210849170659833
right:9,0.9864468569755007
#no.6
under:7,0.3182877780591007
right:10,0.9969304112283207
#no.7
under:8,0.7962901311236685
right:11,0.9363548917948018
#no.8
under:1,0.2814161033907845
right:12,0.7581779188301637
#no.9
under:10,0.9053394960334207
right:13,0.9899564700597434
#no.10
under:11,0.4728194225402103
right:14,0.9890637000629602
#no.11
under:12,0.8352856066476022
right:10,0.5707718391196519
#no.12
under:2,0.4626492644652501
right:16,0.8255589979079792
#no.13
under:14,0.9402215618448856
right:9,0.7400994386318248
#no.14
under:2,0.6847762922386988
right:2,0.31493261546174606
#no.16
under:13,0.22993911377342055
right:3,0.39504428749740844
色分けは、数値が0.5以下のものは相関が低いので、ノーカウント黄色(セーフ)のイメージ、青は正解、赤はハズレという判定とみなした。
全体的な正答率としては、いまひとつではあるものの左か下どちらか当たっているものは多いので、アルゴリズムとしてはまあまあかなと思う。
ChatGPTの最初のイメージは、ちょっと面白いが平気で嘘をつく冴えないやつというイメージだったが、夏休みから帰ってきたら、急に賢くなりたちまちクラスの人気者に。
といったところだろうか。
ともかく、ChatGPTは、文章生成や、質問に対する対話的回答だけでなく、プログラミングの作成で大きく影響しそうな感じではある。