ChatGPTに普通に負けた話【穴掘り法】

  • SmartBee

最終更新⽇:

掲載⽇:

# 自分で迷路を作る

ある日ふと思い立ち、迷路を作るスクリプトを作成してみた。
アルゴリズムが複雑でなく、出来る迷路もそこそこ複雑性のある、
軽く実装するにはうってつけの穴掘り法で実装した。
しかしながら、アルゴリズムは簡単なものの、実装が煩雑で、
言ってしまえば普通にめんどくさく、
境界値の検査やtypescript特有の配列操作のやりづらさもあり、
半日もかかってしまった。
しかも実装がめちゃくちゃ、もっといい方法がないかと考えていたが、
思いつかない。しかもめんどくさい。
勝手に実装してくれたらいいのにと思っていた。

# ChatGPT大先生

ということで登場してもらったChatGPT先生。
噂には聞いていたが、使うのは初めてである。
所詮AIごときに私様の書いたコードより優秀なコードが書けるわけ無いという思い半分、
普通に負けるだろうという思い半分で、使わなければその答えは出ない、
ということで使わないようにしてたChatGPTである。
このシュレーディンガーの実験装置に押し込まれた私様のプライドを観測してみようじゃないか。

# 普通に負けた

普通に負けました。5分で作りました。
しかも大体指示が悪かっただけという結果。
実験装置の中でプライドがズタズタにされて死んでいた。

# 大先生、その優秀なる頭脳

ということで、前置きが長くなったが、大先生の優秀なる頭脳と
ポンコツプログラマとのやりとりの一部始終を記載していこうと思う。

```
please japanese
```

> はい、どのようなお手伝いをいたしましょうか?
> 日本語での質問や翻訳のお手伝いなど、なんでもお伺いいたします。

```
> あなたはプログラムの専門家です
```

> はい、私はプログラムの専門家です。
> プログラミングに関する質問や助言が必要な場合は、お気軽にどんな内容でもお尋ねください。
? どのようなプログラミング言語や技術についての情報をお求めですか?

```
> 以降の会話では、コードを書くときはtype scriptで書いてください
```

> 了解です。以降の会話では、TypeScriptでコードを記述します。ご了承ください。

```
> 穴掘り法で迷路を作るスクリプトを書いてください
```

> 以下は、TypeScriptで穴掘り法を使用してランダムな迷路を生成するスクリプトの例です。

```typescript
class MazeGenerator {
private rows: number;
private cols: number;
private maze: number[][];

constructor(rows: number, cols: number) {
this.rows = rows;
this.cols = cols;
this.maze = [];

// Initialize maze grid
for (let i = 0; i < this.rows; i++) {
this.maze[i] = [];
for (let j = 0; j < this.cols; j++) {
this.maze[i][j] = 1; // 1 represents walls
}
}
}

generateMaze(): number[][] {
this.digRecursive(0, 0);
return this.maze;
}

private digRecursive(row: number, col: number): void {
const directions = this.shuffleDirections();

for (const direction of directions) {
const [dx, dy] = direction;
const nextRow = row + dx * 2;
const nextCol = col + dy * 2;

if (this.isValidCell(nextRow, nextCol)) {
this.maze[nextRow][nextCol] = 0; // 0 represents paths
this.maze[row + dx][col + dy] = 0;
this.digRecursive(nextRow, nextCol);
}
}
}

private shuffleDirections(): number[][] {
const directions = [[-1, 0], [1, 0], [0, -1], [0, 1]];
for (let i = directions.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[directions[i], directions[j]] = [directions[j], directions[i]];
}
return directions;
}

private isValidCell(row: number, col: number): boolean {
return row >= 0 && row < this.rows && col >= 0 && col < this.cols && this.maze[row][col] === 1;
}
}

// Example usage
const rows = 10;
const cols = 10;
const generator = new MazeGenerator(rows, cols);
const maze = generator.generateMaze();

// Print the generated maze
for (const row of maze) {
console.log(row.join(" "));
}
```

> このスクリプトでは、指定した行数と列数で初期化された迷路グリッドを作成し、
穴掘り法アルゴリズムを使用してランダムな迷路を生成します。
迷路は2次元の配列として表され、1は壁を、0は通路を示します。
最後に、生成された迷路をコンソールに表示します。

# あとがき

実に30倍の速度で実装してくれたChatGPT大先生の次回作にご期待ください。
私は死んだプライドを抱えながら大先生に実装コードをすべて丸投げして寝ます。