20-10 石室の記憶、いま解き放たれて

解説動画

間違っているコード

player.onChat("20-10", function () {
    player.say("読み取ったブロックを、番号の小さい順に外周へ並べ直します");

    // 渦巻の中心からはじめて、左回りに読み取ります
    let values: number[] = [];
    const spiralLengths: number[] = [1, 1, 2, 2, 3, 3, 4, 4, 4];
    for (let s: number = 0; s < spiralLengths.length; s++) {
        if (s > 0) {
            agent.turn(LEFT);
        }
        for (let i: number = 0; i < spiralLengths[s]; i++) {
            agent.move(FORWARD, 1);
            values.push(agent.inspect(AgentInspection.Block, DOWN));
        }
    }

    // 読み取った配列を、小さい順に並べ替えます
    let sorted: number[] = [];
    for (let i: number = 0; i < values.length; i++) {
        let insertIndex: number = 0;
        for (let j: number = 0; j < sorted.length; j++) {
            if (sorted[j] > values[i]) {
                insertIndex = insertIndex + 1;
            }
        }
        sorted.insertAt(insertIndex, values[i]);
    }

    // 並べ替えた配列を、外周に右回りに置いていきます
    agent.move(FORWARD, 2);
    agent.turn(RIGHT);
    agent.move(FORWARD, 1);
    agent.turn(RIGHT);

    agent.setSlot(1);
    const ringLengths: number[] = [7, 6, 6, 5];
    for (let s: number = 0; s < ringLengths.length; s++) {
        if (s > 0) {
            agent.turn(RIGHT);
        }
        for (let i: number = 0; i < ringLengths[s]; i++) {
            agent.move(FORWARD, 1);
            let id: number = sorted.shift();
            agent.setItem(id, 1, 1);
            agent.place(DOWN);
        }
    }

    player.say("外周を並べ直しました");
});

解答コード

player.onChat("20-10", function () {
    player.say("読み取ったブロックを、番号の小さい順に外周へ並べ直します");

    // 渦巻の中心からはじめて、左回りに読み取ります
    let values: number[] = [];
    const spiralLengths: number[] = [1, 1, 2, 2, 3, 3, 4, 4, 4];
    for (let s: number = 0; s < spiralLengths.length; s++) {
        if (s > 0) {
            agent.turn(LEFT);
        }
        for (let i: number = 0; i < spiralLengths[s]; i++) {
            agent.move(FORWARD, 1);
            values.push(agent.inspect(AgentInspection.Block, DOWN));
        }
    }

    // 読み取った配列を、小さい順に並べ替えます
    let sorted: number[] = [];
    for (let i: number = 0; i < values.length; i++) {
        let insertIndex: number = 0;
        for (let j: number = 0; j < sorted.length; j++) {
            if (sorted[j] < values[i]) {
                insertIndex = insertIndex + 1;
            }
        }
        sorted.insertAt(insertIndex, values[i]);
    }

    // 並べ替えた配列を、外周に右回りに置いていきます
    agent.move(FORWARD, 2);
    agent.turn(RIGHT);
    agent.move(FORWARD, 1);
    agent.turn(RIGHT);

    agent.setSlot(1);
    const ringLengths: number[] = [7, 6, 6, 5];
    for (let s: number = 0; s < ringLengths.length; s++) {
        if (s > 0) {
            agent.turn(RIGHT);
        }
        for (let i: number = 0; i < ringLengths[s]; i++) {
            agent.move(FORWARD, 1);
            let id: number = sorted.shift();
            agent.setItem(id, 1, 1);
            agent.place(DOWN);
        }
    }

    player.say("外周を並べ直しました");
});