Comment detail

ソートするコードの生成 (Nested Flatten)
コンパイラはDMD2.009を使用しました。
ソートコードのコンパイルは、最適化を有効にした場合、n=6までしか出来ませんでした。

* ソースコード生成
gensort 7  00:00.062
gensort 8  00:00.515
gensort 9  00:05.312
gensort 10 00:57.671

* コンパイル
sort5  00:00.125
sort6  00:00.156
sort7  00:01.328
sort8  00:54.937
// 9,10はメモリ不足でコンパイルできず
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import std.stream, std.string, std.conv

void gensort(uint n, Stream o) {
    enum string INDENT = "\t";
    
    void _gensort(string[] checked, uint index, string[] vars, uint indent) {
        if(!vars.length) {
            o.writefln("%swriteln([%s]);", INDENT.repeat(indent), checked.join(", "));
            return;
        }

        o.writefln("%sif(%s < %s)", INDENT.repeat(indent), checked[index], vars[0]);
        if(index + 1 < checked.length) {
            _gensort(checked, index + 1, vars, indent + 1);
        } else {
            _gensort(checked ~ vars[0], 0, vars[1..$], indent + 1);
        }
        o.writefln("%selse", INDENT.repeat(indent));
        _gensort(checked[0..index] ~ vars[0] ~ checked[index..$], 0, vars[1..$], indent + 1);
    }
    
    string[] _variables(uint n) {
        auto vars = new string[n];
        vars[0] = "a";
        foreach(i; 1 .. n) {
            vars[i] = vars[i - 1].succ();
        }
        return vars;
    }
    
    o.writefln("import std.stdio, std.string, std.conv;");
    o.writefln("void main() {");
    
    auto vars = _variables(n);
    foreach(var; vars) {
        o.writefln("%sint %s = to!(int)(strip(readln()));", INDENT, var);
    }
    _gensort([vars[0]], 0, vars[1..$], 1);
    
    o.writefln("}");
}

void main(string[] args) {
    if(args.length>=2) {
        auto o = new BufferedFile("sort" ~ args[1] ~ ".d", FileMode.OutNew);
        scope(exit) o.close();
        gensort(to!(int)(args[1]), o);
    }
}

Index

Feed

Other

Link

Pathtraq

loading...