typescript練習帳

本書はtypescirptの使い方について書いて行きます。

963 views

配列(1次元)

配列はpythonの書き方と似ている。
配列と言いながら、ほぼリスト。

console.log("hello world");
let matrix:number[] = [];

for(let i = 0; i < 10; i++) {
    matrix[i] = i + 1;
}

matrix.forEach(function(ele, index){
    console.log(index, ele);
});

2次元配列

C言語みたいにdata[4][4]みたいな指定はない
配列に配列を持たせることで実現する。

console.log("hello world");
let matrix:Array<number>[] = [];

for(let row = 0; row < 3; row++) {
    let array:number[] = [];
    for(let col = 0; col < 10; col++) {
        array[col] = col + 1;
    }
    matrix[row] = array;
}

for(let row = 0; row < 3; row++) {
    for(let col = 0; col < 10; col++) {
        process.stdout.write(matrix[row][col].toString());
    }
    process.stdout.write("\n");

}

13行目のprocessを動かすには

npm i @types/node

を実行する。

2次元配列を作成する関数

コール元

import * as utils from "./utils";

//配列作成
let mat = utils.createArray2D(3, 4, -1);


let rowLength = mat.length;
//表示
for(let row = 0; row < rowLength; row++) {
    let colNum = mat[row].length;
    for(let col = 0; col < colNum; col++){
        process.stdout.write(mat[row][col]+ " ");
    }
    process.stdout.write("\n");
}

コール先

/**
 * 2次元配列を作成するプログラム
 * row:行の数
 * col:列の数
 * initValue:配列の初期値
 */
export function createArray2D(row:number, col:number, initValue:number=0):Array<number>[]{
    let matrix:Array<number>[] = [];

    for(let y = 0; y < row; y++) {
        let arr:number[] = [];
        for(let x = 0; x < col; x++){
            arr[x] = initValue;
        }
        matrix[y] = arr;
    }

    return matrix;
}

配列を回転したり、鏡面コピーしたりする関数

import * as lodash from 'lodash';

/**
 * 2次元配列を作成する
 * row:行の数
 * col:列の数
 * initValue:配列の初期値
 */
export function createArray2D(row:number, col:number, initValue:number=0):Array<number>[]{
    let matrix:Array<number>[] = [];

    for(let y = 0; y < row; y++) {
        let arr:number[] = [];
        for(let x = 0; x < col; x++){
            arr[x] = initValue;
        }
        matrix[y] = arr;
    }

    return matrix;
}

/**
 * 配列を90°ずつ回転する。
 * @param matrix 2次元配列(これだと正方行列しか回転できない)
 * @param type 0の場合、時計回りに90°回転する。1の場合、反時計回りに90°回転する
 */
export function rotateArray2D(matrix:Array<number>[], type:number):Array<number>[]{
    let degree:number = 90;
    let cos90 = 0;
    let sin90 = 1;
    if(type == -1) {
        sin90 = -1;
    }

    let rotateMatrix = createArray2D(matrix[0].length, matrix.length, 0);
    //rederMatrix(rotateMatrix);

    let s_c_w = parseFloat(matrix[0].length.toString());
    let s_c_h = parseFloat(matrix.length.toString());
    let d_c_w = parseFloat(rotateMatrix[0].length.toString());
    let d_c_h = parseFloat(rotateMatrix.length.toString());

    s_c_w = (s_c_w - 1.0) / 2.0;
    s_c_h =  (s_c_h - 1.0) / 2.0;

    d_c_w = (d_c_w - 1.0) / 2.0;
    d_c_h =  (d_c_h - 1.0) / 2.0;

   // console.log(d_c_w, d_c_h);

    for(let y = 0; y < matrix.length; y++) {
        for(let x = 0; x < matrix[y].length; x++) {
            let o_x = x - s_c_w;  //中心座標を原点に移動
            let o_y = y - s_c_h;
            let r_x =  -1.0 * o_y * sin90;
            let r_y = o_x * sin90;

            //元の位置に移動
            r_x = r_x + d_c_w;
            r_y = r_y + d_c_h;
            o_x = o_x + s_c_w;
            o_y = o_y + s_c_h;
            //console.log(r_x, r_y);
            rotateMatrix[r_y][r_x] = matrix[o_y][o_x];
        }
    }

    return rotateMatrix
}

export function rederMatrix(matrix:Array<number>[]) {
    for(let row = 0; row < matrix.length; row++) {
        let colNum = matrix[row].length;
        for(let col = 0; col < colNum; col++){
            process.stdout.write(matrix[row][col]+ " ");
        }
        process.stdout.write("\n");
    }
}

/**
 * 2次元配列の鏡面コピーを作成する
 * @param matrix 鏡面コピーする元となる2次元配列
 */
export function reverseArray2D(matrix:Array<number>[]):Array<number>[]{
    //ディープコピー
    let revMat = lodash.cloneDeep(matrix);
    //縦のミラー作成
    revMat.reverse();

    //各行のミラー作成
    revMat.forEach((value, index)=>{
        value.reverse();
    });

    return revMat;
}

上の配列の回転は、配列のインデックスを座標としたアフィン変換で回転しているけど、もっとプログラムチックに回転するなら以下。

/**
 * 配列を90°ずつ回転する。
 * @param matrix 2次元配列(これだと正方行列しか回転できない)
 * @param type 0の場合、時計回りに90°回転する。1の場合、反時計回りに90°回転する
 */
export function rotateArray2D(matrix:Array<number>[], type:number):Array<number>[] {
    let rotateMatrix = createArray2D(matrix[0].length, matrix.length, 0);
    let height = rotateMatrix.length;
    let width = rotateMatrix[0].length;

    if(type == 0) {
        for(let y = 0; y < matrix.length; y++) {
            for(let x = 0; x < matrix[y].length; x++) {
                let rX = width - y  - 1;
                let rY = x;
                rotateMatrix[rY][rX] = matrix[y][x]
            }
        }
    }
    else {
        for(let y = 0; y < matrix.length; y++) {
            for(let x = 0; x < matrix[y].length; x++) {
                let rX = y;
                let rY = height - x - 1;
                rotateMatrix[rY][rX] = matrix[y][x]
            }
        }     
    }

    return rotateMatrix
}

ディープコピー

素のtypescriptやjavascriptでもできるが、スマートな方法はない。
かといって、自作するのも面倒。
javascriptでディープコピーする場合はlodashというライブラリを使うのが良い。
インストールは以下。

npm install lodash
npm i @types/lodash

Page 10 of 12.

前のページ 次のページ



[添付ファイル]


お問い合わせ

プロフィール

すぺぺぺ

自己紹介

本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。

サイト/ブログ

https://www.osumoi-stdio.com/novel/

ツイッター

@darkimpact0626