2D List(2次元配列)のソートルーチンをChatGPTに書かせてみました。1,000項目のソートで0.6秒(MacBook Air M2)、10,000項目のソートで329秒(MacBook Air M2)。
そのままでは使い物にならないので、listの持ち方を変えて高速化対応を行い、10,000項目のソートで0.32秒まで速くなりました。
Cocoaの機能を利用して10,000項目の2D Listソートすると、0.08秒ほど(MacBook Air M2)でしたが、Cocoaでソートする場合にはList中にアプリケーションのオブジェクト情報を入れられないので、Vanilla Scriptのソートルーチンもそれなりに高速なものをそろえておく必要があります。
ChatGPTにソートルーチンを書かせてみたら、AppleScriptのListは遅いとか言い訳をしだしたので、「こうしたら速くなるよ、100倍ぐらい」と言い返したら、少しマシな内容を返してきました。人間だと思って相手をすると腹が立ちますが、人間だと思わず、あらかじめ正解を知っていればそちらに誘導するぐらいはできそうです。
AppleScript名:Chat GPTに書かせたQuickSort(昇順・降順ソート_高速化改造版)2D.scpt |
use AppleScript use scripting additions use framework "Foundation" script spd property aList : {} end script set (aList of spd) to {} repeat 10000 times set end of (aList of spd) to {(random number 1000 from 1 to 9999), (random number 1000 from 1 to 9999)} end repeat –昇順ソート set a1Dat to current application’s NSDate’s timeIntervalSinceReferenceDate() set sortedList to quickSort2DArray((aList of spd), 2, true) –ソート set b1Dat to current application’s NSDate’s timeIntervalSinceReferenceDate() set c1Dat to b1Dat – a1Dat –降順ソート set a2Dat to current application’s NSDate’s timeIntervalSinceReferenceDate() set sortedList to quickSort2DArray((aList of spd), 2, false) –ソート set b2Dat to current application’s NSDate’s timeIntervalSinceReferenceDate() set c2Dat to b2Dat – a2Dat display dialog (c1Dat as number as text) & return & (c2Dat as number as text) –> 0.01 sec @MacBook Air M2 (1,000 items) –> 0.32 sec @MacBook Air M2 (10,000 items) return {c1Dat, c2Dat} — クイックソートの関数(高速化対応版) on quickSort2DArray(array2D, columnIndex, ascendingOrder) script oBj property list : array2D property lessList : {} property greaterList : {} end script if (length of (oBj’s list)) ≤ 1 then return (oBj’s list) — 要素が1つ以下の場合はそのまま返す else — ピボットを選択(最初の要素を基準) set pivot to item 1 of (oBj’s list) set pivotValue to item columnIndex of pivot — ピボットより小さい要素のリスト set (oBj’s lessList) to {} — ピボット以上の要素のリスト set (oBj’s greaterList) to {} repeat with i from 2 to length of (oBj’s list) — ピボットを除いたリストを処理 set currentItem to item i of (oBj’s list) set currentValue to item columnIndex of currentItem — 昇順または降順で分岐 if (ascendingOrder and currentValue ≤ pivotValue) or ((not ascendingOrder) and currentValue ≥ pivotValue) then set end of (oBj’s lessList) to currentItem else set end of (oBj’s greaterList) to currentItem end if end repeat — 再帰的にソートして結合 return (quickSort2DArray((oBj’s lessList), columnIndex, ascendingOrder) & {pivot} & quickSort2DArray((oBj’s greaterList), columnIndex, ascendingOrder)) end if end quickSort2DArray |