連想配列再び

授業さぼってしまって暇なので…

import std.c.stdio;

void main(){
    int[char[]] h0;
    h0["sa"] = 1;
    h0["tsu"] = 2;
    h0["ga"] = 3;
    h0["i"] = 1;
    h0.write();
    char[][int] h1;
    h1 = h0.invert();
    h1.write();
    h1.delete_if( (int i, char[] c){ return (i == 3)&&(c == "ga"); } );
    h1.write();
}

void write(int[char[]] h){
    foreach (char[] c, int i; h){
        printf("(%.*s : %d) ", c, i);
    }
    printf("\n");
}

void write(char[][int] h){
    foreach (int i, char[] c; h){
        printf("(%d : %.*s) ", i, c);
    }
    printf("\n");
}

U[T] invert(T, U)(T[U] hash){
    U[] keys = hash.keys;
    T[] values = hash.values;
    U[T] temp;
    for (int i = 0; i < keys.length; i++){
        temp[values[i]] = keys[i];
    }
    return temp;
}

void delete_if(V, K, F)(inout V[K] hash, F f){
    foreach (K k, V v; hash){
        if (f(k, v)){
            hash.remove(k);
        }
    }
}
(sa : 1) (i : 1) (ga : 3) (tsu : 2)
(1 : i) (2 : tsu) (3 : ga)
(1 : i) (2 : tsu)

お前SATSUGAI言いたかっただけじゃないのかと。SATSUGAIせよ!SATSUGAIせよ!GO TO DMC
あ、DMCDMDは似ている。
デトロイト・メタル・D language。
嘘です。