~lovesyao/+junk/transgs

« back to all changes in this revision

Viewing changes to nazo/set.d

  • Committer: Nazo
  • Date: 2008-10-18 08:26:14 UTC
  • Revision ID: lovesyao@hotmail.com-20081018082614-22qgtg2gsotz5r2i
initial checkin

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
module nazo.set;
 
2
/**
 
3
 * いろんなものの集合
 
4
 * License: Public Domain
 
5
 */
 
6
 
 
7
static class NumberSet(int skip, bool reverse=false, int add=0){
 
8
  static int[] opSlice(int i,int j){
 
9
    assert(i<j);
 
10
    int[] rv = new int[j-i];
 
11
    i*=skip;
 
12
    j*=skip;
 
13
    for(int n;i<j;i+=skip,n++){
 
14
      rv[n]=reverse?-i-add:i+add;
 
15
    }
 
16
    return rv;
 
17
  }
 
18
  static int opIndex(int i){
 
19
    return i;
 
20
  }
 
21
}
 
22
 
 
23
///0,1,2...
 
24
alias NumberSet!(1) IntegerSet;
 
25
///0,-1,-2...
 
26
alias NumberSet!(1, true) ReverseIntegerSet;
 
27
///0,2,4...
 
28
alias NumberSet!(2) EvenNumberSet;
 
29
///0,-2,-4...
 
30
alias NumberSet!(2, true) ReverseEvenNumberSet;
 
31
///1,3,5...
 
32
alias NumberSet!(2, false, 1) OddNumberSet;
 
33
///-1,-3,-5...
 
34
alias NumberSet!(2, true, 1) ReverseOddNumberSet;
 
35
 
 
36
///$start-$end $start$start-$end$end...
 
37
static class StringSet(char start,char end){
 
38
  static string[] opSlice(uint i,uint j){
 
39
    assert(i<j);
 
40
    string[] rv = new string[j-i];
 
41
    string a = opIndex(i);
 
42
    foreach(inout string v; rv){
 
43
      v = a;
 
44
      a = next!(start, end)(a);
 
45
    }
 
46
    return rv;
 
47
  }
 
48
  static string opIndex(uint i){
 
49
    const int n = end-start+1;
 
50
    string rv;
 
51
    i++;
 
52
    while(i>0){
 
53
      rv~=(i-1)%n+start;
 
54
      i=(i-1)/n;
 
55
    }
 
56
    rv.reverse;
 
57
    return rv;
 
58
  }
 
59
  private static string next(char start,char end)(string val){
 
60
    string rv = val.idup;
 
61
    for(int i=val.length-1;i>=0;i--){
 
62
      if(val[i] != end){
 
63
        rv[i]++;
 
64
        return rv;
 
65
      }
 
66
      rv[i]=start;
 
67
    }
 
68
    rv.length = rv.length+1;
 
69
    rv[1..$] = rv[0..$-1];
 
70
    rv[0]=start;
 
71
    return rv;
 
72
  }
 
73
}
 
74
 
 
75
///a-z aa-zz aaa-zzz...
 
76
alias StringSet!('a','z') AlphabetSet;
 
77
 
 
78
import std.stdio;
 
79
unittest{
 
80
  assert(IntegerSet[0..6] == [0,1,2,3,4,5]);
 
81
  assert(ReverseIntegerSet[0..6] == [0,-1,-2,-3,-4,-5]);
 
82
  assert(IntegerSet[0..1] == [0]);
 
83
  assert(ReverseIntegerSet[0..1] == [0]);
 
84
  assert(IntegerSet[-5..6] == [-5,-4,-3,-2,-1,0,1,2,3,4,5]);
 
85
  assert(ReverseIntegerSet[-5..6] == [5,4,3,2,1,0,-1,-2,-3,-4,-5]);
 
86
  assert(IntegerSet[-5..1] == [-5,-4,-3,-2,-1,0]);
 
87
  assert(ReverseIntegerSet[-5..1] == [5,4,3,2,1,0]);
 
88
  assert(IntegerSet[0]==0);
 
89
  assert(IntegerSet[5]==5);
 
90
  assert(IntegerSet[-5]==-5);
 
91
  assert(EvenNumberSet[1..3]==[2,4]);
 
92
  assert(OddNumberSet[1..3]==[3,5]);
 
93
  assert(AlphabetSet[0..1]==["a"[]]);
 
94
  assert(AlphabetSet[1..2]==["b"[]]);
 
95
  assert(AlphabetSet[99]==AlphabetSet[0..100][$-1]);
 
96
}